Changeset 320

Show
Ignore:
Timestamp:
03/23/08 01:23:15 (10 months ago)
Author:
johnbywater
Message:

Added (to dm/db.py) full detection and support for SQLObject versions 0.7.1 (on Debian Etch) through 0.10.0 (the latest stable release of SQLObject).

Files:

Legend:

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

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

    r318 r320  
    1 __version__ = '0.3.14
     1__version__ = '0.3.15
  • trunk/src/dm/db.py

    r319 r320  
    2727depends on an ORM to move values from the persistence model to the DBRMS. 
    2828 
     29This module has been tested with the recent stable SQLObject versions, which 
     30are understood by the author to be 0.7.10, 0.8.7, 0.9.5, and 0.10.0. It has 
     31also been tested with the python-sqlobject version of Debian Etch (0.7.1). 
     32 
    2933""" 
    3034 
    31 sov = '0.10' 
     35from dm.exceptions import * 
     36 
     37import sqlobject 
     38sqoVer = None 
     39isSqoSupported = False 
     40sqoVers = ['0.7', '0.8', '0.9', '0.10'] 
     41if sqlobject.__doc__ != None: 
     42    sqoDocSplit = sqlobject.__doc__.split(' ') 
     43    if len(sqoDocSplit) > 1: 
     44        sqoVerSplit = sqoDocSplit[1].split('.') 
     45        if len(sqoVerSplit) > 2: 
     46            sqoVer = ".".join(sqoVerSplit[0:2]) 
     47if sqoVer in sqoVers: 
     48    isSqoSupported = True 
     49else: 
     50    # Debian Etch-ish support (SQLObject 0.7.1). 
     51    if sqlobject.__doc__ == None and \ 
     52    hasattr(sqlobject.SQLObject, 'sqlmeta'): 
     53        isSqoSupported = True 
     54        sqoVer = '0.7' 
     55if not isSqoSupported: 
     56    msg = "Imported SQLObject not supported by dm." 
     57    msg += "\nImported SQLObject package doc: %s" % sqlobject.__doc__ 
     58    msg += "Imported SQLObject package path: %s" % sqlobject.__path__ 
     59    msg += "\nNeeds latest version of any of: %s." % ", ".join(sqoVers) 
     60    raise ORMError, msg  
    3261 
    3362from sqlobject import * 
     
    3564from dm.ioc import * 
    3665import dm.dom.meta 
    37 from dm.exceptions import KforgeDbError 
    3866import sqlobject.main 
    3967from dm.ioc import * 
     
    276304            if sqlAttribute == None: 
    277305                return 
     306            # Todo: Perhaps just? addColumn = mapperClass.sqlmeta.addColumn 
    278307            if hasattr(mapperClass.sqlmeta, 'addColumn'): 
    279308                addColumn = mapperClass.sqlmeta.addColumn 
     
    284313            else: 
    285314                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': 
     315            try:     
     316                addColumn(sqlAttribute, changeSchema=False) 
     317            except: 
     318                if features.allowReplace: 
     319                    return 
     320                raise 
     321            try: 
     322                list(mapperClass.select()) 
     323            except: 
     324                delColumn(sqlAttribute, changeSchema=False) 
    306325                addColumn(sqlAttribute, changeSchema=True) 
     326                list(mapperClass.select()) 
    307327                msg = "Added %s field to %s table in database." % ( 
    308328                    mapperAttribute.dbName, 
     
    448468 
    449469    def getSQLStyle(self): 
    450         if hasattr(SQLObject, 'sqlmeta'):  # SQLObject 0.7 
    451             return SQLObject.sqlmeta.style 
    452         #elif hasattr(SQLObject, '_style'): # SQLObject 0.6 
    453         #    return SQLObject._style 
    454         else: 
    455             raise Exception, "Can't find SQLObject style object." 
     470        return SQLObject.sqlmeta.style 
    456471             
    457472 
     
    463478        self.isUnique = self.dom.isUnique 
    464479        self.isCached = self.dom.isCached 
    465         if sov == '0.10': 
    466             dbName = self.makeSafeTableName(self.dom.dbName or self.dom.name) 
     480        dbName = self.makeSafeTableName(self.dom.dbName or self.dom.name) 
     481        if sqoVer in ['0.8', '0.9', '0.10']: 
    467482            self.domName = dbName 
    468483            self.dbName = dbName 
    469         if sov == '0.7': 
    470             dbName = self.makeSafeTableName(self.dom.dbName or self.dom.name) 
     484        if sqoVer == '0.7': 
    471485            self.domName = self.dom.name 
    472486            self.dbName = dbName 
     
    504518        # Set mapper class name from domName, and table attribute from dbName. 
    505519        mapper = self.createClass(self.domName, baseClass, mapperAttributes) 
    506         if sov == '0.7' and self.dbName: 
     520        if sqoVer == '0.7' and self.dbName: 
    507521            mapper.sqlmeta.table = self.dbName 
    508522        if self.isCached: 
     
    521535    def getSQLObjectAttributes(self): 
    522536        mapperAttributes = {} 
    523         if not 'sqlmeta' in sqlobject.main.__dict__:  # table for SQLObject 0.6 
    524             if self.dbName: 
    525                 mapperAttributes['_table'] = self.dbName 
    526537        for a in self.attributes: 
    527538            if a.dom.isTemporal: 
    528539                # We don't persist temporal attributes on the parent. 
     540                # Todo: Perhaps we should? 
    529541                continue 
    530542            mapperClassAttribute = a.createMapperClassAttribute() 
     
    542554                index = DatabaseIndex(mapperClassAttribute) 
    543555                mapperAttributes[indexName] = index 
    544  
    545556        return mapperAttributes 
    546557 
     
    566577        self.dom = metaDomainAttribute 
    567578        self.domName  = self.dom.name 
    568         if sov == '0.10' and self.dom.isDomainObjectRef: 
     579        if sqoVer in ['0.8', '0.9', '0.10'] and self.dom.isDomainObjectRef: 
    569580            self.typeName = self.makeSafeFieldName(self.dom.typeName) 
    570581        else: 
     
    659670            return None 
    660671        elif issubclass(self.dom.__class__, dm.dom.meta.DomainObjectRef): 
    661             if sov == '0.10'
     672            if sqoVer in ['0.8', '0.9', '0.10']
    662673                dbName = self.dbName 
    663             elif sov == '0.7'
     674            elif sqoVer in ['0.7']
    664675                dbName = self.dbName + 'ID' 
    665676            else: 
    666                 raise ORMError, "No support for SQLObject version %s." % sov 
     677                raise ORMError, "No support for SQLObject version %s." % sqoVer 
    667678            if hasattr(self, 'default'): 
    668679                return KeyCol(foreignKey=self.typeName, name=dbName, 
     
    720731        if self.selectByKeywords(**kwds).count(): 
    721732            msg = "'%s' record already exists for: %s" % (self.__name__, kwds) 
    722             logger.error(msg) 
     733            logger.info(msg) 
    723734            raise KforgeDbError, msg 
    724735 
     
    9961007                    mapper = kwds[metaAttr.domName] 
    9971008                    del kwds[metaAttr.domName] 
    998                     if sov == '0.10'
     1009                    if sqoVer in ['0.10']
    9991010                        dbName = metaAttr.dbName 
    1000                     elif sov == '0.7'
     1011                    elif sqoVer in ['0.7', '0.8', '0.9']
    10011012                        dbName = metaAttr.dbName + 'ID' 
    10021013                    if mapper: 
    1003                         if sov == '0.10'
     1014                        if sqoVer in ['0.10']
    10041015                            kwds[dbName] = mapper 
    1005                         elif sov == '0.7'
     1016                        elif sqoVer in ['0.7', '0.8', '0.9']
    10061017                            kwds[dbName] = mapper.id 
    10071018                    else: 
     
    10141025    coerceKwds = classmethod(coerceKwds) 
    10151026 
     1027    def getAttributeDbName(self, domName): 
     1028        return self.meta.getAttribute(domName).dbName 
     1029 
     1030    getAttributeDbName = classmethod(getAttributeDbName) 
     1031 
     1032    def makeSqlName(self, name): 
     1033        if name[-2:] == 'ID': 
     1034            name = name[:-2] + '_id' 
     1035        return name 
     1036 
     1037    makeSqlName = classmethod(makeSqlName) 
     1038     
    10161039    def startsWith(self, value, attributeName, **kwds): 
    10171040        sqlSafeValue = sqlrepr(value, 'postgres')[1:-1] # drop quotes 
     
    10231046        for name in kwds: 
    10241047            value = kwds[name] 
    1025             if sov == '0.10'
     1048            if sqoVer in ['0.10']
    10261049                if self.meta.dom.attributeNames[name].isDomainObjectRef: 
    10271050                    name += '_id' 
     
    10411064    startsWith = classmethod(startsWith) 
    10421065 
    1043     def getAttributeDbName(self, domName): 
    1044         return self.meta.getAttribute(domName).dbName 
    1045  
    1046     getAttributeDbName = classmethod(getAttributeDbName) 
    1047  
    1048     def makeSqlName(self, name): 
    1049         #return self.q.__getattr__(name) 
    1050         if name[-2:] == 'ID': 
    1051             name = name[:-2] + '_id' 
    1052         return name 
    1053  
    1054     makeSqlName = classmethod(makeSqlName) 
    1055      
    10561066    def search(self, userQuery, attributeNames, spaceSplit=True, **kwds): 
    10571067        dbNames = [] 
     
    10831093        for name in kwds: 
    10841094            value = kwds[name] 
    1085             if sov == '0.10'
     1095            if sqoVer in ['0.10']
    10861096                if self.meta.dom.attributeNames[name].isDomainObjectRef: 
    10871097                    name += '_id' 
     
    11101120        for name in kwds: 
    11111121            value = kwds[name] 
    1112             if sov == '0.10' and name != 'id': 
     1122            if sqoVer in ['0.10'] and name != 'id': 
    11131123                if self.meta.dom.attributeNames[name].isDomainObjectRef: 
    11141124                    name += '_id' 
     
    11911201                sqlEqualsList.append(sqlEquals) 
    11921202            else: 
    1193                 if sov == '0.10'
     1203                if sqoVer in ['0.10']
    11941204                    if self.meta.dom.attributeNames[name].isDomainObjectRef: 
    11951205                        name += '_id'