home contents changes options help subscribe edit

Modul relations - nástroj pro vytváření a spravování relací

Author:Jan Švec
Copyright: Copyright 2005 Jan Švec
License:GPL
Contact:honza(at)py(dot)cz

Úvod

Tento modul podporuje vytváření a používání relací. Relace mohou být vytvořeny mezi dvěma objekty a spravovány jednoduchým způsobem. Podporují callback funkce volané vždy, když jsou dva objekty spojeny nebo rozpojeny relací.

Download

Komentovaný příklad

Modelová situace:

Máme objekt třídy Application, která zobrazuje objekty Document za použití objektů View. Pokud vytvoříme Document je k němu nové View vytvořeno automaticky. Pokud je uzavřeno poslední View konkrétního objektu Document, tento Document je též uzavřen. Relace mezi objekty jsou popsány následujícím ERA modelem:

.       +-------------+ 1    N +----------+ 1    N +------+
        | Application |--------| Document |--------| View |
        +-------------+        +----------+        +------+

Pomocné třídy:

class MyObj(object):
        def __init__(self, name):
                self.name = name
        def __repr__(self):
                return '<%s %r>' % (self.__class__.__name__, self.name)

Relace (definované pomocí příkazu class), přínos modulu ``relations`` (!!!):

class RAppDocs(Relation):
        name = 'app:docs*'
        def plug(app, doc):
                # Document nemá žádná View, vytvoříme nové
                if not doc.views:
                        v = View('View of %s' % doc.name)
                        doc.views.add(v)

        def unplug(app, doc):
                # Document je uzavírán, odstraňme všechna jeho View
                doc.views.clear()

class RViewsDoc(Relation):
        name = 'views*:doc'
        def unplug(view, doc):
                # Bylo-li uzavřeno poslední View dokumentu, zavřeme ho též
                if not doc.views:
                        doc.close()
                # Uzavřeme View
                view.close()

Třída Application:

class App(MyObj):
        docs = RAppDocs.docs

Třída Document:

class Doc(MyObj):
        app = RAppDocs.app
        views = RViewsDoc.views

        def __init__(self, *args):
                super(Doc, self).__init__(*args)
                self.saved = False

        def save(self):
                print 'Saving %r' % self
                self.saved = True

        def close(self):
                if not self.saved:
                        print 'Not saved %r' % self
                        raise RuntimeError("Not saved")
                print 'Closing document'

Třída View:

class View(MyObj):
        doc = RViewsDoc.doc

        def __init__(self, *args):
                super(View, self).__init__(*args)
                print 'New view'

        def close(self):
                print 'Closing view'

        def __repr__(self):
                return '<View of %r>' % self.doc

Vytvoříme instanci aplikace:

app = App('main')

Vytvoříme nějaké dokumenty:

d1 = Doc('FOO.TXT')
d2 = Doc('BAR.TXT')

Vytvořené dokumenty přidáme k aplikaci:

app.docs.add(d1)
app.docs.add(d2)

Vytvoříme nové View, takže d2 má dvě View:

d2.views.add(View('Foo'))
print RAppDocs.all()
print RViewsDoc.all()

Pokusíme se uzavřít všechna view dokumentu d1 a tím i uzavřít d1, ale ten není uložen a je vyvolána RuntimeError:

try:
        d1.views.clear()
except RuntimeError:
        pass

d1.save()
print app.docs
print RAppDocs.all()
print RViewsDoc.all()

Dokument d1 můžeme uzavřít i odstraněním vazeb na app:

del d1.app
print RAppDocs.all()
print RViewsDoc.all()




subject:
  ( 118 subscribers )