Changeset 413

Show
Ignore:
Timestamp:
10/16/08 11:57:55 (3 months ago)
Author:
johnbywater
Message:

Added model path resolver. Added autodelete view.

Files:

Legend:

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

    r374 r413  
    2020    registry         = RequiredFeature('DomainRegistry') 
    2121    pluginController = RequiredFeature('PluginController') 
     22 
     23    def resolvePathPart(self, pathPart): 
     24        return getattr(self, pathPart) 
    2225 
    2326 
     
    148151        ) 
    149152 
     153    def resolvePathPart(self, pathPart): 
     154        # Make register key from path part. 
     155        keyMeta = self.getKeyMeta() 
     156        if keyMeta == None: 
     157            keyValue = pathPart 
     158        elif keyMeta.isDomainObjectRef: 
     159            keyValue = keyMeta.getObjectByKey(pathPart) 
     160        else: 
     161            keyValue = pathPart 
     162        return self[keyValue] 
     163 
    150164    def retrieveItem(self, key): 
    151165        "Attempts to retrieve existing domain object from database." 
     
    411425            keyName = 'id' 
    412426        return keyName 
     427 
     428    def getKeyMeta(self): 
     429        "Returns meta attr for register key." 
     430        keyName = self.getKeyName() 
     431        metaAttrs = self.getDomainClassMetaAttributeNames() 
     432        if keyName in metaAttrs: 
     433            return metaAttrs[keyName] 
     434        else: 
     435            return None 
    413436 
    414437    def getStartsWithAttributeName(self): 
  • trunk/src/dm/dom/meta.py

    r375 r413  
    1717import os 
    1818import inspect 
    19  
     19from dm.exceptions import * 
    2020moddebug = False 
    2121 
     
    4646    logger = RequiredFeature('Logger') 
    4747    debug = RequiredFeature('Debug') 
     48 
     49    def resolvePathPart(self, pathPart): 
     50        return pathPart 
    4851 
    4952    def calcTitle(self): 
     
    495498        super(Integer, self).__init__(default=default, **kwds) 
    496499 
     500    def resolvePathPart(self, pathPart): 
     501        return int(pathPart) 
     502 
    497503    def makeValueFromMultiValueDict(self, multiValueDict): 
    498504        integerValue = multiValueDict[self.name] 
     
    621627                domainRegister = domainRegister.getAll() 
    622628        return domainRegister[key] 
     629 
     630    def resolvePathPart(self, pathPart): 
     631        return self.getObjectByKey(pathPart) 
    623632 
    624633 
  • trunk/src/dm/dom/registry.py

    r308 r413  
    1212import dm.times 
    1313 
     14 
    1415class DomainRegistry(AbstractList): 
    1516    "Holds top-level domain object registers." 
     
    2021        self.domainClassRegister = None 
    2122        self.backgroundObjectCache = [] 
     23        self.path = ModelPath(self) 
     24 
     25    def resolvePathPart(self, pathPart): 
     26        return getattr(self, pathPart) 
    2227 
    2328    def registerDomainClass(self, domainClass): 
     
    293298        self.registryPath = registryPath 
    294299 
     300    def getDomainObject(self): 
     301        objectRegister = self.getRegister() 
     302        optionsRegister = objectRegister.getOptionsRegister() 
     303        optionKey = self.getRegistryPathNames()[-1] 
     304        selectedOption = optionsRegister[optionKey] 
     305        return objectRegister[selectedOption] 
     306 
    295307    def getRegister(self): 
    296308        if self.isRegistryPathToRegister(): 
     
    326338 
    327339 
    328  
     340class ModelPath(object): 
     341 
     342    def __init__(self, modelRegistry): 
     343        self.registry = modelRegistry 
     344 
     345    def open(self, registryPath): 
     346        """ 
     347        Return model object for model path. 
     348        """ 
     349        modelObj = self.registry 
     350        for pathPart in registryPath.split('/'): 
     351            if pathPart == '': 
     352                continue 
     353            modelObj = modelObj.resolvePathPart(pathPart) 
     354        return modelObj 
     355 
  • trunk/src/dm/dom/registrytest.py

    r274 r413  
    22from dm.dom.basetest import TestCase 
    33from dm.dom.registry import RegistryPathGetter 
     4from dm.dom.registry import ModelPath  
     5from dm.dom.base import DomainObject 
    46 
    57def suite(): 
    68    suites = [ 
     9        unittest.makeSuite(TestSessionsPath), 
     10        unittest.makeSuite(TestRolesPath), 
     11        unittest.makeSuite(TestRolePath), 
     12        unittest.makeSuite(TestProtectionObjectsPath), 
     13        unittest.makeSuite(TestGrantsPath), 
     14        unittest.makeSuite(TestRoleGrantsPath), 
     15        unittest.makeSuite(TestRoleGrantPath1), 
     16        unittest.makeSuite(TestRoleGrantPath2), 
     17        unittest.makeSuite(TestRoleGrantPermissionPath1), 
     18        unittest.makeSuite(TestRoleGrantPermissionActionPath1), 
    719        unittest.makeSuite(TestRegistryPathGetter1), 
    820        unittest.makeSuite(TestRegistryPathGetter2), 
     
    1022    return unittest.TestSuite(suites) 
    1123 
     24 
     25class ModelPathTestCase(TestCase): 
     26 
     27    openIsDomainObject = False 
     28 
     29    def setUp(self): 
     30        try: 
     31            del(self.registry.sessions['TestPath1']) 
     32        except: 
     33            pass 
     34        try: 
     35            del(self.registry.protectionObjects['TestPath1']) 
     36        except: 
     37            pass 
     38        try: 
     39            del(self.registry.sessions['TestPath1']) 
     40        except: 
     41            pass 
     42        self.session1 = self.registry.sessions.create('TestPath1') 
     43        self.protectionObject1 = self.registry.protectionObjects.create('TestPath1') 
     44        self.role1 = self.registry.roles.create('TestPath1') 
     45        self.path = ModelPath(self.registry) 
     46 
     47    def tearDown(self): 
     48        self.path = None 
     49        self.role1.delete() 
     50        self.protectionObject1.delete() 
     51        self.session1.delete() 
     52 
     53    def test_open(self): 
     54        o = self.path.open(self.openPath) 
     55        if self.openIsDomainObject: 
     56            self.failUnless(isinstance(o, DomainObject)) 
     57            self.failUnlessEqual(o.meta.name, self.openTypeName) 
     58        else: 
     59            self.failUnlessEqual(o.typeName, self.openTypeName) 
     60 
     61 
     62class TestSessionsPath(ModelPathTestCase): 
     63 
     64    openPath = 'sessions' 
     65    openTypeName = 'Session' 
     66 
     67 
     68class TestRolesPath(ModelPathTestCase): 
     69 
     70    openPath = 'roles' 
     71    openTypeName = 'Role' 
     72 
     73 
     74class TestProtectionObjectsPath(ModelPathTestCase): 
     75 
     76    openPath = 'protectionObjects' 
     77    openTypeName = 'ProtectionObject' 
     78 
     79 
     80class TestGrantsPath(ModelPathTestCase): 
     81 
     82    openPath = 'grants' 
     83    openTypeName = 'Grant' 
     84 
     85 
     86class TestRolePath(ModelPathTestCase): 
     87 
     88    openIsDomainObject = True 
     89    openPath = 'roles/Administrator' 
     90    openTypeName = 'Role' 
     91 
     92 
     93class TestRoleGrantsPath(ModelPathTestCase): 
     94 
     95    openPath = 'roles/Administrator/grants' 
     96    openTypeName = 'Grant' 
     97 
     98 
     99class TestRoleGrantPath1(ModelPathTestCase): 
     100 
     101    openIsDomainObject = True 
     102    openPath = 'roles/Administrator/grants/1' 
     103    openTypeName = 'Grant' 
     104 
     105 
     106class TestRoleGrantPath2(ModelPathTestCase): 
     107 
     108    openIsDomainObject = True 
     109    openPath = 'roles/Administrator/grants/9' 
     110    openTypeName = 'Grant' 
     111 
     112 
     113class TestRoleGrantPermissionPath1(ModelPathTestCase): 
     114 
     115    openIsDomainObject = True 
     116    openPath = 'roles/Administrator/grants/9/permission' 
     117    openTypeName = 'Permission' 
     118 
     119 
     120class TestRoleGrantPermissionActionPath1(ModelPathTestCase): 
     121 
     122    openIsDomainObject = True 
     123    openPath = 'roles/Administrator/grants/24/permission/action/permissions/Person' 
     124    openTypeName = 'Permission' 
     125 
     126 
     127 
     128 
     129### Older way. 
    12130 
    13131class TestRegistryPathGetter1(TestCase): 
  • trunk/src/dm/exceptions.py

    r402 r413  
    1616 
    1717class DataMigrationError(DomainModelApplicationError): pass 
     18 
     19class MissingMethodError(DomainModelApplicationError): pass 
    1820 
    1921class MissingPluginSystem(DomainModelApplicationError): pass 
  • trunk/src/dm/strategy.py

    r188 r413  
    33from dm.exceptions import KforgeSessionCookieValueError 
    44import md5 
    5  
     5from dm.dom.base import DomainObject, DomainObjectRegister 
    66moddebug = False 
    77 
     
    4040            className = self.protectedObject.__name__ 
    4141            protectedNames.append(className) 
    42         else: 
     42        elif isinstance(self.protectedObject, DomainObjectRegister): 
     43            if moddebug and self.debug: 
     44                self.logger.debug('Making protected name for register: %s' % self.protectedObject) 
     45            className = self.protectedObject.typeName 
     46            protectedNames.append(className) 
     47        elif isinstance(self.protectedObject, DomainObject): 
    4348            if moddebug and self.debug: 
    4449                self.logger.debug('Making protected names for instance: %s' % self.protectedObject) 
     
    4853            protectedNames.append(instanceName) 
    4954            protectedNames.append(className) 
    50         if not protectedNames: 
    51             msg = "No protected names derived from protection object: %s" % ( 
    52                 self.protectedObject 
    53             ) 
    54             raise Exception, msg 
    55         elif moddebug and self.debug: 
     55        else: 
     56            protectedNames.append('System') 
     57        if moddebug and self.debug: 
    5658            self.logger.debug('Made protected names: %s' % protectedNames) 
    5759        return protectedNames 
     
    8688                protection = self.registry.protectionObjects[name] 
    8789                protectionObjects.append(protection) 
    88         if not protectionObjects: 
    89             raise Exception, "No protection for %s (protected names: %s)" % ( 
    90                 self.protectedObject, protectedNames 
    91             ) 
     90        # Todo: Log this, and just return empty list. 
     91        #if not protectionObjects: 
     92        #    raise Exception, "No protection for %s (protected names: %s)" % ( 
     93        #        self.protectedObject, protectedNames 
     94        #    ) 
    9295        return protectionObjects 
    9396 
  • trunk/src/dm/view/base.py

    r390 r413  
    2121class ControlledAccessView(object): 
    2222 
     23    responseStatusCode = 200 
    2324    accessController = RequiredFeature('AccessController') 
    2425    dictionary       = RequiredFeature('SystemDictionary') 
     
    561562                if webkitName == 'django': 
    562563                    self.response = HttpResponse(self.content) 
     564                    self.response.status_code = self.responseStatusCode 
    563565                elif webkitName == 'pylons': 
    564566                    self.response = self.content 
  • trunk/src/dm/view/rpc.py

    r286 r413  
    173173    def runProcedure(self): 
    174174        queryString = self.getRequestParam(self.queryName) 
    175         self.logger.debug("Appender queryString: %s" % queryString) 
     175        self.logger.debug("Autocompleter queryString: %s" % queryString) 
    176176        registryPath = self.getRequestParam('registryPath') 
    177         self.logger.debug("Appender registryPath: %s" % registryPath) 
     177        self.logger.debug("Autocompleter registryPath: %s" % registryPath) 
    178178        if registryPath: 
    179179            self.message = self.completer.complete(queryString, registryPath) 
     
    184184 
    185185 
    186 class RegistryAutoappenderView(JsonView): 
    187  
     186class RegistryAutopathView(JsonView): 
     187 
     188    modelObject = None 
    188189    registryPath = None 
     190 
     191    def canAccess(self): 
     192        return self.canUpdate(self.getModelObject()) or self.canUpdateSystem() 
     193 
     194    def getModelObject(self): 
     195        if not self.modelObject: 
     196            registryPath = self.getRegistryPath() 
     197            o = self.registry.path.open(registryPath) 
     198            self.modelObject = o 
     199        return self.modelObject 
     200 
     201    def getRegistryPath(self): 
     202        if self.registryPath == None: 
     203            registryPath = self.getRequestParam('registryPath') 
     204            if not registryPath: 
     205                raise Exception, "No registryPath in request." 
     206            if registryPath[0] == '#': 
     207                registryPath = registryPath[1:] 
     208            self.logger.debug("Appender registryPath: %s" % registryPath) 
     209            self.registryPath = registryPath 
     210        return self.registryPath 
     211 
     212 
     213class RegistryAutoappenderView(RegistryAutopathView): 
     214 
    189215    objectRegister = None 
    190216    targetAttribute = None 
    191217    completedString = None 
    192218    pathGetter = None 
    193  
    194     def canAccess(self): 
    195         if self.getPathGetter().isRegistryPathToRegister(): 
    196             register = self.getObjectRegister() 
    197             if register.owner != None: 
    198                 return self.canUpdate(register.owner) 
    199             else: 
    200                 return self.canUpdate(register.getDomainClass()) 
    201         else: 
    202             domainObject = self.getPathGetter().getDomainObject() 
    203             return self.canUpdate(domainObject) 
    204         return False 
    205219 
    206220    def runProcedure(self): 
     
    256270        return self.completedString 
    257271 
    258     def getRegistryPath(self): 
    259         if self.registryPath == None: 
    260             registryPath = self.getRequestParam('registryPath') 
    261             self.logger.debug("Appender registryPath: %s" % registryPath) 
    262             if not registryPath: 
    263                 raise Exception, "No registryPath in request." 
    264             self.registryPath = registryPath 
    265         return self.registryPath 
    266  
    267272    def getTargetAttribute(self): 
    268273        if self.targetAttribute == None: 
     
    274279        return self.targetAttribute 
    275280 
     281 
     282class RegistryAutodeleteView(RegistryAutopathView): 
     283 
     284    def runProcedure(self): 
     285        self.getModelObject().delete() 
     286        self.message = 'OK' 
     287     
     288 
  • trunk/src/dm/view/rpctest.py

    r279 r413  
    66from dm.view.rpc import Autocompleter, RegistryAutocompleter 
    77from dm.view.rpc import RegistryAutoappenderView 
     8from dm.view.rpc import RegistryAutodeleteView 
    89import simplejson 
    910 
     
    1819        unittest.makeSuite(TestRegistryAutocompleterView), 
    1920        unittest.makeSuite(TestRegistryAutoappenderView), 
     21        unittest.makeSuite(TestRegistryAutodeleteView), 
    2022    ] 
    2123    return unittest.TestSuite(suites) 
     
    183185    pass 
    184186 
     187 
     188class AutodeleteViewTestCase(JsonViewTestCase): 
     189 
     190    viewClass = RegistryAutodeleteView 
     191    registryPath = None 
     192    requiredResponseContent = None 
     193 
     194    def initPost(self): 
     195        self.POST['registryPath'] = self.registryPath 
     196 
     197    def setUp(self): 
     198        while 'TestRegistryAutoappend' in self.registry.persons: 
     199            del(self.registry.persons['TestRegistryAutoappend']) 
     200        while 'RegistryAutoappend1' in self.registry.sessions: 
     201            del(self.registry.sessions['RegistryAutoappend1']) 
     202        while 'RegistryAutoappend2' in self.registry.sessions: 
     203            del(self.registry.sessions['RegistryAutoappend2']) 
     204        while 'RegistryAutoappend3' in self.registry.sessions: 
     205            del(self.registry.sessions['RegistryAutoappend3']) 
     206        persons = self.registry.persons 
     207        self.person = persons.create('TestRegistryAutoappend') 
     208        sessions = self.person.sessions 
     209        self.session1 = sessions.create('RegistryAutoappend1') 
     210        self.session2 = sessions.create('RegistryAutoappend2') 
     211        registerKey = self.person.getRegisterKeyValue() 
     212        self.registryPath = 'persons/%s/sessions/%s' % ( 
     213            registerKey, 'RegistryAutoappend1') 
     214        super(AutodeleteViewTestCase, self).setUp() 
     215 
     216    def tearDown(self): 
     217        super(AutodeleteViewTestCase, self).tearDown() 
     218        while 'RegistryAutoappend3' in self.registry.sessions: 
     219            del(self.registry.sessions['RegistryAutoappend3']) 
     220        while 'RegistryAutoappend2' in self.registry.sessions: 
     221            del(self.registry.sessions['RegistryAutoappend2']) 
     222        while 'RegistryAutoappend1' in self.registry.sessions: 
     223            del(self.registry.sessions['RegistryAutoappend1']) 
     224        while 'TestRegistryAutoappend' in self.registry.persons: 
     225            del(self.registry.persons['TestRegistryAutoappend']) 
     226 
     227    def checkResponseContent(self): 
     228        self.failIf('RegistryAutoappend1' in self.person.sessions, self.person.sessions.keys())  
     229        self.failUnless('RegistryAutoappend2' in self.person.sessions)  
     230        self.requiredResponseContent = '"OK"' 
     231        self.failUnlessResponseContent() 
     232         
     233 
     234 
     235class TestRegistryAutodeleteView(AutodeleteViewTestCase): 
     236 
     237    pass 
     238