Changeset 318

Show
Ignore:
Timestamp:
03/20/08 12:30:16 (9 months ago)
Author:
johnbywater
Message:

Fixed domainmodel for SQLObject 0.10.0.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/setup.py

    r308 r318  
    1616    # no way to specify the dependency on django as we need a specific revision 
    1717    install_requires = [ 
    18         'SQLObject>=0.7.1,<=0.7.99'
     18        'SQLObject==0.10.0
    1919        'simplejson', 
    2020        # 'Django>=0.95'  # Django not served on cheese shop 
  • trunk/src/dm/__init__.py

    r309 r318  
    1 __version__ = '0.3.12
     1__version__ = '0.3.14
  • trunk/src/dm/db.py

    r308 r318  
    2828 
    2929""" 
     30 
     31sov = '0.10' 
    3032 
    3133from sqlobject import * 
     
    4345timepoint = RequiredFeature('Timepoint') 
    4446 
    45 moddebug = Fals
     47moddebug = Tru
    4648 
    4749class ConnectionFacade(object): 
     
    252254                    mapperClass.createTable() 
    253255                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 
    255260                    logger.error(msg) 
    256                     #raise  
    257261                    raise Exception, msg 
    258262                else:  
     
    272276            if sqlAttribute == None: 
    273277                return 
    274             if hasattr(mapperClass.sqlmeta, 'addColumn'):   # for SQLObject 0.7 
     278            if hasattr(mapperClass.sqlmeta, 'addColumn'): 
    275279                addColumn = mapperClass.sqlmeta.addColumn 
     280            else: 
     281                raise ORMError, "No 'addColumn' method on SQLObject sqlmeta." 
     282            if hasattr(mapperClass.sqlmeta, 'delColumn'): 
    276283                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': 
    290306                addColumn(sqlAttribute, changeSchema=True) 
    291                 list(mapperClass.select()) 
    292307                msg = "Added %s field to %s table in database." % ( 
    293308                    mapperAttribute.dbName, 
     
    409424        naiveName = self.makeSafeDbName(naiveName) 
    410425        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 
    412430     
    413431    def makeSafeFieldName(self, naiveName): 
    414432        naiveName = self.makeSafeDbName(naiveName) 
    415433        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 
    417438 
    418439    def makeSafeDbName(self, name): 
    419440        if name.upper() in self.getReservedNames(): 
    420             name = 'x' + name 
     441            name = 'x' + name.lower() 
    421442            if name != self.makeSafeDbName(name): 
    422443                raise Exception, "Can't make this name safe: %s" % name 
     
    429450        if hasattr(SQLObject, 'sqlmeta'):  # SQLObject 0.7 
    430451            return SQLObject.sqlmeta.style 
    431         elif hasattr(SQLObject, '_style'): # SQLObject 0.6 
    432             return SQLObject._style 
     452        #elif hasattr(SQLObject, '_style'): # SQLObject 0.6 
     453        #    return SQLObject._style 
    433454        else: 
    434455            raise Exception, "Can't find SQLObject style object." 
     
    442463        self.isUnique = self.dom.isUnique 
    443464        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 
    446473        self.attributesByName = {} 
    447474        self.attributes = [] 
     
    477504        # Set mapper class name from domName, and table attribute from dbName. 
    478505        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 
    494519        return mapper 
    495520 
     
    541566        self.dom = metaDomainAttribute 
    542567        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 
    544572        self.dbName = self.makeSafeFieldName(self.dom.dbName or self.dom.name) 
    545573        if self.dom.isValueRef and hasattr(self.dom, 'default'):  
     
    631659            return None 
    632660        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) 
    639672        else: 
    640673            raise Exception, "Unknown domain attribute: %s" % self.dom 
     
    646679    class sqlmeta: 
    647680        cacheValues = True 
    648         lazyUpdate = True  
     681        lazyUpdate = True 
    649682 
    650683    domainObject = None 
     
    680713    def assertUnique(self, *args, **kwds): 
    681714        "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(): 
    684721            msg = "'%s' record already exists for: %s" % (self.__name__, kwds) 
     722            logger.error(msg) 
    685723            raise KforgeDbError, msg 
    686724 
     
    727765         
    728766    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 
    731769        registry = RequiredFeature('DomainRegistry') 
    732         return registry.getDomainClass(className) 
     770        return registry.getDomainClass(domClassName) 
    733771 
    734772    def loadDomainObject(self, loadedList, loadMapper=True): 
     
    958996                    mapper = kwds[metaAttr.domName] 
    959997                    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' 
    9641002                    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 
    9661007                    else: 
    967                         kwds[metaAttrDbName] = None 
     1008                        kwds[dbName] = None 
    9681009                else: 
    9691010                    value = kwds[metaAttr.domName] 
     
    9821023        for name in kwds: 
    9831024            value = kwds[name] 
     1025            if sov == '0.10': 
     1026                if self.meta.dom.attributeNames[name].isDomainObjectRef: 
     1027                    name += '_id' 
    9841028            # todo: expand for all database systems 
    9851029            sqlSafeValue = sqlrepr(value, 'postgres') 
     
    10391083        for name in kwds: 
    10401084            value = kwds[name] 
     1085            if sov == '0.10': 
     1086                if self.meta.dom.attributeNames[name].isDomainObjectRef: 
     1087                    name += '_id' 
    10411088            # todo: expand for all database systems 
    10421089            sqlSafeValue = sqlrepr(value, 'postgres') 
     
    10631110        for name in kwds: 
    10641111            value = kwds[name] 
     1112            if sov == '0.10' and name != 'id': 
     1113                if self.meta.dom.attributeNames[name].isDomainObjectRef: 
     1114                    name += '_id' 
    10651115            # todo: expand for all database systems 
    10661116            sqlSafeValue = sqlrepr(value, 'postgres') 
     
    11411191                sqlEqualsList.append(sqlEquals) 
    11421192            else: 
     1193                if sov == '0.10': 
     1194                    if self.meta.dom.attributeNames[name].isDomainObjectRef: 
     1195                        name += '_id' 
    11431196                sqlSafeName = self.makeSqlName(name) 
    11441197                sqlEquals = "%s = %s" % (sqlSafeName, sqlSafeValue) 
  • trunk/src/dm/dom/accesscontrol.py

    r174 r318  
    77    "Registered granted permission. Associates a Role and a Permission." 
    88 
    9 #    isConstant  = True 
    109    permission  = HasA('Permission') 
    1110    role        = HasA('Role') 
     
    5251    """ 
    5352 
    54 #    isConstant  = True 
    5553    action           = HasA('Action') 
    5654    protectionObject = HasA('ProtectionObject') 
     
    6967    "Protects a protected object with a protected name." 
    7068 
    71 #    isConstant  = True 
    7269    permissions = AggregatesMany('Permission', 'action') 
    7370 
  • trunk/src/dm/exceptions.py

    r308 r318  
    44 
    55class DomainModelApplicationError(StandardError): pass 
     6 
     7class ORMError(DomainModelApplicationError): pass 
    68 
    79class InvalidSystemDictionary(DomainModelApplicationError): pass