Changeset 45
- Timestamp:
- 08/26/06 10:30:22 (2 years ago)
- Files:
-
- trunk/bin/domainmodel-profiletest (added)
- trunk/etc/domainmodel.conf.new (modified) (3 diffs)
- trunk/src/dm/accesscontrol.py (modified) (5 diffs)
- trunk/src/dm/db.py (modified) (9 diffs)
- trunk/src/dm/dictionary.py (modified) (1 diff)
- trunk/src/dm/dom/accesscontrol.py (modified) (6 diffs)
- trunk/src/dm/dom/base.py (modified) (3 diffs)
- trunk/src/dm/dom/builder.py (modified) (2 diffs)
- trunk/src/dm/dom/meta.py (modified) (2 diffs)
- trunk/src/dm/dom/plugin.py (modified) (1 diff)
- trunk/src/dm/dom/state.py (modified) (1 diff)
- trunk/src/dm/dom/stateful.py (modified) (1 diff)
- trunk/src/dm/testrunner.py (added)
- trunk/src/dm/view/manipulator.py (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/etc/domainmodel.conf.new
r43 r45 1 1 ## Please Note: This file is a meant as a starting point for a configuration file for a 2 new dm application. It is also used to setup development of the dm package.2 #new dm application. It is also used to setup development of the dm package. 3 3 4 4 [DEFAULT] … … 20 20 # plugin_data_dir: 21 21 # * path to plugin filesystems 22 plugin_data_dir = / tmp/domainmodel_testing/plugin_data22 plugin_data_dir = /path/to/domainmdoel/var/plugin_data 23 23 24 24 # domain_name: … … 30 30 # log_file: 31 31 # * service log file 32 log_file = %(system_name)s.log32 log_file = /path/to/domainmodel/var/log/domainmodel.log 33 33 34 34 # level: trunk/src/dm/accesscontrol.py
r32 r45 1 1 from dm.ioc import RequiredFeature 2 2 from dm.exceptions import * 3 from dm.dictionarywords import VISITOR_NAME 3 4 4 5 class AbstractAccessController(object): … … 10 11 debug = RequiredFeature('Debug') 11 12 13 def __init__(self): 14 self.visitor = None 15 16 def getVisitor(self): 17 if self.visitor == None: 18 visitorName = self.dictionary[VISITOR_NAME] 19 self.visitor = self.registry.persons[visitorName] 20 return self.visitor 21 12 22 def isAuthorised(self, person=None, actionName='', protectedObject=None): 23 if not actionName: 24 return False 25 if not protectedObject: 26 return False 13 27 self.setPerson(person) 14 self.actionName = actionName 15 self.protectedObject = protectedObject 16 if not self.validateInput(): 17 if self.debug: 18 self.logger.debug("Access denied: Invalid input.") 19 return False 28 self.setAction(actionName) 29 self.setProtectedObject(protectedObject) 20 30 if self.hasAuthorisedRole(): 21 31 if self.debug: … … 34 44 return False 35 45 36 def setPerson(self, person ):37 if person == None:38 personName = self.dictionary['visitor']39 person = self.registry.persons[personName]40 self.person = person46 def setPerson(self, person=None): 47 if person != None: 48 self.person = person 49 else: 50 self.person = self.getVisitor() 41 51 42 def validateInput(self): 43 if not self.person: 44 if self.debug: 45 self.logger.debug( 46 "No person for access controller." 47 ) 48 return False 49 if not self.actionName: 50 if self.debug: 51 self.logger.debug( 52 "No action name for access controller." 53 ) 54 return False 55 if not self.actionName in self.registry.actions: 56 if self.debug: 57 self.logger.debug( 58 "Action name '%s' not registered." % self.actionName 59 ) 60 return False 52 def setAction(self, actionName): 53 self.actionName = actionName 61 54 self.action = self.registry.actions[self.actionName] 62 if not self.action: 63 if self.debug: 64 self.logger.debug( 65 "No action for access controller." 66 ) 67 return False 68 if not self.protectedObject: 69 if self.debug: 70 self.logger.debug( 71 "No protected object for access controller." 72 ) 73 return False 74 return True 55 56 def setProtectedObject(self, protectedObject): 57 self.protectedObject = protectedObject 58 self.makeProtectedNames() 59 self.setProtectionObject() 75 60 76 61 def hasAuthorisedRole(self): 77 62 message = "Abstract method not implemented on: %s" % str(self) 78 63 raise Exception(message) 79 64 80 65 def isRoleAuthorised(self, role): 66 permission = self.protectionObject.permissions[self.action] 67 if role in permission.grants: 68 if self.debug: 69 msg = "Access by role authorised: '%s' to '%s' with '%s'." % (role.name, self.actionName, self.protectedObject) 70 self.logger.debug(msg) 71 return True 72 else: 73 if self.debug: 74 msg = "Access by role not authorised: '%s' to '%s' with '%s'." % (role.name, self.actionName, self.protectedObject) 75 self.logger.debug(msg) 76 return False 77 78 def ____isRoleAuthorised(self, role): 81 79 for grant in role.grants: 82 80 permission = grant.permission … … 90 88 return False 91 89 90 def makeProtectedNames(self): 91 self.protectedNames = [] 92 if self.protectedObject.__class__ == type: 93 className = self.protectedObject.__name__ 94 self.protectedNames.append(className) 95 else: 96 className = self.protectedObject.__class__.__name__ 97 keyValue = self.protectedObject.getRegisterKeyValue() 98 self.protectedNames.append(className + "." + str(keyValue)) 99 self.protectedNames.append(className) 100 if not self.protectedNames: 101 raise "No protected names derived from protection object." 102 103 def setProtectionObject(self): 104 protectionObjects = self.registry.protectionObjects 105 for name in self.protectedNames: 106 if name in protectionObjects: 107 self.protectionObject = protectionObjects[name] 108 return 109 raise "No protection object available for %s" % self.protectedNames 110 92 111 93 112 class SystemAccessController(AbstractAccessController): … … 95 114 96 115 def hasAuthorisedRole(self): 97 if self.isPersonBarred():98 return False99 if self.isPersonAuthorised():100 return True101 116 if self.isSystemRoleAuthorised(): 102 117 return True 118 #if self.isPersonAuthorised(): 119 # return True 120 #if self.isPersonBarred(): 121 # return False 103 122 return False 104 123 trunk/src/dm/db.py
r2 r45 102 102 else: 103 103 record = records 104 if debug: 105 logger.debug('Found %s record from database.' % (className)) 104 106 return record 105 107 … … 129 131 recordClass = self.getRecordClass(className) 130 132 if self.isSelectById(kwds): 131 re turnrecordClass.selectByKeywordsWithId(**kwds)133 records = recordClass.selectByKeywordsWithId(**kwds) 132 134 elif self.isSelectByTimeInterval(kwds): 133 re turnrecordClass.selectByKeywordsWithTimeInterval(**kwds)135 records = recordClass.selectByKeywordsWithTimeInterval(**kwds) 134 136 else: 135 return recordClass.selectByKeywords(**kwds) 137 records = recordClass.selectByKeywords(**kwds) 138 return records 136 139 137 140 def startsWith(self, className, value, attributeName, **kwds): … … 154 157 else: 155 158 records = self.getRecordClass(className).select() 159 if debug: 160 logger.debug('Listed %s records from database.' % (className)) 156 161 return records 157 162 … … 437 442 loadedList = dict() 438 443 if not self.domainObject: 439 if debug:440 message = "Rebuilding domain object from db record: %s" % self441 logger.debug(message)442 444 obj = self.createDomainObject() 443 445 self.domainObject = obj 444 446 self.domainObject.record = self 445 447 if debug: 446 message = " Loading from db record: %s" % self448 message = "Record returned newly instantiated %s." % self.getClassName() 447 449 logger.debug(message) 448 450 self.loadDomainObject(loadedList, sync=False) … … 451 453 if not self.domainObject in loadedList: 452 454 if debug: 453 message = "Re loading from db record: %s" % self455 message = "Record loads existing %s instance with values." % self.getClassName() 454 456 logger.debug(message) 455 457 self.loadDomainObject(loadedList) 456 458 else: 457 459 if debug: 458 message = " Cyclic reload avoided for db record: %s" % self460 message = "Loaded %s record avoids loading loop." % self.getClassName() 459 461 logger.debug(message) 460 462 else: 461 463 if debug: 462 message = " Using cached db record values: %s" % self464 message = "Record returned %s with existing values." % self.getClassName() 463 465 logger.debug(message) 464 466 return self.domainObject … … 473 475 return domainObject 474 476 477 def getClassName(self): 478 return self.__class__.__name__ 479 475 480 def getDomainClass(self): 476 481 "Returns mapper's synonymous domain model class." 477 className = self. __class__.__name__482 className = self.getClassName() 478 483 registry = RequiredFeature('DomainRegistry') 479 484 return registry.getDomainClass(className) … … 483 488 if sync: 484 489 if debug: 485 message = "Synchronising db record with database. %s" % self490 message = "Synchronising mapper values with RDBMS." 486 491 logger.debug(message) 487 492 self.sync() 493 elif sync: 494 if debug: 495 message = "Not synchronising mapper values with RDBMS." 496 logger.debug(message) 497 if debug: 498 message = "Loading domain object values from mapper." 499 logger.debug(message) 488 500 self.domainObject.id = self.id 489 501 for metaAttr in self.meta.attributes: … … 501 513 setattr(self.domainObject, domName, mappedValue) 502 514 loadedList[self.domainObject] = self.domainObject 503 if debug:504 message = "Updated domain object from db record. %s" % self505 logger.debug(message)506 515 507 516 def saveDomainObject(self): 508 517 "Sets attributes of record object from domain object." 518 isChanged = False 509 519 for metaAttr in self.meta.attributes: 510 isChanged = False511 520 if metaAttr.isDomainObjectRef: 512 521 domainObject = getattr(self.domainObject, metaAttr.domName) … … 525 534 setattr(self, metaAttr.dbName, domValue) 526 535 isChanged = True 527 if isChanged: 528 if debug: 529 message = "Updating database with db record: %s" % self 530 logger.debug(message) 531 self.syncUpdate() 532 if debug: 533 message = "Updated db record from domain object: %s" % self 534 logger.debug(message) 536 if isChanged: 537 if debug: 538 message = "Updating RDBMS with %s mapper value." % ( 539 self.meta.domName 540 ) 541 logger.debug(message) 542 self.syncUpdate() 535 543 536 544 def coerceKwds(self, kwds): trunk/src/dm/dictionary.py
r43 r45 41 41 self[AUTH_COOKIE_NAME] = '%s_auth' % self[SYSTEM_NAME] 42 42 self[NO_AUTH_COOKIE_NAME] = '%s_no_auth' % self[SYSTEM_NAME] 43 self[LOG_LEVEL] = 'INFO' 43 44 44 45 def makeConfigFilePath(self): trunk/src/dm/dom/accesscontrol.py
r2 r45 5 5 "Registered granted permission. Associates a Role and a Permission." 6 6 7 isConstant = True7 # isConstant = True 8 8 permission = HasA('Permission') 9 9 role = HasA('Role') … … 34 34 isConstant = True 35 35 # define aggregates 36 permissions = HasMany('Permission', 'protectionObject')36 permissions = AggregatesMany('Permission', 'protectionObject') 37 37 38 38 def initialise(self, register): … … 41 41 for protectionObject in self.registry.protectionObjects: 42 42 self.permissions.create(protectionObject) 43 44 def delete(self):45 # delete aggregates46 for permission in self.permissions:47 permission.delete()48 super(Action, self).delete()49 43 50 44 … … 55 49 """ 56 50 51 # isConstant = True 57 52 action = HasA('Action') 58 53 protectionObject = HasA('ProtectionObject') 59 grants = HasMany('Grant', 'role') # aggregates60 personalGrants = HasMany('PersonalGrant', 'person') # aggregates61 personalBars = HasMany('PersonalBar', 'person') # aggregates54 grants = AggregatesMany('Grant', 'role') 55 personalGrants = AggregatesMany('PersonalGrant', 'person') 56 personalBars = AggregatesMany('PersonalBar', 'person') 62 57 63 def delete(self):64 # delete aggregates65 for grant in self.grants:66 grant.delete()67 for personalGrant in self.personalGrants:68 personalGrant.delete()69 for personalBar in self.personalBars:70 personalBar.delete()71 super(Permission, self).delete()72 73 58 def getLabelValue(self): 74 59 return "%s-%s" % ( … … 81 66 "Protects a protected object with a protected name." 82 67 83 isConstant = True 84 # define aggregates 85 permissions = HasMany('Permission', 'action') 68 # isConstant = True 69 permissions = AggregatesMany('Permission', 'action') 86 70 87 71 def isProtector(self, protectedObject): … … 122 106 self.permissions.create(action) 123 107 124 def delete(self):125 # delete aggregates126 for permission in self.permissions:127 permission.delete()128 super(ProtectionObject, self).delete()129 trunk/src/dm/dom/base.py
r29 r45 124 124 125 125 def __repr__(self): 126 count = self.count()127 126 className = self.__class__.__name__ 128 127 typeName = self.typeName 129 128 keyName = self.keyName 130 return "<%s count='%d' typeName='%s' keyName='%s'>" % ( 131 className, count, typeName, keyName) 129 return "<%s typeName='%s' keyName='%s'>" % ( 130 className, typeName, keyName 131 ) 132 132 133 133 def retrieveItem(self, key): … … 406 406 if self.meta: 407 407 for attr in self.meta.attributes: 408 attrsRepr += " " + attr.createObjectRepr(self) 408 if attr.isValueRef: 409 attrsRepr += " " + attr.createObjectRepr(self) 409 410 className = self.__class__.__name__ 410 411 return "<%s id='%s'%s>" % (className, str(self.id), attrsRepr) … … 489 490 self.record = None 490 491 492 def purgeAggregates(self): 493 for metaAttr in self.meta.attributes: 494 if metaAttr.isAggregation(): 495 if metaAttr.isList(): 496 self.purgeAggregateList(metaAttr.name) 497 498 def purgeAggregateList(self, attrName): 499 aggregateRegister = getattr(self, attrName) 500 for aggregateObject in aggregateRegister: 501 aggregateObject.purge() 502 491 503 def decacheItem(self): 492 504 for register in self.registerCache.keys(): trunk/src/dm/dom/builder.py
r2 r45 43 43 self.registry.registerDomainClass(ProtectionObject) 44 44 45 self.registry.grants = Grant.createRegister() 45 46 self.registry.roles = Role.createRegister() 46 47 self.registry.actions = Action.createRegister() 48 self.registry.permissions = Permission.createRegister() 47 49 self.registry.protectionObjects = ProtectionObject.createRegister() 48 50 49 51 self.registry.loadBackgroundRegister(self.registry.roles) 50 52 self.registry.loadBackgroundRegister(self.registry.actions) 51 self.registry.loadBackgroundRegister(self.registry.protectionObjects)52 53 53 54 def loadPerson(self): … … 62 63 self.registry.registerDomainClass(PersonalBar) 63 64 65 64 66 def loadSession(self): 65 67 from dm.dom.session import Session trunk/src/dm/dom/meta.py
r29 r45 246 246 class DomainObjectAssociation(MetaDomainAttr): 247 247 "Associates domain objects with other domain objects." 248 249 def countChoices(self, domainObject): 250 if callable(self.getChoices): 251 return len(self.getChoices(domainObject)) 252 else: 253 return len(self.getAssociatedObjectRegister(domainObject)) 248 254 249 255 def getAllChoices(self, domainObject): … … 373 379 return True 374 380 381 def countChoices(self, domainObject): 382 associateRegister = self.getAssociatedObjectRegister(domainObject) 383 return len(associateRegister) 384 375 385 def getAllChoices(self, domainObject): 376 386 choices = [] trunk/src/dm/dom/plugin.py
r2 r45 6 6 return domainRegistry.projects 7 7 8 #class Plugin(SimpleNamedObject):9 8 class Plugin(StandardObject): 10 9 "Registered plugin." trunk/src/dm/dom/state.py
r2 r45 58 58 def purgeObject(self, object): 59 59 object.raisePurge() 60 object.purgeAggregates() 60 61 object.decacheItem() 61 62 object.state = None 62 63 object.destroySelf() 64 65 63 66 64 67 def getBehaviour(self): trunk/src/dm/dom/stateful.py
r2 r45 222 222 self.page = page 223 223 self.pageKeys = pageKeys 224 225 def countChoices(self, domainObject): 226 associateRegister = self.getAssociatedObjectRegister(domainObject) 227 return len(associateRegister) 224 228 225 229 def getAllChoices(self, domainObject): trunk/src/dm/view/manipulator.py
r29 r45 84 84 isFieldRequired = metaAttr.isRequired 85 85 if metaAttr.isAssociateList: 86 choices = metaAttr.getAllChoices(self.domainObject) 87 field = djangoforms.SelectMultipleField( 88 field_name=metaAttr.name, 89 is_required=isFieldRequired, 90 choices=choices, 91 size=4, 92 ) 93 elif metaAttr.isDomainObjectRef: 94 choices = metaAttr.getAllChoices(self.domainObject) 95 choices = [('', '-- select option --')] + choices 96 if len(choices) <= 50: 97 field = djangoforms.SelectField( 86 countChoices = metaAttr.countChoices(self.domainObject) 87 if countChoices <= 50: 88 choices = metaAttr.getAllChoices(self.domainObject) 89 field = djangoforms.SelectMultipleField( 98 90 field_name=metaAttr.name, 99 91 is_required=isFieldRequired, 100 92 choices=choices, 93 size=4, 101 94 ) 102 95 else: 103 96 field = djangoforms.TextField( 104 97 field_name=metaAttr.name, 105 is_required=metaAttr.isRequired, 98 is_required=isFieldRequired, 99 ) 100 101 elif metaAttr.isDomainObjectRef: 102 countChoices = metaAttr.countChoices(self.domainObject) 103 if countChoices <= 50: 104 choices = metaAttr.getAllChoices(self.domainObject) 105 choices = [('', '-- select option --')] + choices 106 field = djangoforms.SelectField( 107 field_name=metaAttr.name, 108 is_required=isFieldRequired, 109 choices=choices, 110 ) 111 else: 112 field = djangoforms.TextField( 113 field_name=metaAttr.name, 114 is_required=isFieldRequired, 106 115 ) 107 116 elif metaAttr.isValueObject(): … … 109 118 field = djangoforms.LargeTextField( 110 119 field_name=metaAttr.name, 111 is_required= metaAttr.isRequired,120 is_required=isFieldRequired, 112 121 ) 113 122 elif metaAttr.typeName == 'Password': 114 123 field = djangoforms.PasswordField( 115 124 field_name=metaAttr.name, 116 is_required= metaAttr.isRequired,125 is_required=isFieldRequired, 117 126 ) 118 127 elif metaAttr.typeName == 'Integer': 119 128 field = djangoforms.IntegerField( 120 129 field_name=metaAttr.name, 121 is_required= metaAttr.isRequired,130 is_required=isFieldRequired, 122 131 ) 123 132 elif metaAttr.typeName == 'Url': 124 133 field = djangoforms.URLField( 125 134 field_name=metaAttr.name, 126 is_required= metaAttr.isRequired,135 is_required=isFieldRequired, 127 136 ) 128 137 elif metaAttr.typeName == 'DateTime': 129 138 field = djangoforms.DatetimeField( 130 139 field_name=metaAttr.name, 131 is_required= metaAttr.isRequired,140 is_required=isFieldRequired, 132 141 ) 133 142 elif metaAttr.typeName == 'Date': 134 143 field = djangoforms.DateField( 135 144 field_name=metaAttr.name, 136 is_required= metaAttr.isRequired,145 is_required=isFieldRequired, 137 146 ) 138 147 else: 139 148 field = djangoforms.TextField( 140 149 field_name=metaAttr.name, 141 is_required= metaAttr.isRequired,150 is_required=isFieldRequired, 142 151 ) 143 152 if field:
