def __new__(mcs, name, bases, attrs): binding = ConcretePyGlassModelsMeta._engines.get(name) if binding is None: # Retrieve the database URL from the __init__.py for the package in which the model class # resides. try: module = attrs['__module__'] package = module[:module.rfind('.')] res = __import__(package, globals(), locals(), [StringUtils.toStr2('DATABASE_URL')]) except Exception as err: PyGlassModelUtils.logger.writeError([ 'ERROR: Unable to initialize model', 'NAME: %s' % name ]) raise try: sourceUrl = getattr(res, 'DATABASE_URL') except Exception as err: PyGlassModelUtils.logger.writeError([ 'ERROR: Unable to get DATABASE_URL from %s.__init__.py' % package, 'NAME: %s' % name ], err) raise try: url = PyGlassModelUtils.getEngineUrl(sourceUrl) except Exception as err: PyGlassModelUtils.logger.writeError([ 'ERROR: Unable to get url from database url', 'DATABASE URL: ' + StringUtils.toUnicode(sourceUrl) ], err) raise try: engine = create_engine(url, echo=False) except Exception as err: PyGlassModelUtils.logger.writeError([ 'DATABASE FAILURE: Unable to create engine for database', 'URL: ' + StringUtils.toUnicode(url), 'NAME: ' + StringUtils.toUnicode(name) ], err) raise try: Session = scoped_session(sessionmaker(bind=engine)) except Exception as err: PyGlassModelUtils.logger.writeError([ 'DATABASE FAILURE: Unable to create bound Session.', 'URL: ' + StringUtils.toUnicode(url), 'ENGINE: ' + StringUtils.toUnicode(engine) ], err) raise try: Base = declarative_base(bind=engine) except Exception as err: PyGlassModelUtils.logger.writeError([ 'DATABASE FAILURE: Unable to create database engine Base.', 'URL: ' + StringUtils.toUnicode(url), 'ENGINE: ' + StringUtils.toUnicode(engine) ], err) raise try: Base.metadata.create_all(engine) except Exception as err: PyGlassModelUtils.logger.writeError([ 'DATABASE FAILURE: Unable to create models.' 'URL: ' + StringUtils.toUnicode(url), 'ENGINE: ' + StringUtils.toUnicode(engine), 'BASE: ' + StringUtils.toUnicode(Base) ], err) raise binding = { 'engine':engine, 'SessionClass':Session, 'BaseClass':Base, 'url':url, 'databaseUrl':sourceUrl } mcs._engines[name] = binding attrs['ENGINE'] = binding['engine'] attrs['SESSION_CLASS'] = binding['SessionClass'] attrs['BASE'] = binding['BaseClass'] attrs['URL'] = binding['url'] attrs['MODEL_NAME'] = name attrs['DATABASE_URL'] = binding['databaseUrl'] attrs['BINDING'] = binding # Add the declarative base to inheritance declaredBase = (binding['BaseClass'],) try: bases = bases + declaredBase except Exception as err: bases = declaredBase out = AbstractPyGlassModelsMeta.__new__(mcs, name, bases, attrs) return out
attrs['SESSION_CLASS'] = binding['SessionClass'] attrs['BASE'] = binding['BaseClass'] attrs['URL'] = binding['url'] attrs['MODEL_NAME'] = name attrs['DATABASE_URL'] = binding['databaseUrl'] attrs['BINDING'] = binding # Add the declarative base to inheritance declaredBase = (binding['BaseClass'],) try: bases = bases + declaredBase except Exception, err: bases = declaredBase out = AbstractPyGlassModelsMeta.__new__(mcs, name, bases, attrs) return out #=================================================================================================== # P U B L I C #___________________________________________________________________________________________________ createSession def createSession(cls): return cls.SESSION_CLASS() #___________________________________________________________________________________________________ query def query(cls, session, modelFilter =None, modelOrderBy =None, limit =None, offset =None, joinModels =None): query = cls.createQuery(session) if joinModels is not None: for model in joinModels: