Changeset 306
- Timestamp:
- 02/03/08 23:14:11 (1 year ago)
- Files:
-
- trunk/src/dm/db.py (modified) (1 diff)
- trunk/src/dm/dom/meta.py (modified) (2 diffs)
- trunk/src/dm/dom/registry.py (modified) (5 diffs)
- trunk/src/dm/dom/stateful.py (modified) (1 diff)
- trunk/src/dm/dom/temporaltest.py (modified) (2 diffs)
- trunk/src/dm/migrate.py (modified) (1 diff)
- trunk/src/dm/timepoint.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/src/dm/db.py
r305 r306 246 246 try: 247 247 mapperClass.createTable() 248 except: 249 raise 248 except Exception, inst: 249 msg = "Couldn't create table for class '%s': %s. Attributes are: %s" % (className, inst, str(mapperClass.meta.dom.attributeNames)) 250 logger.error(msg) 251 #raise 252 raise Exception, msg 250 253 else: 251 254 mapperClass.select().count() trunk/src/dm/dom/meta.py
r305 r306 545 545 domainRegister = self.getDomainRegister() 546 546 if self.dictionary[DB_MIGRATION_IN_PROGRESS]: 547 if hasattr(domainRegister, 'getAll'): 547 #if hasattr(domainRegister, 'getAll'): 548 if domainRegister.isStateful: 548 549 domainRegister = domainRegister.getAll() 549 550 return domainRegister[key] … … 637 638 638 639 class TemporalRegisterMixin(object): 640 "Use real register if in real time, otherwise use temporal history." 641 642 # When using real register, call super methods with given params. 643 # To use temporal history, get parent's revision object and pull 644 # keys and values from it's register. 645 646 timepoint = RequiredFeature('Timepoint') 647 648 # Todo: Fix this before using temporal properties on HasMany attrs! 639 649 640 650 def __iter__(self): 641 return iter([]) 642 651 if self.timepoint.isReset(): 652 return super(TemporalRegisterMixin, self).__iter__() 653 else: 654 if not self.owner: 655 raise Exception, "Temporal registers need an owner!" 656 currentVersion = self.owner.temporalHistory.getCurrent() 657 listAttr = getattr(currentVersion, self.metaAttr.name) 658 recordedItems = [i.recordedValue for i in listAttr] 659 return iter(recordedItems) 660 643 661 644 662 class AssociateList(DomainObjectAssociation): trunk/src/dm/dom/registry.py
r305 r306 71 71 self.generateTemporalRevisionClass(parentMeta, metaAttrs) 72 72 else: 73 # Look for independently temporal propert es.73 # Look for independently temporal properties. 74 74 for attrMeta in domainClass.meta.attributes: 75 75 if attrMeta.isTemporal: … … 88 88 temporalClassName = self.makeTemporalRevisionClassName(parentMeta) 89 89 temporalMeta = temporalBase.metaClass(temporalClassName) 90 todoParams = []90 deferredParams = [] 91 91 for metaAttr in metaAttrs: 92 92 if metaAttr.isAssociateList: 93 if not metaAttr.getDomainRegister().isStateful: 94 msg = "Associated class '%s' must be stateful for " % ( 95 metaAttr.typeName, 96 ) 97 msg += "attribute '%s' on class '%s'." % ( 98 metaAttr.name, parentMeta.name 99 ) 100 # Todo: Figure if this can be avoided. Problem is that 101 # deleting the simple associated object leaves the list 102 # history in a mess. Could fix by deleting the history? 103 raise Exception, msg 93 104 temporalListClassName = temporalBase.makeTemporalName( 94 parentMeta.name, metaAttr.name) 95 96 todoParams.append((temporalMeta, metaAttr, temporalListClassName)) 97 newAttr = AggregatesMany(temporalListClassName, 'id', 'parent') 105 parentMeta.name, metaAttr.name 106 ) 107 deferredParams.append({ 108 'temporalMeta': temporalMeta, 109 'metaAttr': metaAttr, 110 'temporalListClassName': temporalListClassName, 111 }) 112 self.generateTemporalAssociateListClass( 113 temporalMeta, metaAttr, temporalListClassName 114 ) 115 newAttr = AggregatesMany(temporalListClassName,'id','parent') 98 116 else: 99 117 newAttr = metaAttr.duplicateTemporal() 100 118 setattr(temporalMeta, metaAttr.name, newAttr) 101 temporalMeta.parent = HasA(parentMeta.name, isRequired=True)102 119 temporalClass = self.createDomainClass(temporalMeta, temporalBase) 120 temporalClass.parent = HasA(parentMeta.name, isRequired=True) 121 self.registerDomainClass(temporalClass) 103 122 parentMeta.setTemporalDomainClass(temporalClass) 104 for params in todoParams: 105 self.generateTemporalAssociateListClass(params[0], params[1], params[2]) 106 123 for params in deferredParams: 124 self.generateTemporalAssociateListClass( 125 params['temporalMeta'], 126 params['metaAttr'], 127 params['temporalListClassName'] 128 ) 129 107 130 def generateTemporalAssociateListClass(self, parentMeta, attrMeta, temporalClassName): 108 131 # No support for bitemporal associate lists yet! 109 132 temporalBase = TemporalAssociateList 110 133 temporalMeta = temporalBase.metaClass(temporalClassName) 134 temporalClass = self.createDomainClass(temporalMeta, temporalBase) 111 135 keyMeta = attrMeta.getKeyMetaAttribute() 136 # N.B. Key meta for key name 'id' == None. 112 137 if keyMeta: 113 temporal Meta.recordedKey = keyMeta.duplicateTemporal()114 else: 115 temporal Meta.recordedKey = Integer(isRequired=True)116 temporal Meta.recordedValue = HasA(attrMeta.typeName, isRequired=True)117 temporal Meta.parent = HasA(parentMeta.name, isRequired=True)118 temporalClass = self.createDomainClass(temporalMeta, temporalBase)138 temporalClass.recordedKey = keyMeta.duplicateTemporal() 139 else: 140 temporalClass.recordedKey = Integer(isRequired=True) 141 temporalClass.recordedValue = HasA(attrMeta.typeName, isRequired=True) 142 temporalClass.parent = HasA(parentMeta.name, isRequired=True) 143 self.registerDomainClass(temporalClass) 119 144 attrMeta.setTemporalDomainClass(temporalClass) 120 145 … … 130 155 ) 131 156 temporalMeta = temporalBase.metaClass(temporalClassName) 132 temporalMeta.recordedValue = attrMeta.duplicateTemporal()133 temporalMeta.parent = HasA(parentMeta.name, isRequired=True)134 157 temporalClass = self.createDomainClass(temporalMeta, temporalBase) 158 temporalClass.recordedValue = attrMeta.duplicateTemporal() 159 temporalClass.parent = HasA(parentMeta.name, isRequired=True) 160 self.registerDomainClass(temporalClass) 135 161 attrMeta.setTemporalDomainClass(temporalClass) 136 162 … … 151 177 152 178 def createDomainClass(self, metaDomainObject, baseClass=DomainObject): 153 domainClass = metaDomainObject.createDomainClass(baseClass) 154 self.registerDomainClass(domainClass) 155 return domainClass 179 return metaDomainObject.createDomainClass(baseClass) 156 180 157 181 def isDomainClassRegistered(self, className): … … 160 184 raise Exception, message 161 185 classRegister = self.getDomainClassRegister() 162 return className in classRegister 186 if className in classRegister: 187 return classRegister[className].isRegistered 188 else: 189 return False 163 190 164 191 def getDomainClass(self, className): trunk/src/dm/dom/stateful.py
r304 r306 81 81 else: 82 82 register.requiredStateName = stateName 83 register.isStateful = False 83 84 return register 84 85 trunk/src/dm/dom/temporaltest.py
r305 r306 15 15 unittest.makeSuite(TestBitemporalActual), 16 16 unittest.makeSuite(TestBitemporalProperty), 17 unittest.makeSuite(TestTemporal), # Example of DomainObject with temporal properties. 17 # Example of DomainObject with temporal properties. 18 unittest.makeSuite(TestTemporal), # TestTemporalPropertiesExample 18 19 unittest.makeSuite(TestTemporalObjectExample), 19 20 ] … … 89 90 self.failUnlessEqual(instance.title, title4) 90 91 91 def _test_grants(self):92 def test_grants(self): 92 93 permissions = self.registry.permissions.getSortedList() 93 94 permission1 = permissions[0] trunk/src/dm/migrate.py
r305 r306 35 35 # Dumping class register objects 36 36 domainRegister = domainClass.createRegister() 37 if hasattr(domainRegister, 'getAll'): 37 #if hasattr(domainRegister, 'getAll'): 38 if domainRegister.isStateful: 38 39 domainRegister = domainRegister.getAll() 39 40 for domainObject in domainRegister: trunk/src/dm/timepoint.py
r300 r306 7 7 8 8 def resetToPresent(self): 9 self.recorded = None 10 self.actual = None 9 self._recorded = None 10 self._actual = None 11 12 def isReset(self): 13 return self._recorded == None and self._actual == None 11 14 12 15 def reset(self):
