Changeset 413
- Timestamp:
- 10/16/08 11:57:55 (3 months ago)
- Files:
-
- trunk/src/dm/dom/base.py (modified) (3 diffs)
- trunk/src/dm/dom/meta.py (modified) (4 diffs)
- trunk/src/dm/dom/registry.py (modified) (4 diffs)
- trunk/src/dm/dom/registrytest.py (modified) (2 diffs)
- trunk/src/dm/exceptions.py (modified) (1 diff)
- trunk/src/dm/strategy.py (modified) (4 diffs)
- trunk/src/dm/view/base.py (modified) (2 diffs)
- trunk/src/dm/view/rpc.py (modified) (4 diffs)
- trunk/src/dm/view/rpctest.py (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/src/dm/dom/base.py
r374 r413 20 20 registry = RequiredFeature('DomainRegistry') 21 21 pluginController = RequiredFeature('PluginController') 22 23 def resolvePathPart(self, pathPart): 24 return getattr(self, pathPart) 22 25 23 26 … … 148 151 ) 149 152 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 150 164 def retrieveItem(self, key): 151 165 "Attempts to retrieve existing domain object from database." … … 411 425 keyName = 'id' 412 426 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 413 436 414 437 def getStartsWithAttributeName(self): trunk/src/dm/dom/meta.py
r375 r413 17 17 import os 18 18 import inspect 19 19 from dm.exceptions import * 20 20 moddebug = False 21 21 … … 46 46 logger = RequiredFeature('Logger') 47 47 debug = RequiredFeature('Debug') 48 49 def resolvePathPart(self, pathPart): 50 return pathPart 48 51 49 52 def calcTitle(self): … … 495 498 super(Integer, self).__init__(default=default, **kwds) 496 499 500 def resolvePathPart(self, pathPart): 501 return int(pathPart) 502 497 503 def makeValueFromMultiValueDict(self, multiValueDict): 498 504 integerValue = multiValueDict[self.name] … … 621 627 domainRegister = domainRegister.getAll() 622 628 return domainRegister[key] 629 630 def resolvePathPart(self, pathPart): 631 return self.getObjectByKey(pathPart) 623 632 624 633 trunk/src/dm/dom/registry.py
r308 r413 12 12 import dm.times 13 13 14 14 15 class DomainRegistry(AbstractList): 15 16 "Holds top-level domain object registers." … … 20 21 self.domainClassRegister = None 21 22 self.backgroundObjectCache = [] 23 self.path = ModelPath(self) 24 25 def resolvePathPart(self, pathPart): 26 return getattr(self, pathPart) 22 27 23 28 def registerDomainClass(self, domainClass): … … 293 298 self.registryPath = registryPath 294 299 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 295 307 def getRegister(self): 296 308 if self.isRegistryPathToRegister(): … … 326 338 327 339 328 340 class 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 2 2 from dm.dom.basetest import TestCase 3 3 from dm.dom.registry import RegistryPathGetter 4 from dm.dom.registry import ModelPath 5 from dm.dom.base import DomainObject 4 6 5 7 def suite(): 6 8 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), 7 19 unittest.makeSuite(TestRegistryPathGetter1), 8 20 unittest.makeSuite(TestRegistryPathGetter2), … … 10 22 return unittest.TestSuite(suites) 11 23 24 25 class 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 62 class TestSessionsPath(ModelPathTestCase): 63 64 openPath = 'sessions' 65 openTypeName = 'Session' 66 67 68 class TestRolesPath(ModelPathTestCase): 69 70 openPath = 'roles' 71 openTypeName = 'Role' 72 73 74 class TestProtectionObjectsPath(ModelPathTestCase): 75 76 openPath = 'protectionObjects' 77 openTypeName = 'ProtectionObject' 78 79 80 class TestGrantsPath(ModelPathTestCase): 81 82 openPath = 'grants' 83 openTypeName = 'Grant' 84 85 86 class TestRolePath(ModelPathTestCase): 87 88 openIsDomainObject = True 89 openPath = 'roles/Administrator' 90 openTypeName = 'Role' 91 92 93 class TestRoleGrantsPath(ModelPathTestCase): 94 95 openPath = 'roles/Administrator/grants' 96 openTypeName = 'Grant' 97 98 99 class TestRoleGrantPath1(ModelPathTestCase): 100 101 openIsDomainObject = True 102 openPath = 'roles/Administrator/grants/1' 103 openTypeName = 'Grant' 104 105 106 class TestRoleGrantPath2(ModelPathTestCase): 107 108 openIsDomainObject = True 109 openPath = 'roles/Administrator/grants/9' 110 openTypeName = 'Grant' 111 112 113 class TestRoleGrantPermissionPath1(ModelPathTestCase): 114 115 openIsDomainObject = True 116 openPath = 'roles/Administrator/grants/9/permission' 117 openTypeName = 'Permission' 118 119 120 class 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. 12 130 13 131 class TestRegistryPathGetter1(TestCase): trunk/src/dm/exceptions.py
r402 r413 16 16 17 17 class DataMigrationError(DomainModelApplicationError): pass 18 19 class MissingMethodError(DomainModelApplicationError): pass 18 20 19 21 class MissingPluginSystem(DomainModelApplicationError): pass trunk/src/dm/strategy.py
r188 r413 3 3 from dm.exceptions import KforgeSessionCookieValueError 4 4 import md5 5 5 from dm.dom.base import DomainObject, DomainObjectRegister 6 6 moddebug = False 7 7 … … 40 40 className = self.protectedObject.__name__ 41 41 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): 43 48 if moddebug and self.debug: 44 49 self.logger.debug('Making protected names for instance: %s' % self.protectedObject) … … 48 53 protectedNames.append(instanceName) 49 54 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: 56 58 self.logger.debug('Made protected names: %s' % protectedNames) 57 59 return protectedNames … … 86 88 protection = self.registry.protectionObjects[name] 87 89 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 # ) 92 95 return protectionObjects 93 96 trunk/src/dm/view/base.py
r390 r413 21 21 class ControlledAccessView(object): 22 22 23 responseStatusCode = 200 23 24 accessController = RequiredFeature('AccessController') 24 25 dictionary = RequiredFeature('SystemDictionary') … … 561 562 if webkitName == 'django': 562 563 self.response = HttpResponse(self.content) 564 self.response.status_code = self.responseStatusCode 563 565 elif webkitName == 'pylons': 564 566 self.response = self.content trunk/src/dm/view/rpc.py
r286 r413 173 173 def runProcedure(self): 174 174 queryString = self.getRequestParam(self.queryName) 175 self.logger.debug("A ppender queryString: %s" % queryString)175 self.logger.debug("Autocompleter queryString: %s" % queryString) 176 176 registryPath = self.getRequestParam('registryPath') 177 self.logger.debug("A ppender registryPath: %s" % registryPath)177 self.logger.debug("Autocompleter registryPath: %s" % registryPath) 178 178 if registryPath: 179 179 self.message = self.completer.complete(queryString, registryPath) … … 184 184 185 185 186 class RegistryAutoappenderView(JsonView): 187 186 class RegistryAutopathView(JsonView): 187 188 modelObject = None 188 189 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 213 class RegistryAutoappenderView(RegistryAutopathView): 214 189 215 objectRegister = None 190 216 targetAttribute = None 191 217 completedString = None 192 218 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 False205 219 206 220 def runProcedure(self): … … 256 270 return self.completedString 257 271 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 = registryPath265 return self.registryPath266 267 272 def getTargetAttribute(self): 268 273 if self.targetAttribute == None: … … 274 279 return self.targetAttribute 275 280 281 282 class 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 6 6 from dm.view.rpc import Autocompleter, RegistryAutocompleter 7 7 from dm.view.rpc import RegistryAutoappenderView 8 from dm.view.rpc import RegistryAutodeleteView 8 9 import simplejson 9 10 … … 18 19 unittest.makeSuite(TestRegistryAutocompleterView), 19 20 unittest.makeSuite(TestRegistryAutoappenderView), 21 unittest.makeSuite(TestRegistryAutodeleteView), 20 22 ] 21 23 return unittest.TestSuite(suites) … … 183 185 pass 184 186 187 188 class 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 235 class TestRegistryAutodeleteView(AutodeleteViewTestCase): 236 237 pass 238
