diff --git a/Database/sqlsetup.py b/Database/sqlsetup.py index c59693d..3a3f66b 100644 --- a/Database/sqlsetup.py +++ b/Database/sqlsetup.py @@ -20,8 +20,8 @@ class SQLSetup(object): {"name":"string", "type":"TEXT"}, {"name":"help", "type":"TEXT"}, {"name":"rank", "type":"INTEGER"}, - {"name":"date_update", "type":"DATE"}, - {"name":"date_create", "type":"DATE"} + {"name":"date_create", "type":"DATETIME"}, + {"name":"date_update", "type":"DATETIME"}, ] # Table listing all objects created by lodel, giving them an unique id @@ -99,8 +99,8 @@ class SQLSetup(object): {"name":"string", "type":"VARCHAR(50)"}, {"name":"class_id", "type":"INTEGER", "extra":{"foreignkey":"em_class.uid"}}, {"name":"type_id", "type":"INTEGER", "extra":{"foreignkey":"em_type.uid"}}, - {"name":"date_update", "type":"DATE"}, - {"name":"date_create", "type":"DATE"}, + {"name":"date_create", "type":"DATETIME"}, + {"name":"date_update", "type":"DATETIME"}, {"name":"history", "type":"TEXT"} ] } diff --git a/Database/sqlwrapper.py b/Database/sqlwrapper.py index de968c2..8efc6c7 100644 --- a/Database/sqlwrapper.py +++ b/Database/sqlwrapper.py @@ -104,10 +104,8 @@ class SqlWrapper(object): def renewMetaData(self): """ (Re)load the database schema """ - if self.metadata == None: - self.metadata = sqla.MetaData(bind=self.r_engine, reflect=True) - else: - self.metadata = sqla.MetaData(bind=self.r_engine, reflect=True) + self.metadata = sqla.MetaData(bind=self.r_engine, reflect=True) + self.metadata.reflect() @property def rconn(self): diff --git a/EditorialModel/classes.py b/EditorialModel/classes.py index be70663..a6409e2 100644 --- a/EditorialModel/classes.py +++ b/EditorialModel/classes.py @@ -40,14 +40,14 @@ class EmClass(EmComponent): @classmethod def _createDb(c, name, class_type): """ Do the db querys for EmClass::create() """ - uid = c.newUid() + + #Create a new entry in the em_class table + values = { 'name':name, 'classtype':class_type['name'] } + resclass = super(EmClass,c).create(values) + dbe = c.getDbE() conn = dbe.connect() - #Create a new entry in the em_class table - dbclass = sql.Table(c.table, sqlutils.meta(dbe)) - req = dbclass.insert().values(uid = uid, name=name, classtype=class_type['name']) - res = conn.execute(req) #Create a new table storing LodelObjects of this EmClass meta = sql.MetaData() @@ -57,7 +57,7 @@ class EmClass(EmComponent): conn.close() - return EmClass(name) + return resclass def populate(self): diff --git a/EditorialModel/components.py b/EditorialModel/components.py index 2b11140..c40fb42 100644 --- a/EditorialModel/components.py +++ b/EditorialModel/components.py @@ -5,6 +5,8 @@ @see EmClass, EmType, EmFieldGroup, EmField """ +import datetime + from Lodel.utils.mlstring import MlString import logging import sqlalchemy as sql @@ -79,18 +81,43 @@ class EmComponent(object): raise EmComponentNotExistError("No component found with "+('name '+self.name if self.id == None else 'id '+self.id )) return res + + ## Insert a new component in the database + # This function create and assign a new UID and handle the date_create value + # @param values The values of the new component + # @return An instance of the created component + # + # @todo Check that the query didn't failed + @classmethod + def create(c, values): + values['uid'] = c.newUid() + values['date_update'] = values['date_create'] = datetime.datetime.utcnow() + + dbe = c.getDbE() + conn = dbe.connect() + table = sql.Table(c.table, sqlutils.meta(dbe)) + req = table.insert(values) + res = conn.execute(req) #Check res? + conn.close() + return c(values['name']) #Maybe no need to check res because this would fail if the query failed + """ write the representation of the component in the database @return bool """ def save(self, values): + values['name'] = self.name values['rank'] = self.rank - values['date_update'] = self.date_update - values['date_create'] = self.date_create + values['date_update'] = datetime.datetime.utcnow() values['string'] = str(self.string) values['help']= str(self.help) + #Don't allow creation date overwritting + if 'date_create' in values: + del values['date_create'] + logger.warning("date_create supplied for save, but overwritting of date_create not allowed, the date will not be changed") + self._saveDb(values) def _saveDb(self, values): diff --git a/EditorialModel/fieldgroups.py b/EditorialModel/fieldgroups.py index a3e2e36..ce0344f 100644 --- a/EditorialModel/fieldgroups.py +++ b/EditorialModel/fieldgroups.py @@ -24,8 +24,8 @@ class EmFieldGroup(EmComponent): self.table = EmFieldGroup.table super(EmFieldGroup, self).__init__(id_or_name) - @staticmethod - def create(name, em_class): + @classmethod + def create(c, name, em_class): """ Create a new EmFieldGroup, save it and instanciate it @param name str: The name of the new fielgroup @@ -34,28 +34,10 @@ class EmFieldGroup(EmComponent): try: exists = EmFieldGroup(name) except EmComponentNotExistError: - return EmFieldGroup._createDb(name, em_class) + return super(EmFieldGroup, c).create({'name': name, 'class_id':em_class.id}) #Check the return value ? return exists - @classmethod - def _createDb(c,name, em_class): - """ Make the Db insertion for fieldgroup creation """ - uid = c.newUid() - - dbe = c.getDbE() - conn = dbe.connect() - - req = sql.Table(c.table, sqlutils.meta(dbe)).insert().values(uid=uid, name=name, class_id=em_class.id) - res = conn.execute(req) - - conn.close() - - return EmFieldGroup(name) - - - - """ Use dictionary (from database) to populate the object """ def populate(self): diff --git a/EditorialModel/fields.py b/EditorialModel/fields.py index c3f2c82..c885434 100644 --- a/EditorialModel/fields.py +++ b/EditorialModel/fields.py @@ -21,8 +21,8 @@ class EmField(EmComponent): self.table = EmField.table super(EmField, self).__init__(id_or_name) - @staticmethod - def create(name, em_fieldgroup, em_fieldtype, optional=True, internal=False): + @classmethod + def create(c, name, em_fieldgroup, em_fieldtype, optional=True, internal=False): """ Create a new EmField and instanciate it @static @@ -50,23 +50,10 @@ class EmField(EmComponent): 'optional' : 1 if optional else 0, 'internal' : 1 if internal else 0, } - - return EmField._createDb(values) + return super(EmField,c).create(values) return exists - - @classmethod - def _createDb(c, values): - values['uid'] = c.newUid() - dbe = c.getDbE() - conn = dbe.connect() - req = sql.Table(c.table, sqlutils.meta(dbe)).insert(values=values) - res = conn.execute(req) - - conn.close() - - return EmField(values['name']) """ Use dictionary (from database) to populate the object """ diff --git a/EditorialModel/types.py b/EditorialModel/types.py index 98ec490..e31c1e3 100644 --- a/EditorialModel/types.py +++ b/EditorialModel/types.py @@ -25,8 +25,8 @@ class EmType(EmComponent): self.table = EmType.table super(EmType, self).__init__(id_or_name) - @staticmethod - def create(name, em_class): + @classmethod + def create(c, name, em_class): """ Create a new EmType and instanciate it @param name str: The name of the new type @@ -35,29 +35,15 @@ class EmType(EmComponent): @see EmComponent::__init__() @todo Change the icon param type - @todo change staticmethod to classmethod + @todo check that em_class is an EmClass object """ try: exists = EmType(name) except EmComponentNotExistError: - return EmType._createDb(name, em_class) + return super(EmType, c).create({'name':name, 'class_id': em_class.id}) return exists - @classmethod - def _createDb(c, name, em_class): - uid = c.newUid() - - dbe = c.getDbE() - conn = dbe.connect() - - #Insert type in db - dbtype = sql.Table(c.table, sqlutils.meta(dbe)) - req = dbtype.insert().values(uid=uid, name=name, class_id=em_class.id) - res = conn.execute(req) - - return EmType(name) - """ Use dictionary (from database) to populate the object """ def populate(self):