On Apr 1, 2007, at 12:31 AM, Robert Gravina wrote:


On Mar 31, 2007, at 11:41 PM, Robert Gravina wrote:


On Mar 31, 2007, at 11:13 PM, Robert Gravina wrote:


On Mar 31, 2007, at 10:32 PM, Stephan Richter wrote:

On Thursday 29 March 2007 15:14, Robert Gravina wrote:
Is anyone using ZEO to build mutliuser networked applications outside
of Zope?

Uwe Oestermeier and his team built Bebop. While the server component uses Zope
3, it uses a full wxPython GUI as client.

http://svn.kmrc.de/

Wow, that looks very impressive. I'll checkout the source and have a look around to see what I can learn.

Thanks,

Robert


I'm still a little bit unsure about how to update the GUI when objects are changed.

I noticed a previous thread on a similar topic which suggested to customise ZODB.DB.invalidate.
http://www.mail-archive.com/zodb-dev@zope.org/msg01969.html

I thought I could check the type of object, and generally that will be enough for me to decide which parts of the UI need a refresh. It seems though, that when I change data from one client other clients, although getting invalidate messages, are still displaying old data.

I tried subclassing DB, and printing out the object as a test, but it's always "None" (even when I have a few clients connected). The code there to get the object from the cache I don't quite understand, I just copied it from ZODB.DB.invalidate and hoped for the best :)

class UpdatedDB(DB):
    def invalidate(self, tid, oids, connection=None, version=''):
        DB.invalidate(self, tid, oids, connection, version)
        for oid in oids.keys():
            h = hash(oid) % 131
            o = self._miv_cache.get(h, None)
            print o

Is there anything else I need to do/doing wrong?


Woohoo! I realised Connection.sync() does exactly what I need, but this still doesn't work as expected.

class UpdatedDB(DB):
    def invalidate(self, tid, oids, connection=None, version=''):
        DB.invalidate(self, tid, oids, connection, version)
        if connection is not None:
            connection.sync()


OK, I realised the connection passed in is the one that committed the transaction, but we want to refresh the connection for the current client, so I've changed the code to do that (but still no luck). (here ApplicationPresenter is a singleton that holds a reference to the connection (well, reachable from it anyway)).

class UpdatedDB(DB):
    def invalidate(self, tid, oids, connection=None, version=''):
        DB.invalidate(self, tid, oids, connection, version)
        appmodel = ApplicationPresenter.getInstance().model
        if connection is not appmodel.connection:
            appmodel.connection.sync()

Am I going about this the right way?

Thanks,

Robert


Robert



_______________________________________________
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zodb-dev

_______________________________________________
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zodb-dev

_______________________________________________
For more information about ZODB, see the ZODB Wiki:
http://www.zope.org/Wikis/ZODB/

ZODB-Dev mailing list  -  ZODB-Dev@zope.org
http://mail.zope.org/mailman/listinfo/zodb-dev

Reply via email to