[Zope-dev] RFC: RelationAware class for relations betweenobjects
Max M
maxm@mxm.dk
Thu, 01 May 2003 08:39:56 +0200
Shane Hathaway wrote:
> I don't know about the others participating in this thread, but I'm
> reaching quite different conclusions than you did. For example:
>
> - The solution should not require Zope.
It is implemented as a Zope product, but the base class that implements
the relationships is actually pure Python. The latest version is based
on an OOBTree to handle the relations.
> - It should not be necessary to visit the management interface to set
> up relationships.
No.
> - Developers should have the *option* of using relationships directly
> in their classes, with a Pythonic API.
I think that should be working on top a general relationship service.
> I listed other requirements this morning, and as far as I can tell,
> few are fulfilled by mxmRelations. On the other hand, maybe I
> misunderstand mxmRelations. Does it fulfill the requirements I
> listed? I'm sure there's nothing wrong with mxmRelations, but it
> seems like we're targetting different audiences.
Let me say that I am not married to mxmRelations, and I am not trying to
push it as a solution. But I think it has a sound model for
relationships. One that is very general and expandable.
Here is a not even half baked pseudo example on how it could be
implemented. Which uses the same idea as mxmRelations:
class ManyToMany: # simillar to a mxmRelations class
"A many to many Relationships, it can also hold meta data attrs"
def __init__(self, name):
self.name = name
self.__relationship_graph = {}
def relate(self, obj1, obj2):
"relates 2 objects"
def unrelate(self, obj1, obj2):
"unrelates 2 objects"
def del(self, obj):
"Delete all relations to and from obj"
def get(self, obj):
"returns all relations to object"
class RelationshipsManager:
"Folder-like class to hold Relationships instances"
def addRelationsships(self, name, relationsshipsInstance):
"Adds a Relationships"
def getRelationsships(self, name):
"retuns a Relationships by name"
def delRelationsships(self, name):
"Delete a relationships"
# perhaps a method on ZODB to return the RelationshipsManager ?
rm = ZODB().getRelationshipsManager()
rm.addRelationsships('members_groups', ManyToMany('members_groups'))
r = rm.getRelationsships('members_groups')
r.relate(someNewMember, someGroup)
groups = r.get(someMember)
>>> [someGroup]