Changeset 602
- Timestamp:
- 07/07/03 18:53:27 (5 years ago)
- Files:
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/RBFoundation/RBFoundation/Objects/Relations.py
r595 r602 256 256 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 257 257 258 defaultkey = None259 keyname = None260 258 itemfactory = None 261 259 … … 264 262 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 265 263 266 def __init__(self, keyname=None, defaultkey=None, itemfactory=None, lookup=None): 267 if keyname is not None: 268 self.keyname = keyname 269 270 if defaultkey is not None: 271 self.defaultkey = defaultkey 272 264 def __init__(self, itemfactory=None, lookup=None): 273 265 if itemfactory is not None: 274 266 self.itemfactory = itemfactory … … 335 327 if default is not NotImplemented: 336 328 return default 337 elif self.itemfactory is not None:329 elif self.itemfactory: 338 330 result = self.lookup[key] = self.itemfactory().asRelationReference() 339 331 return result.Resolve() … … 365 357 366 358 def _getkeypairs(self, *relations): 367 if self.keyname is None: 368 raise ValueError, 'Cannot infer key for relation "%s"' % (relation,) 369 370 for relation in relations: 371 try: 372 yield self._translateKey(relation.Metadata(self.keyname)), relation 373 except KeyError: 374 if self.defaultkey is not None: 375 yield self._translateKey(self.defaultkey), relation 376 else: 377 raise KeyError, 'Relation "%s" metadata has no key "%s"' % (relation, self.keyname) 359 raise NotImplementedError 378 360 379 361 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ … … 523 505 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 524 506 525 class RelationshipMetadataMixin(object):526 def Metadata(self, *keys):527 """Returns the metadata about this relationship"""528 try:529 result = self.metadata530 except AttributeError:531 if keys:532 # Don't force the creation of the dictionary533 result = {}534 else:535 self.metadata = {}536 result = self.metadata537 if keys:538 if len(keys) == 1:539 result = result[keys[0]]540 elif len(keys) > 1:541 result = [result[key] for key in keys]542 return result543 544 507 class RelationshipDefaultMixin(object): 545 508 #~ Default Relations helpers ~~~~~~~~~~~~~~~~~~~~~~~~ … … 566 529 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 567 530 568 class Relationships(RelationshipsBase, RelationshipMetadataMixin, RelationshipDefaultMixin): 569 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 570 #~ Constants / Variables / Etc. 571 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 572 573 relations = LazyProperty(RelationsLookup) 574 defaultKind = None 575 576 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 577 #~ Public Methods 578 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 579 531 class RelationshipDataItemMixin(object): 580 532 def __init__(self, dataitem=None, metarelationship=None): 581 533 if dataitem is not None: 582 534 self.SetDataItem(dataitem) 583 535 584 #if metarelationship is not None:585 # self.SetMetaRelationship(metarelationship)586 587 536 def GetDataItem(self): 588 537 """Returns the subject dataitem of the relationship""" … … 599 548 DataItem = property(GetDataItem, SetDataItem, DelDataItem) 600 549 601 #def GetMetaRelationship(self): 602 # """Returns the relationship "above" the current level... a relationship of relationships""" 603 # return self.metarelationship 604 605 #def SetMetaRelationship(self, metarelationship): 606 # """Sets the relationship "above" the current level... a relationship of relationships""" 607 # self.metarelationship = metarelationship 608 609 #def DelMetaRelationship(self): 610 # """Removes the relationship "above" the current level... a relationship of relationships""" 611 # del self.metarelationship 612 613 #MetaRelationship = property(GetMetaRelationship, SetMetaRelationship, DelMetaRelationship) 614 615 def AddRelation(self, other, kind=None, **kw): 616 if kind is None: kind = self.defaultKind 550 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 551 552 class MetaRelationshipsMixin(object): 553 def __init__(self, metarelationship=None): 554 if metarelationship is not None: 555 self.SetMetaRelationship(metarelationship) 556 557 def GetMetaRelationship(self): 558 """Returns the relationship "above" the current level... a relationship of relationships""" 559 return self.metarelationship 560 561 def SetMetaRelationship(self, metarelationship): 562 """Sets the relationship "above" the current level... a relationship of relationships""" 563 self.metarelationship = metarelationship 564 565 def DelMetaRelationship(self): 566 """Removes the relationship "above" the current level... a relationship of relationships""" 567 del self.metarelationship 568 569 MetaRelationship = property(GetMetaRelationship, SetMetaRelationship, DelMetaRelationship) 570 571 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 572 573 class Relationships(RelationshipsBase, RelationshipDataItemMixin, RelationshipDefaultMixin): 574 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 575 #~ Constants / Variables / Etc. 576 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 577 578 relations = LazyProperty(RelationsLookup) 579 defaultKind = None 580 581 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 582 #~ Public Methods 583 #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 584 585 def Metadata(self): 586 """Returns the metadata about this relationship""" 587 try: 588 return self.metadata 589 except AttributeError: 590 self.metadata = {} 591 return self.metadata 592 593 def AddRelation(self, other, kind=NotImplemented, **kw): 594 if kind is NotImplemented: kind = self.defaultKind 617 595 self.relations[kind].add(other, **kw) 618 596 … … 620 598 self.relations[kind] = relationcollection 621 599 622 def Relations(self, kind=No ne):623 if kind is No ne: kind = self.defaultKind600 def Relations(self, kind=NotImplemented): 601 if kind is NotImplemented: kind = self.defaultKind 624 602 return self.relations[kind] 625 603
