Changeset 306

Show
Ignore:
Timestamp:
02/03/08 23:14:11 (1 year ago)
Author:
johnbywater
Message:

Fixed temporal list attribute iteration.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/dm/db.py

    r305 r306  
    246246                try: 
    247247                    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 
    250253                else:  
    251254                    mapperClass.select().count() 
  • trunk/src/dm/dom/meta.py

    r305 r306  
    545545        domainRegister = self.getDomainRegister() 
    546546        if self.dictionary[DB_MIGRATION_IN_PROGRESS]: 
    547             if hasattr(domainRegister, 'getAll'): 
     547            #if hasattr(domainRegister, 'getAll'): 
     548            if domainRegister.isStateful: 
    548549                domainRegister = domainRegister.getAll() 
    549550        return domainRegister[key] 
     
    637638 
    638639class 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! 
    639649 
    640650    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             
    643661 
    644662class AssociateList(DomainObjectAssociation): 
  • trunk/src/dm/dom/registry.py

    r305 r306  
    7171            self.generateTemporalRevisionClass(parentMeta, metaAttrs) 
    7272        else: 
    73             # Look for independently temporal propertes. 
     73            # Look for independently temporal properties. 
    7474            for attrMeta in domainClass.meta.attributes: 
    7575                if attrMeta.isTemporal: 
     
    8888        temporalClassName = self.makeTemporalRevisionClassName(parentMeta) 
    8989        temporalMeta = temporalBase.metaClass(temporalClassName) 
    90         todoParams = [] 
     90        deferredParams = [] 
    9191        for metaAttr in metaAttrs: 
    9292            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 
    93104                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') 
    98116            else: 
    99117                newAttr = metaAttr.duplicateTemporal() 
    100118            setattr(temporalMeta, metaAttr.name, newAttr) 
    101         temporalMeta.parent = HasA(parentMeta.name, isRequired=True) 
    102119        temporalClass = self.createDomainClass(temporalMeta, temporalBase) 
     120        temporalClass.parent = HasA(parentMeta.name, isRequired=True) 
     121        self.registerDomainClass(temporalClass) 
    103122        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 
    107130    def generateTemporalAssociateListClass(self, parentMeta, attrMeta, temporalClassName): 
    108131        # No support for bitemporal associate lists yet! 
    109132        temporalBase = TemporalAssociateList 
    110133        temporalMeta = temporalBase.metaClass(temporalClassName) 
     134        temporalClass = self.createDomainClass(temporalMeta, temporalBase) 
    111135        keyMeta = attrMeta.getKeyMetaAttribute() 
     136        # N.B. Key meta for key name 'id' == None. 
    112137        if keyMeta: 
    113             temporalMeta.recordedKey = keyMeta.duplicateTemporal() 
    114         else: 
    115             temporalMeta.recordedKey = Integer(isRequired=True) 
    116         temporalMeta.recordedValue = HasA(attrMeta.typeName, isRequired=True) 
    117         temporalMeta.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
    119144        attrMeta.setTemporalDomainClass(temporalClass) 
    120145 
     
    130155        ) 
    131156        temporalMeta = temporalBase.metaClass(temporalClassName) 
    132         temporalMeta.recordedValue = attrMeta.duplicateTemporal() 
    133         temporalMeta.parent = HasA(parentMeta.name, isRequired=True) 
    134157        temporalClass = self.createDomainClass(temporalMeta, temporalBase) 
     158        temporalClass.recordedValue = attrMeta.duplicateTemporal() 
     159        temporalClass.parent = HasA(parentMeta.name, isRequired=True) 
     160        self.registerDomainClass(temporalClass) 
    135161        attrMeta.setTemporalDomainClass(temporalClass) 
    136162 
     
    151177 
    152178    def createDomainClass(self, metaDomainObject, baseClass=DomainObject): 
    153         domainClass = metaDomainObject.createDomainClass(baseClass) 
    154         self.registerDomainClass(domainClass) 
    155         return domainClass 
     179        return metaDomainObject.createDomainClass(baseClass) 
    156180 
    157181    def isDomainClassRegistered(self, className): 
     
    160184            raise Exception, message 
    161185        classRegister = self.getDomainClassRegister() 
    162         return className in classRegister 
     186        if className in classRegister: 
     187            return classRegister[className].isRegistered 
     188        else: 
     189            return False 
    163190     
    164191    def getDomainClass(self, className): 
  • trunk/src/dm/dom/stateful.py

    r304 r306  
    8181        else: 
    8282            register.requiredStateName = stateName 
     83        register.isStateful = False 
    8384        return register 
    8485         
  • trunk/src/dm/dom/temporaltest.py

    r305 r306  
    1515        unittest.makeSuite(TestBitemporalActual), 
    1616        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 
    1819        unittest.makeSuite(TestTemporalObjectExample), 
    1920    ] 
     
    8990        self.failUnlessEqual(instance.title, title4) 
    9091 
    91     def _test_grants(self): 
     92    def test_grants(self): 
    9293        permissions = self.registry.permissions.getSortedList() 
    9394        permission1 = permissions[0] 
  • trunk/src/dm/migrate.py

    r305 r306  
    3535            # Dumping class register objects 
    3636            domainRegister = domainClass.createRegister() 
    37             if hasattr(domainRegister, 'getAll'): 
     37            #if hasattr(domainRegister, 'getAll'): 
     38            if domainRegister.isStateful: 
    3839                domainRegister = domainRegister.getAll() 
    3940            for domainObject in domainRegister: 
  • trunk/src/dm/timepoint.py

    r300 r306  
    77 
    88    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 
    1114 
    1215    def reset(self):