Changeset 318
- Timestamp:
- 03/20/08 12:30:16 (9 months ago)
- Files:
-
- trunk/setup.py (modified) (1 diff)
- trunk/src/dm/__init__.py (modified) (1 diff)
- trunk/src/dm/db.py (modified) (18 diffs)
- trunk/src/dm/dom/accesscontrol.py (modified) (3 diffs)
- trunk/src/dm/exceptions.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/setup.py
r308 r318 16 16 # no way to specify the dependency on django as we need a specific revision 17 17 install_requires = [ 18 'SQLObject >=0.7.1,<=0.7.99',18 'SQLObject==0.10.0, 19 19 'simplejson', 20 20 # 'Django>=0.95' # Django not served on cheese shop trunk/src/dm/__init__.py
r309 r318 1 __version__ = '0.3.1 2'1 __version__ = '0.3.14' trunk/src/dm/db.py
r308 r318 28 28 29 29 """ 30 31 sov = '0.10' 30 32 31 33 from sqlobject import * … … 43 45 timepoint = RequiredFeature('Timepoint') 44 46 45 moddebug = False47 moddebug = True 46 48 47 49 class ConnectionFacade(object): … … 252 254 mapperClass.createTable() 253 255 except Exception, inst: 254 msg = "Couldn't create table for class '%s': %s. Attributes are: %s" % (className, inst, str(mapperClass.meta.dom.attributeNames)) 256 msg = "Couldn't create table for class '%s': " % className 257 msg += "Error: %s. " % inst 258 attributes = str(mapperClass.meta.dom.attributeNames) 259 msg += "Attributes are: %s" % attributes 255 260 logger.error(msg) 256 #raise257 261 raise Exception, msg 258 262 else: … … 272 276 if sqlAttribute == None: 273 277 return 274 if hasattr(mapperClass.sqlmeta, 'addColumn'): # for SQLObject 0.7278 if hasattr(mapperClass.sqlmeta, 'addColumn'): 275 279 addColumn = mapperClass.sqlmeta.addColumn 280 else: 281 raise ORMError, "No 'addColumn' method on SQLObject sqlmeta." 282 if hasattr(mapperClass.sqlmeta, 'delColumn'): 276 283 delColumn = mapperClass.sqlmeta.delColumn 277 else: # for SQLObject 0.6 278 addColumn = mapperClass.addColumn 279 delColumn = mapperClass.delColumn 280 try: 281 addColumn(sqlAttribute, changeSchema=False) 282 except: 283 if features.allowReplace: 284 return 285 raise 286 try: 287 list(mapperClass.select()) 288 except: 289 delColumn(sqlAttribute, changeSchema=False) 284 else: 285 raise ORMError, "No 'delColumn' method on SQLObject sqlmeta." 286 287 if sov == '0.7' or sov == '0.10': 288 try: 289 addColumn(sqlAttribute, changeSchema=False) 290 except: 291 if features.allowReplace: 292 return 293 raise 294 try: 295 list(mapperClass.select()) 296 except: 297 delColumn(sqlAttribute, changeSchema=False) 298 addColumn(sqlAttribute, changeSchema=True) 299 list(mapperClass.select()) 300 msg = "Added %s field to %s table in database." % ( 301 mapperAttribute.dbName, 302 mapperClass.meta.dbName 303 ) 304 logger.info(msg) 305 elif sov == '0.10': 290 306 addColumn(sqlAttribute, changeSchema=True) 291 list(mapperClass.select())292 307 msg = "Added %s field to %s table in database." % ( 293 308 mapperAttribute.dbName, … … 409 424 naiveName = self.makeSafeDbName(naiveName) 410 425 style = self.getSQLStyle() 411 return style.pythonClassToDBTable(naiveName) 426 safeName = style.pythonClassToDBTable(naiveName) 427 if moddebug and debug: 428 self.logger.debug("Made safe db table name: %s" % safeName) 429 return safeName 412 430 413 431 def makeSafeFieldName(self, naiveName): 414 432 naiveName = self.makeSafeDbName(naiveName) 415 433 style = self.getSQLStyle() 416 return style.pythonAttrToDBColumn(naiveName) 434 safeName = style.pythonAttrToDBColumn(naiveName) 435 if moddebug and debug: 436 self.logger.debug("Made safe db field name: %s" % safeName) 437 return safeName 417 438 418 439 def makeSafeDbName(self, name): 419 440 if name.upper() in self.getReservedNames(): 420 name = 'x' + name 441 name = 'x' + name.lower() 421 442 if name != self.makeSafeDbName(name): 422 443 raise Exception, "Can't make this name safe: %s" % name … … 429 450 if hasattr(SQLObject, 'sqlmeta'): # SQLObject 0.7 430 451 return SQLObject.sqlmeta.style 431 elif hasattr(SQLObject, '_style'): # SQLObject 0.6432 return SQLObject._style452 #elif hasattr(SQLObject, '_style'): # SQLObject 0.6 453 # return SQLObject._style 433 454 else: 434 455 raise Exception, "Can't find SQLObject style object." … … 442 463 self.isUnique = self.dom.isUnique 443 464 self.isCached = self.dom.isCached 444 self.domName = self.dom.name 445 self.dbName = self.makeSafeTableName(self.dom.dbName or self.dom.name) 465 if sov == '0.10': 466 dbName = self.makeSafeTableName(self.dom.dbName or self.dom.name) 467 self.domName = dbName 468 self.dbName = dbName 469 if sov == '0.7': 470 dbName = self.makeSafeTableName(self.dom.dbName or self.dom.name) 471 self.domName = self.dom.name 472 self.dbName = dbName 446 473 self.attributesByName = {} 447 474 self.attributes = [] … … 477 504 # Set mapper class name from domName, and table attribute from dbName. 478 505 mapper = self.createClass(self.domName, baseClass, mapperAttributes) 479 if 'sqlmeta' in sqlobject.main.__dict__: # table for SQLObject 0.7 480 if self.dbName: 481 mapper.sqlmeta.table = self.dbName 482 if self.isCached: 483 mapper.sqlmeta.cacheValues = True 484 if self.sortOnDbName: 485 defaultOrder = getattr(mapper.q, self.sortOnDbName) 486 if not self.sortAscending: 487 defaultOrder = DESC(defaultOrder) 488 mapper.sqlmeta.defaultOrder = defaultOrder 489 490 # Todo: Figure indexes in sqlmeta. 491 #indexes = self.getSQLObjectIndexes() 492 #if indexes: 493 # mapper.indexes = indexes 506 if sov == '0.7' and self.dbName: 507 mapper.sqlmeta.table = self.dbName 508 if self.isCached: 509 mapper.sqlmeta.cacheValues = True 510 if self.sortOnDbName: 511 defaultOrder = getattr(mapper.q, self.sortOnDbName) 512 if not self.sortAscending: 513 defaultOrder = DESC(defaultOrder) 514 mapper.sqlmeta.defaultOrder = defaultOrder 515 # Todo: Figure indexes in sqlmeta. 516 #indexes = self.getSQLObjectIndexes() 517 #if indexes: 518 # mapper.indexes = indexes 494 519 return mapper 495 520 … … 541 566 self.dom = metaDomainAttribute 542 567 self.domName = self.dom.name 543 self.typeName = self.dom.typeName 568 if sov == '0.10' and self.dom.isDomainObjectRef: 569 self.typeName = self.makeSafeFieldName(self.dom.typeName) 570 else: 571 self.typeName = self.dom.typeName 544 572 self.dbName = self.makeSafeFieldName(self.dom.dbName or self.dom.name) 545 573 if self.dom.isValueRef and hasattr(self.dom, 'default'): … … 631 659 return None 632 660 elif issubclass(self.dom.__class__, dm.dom.meta.DomainObjectRef): 633 if hasattr(self, 'default'): 634 return KeyCol(foreignKey=self.typeName, name=self.dbName+'ID', 635 default=self.default 636 ) 637 else: 638 return KeyCol(foreignKey=self.typeName, name=self.dbName+'ID') 661 if sov == '0.10': 662 dbName = self.dbName 663 elif sov == '0.7': 664 dbName = self.dbName + 'ID' 665 else: 666 raise ORMError, "No support for SQLObject version %s." % sov 667 if hasattr(self, 'default'): 668 return KeyCol(foreignKey=self.typeName, name=dbName, 669 default=self.default) 670 else: 671 return KeyCol(foreignKey=self.typeName, name=dbName) 639 672 else: 640 673 raise Exception, "Unknown domain attribute: %s" % self.dom … … 646 679 class sqlmeta: 647 680 cacheValues = True 648 lazyUpdate = True 681 lazyUpdate = True 649 682 650 683 domainObject = None … … 680 713 def assertUnique(self, *args, **kwds): 681 714 "Raises exception unless no record exists with given parameters." 682 records = self.selectByKeywords(**kwds) 683 if kwds and records.count(): 715 if not kwds: 716 return 717 if moddebug and debug: 718 msg = "Asserting kwds are unique: %s" % kwds 719 logger.debug(msg) 720 if self.selectByKeywords(**kwds).count(): 684 721 msg = "'%s' record already exists for: %s" % (self.__name__, kwds) 722 logger.error(msg) 685 723 raise KforgeDbError, msg 686 724 … … 727 765 728 766 def getDomainClass(self): 729 "Returns mapper's synonymous domain model class." 730 className = self.getClassName()767 "Returns mapper's synonymous domain model class." 768 domClassName = self.meta.dom.name 731 769 registry = RequiredFeature('DomainRegistry') 732 return registry.getDomainClass( className)770 return registry.getDomainClass(domClassName) 733 771 734 772 def loadDomainObject(self, loadedList, loadMapper=True): … … 958 996 mapper = kwds[metaAttr.domName] 959 997 del kwds[metaAttr.domName] 960 961 # Todo: Whether this causes the snag in sqlobject>=0.8?962 963 metaAttrDbName = metaAttr.dbName + 'ID'998 if sov == '0.10': 999 dbName = metaAttr.dbName 1000 elif sov == '0.7': 1001 dbName = metaAttr.dbName + 'ID' 964 1002 if mapper: 965 kwds[metaAttrDbName] = mapper.id 1003 if sov == '0.10': 1004 kwds[dbName] = mapper 1005 elif sov == '0.7': 1006 kwds[dbName] = mapper.id 966 1007 else: 967 kwds[ metaAttrDbName] = None1008 kwds[dbName] = None 968 1009 else: 969 1010 value = kwds[metaAttr.domName] … … 982 1023 for name in kwds: 983 1024 value = kwds[name] 1025 if sov == '0.10': 1026 if self.meta.dom.attributeNames[name].isDomainObjectRef: 1027 name += '_id' 984 1028 # todo: expand for all database systems 985 1029 sqlSafeValue = sqlrepr(value, 'postgres') … … 1039 1083 for name in kwds: 1040 1084 value = kwds[name] 1085 if sov == '0.10': 1086 if self.meta.dom.attributeNames[name].isDomainObjectRef: 1087 name += '_id' 1041 1088 # todo: expand for all database systems 1042 1089 sqlSafeValue = sqlrepr(value, 'postgres') … … 1063 1110 for name in kwds: 1064 1111 value = kwds[name] 1112 if sov == '0.10' and name != 'id': 1113 if self.meta.dom.attributeNames[name].isDomainObjectRef: 1114 name += '_id' 1065 1115 # todo: expand for all database systems 1066 1116 sqlSafeValue = sqlrepr(value, 'postgres') … … 1141 1191 sqlEqualsList.append(sqlEquals) 1142 1192 else: 1193 if sov == '0.10': 1194 if self.meta.dom.attributeNames[name].isDomainObjectRef: 1195 name += '_id' 1143 1196 sqlSafeName = self.makeSqlName(name) 1144 1197 sqlEquals = "%s = %s" % (sqlSafeName, sqlSafeValue) trunk/src/dm/dom/accesscontrol.py
r174 r318 7 7 "Registered granted permission. Associates a Role and a Permission." 8 8 9 # isConstant = True10 9 permission = HasA('Permission') 11 10 role = HasA('Role') … … 52 51 """ 53 52 54 # isConstant = True55 53 action = HasA('Action') 56 54 protectionObject = HasA('ProtectionObject') … … 69 67 "Protects a protected object with a protected name." 70 68 71 # isConstant = True72 69 permissions = AggregatesMany('Permission', 'action') 73 70 trunk/src/dm/exceptions.py
r308 r318 4 4 5 5 class DomainModelApplicationError(StandardError): pass 6 7 class ORMError(DomainModelApplicationError): pass 6 8 7 9 class InvalidSystemDictionary(DomainModelApplicationError): pass
