class BibdocBibdoc(db.Model): """Represent a BibdocBibdoc record.""" __tablename__ = 'bibdoc_bibdoc' id = db.Column(db.MediumInteger(9, unsigned=True), primary_key=True, nullable=False, autoincrement=True) id_bibdoc1 = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Bibdoc.id), nullable=True) version1 = db.Column(db.TinyInteger(4, unsigned=True)) format1 = db.Column(db.String(50)) id_bibdoc2 = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Bibdoc.id), nullable=True) version2 = db.Column(db.TinyInteger(4, unsigned=True)) format2 = db.Column(db.String(50)) rel_type = db.Column(db.String(255), nullable=True) bibdoc1 = db.relationship(Bibdoc, backref='bibdoc2s', primaryjoin=Bibdoc.id == id_bibdoc1) bibdoc2 = db.relationship(Bibdoc, backref='bibdoc1s', primaryjoin=Bibdoc.id == id_bibdoc2)
class CollectionFieldFieldvalue(db.Model): """Represent a CollectionFieldFieldvalue record.""" __tablename__ = 'collection_field_fieldvalue' id_collection = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Collection.id), primary_key=True, nullable=False) id_field = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Field.id), primary_key=True, nullable=False) id_fieldvalue = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Fieldvalue.id), primary_key=True, nullable=True) type = db.Column(db.Char(3), nullable=False, server_default='src') score = db.Column(db.TinyInteger(4, unsigned=True), nullable=False, server_default='0') score_fieldvalue = db.Column(db.TinyInteger(4, unsigned=True), nullable=False, server_default='0') collection = db.relationship(Collection, backref='field_fieldvalues', order_by=score) field = db.relationship(Field, backref='collection_fieldvalues', lazy='joined') fieldvalue = db.relationship(Fieldvalue, backref='collection_fields', lazy='joined')
class LnkENTRYURLTITLE(db.Model): """Represents a LnkENTRYURLTITLE record.""" __tablename__ = 'lnkENTRYURLTITLE' id = db.Column(db.Integer(15, unsigned=True), primary_key=True, nullable=False) url = db.Column(db.String(100), nullable=False, unique=True) title = db.Column(db.String(100), nullable=False, index=True) manual_set = db.Column(db.TinyInteger(1), nullable=False, server_default='0') broken_count = db.Column(db.Integer(5), server_default='0') broken = db.Column(db.TinyInteger(1), nullable=False, server_default='0')
class BsrMETHODDATABUCKET(db.Model): """Represent a BsrMETHODDATABUCKET record.""" __tablename__ = 'bsrMETHODDATABUCKET' id_bsrMETHOD = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(BsrMETHOD.id), autoincrement=False, primary_key=True, nullable=False) bucket_no = db.Column(db.TinyInteger(2), primary_key=True, nullable=False, autoincrement=False) bucket_data = db.Column(db.LargeBinary) bucket_last_value = db.Column(db.String(255)) last_updated = db.Column(db.DateTime) method = db.relationship(BsrMETHOD, backref=db.backref( "buckets", collection_class=attribute_mapped_collection("bucket_no"), cascade="all, delete-orphan" ) ) @property def data(self): """Return bucket data as intbitset.""" return intbitset(self.bucket_data)
class CollectionExternalcollection(db.Model): """Represent a CollectionExternalcollection record.""" __tablename__ = 'collection_externalcollection' id_collection = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Collection.id), primary_key=True, server_default='0') id_externalcollection = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Externalcollection.id), primary_key=True, server_default='0') type = db.Column(db.TinyInteger(4, unsigned=True), server_default='0', nullable=False) def _collection_type(type_): return db.relationship( Collection, primaryjoin=lambda: db.and_( CollectionExternalcollection.id_collection == Collection.id, CollectionExternalcollection.type == type_), backref='_externalcollections_{0}'.format(str(type_))) collection_0 = _collection_type(0) collection_1 = _collection_type(1) collection_2 = _collection_type(2) externalcollection = db.relationship(Externalcollection)
class Bibdocfsinfo(db.Model): """Represents a Bibdocfsinfo record.""" __tablename__ = 'bibdocfsinfo' id_bibdoc = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Bibdoc.id), primary_key=True, nullable=False, autoincrement=False) version = db.Column(db.TinyInteger(4, unsigned=True), primary_key=True, nullable=False, autoincrement=False) format = db.Column(db.String(50), primary_key=True, nullable=False, index=True) last_version = db.Column(db.Boolean, nullable=False, index=True) cd = db.Column(db.DateTime, nullable=False, index=True) md = db.Column(db.DateTime, nullable=False, index=True) checksum = db.Column(db.Char(32), nullable=False) filesize = db.Column(db.BigInteger(15, unsigned=True), nullable=False, index=True) mime = db.Column(db.String(100), nullable=False, index=True) master_format = db.Column(db.String(50))
class Bibfmt(db.Model): """Represent a Bibfmt record.""" __tablename__ = 'bibfmt' id_bibrec = db.Column(db.MediumInteger(8, unsigned=True), db.ForeignKey(Bibrec.id), nullable=False, server_default='0', primary_key=True, autoincrement=False) format = db.Column(db.String(10), nullable=False, server_default='', primary_key=True, index=True) kind = db.Column(db.String(10), nullable=False, server_default='', index=True) last_updated = db.Column(db.DateTime, nullable=False, server_default='1900-01-01 00:00:00', index=True) value = db.Column(db.iLargeBinary) needs_2nd_pass = db.Column(db.TinyInteger(1), server_default='0') bibrec = db.relationship(Bibrec, backref='bibfmt')
class FieldTag(db.Model): """Represent a FieldTag record.""" __tablename__ = 'field_tag' id_field = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey('field.id'), nullable=False, primary_key=True) id_tag = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey('tag.id'), nullable=False, primary_key=True) score = db.Column(db.TinyInteger(4, unsigned=True), nullable=False, server_default='0') tag = db.relationship(Tag, backref='fields', order_by=score) field = db.relationship(Field, backref='tags', order_by=score) def __init__(self, score=None, tup=None, *args, **kwargs): if score is not None: self.score = score if tup is not None: self.tag = Tag(tup) super(FieldTag, self).__init__(*args, **kwargs) @property def as_tag(self): """ Returns Tag record directly.""" return self.tag
class CollectionCollection(db.Model): """Represent a CollectionCollection record.""" __tablename__ = 'collection_collection' id_dad = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Collection.id), primary_key=True) id_son = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Collection.id), primary_key=True) type = db.Column(db.Char(1), nullable=False, server_default='r') score = db.Column(db.TinyInteger(4, unsigned=True), nullable=False, server_default='0') son = db.relationship( Collection, primaryjoin=id_son == Collection.id, backref='dads', # FIX # collection_class=db.attribute_mapped_collection('score'), order_by=db.asc(score)) dad = db.relationship(Collection, primaryjoin=id_dad == Collection.id, backref='sons', order_by=db.asc(score))
class HstDOCUMENT(db.Model): """Represent a HstDOCUMENT record.""" __tablename__ = 'hstDOCUMENT' id = db.Column(db.Integer(15, unsigned=True), primary_key=True, nullable=False, autoincrement=True) id_bibdoc = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Bibdoc.id), primary_key=True, nullable=False, autoincrement=False) docname = db.Column(db.String(250), nullable=False, index=True) docformat = db.Column(db.String(50), nullable=False, index=True) docversion = db.Column(db.TinyInteger(4, unsigned=True), nullable=False) docsize = db.Column(db.BigInteger(15, unsigned=True), nullable=False) docchecksum = db.Column(db.Char(32), nullable=False) doctimestamp = db.Column(db.DateTime, nullable=False, index=True) action = db.Column(db.String(50), nullable=False, index=True) job_id = db.Column(db.MediumInteger(15, unsigned=True), nullable=True, index=True) job_name = db.Column(db.String(255), nullable=True, index=True) job_person = db.Column(db.String(255), nullable=True, index=True) job_date = db.Column(db.DateTime, nullable=True, index=True) job_details = db.Column(db.iBinary, nullable=True)
class CollectionFieldFieldvalue(db.Model): """Represent a CollectionFieldFieldvalue record.""" __tablename__ = 'collection_field_fieldvalue' id = db.Column(db.MediumInteger(9, unsigned=True), autoincrement=True, primary_key=True, nullable=False) id_collection = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Collection.id), nullable=False) id_field = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Field.id), nullable=False) _id_fieldvalue = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Fieldvalue.id), nullable=True, default=None, name="id_fieldvalue") type = db.Column(db.Char(3), nullable=False, server_default='src') score = db.Column(db.TinyInteger(4, unsigned=True), nullable=False, server_default='0') score_fieldvalue = db.Column(db.TinyInteger(4, unsigned=True), nullable=False, server_default='0') collection = db.relationship(Collection, backref='field_fieldvalues', order_by=score) field = db.relationship(Field, backref='collection_fieldvalues', lazy='joined') fieldvalue = db.relationship(Fieldvalue, backref='collection_fields', lazy='joined') @db.hybrid_property def id_fieldvalue(self): """Get id_fieldvalue.""" return self._id_fieldvalue @id_fieldvalue.setter def id_fieldvalue(self, value): """Set id_fieldvalue.""" self._id_fieldvalue = value or None
class XtrJOB(db.Model): """Represents a XtrJOB record.""" __tablename__ = 'xtrJOB' id = db.Column(db.TinyInteger(4), primary_key=True, nullable=False) name = db.Column(db.String(30), nullable=False) last_updated = db.Column(db.DateTime, nullable=False) last_recid = db.Column(db.MediumInteger(8, unsigned=True), nullable=False)
class BibARXIVPDF(db.Model): """Represent a bibARXIVPDF record.""" __tablename__ = 'bibARXIVPDF' id_bibrec = db.Column(db.MediumInteger(8, unsigned=True), primary_key=True) status = db.Column(db.Enum('ok', 'missing', name='bibarxivpdf_status'), nullable=False, index=True) date_harvested = db.Column(db.DateTime, nullable=False) version = db.Column(db.TinyInteger(2), nullable=False)
class CollectionExample(db.Model): """Represent a CollectionExample record.""" __tablename__ = 'collection_example' id_collection = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Collection.id), primary_key=True) id_example = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Example.id), primary_key=True) score = db.Column(db.TinyInteger(4, unsigned=True), nullable=False, server_default='0') collection = db.relationship(Collection, backref='_examples', order_by=score) example = db.relationship(Example, backref='collections', order_by=score)
class CollectionRnkMETHOD(db.Model): """Represent a CollectionRnkMETHOD record.""" __tablename__ = 'collection_rnkMETHOD' id_collection = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Collection.id), primary_key=True, nullable=False) id_rnkMETHOD = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(RnkMETHOD.id), primary_key=True, nullable=False) score = db.Column(db.TinyInteger(4, unsigned=True), nullable=False, server_default='0') collection = db.relationship(Collection, backref='rnkMETHODs') rnkMETHOD = db.relationship(RnkMETHOD, backref='collections')
class BsrMETHODDATABUCKET(db.Model): """Represents a BsrMETHODDATABUCKET record.""" __tablename__ = 'bsrMETHODDATABUCKET' id_bsrMETHOD = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(BsrMETHOD.id), autoincrement=False, primary_key=True, nullable=False) bucket_no = db.Column(db.TinyInteger(2), primary_key=True, nullable=False, autoincrement=False) bucket_data = db.Column(db.LargeBinary) bucket_last_value = db.Column(db.String(255)) last_updated = db.Column(db.DateTime)
class SbmCATEGORIES(db.Model): """Represents a SbmCATEGORIES record.""" __tablename__ = 'sbmCATEGORIES' doctype = db.Column(db.String(10), nullable=False, server_default='', primary_key=True, index=True) sname = db.Column(db.String(75), nullable=False, server_default='', primary_key=True, index=True) lname = db.Column(db.String(75), nullable=False, server_default='') score = db.Column(db.TinyInteger(3, unsigned=True), nullable=False, server_default='0')
class CollectionFormat(db.Model): """Represent a CollectionFormat record.""" __tablename__ = 'collection_format' id_collection = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Collection.id), primary_key=True) id_format = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Format.id), primary_key=True) score = db.Column(db.TinyInteger(4, unsigned=True), nullable=False, server_default='0') collection = db.relationship(Collection, backref='formats', order_by=db.desc(score)) format = db.relationship(Format, backref='collections', order_by=db.desc(score))
class Bibdocmoreinfo(db.Model): """Represents a Bibdocmoreinfo record.""" __tablename__ = 'bibdocmoreinfo' id = db.Column(db.MediumInteger(9, unsigned=True), primary_key=True) id_bibdoc = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Bibdoc.id), nullable=True) version = db.Column(db.TinyInteger(4, unsigned=True), nullable=True) format = db.Column(db.String(50), nullable=True) id_rel = db.Column(db.MediumInteger(9, unsigned=True), nullable=True) namespace = db.Column(db.Char(25), nullable=True) data_key = db.Column(db.Char(25)) data_value = db.Column(db.LargeBinary) __table_args__ = (db.Index('bibdocmoreinfo_key', id_bibdoc, version, format, id_rel, namespace, data_key), db.Model.__table_args__)
class BibEDITCACHE(db.Model): """Represent a BibEDITCACHE record.""" __tablename__ = 'bibEDITCACHE' id_bibrec = db.Column(db.MediumInteger(8, unsigned=True), db.ForeignKey(Bibrec.id), autoincrement=False, nullable=False, primary_key=True) uid = db.Column(db.Integer(15, unsigned=True), primary_key=True, nullable=False, autoincrement=False) data = db.Column(db.iBinary, nullable=False) post_date = db.Column(db.DateTime, nullable=False, index=True) is_active = db.Column(db.TinyInteger(1, unsigned=True), server_default='1', nullable=False)
class CollectionFormat(db.Model): """Represent a CollectionFormat record.""" __tablename__ = 'collection_format' id_collection = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Collection.id), primary_key=True) format_code = db.Column('format', db.String(10), primary_key=True) score = db.Column(db.TinyInteger(4, unsigned=True), nullable=False, server_default='0') collection = db.relationship( Collection, backref=db.backref( 'formats', order_by=db.desc(score) ), order_by=db.desc(score)) @property def format(self): """Return output format definition.""" return output_formats[self.format_code]
class CollectionPortalbox(db.Model): """Represent a CollectionPortalbox record.""" __tablename__ = 'collection_portalbox' id_collection = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Collection.id), primary_key=True) id_portalbox = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Portalbox.id), primary_key=True) ln = db.Column(db.Char(5), primary_key=True, server_default='', nullable=False) position = db.Column(db.Char(3), nullable=False, server_default='top') score = db.Column(db.TinyInteger(4, unsigned=True), nullable=False, server_default='0') collection = db.relationship(Collection, backref='portalboxes', order_by=score) portalbox = db.relationship(Portalbox, backref='collections', order_by=score)
class HstTASK(db.Model): """Represents a HstTASK record.""" __tablename__ = 'hstTASK' id = db.Column(db.Integer(15, unsigned=True), nullable=False, primary_key=True, autoincrement=False) proc = db.Column(db.String(255), nullable=False) host = db.Column(db.String(255), nullable=False, server_default='') user = db.Column(db.String(50), nullable=False) runtime = db.Column(db.DateTime, nullable=False, index=True) sleeptime = db.Column(db.String(20), nullable=True) arguments = db.Column(db.iMediumBinary, nullable=True) status = db.Column(db.String(50), nullable=True, index=True) progress = db.Column(db.String(255), nullable=True) priority = db.Column(db.TinyInteger(4), nullable=False, server_default='0', index=True) sequenceid = db.Column(db.Integer(15, unsigned=True), db.ForeignKey(SeqSTORE.id))
class SbmFUNCTIONS(db.Model): """Represents a SbmFUNCTIONS record.""" __tablename__ = 'sbmFUNCTIONS' action = db.Column(db.String(10), nullable=False, server_default='', primary_key=True) doctype = db.Column(db.String(10), nullable=False, server_default='', primary_key=True) function = db.Column(db.String(40), nullable=False, server_default='', primary_key=True) score = db.Column(db.Integer(11), nullable=False, server_default='0', primary_key=True) step = db.Column(db.TinyInteger(4), nullable=False, server_default='1', primary_key=True)
class AccMAILCOOKIE(db.Model): """Represent an email cookie.""" __tablename__ = 'accMAILCOOKIE' AUTHORIZATIONS_KIND = ( 'pw_reset', 'mail_activation', 'role', 'authorize_action', 'comment_msg', 'generic' ) id = db.Column(db.Integer(15, unsigned=True), primary_key=True, autoincrement=True) _data = db.Column('data', db.iBinary, nullable=False) expiration = db.Column(db.DateTime, nullable=False, server_default='9999-12-31 23:59:59', index=True) kind = db.Column(db.String(32), nullable=False) onetime = db.Column(db.TinyInteger(1), nullable=False, server_default='0') status = db.Column(db.Char(1), nullable=False, server_default='W') @validates('kind') def validate_kind(self, key, kind): """Validate cookie kind.""" assert kind in self.AUTHORIZATIONS_KIND return kind @classmethod def get(cls, cookie, delete=False): """Get cookie if it is valid.""" try: password = cookie[:16]+cookie[-16:] cookie_id = int(cookie[16:-16], 16) except ValueError: raise InvenioWebAccessMailCookieError("Cookie is corrupted") obj, data = db.session.query( cls, db.func.aes_decrypt( cls._data, bindparam('password') ).label('decrypted') ).params(password=password).filter_by(id=cookie_id).one() obj.data = loads(data) (kind_check, params, expiration, onetime_check) = obj.data assert obj.kind in cls.AUTHORIZATIONS_KIND if not (obj.kind == kind_check and obj.onetime == onetime_check): raise InvenioWebAccessMailCookieError("Cookie is corrupted") if obj.status == 'D': raise InvenioWebAccessMailCookieDeletedError( "Cookie has been deleted") if obj.onetime or delete: obj.status = 'D' db.session.merge(obj) db.session.commit() return obj @classmethod def create(cls, kind, params, cookie_timeout=timedelta(days=1), onetime=False): """Create cookie with given params.""" expiration = datetime.today() + cookie_timeout data = (kind, params, expiration, onetime) password = md5(str(random())).hexdigest() cookie = cls( expiration=expiration, kind=kind, onetime=int(onetime), ) cookie._data = db.func.aes_encrypt(dumps(data), password) db.session.add(cookie) db.session.commit() db.session.refresh(cookie) return password[:16]+hex(cookie.id)[2:-1]+password[-16:] @classmethod @session_manager def gc(cls): """Remove expired items.""" return cls.query.filter(cls.expiration<db.func.now()).delete()
class CmtRECORDCOMMENT(db.Model): """Represents a CmtRECORDCOMMENT record.""" __tablename__ = 'cmtRECORDCOMMENT' id = db.Column(db.Integer(15, unsigned=True), nullable=False, primary_key=True, autoincrement=True) id_bibrec = db.Column(db.MediumInteger(8, unsigned=True), db.ForeignKey(Bibrec.id), nullable=False, server_default='0') id_user = db.Column(db.Integer(15, unsigned=True), db.ForeignKey(User.id), nullable=False, server_default='0') title = db.Column(db.String(255), nullable=False, server_default='') body = db.Column(db.Text, nullable=False) date_creation = db.Column(db.DateTime, nullable=False, server_default='1900-01-01 00:00:00') star_score = db.Column(db.TinyInteger(5, unsigned=True), nullable=False, server_default='0') nb_votes_yes = db.Column(db.Integer(10), nullable=False, server_default='0') nb_votes_total = db.Column(db.Integer(10, unsigned=True), nullable=False, server_default='0') nb_abuse_reports = db.Column(db.Integer(10), nullable=False, server_default='0') status = db.Column(db.Char(2), nullable=False, index=True, server_default='ok') round_name = db.Column(db.String(255), nullable=False, server_default='') restriction = db.Column(db.String(50), nullable=False, server_default='') in_reply_to_id_cmtRECORDCOMMENT = db.Column(db.Integer(15, unsigned=True), db.ForeignKey(id), nullable=False, server_default='0') reply_order_cached_data = db.Column(db.Binary, nullable=True) bibrec = db.relationship(Bibrec, backref='recordcomments') user = db.relationship(User, backref='recordcomments') replies = db.relationship('CmtRECORDCOMMENT', backref=db.backref('parent', remote_side=[id], order_by=date_creation)) @property def is_deleted(self): """Check if is deleted.""" return self.status != 'ok' def is_collapsed(self, id_user): """Return true if the comment is collapsed by user.""" return CmtCOLLAPSED.query.filter( db.and_(CmtCOLLAPSED.id_bibrec == self.id_bibrec, CmtCOLLAPSED.id_cmtRECORDCOMMENT == self.id, CmtCOLLAPSED.id_user == id_user)).count() > 0 @session_manager def collapse(self, id_user): """Collapse comment beloging to user.""" c = CmtCOLLAPSED(id_bibrec=self.id_bibrec, id_cmtRECORDCOMMENT=self.id, id_user=id_user) db.session.add(c) db.session.commit() def expand(self, id_user): """Expand comment beloging to user.""" CmtCOLLAPSED.query.filter( db.and_(CmtCOLLAPSED.id_bibrec == self.id_bibrec, CmtCOLLAPSED.id_cmtRECORDCOMMENT == self.id, CmtCOLLAPSED.id_user == id_user)).delete( synchronize_session=False) __table_args__ = (db.Index('cmtRECORDCOMMENT_reply_order_cached_data', reply_order_cached_data, mysql_length=40), db.Model.__table_args__) @classmethod def count(cls, *criteria, **filters): """Count how many comments.""" return cls.query.filter(*criteria).filter_by(**filters).count()
class Format(db.Model): """Represents a Format record.""" __tablename__ = 'format' id = db.Column( db.MediumInteger(9, unsigned=True), primary_key=True, autoincrement=True) name = db.Column(db.String(255), nullable=False) code = db.Column(db.String(20), nullable=False, unique=True) description = db.Column(db.String(255), server_default='') content_type = db.Column(db.String(255), server_default='') mime_type = db.Column(db.String(255), unique=True, nullable=True) visibility = db.Column( db.TinyInteger(4), nullable=False, server_default='1') last_updated = db.Column(db.DateTime, nullable=True) @classmethod def get_export_formats(cls): return cls.query.filter(db.and_( Format.content_type != 'text/html', Format.visibility == 1) ).order_by(Format.name).all() def set_name(self, name, lang="generic", type='ln'): """ Sets the name of an output format. if 'type' different from 'ln' or 'sn', do nothing if 'name' exceeds 256 chars, 'name' is truncated to first 256 chars. The localized names of output formats are located in formatname table. :param type: either 'ln' (for long name) and 'sn' (for short name) :param lang: the language in which the name is given :param name: the name to give to the output format """ if len(name) > 256: name = name[:256] if type.lower() != "sn" and type.lower() != "ln": return if lang == "generic" and type.lower() == "ln": self.name = name else: # Save inside formatname table for name variations fname = db.session.query(Formatname)\ .get((self.id, lang, type.lower())) if not fname: fname = db.session.merge(Formatname()) fname.id_format = self.id fname.ln = lang fname.type = type.lower() fname.value = name db.session.save(fname) db.session.add(self) db.session.commit()