class Collectionname(db.Model): """Represent a Collectionname record.""" __tablename__ = 'collectionname' id_collection = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Collection.id), nullable=False, primary_key=True) ln = db.Column(db.Char(5), nullable=False, primary_key=True, server_default='') type = db.Column(db.Char(3), nullable=False, primary_key=True, server_default='sn') value = db.Column(db.String(255), nullable=False) @db.hybrid_property def ln_type(self): """Get ln type.""" return (self.ln, self.type) @ln_type.setter def set_ln_type(self, value): """Set ln type.""" (self.ln, self.type) = value
class Collectionboxname(db.Model): """Represent a Collectionboxname record.""" __tablename__ = 'collectionboxname' TYPES = { 'v': 'Focus on:', 'r': 'Narrow by collection:', 'l': 'Latest additions:', } id_collection = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Collection.id), nullable=False, primary_key=True) ln = db.Column(db.Char(5), nullable=False, primary_key=True, server_default='') type = db.Column(db.Char(3), nullable=False, primary_key=True, server_default='r') value = db.Column(db.String(255), nullable=False) @db.hybrid_property def ln_type(self): return (self.ln, self.type) @ln_type.setter def set_ln_type(self, value): (self.ln, self.type) = value
class Fieldname(db.Model): """Represent a Fieldname record.""" __tablename__ = 'fieldname' id_field = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(Field.id), primary_key=True) ln = db.Column(db.Char(5), primary_key=True, server_default='') type = db.Column(db.Char(3), primary_key=True, server_default='sn') value = db.Column(db.String(255), nullable=False) field = db.relationship(Field, backref='names')
class IdxINDEXNAME(db.Model): """Represent a IdxINDEXNAME record.""" __tablename__ = 'idxINDEXNAME' id_idxINDEX = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(IdxINDEX.id), primary_key=True) ln = db.Column(db.Char(5), primary_key=True, server_default='') type = db.Column(db.Char(3), primary_key=True, server_default='sn') value = db.Column(db.String(255), nullable=False) idxINDEX = db.relationship(IdxINDEX, backref='names')
class RnkMETHODNAME(db.Model): """Represent a RnkMETHODNAME record.""" __tablename__ = 'rnkMETHODNAME' id_rnkMETHOD = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(RnkMETHOD.id), primary_key=True) ln = db.Column(db.Char(5), primary_key=True, server_default='') type = db.Column(db.Char(3), primary_key=True, server_default='sn') value = db.Column(db.String(255), nullable=False) method = db.relationship(RnkMETHOD, backref=db.backref('names', lazy='dynamic'))
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 OaiHARVESTLOG(db.Model): """Represents a OaiHARVESTLOG record.""" __tablename__ = 'oaiHARVESTLOG' id_oaiHARVEST = db.Column(db.MediumInteger(9, unsigned=True), db.ForeignKey(OaiHARVEST.id), nullable=False) id_bibrec = db.Column(db.MediumInteger(8, unsigned=True), db.ForeignKey(Bibrec.id), nullable=False, server_default='0') bibupload_task_id = db.Column(db.Integer(11), db.ForeignKey(SchTASK.id), nullable=False, server_default='0', primary_key=True) oai_id = db.Column(db.String(40), nullable=False, server_default='', primary_key=True) date_harvested = db.Column(db.DateTime, nullable=False, server_default='1900-01-01 00:00:00', primary_key=True) date_inserted = db.Column(db.DateTime, nullable=False, server_default='1900-01-01 00:00:00') inserted_to_db = db.Column(db.Char(1), nullable=False, server_default='P') bibrec = db.relationship(Bibrec, backref='harvestlogs') schtask = db.relationship(SchTASK)
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 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 SbmCOLLECTIONSbmDOCTYPE(db.Model): """Represents a SbmCOLLECTIONSbmDOCTYPE record.""" __tablename__ = 'sbmCOLLECTION_sbmDOCTYPE' id = db.Column(db.Integer(11), nullable=False, autoincrement=True, primary_key=True) _id_father = db.Column(db.Integer(11), db.ForeignKey(SbmCOLLECTION.id), nullable=True, name="id_father") id_son = db.Column(db.Char(10), db.ForeignKey(SbmDOCTYPE.sdocname), nullable=False) catalogue_order = db.Column(db.Integer(11), nullable=False, server_default='0') father = db.relationship( SbmCOLLECTION, backref=db.backref('sonDoctype', uselist=False), ) @db.hybrid_property def id_father(self): """Get id_father.""" return self._id_father @id_father.setter def id_father(self, value): """Set id_father.""" self._id_father = value or None
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 WebQuery(db.Model): """Represent a WebQuery record.""" __tablename__ = 'query' id = db.Column(db.Integer(15, unsigned=True), primary_key=True, autoincrement=True) type = db.Column(db.Char(1), nullable=False, server_default='r') urlargs = db.Column(db.Text(100), nullable=False, index=True)
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 SbmIMPLEMENT(db.Model): """Represents a SbmIMPLEMENT record.""" __tablename__ = 'sbmIMPLEMENT' docname = db.Column(db.String(10), nullable=True) actname = db.Column(db.Char(3), nullable=True) displayed = db.Column(db.Char(1), nullable=True) subname = db.Column(db.String(13), nullable=True, primary_key=True) nbpg = db.Column(db.Integer(11), nullable=True, primary_key=True, autoincrement=False) cd = db.Column(db.Date, nullable=True) md = db.Column(db.Date, nullable=True) buttonorder = db.Column(db.Integer(11), nullable=True) statustext = db.Column(db.Text, nullable=True) level = db.Column(db.Char(1), nullable=False, server_default='') score = db.Column(db.Integer(11), nullable=False, server_default='0') stpage = db.Column(db.Integer(11), nullable=False, server_default='0') endtxt = db.Column(db.String(100), nullable=False, server_default='')
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 SbmACTION(db.Model): """Represents a SbmACTION record.""" __tablename__ = 'sbmACTION' lactname = db.Column(db.Text, nullable=True) sactname = db.Column(db.Char(3), nullable=False, server_default='', primary_key=True) dir = db.Column(db.Text, nullable=True) cd = db.Column(db.Date, nullable=True) md = db.Column(db.Date, nullable=True) actionbutton = db.Column(db.Text, nullable=True) statustext = db.Column(db.Text, nullable=True)
class UsergroupBskBASKET(db.Model): """Represents a UsergroupBskBASKET record.""" __tablename__ = 'usergroup_bskBASKET' id_usergroup = db.Column(db.Integer(15, unsigned=True), db.ForeignKey(Usergroup.id), nullable=False, server_default='0', primary_key=True) id_bskBASKET = db.Column(db.Integer(15, unsigned=True), db.ForeignKey(BskBASKET.id), nullable=False, server_default='0', primary_key=True) topic = db.Column(db.String(50), nullable=False, server_default='') date_shared = db.Column(db.DateTime, nullable=False, server_default='1900-01-01 00:00:00') share_level = db.Column(db.Char(2), nullable=False, server_default='') usergroup = db.relationship(Usergroup, backref='usergroup_baskets') usergroup_basket = db.relationship(BskBASKET, backref='usergroups')
class SbmCOLLECTIONSbmDOCTYPE(db.Model): """Represents a SbmCOLLECTIONSbmDOCTYPE record.""" __tablename__ = 'sbmCOLLECTION_sbmDOCTYPE' id_father = db.Column(db.Integer(11), db.ForeignKey(SbmCOLLECTION.id), nullable=False, server_default='0', primary_key=True) id_son = db.Column(db.Char(10), db.ForeignKey(SbmDOCTYPE.sdocname), nullable=False, server_default='0', primary_key=True) catalogue_order = db.Column(db.Integer(11), nullable=False, server_default='0')
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 SbmFIELD(db.Model): """Represents a SbmFIELD record.""" __tablename__ = 'sbmFIELD' subname = db.Column(db.String(13), nullable=True, primary_key=True) pagenb = db.Column(db.Integer(11), nullable=True, primary_key=True, autoincrement=False) fieldnb = db.Column(db.Integer(11), nullable=True) fidesc = db.Column(db.String(15), nullable=True, primary_key=True) fitext = db.Column(db.Text, nullable=True) level = db.Column(db.Char(1), nullable=True) sdesc = db.Column(db.Text, nullable=True) checkn = db.Column(db.Text, nullable=True) cd = db.Column(db.Date, nullable=True) md = db.Column(db.Date, nullable=True) fiefi1 = db.Column(db.Text, nullable=True) fiefi2 = db.Column(db.Text, nullable=True)
def do_upgrade(): """ Implement your upgrades here """ m = db.MetaData(bind=db.engine) m.reflect() tpid = db.Table( 'pid', m, db.Column('id', db.Integer(15, unsigned=True), primary_key=True, nullable=False), db.Column('type', db.String(length=6), nullable=False), db.Column('pid', db.String(length=255), nullable=False), db.Column('status', db.Char(length=1), nullable=False), db.Column('created', db.DateTime(), nullable=False), db.Column('last_modified', db.DateTime(), nullable=False), db.Index('uidx_type_pid', 'type', 'pid', unique=True), db.Index('idx_status', 'status'), mysql_engine='MyISAM', ) tpidlog = db.Table( 'pidLOG', m, db.Column('id', db.Integer(15, unsigned=True), primary_key=True, nullable=False), db.Column('id_pid', db.Integer(15, unsigned=True), ForeignKey('pid.id')), db.Column('timestamp', DateTime(), nullable=False), db.Column('action', db.String(length=10), nullable=False), db.Column('message', Text(), nullable=False), db.Index('idx_action', 'action'), mysql_engine='MyISAM', ) tpidregistry = db.Table( 'pidREGISTRY', m, db.Column('object_type', db.String(length=3), primary_key=True, nullable=False), db.Column('object_id', db.String(length=255), nullable=False), db.Column('id_pid', db.Integer(15, unsigned=True), ForeignKey('pid.id'), primary_key=True, nullable=False), db.Index('idx_type_id', 'object_type', 'object_id'), mysql_engine='MyISAM', ) tpid.create() tpidlog.create() tpidregistry.create()
class UserMsgMESSAGE(db.Model): """Represents a UserMsgMESSAGE record.""" __tablename__ = 'user_msgMESSAGE' id_user_to = db.Column(db.Integer(15, unsigned=True), db.ForeignKey(User.id), nullable=False, server_default='0', primary_key=True) id_msgMESSAGE = db.Column(db.Integer(15, unsigned=True), db.ForeignKey(MsgMESSAGE.id), nullable=False, server_default='0', primary_key=True) status = db.Column(db.Char(1), nullable=False, server_default='N') user_to = db.relationship(User, backref='received_messages', collection_class=set) message = db.relationship(MsgMESSAGE, backref='sent_to_users', collection_class=set)
class UserQueryBasket(db.Model): """Represent a UserQueryBasket record.""" __tablename__ = 'user_query_basket' id_user = db.Column(db.Integer(15, unsigned=True), db.ForeignKey(User.id), nullable=False, server_default='0', primary_key=True) id_query = db.Column(db.Integer(15, unsigned=True), db.ForeignKey(WebQuery.id), nullable=False, server_default='0', primary_key=True, index=True) id_basket = db.Column(db.Integer(15, unsigned=True), db.ForeignKey(BskBASKET.id), nullable=False, server_default='0', primary_key=True, index=True) frequency = db.Column(db.String(5), nullable=False, server_default='', primary_key=True) date_creation = db.Column(db.Date, nullable=True) date_lastrun = db.Column(db.Date, nullable=True, server_default='1900-01-01') alert_name = db.Column(db.String(30), nullable=False, server_default='', index=True) alert_desc = db.Column(db.Text) alert_recipient = db.Column(db.Text) notification = db.Column(db.Char(1), nullable=False, server_default='y') user = db.relationship(User, backref='query_baskets') webquery = db.relationship(WebQuery, backref='user_baskets') basket = db.relationship(BskBASKET, backref='user_queries')
class SbmFIELDDESC(db.Model): """Represents a SbmFIELDDESC record.""" __tablename__ = 'sbmFIELDDESC' name = db.Column( db.String(15), #db.ForeignKey(SbmFIELD.fidesc), nullable=False, server_default='', primary_key=True) alephcode = db.Column(db.String(50), nullable=True) marccode = db.Column(db.String(50), nullable=False, server_default='') type = db.Column(db.Char(1), nullable=True) size = db.Column(db.Integer(11), nullable=True) rows = db.Column(db.Integer(11), nullable=True) cols = db.Column(db.Integer(11), nullable=True) maxlength = db.Column(db.Integer(11), nullable=True) val = db.Column(db.Text, nullable=True) fidesc = db.Column(db.Text, nullable=True) cd = db.Column(db.Date, nullable=True) md = db.Column(db.Date, nullable=True) modifytext = db.Column(db.Text, nullable=True) fddfi2 = db.Column(db.Text, nullable=True) cookie = db.Column(db.Integer(11), nullable=True, server_default='0')
class Tag(db.Model): """Represent a Tag record.""" __tablename__ = 'tag' id = db.Column(db.MediumInteger(9, unsigned=True), primary_key=True) name = db.Column(db.String(255), nullable=False) value = db.Column(db.Char(6), nullable=False, server_default='') recjson_value = db.Column(db.Text, nullable=False) def __init__(self, tup=None, *args, **kwargs): if tup is not None and isinstance(tup, tuple): self.name, self.value = tup super(Tag, self).__init__(*args, **kwargs) else: if tup is None: super(Tag, self).__init__(*args, **kwargs) else: super(Tag, self).__init__(tup, *args, **kwargs) @property def as_tag(self): """Returns tupple with name and value.""" return self.name, self.value
class CmtACTIONHISTORY(db.Model): """Represents a CmtACTIONHISTORY record.""" __tablename__ = 'cmtACTIONHISTORY' id_cmtRECORDCOMMENT = db.Column(db.Integer(15, unsigned=True), db.ForeignKey(CmtRECORDCOMMENT.id), nullable=True, primary_key=True) id_bibrec = db.Column(db.MediumInteger(8, unsigned=True), db.ForeignKey(Bibrec.id), nullable=True, primary_key=True) id_user = db.Column(db.Integer(15, unsigned=True), db.ForeignKey(User.id), nullable=True, primary_key=True) client_host = db.Column(db.Integer(10, unsigned=True), nullable=True) action_time = db.Column(db.DateTime, nullable=False, server_default='1900-01-01 00:00:00') action_code = db.Column(db.Char(1), nullable=False, index=True) recordcomment = db.relationship(CmtRECORDCOMMENT, backref='actionhistory') bibrec = db.relationship(Bibrec) user = db.relationship(User)
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 KnwKB(db.Model): """Represent a KnwKB record.""" KNWKB_TYPES = { 'written_as': 'w', 'dynamic': 'd', 'taxonomy': 't', } __tablename__ = 'knwKB' id = db.Column(db.MediumInteger(8, unsigned=True), nullable=False, primary_key=True, autoincrement=True) _name = db.Column(db.String(255), server_default='', unique=True, name="name") _description = db.Column(db.Text, nullable=False, name="description", default="") _kbtype = db.Column(db.Char(1), nullable=True, default='w', name="kbtype") slug = db.Column(db.String(255), unique=True, nullable=False, default="") # Enable or disable the access from REST API is_api_accessible = db.Column(db.Boolean, default=True, nullable=False) @db.hybrid_property def name(self): """Get name.""" return self._name @name.setter def name(self, value): """Set name and generate the slug.""" self._name = value # generate slug if not self.slug: self.slug = KnwKB.generate_slug(value) @db.hybrid_property def description(self): """Get description.""" return self._description @description.setter def description(self, value): """Set description.""" # TEXT in mysql don't support default value # @see http://bugs.mysql.com/bug.php?id=21532 self._description = value or '' @db.hybrid_property def kbtype(self): """Get kbtype.""" return self._kbtype @kbtype.setter def kbtype(self, value): """Set kbtype.""" if value is None: # set the default value return # or set one of the available values kbtype = value[0] if len(value) > 0 else 'w' if kbtype not in ['t', 'd', 'w']: raise ValueError('unknown type "{value}", please use one of \ following values: "taxonomy", "dynamic" or \ "written_as"'.format(value=value)) self._kbtype = kbtype def is_dynamic(self): """Return true if the type is dynamic.""" return self._kbtype == 'd' def to_dict(self): """Return a dict representation of KnwKB.""" mydict = { 'id': self.id, 'name': self.name, 'description': self.description, 'kbtype': self.kbtype } if self.kbtype == 'd': mydict.update((self.kbdefs.to_dict() if self.kbdefs else {}) or {}) return mydict def get_kbr_items(self, searchkey="", searchvalue="", searchtype='s'): """ Return dicts of 'key' and 'value' from a knowledge base. :param kb_name the name of the knowledge base :param searchkey search using this key :param searchvalue search using this value :param searchtype s=substring, e=exact, sw=startswith :return a list of dictionaries [{'key'=>x, 'value'=>y},..] """ import warnings warnings.warn("The function is deprecated. Please use the " "`KnwKBRVAL.query_kb_mappings()` instead. " "E.g. [kval.to_dict() for kval in " "KnwKBRVAL.query_kb_mappings(kb_id).all()]") if searchtype == 's' and searchkey: searchkey = '%' + searchkey + '%' if searchtype == 's' and searchvalue: searchvalue = '%' + searchvalue + '%' if searchtype == 'sw' and searchvalue: # startswith searchvalue = searchvalue + '%' if not searchvalue: searchvalue = '%' if not searchkey: searchkey = '%' kvals = KnwKBRVAL.query.filter(KnwKBRVAL.id_knwKB.like(self.id), KnwKBRVAL.m_value.like(searchvalue), KnwKBRVAL.m_key.like(searchkey)).all() return [kval.to_dict() for kval in kvals] def get_kbr_values(self, searchkey="", searchvalue="", searchtype='s'): """ Return dicts of 'key' and 'value' from a knowledge base. :param kb_name the name of the knowledge base :param searchkey search using this key :param searchvalue search using this value :param searchtype s=substring, e=exact, sw=startswith :return a list of dictionaries [{'key'=>x, 'value'=>y},..] """ import warnings warnings.warn("The function is deprecated. Please use the " "`KnwKBRVAL.query_kb_mappings()` instead. " "E.g. [(kval.m_value,) for kval in " "KnwKBRVAL.query_kb_mappings(kb_id).all()]") # prepare filters if searchtype == 's': searchkey = '%' + searchkey + '%' if searchtype == 's' and searchvalue: searchvalue = '%' + searchvalue + '%' if searchtype == 'sw' and searchvalue: # startswith searchvalue = searchvalue + '%' if not searchvalue: searchvalue = '%' # execute query return db.session.execute( db.select([KnwKBRVAL.m_value], db.and_(KnwKBRVAL.id_knwKB.like(self.id), KnwKBRVAL.m_value.like(searchvalue), KnwKBRVAL.m_key.like(searchkey)))) @session_manager def set_dyn_config(self, field, expression, collection=None): """Set dynamic configuration.""" if self.kbdefs: # update self.kbdefs.output_tag = field self.kbdefs.search_expression = expression self.kbdefs.collection = collection db.session.merge(self.kbdefs) else: # insert self.kbdefs = KnwKBDDEF(output_tag=field, search_expression=expression, collection=collection) @staticmethod def generate_slug(name): """Generate a slug for the knowledge. :param name: text to slugify :return: slugified text """ slug = slugify(name) i = KnwKB.query.filter( db.or_( KnwKB.slug.like(slug), KnwKB.slug.like(slug + '-%'), )).count() return slug + ('-{0}'.format(i) if i > 0 else '') @staticmethod def exists(kb_name): """Return True if a kb with the given name exists. :param kb_name: the name of the knowledge base :return: True if kb exists """ return KnwKB.query_exists(KnwKB.name.like(kb_name)) @staticmethod def query_exists(filters): """Return True if a kb with the given filters exists. E.g: KnwKB.query_exists(KnwKB.name.like('FAQ')) :param filters: filter for sqlalchemy :return: True if kb exists """ return db.session.query(KnwKB.query.filter(filters).exists()).scalar() def get_filename(self): """Construct the file name for taxonomy knoledge.""" return cfg['CFG_WEBDIR'] + "/kbfiles/" \ + str(self.id) + ".rdf"
def do_upgrade(): """Implement your upgrades here.""" # Table sbmCOLLECTION_sbmCOLLECTION # add column "id" in the table op.add_column('sbmCOLLECTION_sbmCOLLECTION', db.Column('id', db.Integer(11), nullable=False)) # set all new ids records = run_sql("""SELECT id_father, id_son FROM """ """sbmCOLLECTION_sbmCOLLECTION AS ssc """ """ORDER BY ssc.id_father, ssc.id_son""") for index, rec in enumerate(records): run_sql("""UPDATE sbmCOLLECTION_sbmCOLLECTION SET id = %s WHERE id_father = %s AND id_son = %s """, (index + 1, rec[0], rec[1])) # drop primary keys try: op.drop_constraint(None, 'sbmCOLLECTION_sbmCOLLECTION', type_='primary') except OperationalError: # the primary key is already dropped warnings.warn("""Primary key of sbmCOLLECTION_sbmCOLLECTION """ """table has been already dropped.""") # create new primary key with id op.create_primary_key('pk_sbmCOLLECTION_sbmCOLLECTION_id', 'sbmCOLLECTION_sbmCOLLECTION', ['id']) # set id as autoincrement op.alter_column('sbmCOLLECTION_sbmCOLLECTION', 'id', existing_type=db.Integer(11), existing_nullable=False, autoincrement=True) # fix columns id_father and id_son op.alter_column('sbmCOLLECTION_sbmCOLLECTION', 'id_father', existing_type=db.Integer(11), nullable=True, server_default=None) op.alter_column('sbmCOLLECTION_sbmCOLLECTION', 'id_son', existing_type=db.Integer(11), nullable=False, server_default=None) op.create_index('id_father', 'sbmCOLLECTION_sbmCOLLECTION', columns=['id_father']) # Table sbmCOLLECTION_sbmDOCTYPE # add column "id" in the table op.add_column('sbmCOLLECTION_sbmDOCTYPE', db.Column('id', db.Integer(11), nullable=False)) # set all new ids records = run_sql("""SELECT id_father, id_son FROM sbmCOLLECTION_sbmDOCTYPE AS ssd ORDER BY ssd.id_father, ssd.id_son""") for index, rec in enumerate(records): run_sql("""UPDATE sbmCOLLECTION_sbmDOCTYPE SET id = %s WHERE id_father = %s AND id_son = %s """, (index + 1, rec[0], rec[1])) # drop primary keys op.drop_constraint('id_father', 'sbmCOLLECTION_sbmDOCTYPE', type_='primary') # create new primary key with id op.create_primary_key('pk_sbmCOLLECTION_sbmDOCTYPE_id', 'sbmCOLLECTION_sbmDOCTYPE', ['id']) # set id as autoincrement op.alter_column('sbmCOLLECTION_sbmDOCTYPE', 'id', existing_type=db.Integer(11), existing_nullable=False, autoincrement=True) # fix columns id_father and id_son op.alter_column('sbmCOLLECTION_sbmDOCTYPE', 'id_father', existing_type=db.Integer(11), nullable=True, server_default=None) op.alter_column('sbmCOLLECTION_sbmDOCTYPE', 'id_son', existing_type=db.Char(10), nullable=False, server_default=None) op.create_index('id_father', 'sbmCOLLECTION_sbmDOCTYPE', columns=['id_father'])