class RnkMETHODNAME(db.Model): """Represents 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='names')
class Fieldname(db.Model): """Represents 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 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): """Represents 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 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 WebQuery(db.Model): """Represents 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 KnwKB(db.Model): """Represents a KnwKB record.""" def __init__(self): pass __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) description = db.Column(db.Text, nullable=True) kbtype = db.Column(db.Char(1), nullable=True)
class AccMAILCOOKIE(db.Model): """Represents a AccMAILCOOKIE record.""" __tablename__ = 'accMAILCOOKIE' id = db.Column(db.Integer(15, unsigned=True), primary_key=True, autoincrement=True) data = db.Column(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')
class CollectionPortalbox(db.Model): """Represents 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 Collectionname(db.Model): """Represents 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): return (self.ln, self.type) @ln_type.setter def set_ln_type(self, value): (self.ln, self.type) = value
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 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 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 Tag(db.Model): """Represents 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) 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 UserQueryBasket(db.Model): """Represents 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 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 CollectionCollection(db.Model): """Represents 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 PersistentIdentifier(db.Model): """ Store and register persistent identifiers Assumptions: * Persistent identifiers can be represented as a string of max 255 chars. * An object has many persistent identifiers. * A persistent identifier has one and only one object. """ __tablename__ = 'pid' __table_args__ = ( db.Index('uidx_type_pid', 'type', 'pid', unique=True), db.Index('idx_status', 'status'), db.Index('', 'object_type', 'object_id'), ) id = db.Column(db.Integer(15, unsigned=True), primary_key=True) """ Id of persistent identifier entry """ type = db.Column(db.String(6), nullable=False) """ Persistent Identifier Scheme """ pid = db.Column(db.String(length=255), nullable=False) """ Persistent Identifier """ status = db.Column(db.Char(length=1), nullable=False) """ Status of persistent identifier, e.g. registered, reserved, deleted """ object_type = db.Column(db.String(3), nullable=True) """ Object Type - e.g. rec for record """ object_id = db.Column(db.String(length=255), nullable=True) """ Object ID - e.g. a record id """ created = db.Column(db.DateTime(), nullable=False, default=datetime.now) """ Creation datetime of entry """ last_modified = db.Column(db.DateTime(), nullable=False, default=datetime.now, onupdate=datetime.now) """ Last modification datetime of entry """ # # Class methods # @classmethod def create(cls, pid_type, pid, provider=None): """ Internally reserve a new persistent identifier in Invenio. A provider for the given persistent identifier type must exists. By default the system will choose a provider according to the pid type. If desired, the default system provider can be overridden via the provider keyword argument. Returns PID object if successful otherwise None. """ # Ensure provider exists if provider is None: provider = PidProvider.create(pid_type, pid) if not provider: raise Exception("No provider found for %s:%s" % (pid_type, pid)) try: obj = cls(type=provider.pid_type, pid=pid, status=CFG_STATUS_NEW) obj._provider = provider db.session.add(obj) db.session.commit() obj.log("CREATE", "Created") return obj except SQLAlchemyError: db.session.rollback() obj.log("CREATE", "Failed to created. Already exists.") return None @classmethod def get(cls, pid_type, pid, provider=None): """ Get persistent identifier. Returns None if not found. """ pid = to_unicode(pid) obj = cls.query.filter_by(type=pid_type, pid=pid).first() if obj: obj._provider = provider return obj else: return None # # Instance methods # def has_object(self, object_type, object_id): """ Determine if this persistent identifier is assigned to a specific object. """ if object_type not in CFG_OBJECT_TYPES: raise Exception("Invalid object type %s." % object_type) object_id = to_unicode(object_id) return self.object_type == object_type and self.object_id == object_id def get_provider(self): """ Get the provider for this type of persistent identifier """ if self._provider is None: self._provider = PidProvider.create(self.type, self.pid) return self._provider def assign(self, object_type, object_id, overwrite=False): """ Assign this persistent identifier to a given object Note, the persistent identifier must first have been reserved. Also, if an exsiting object is already assigned to the pid, it will raise an exception unless overwrite=True. """ if object_type not in CFG_OBJECT_TYPES: raise Exception("Invalid object type %s." % object_type) object_id = to_unicode(object_id) if not self.id: raise Exception( "You must first create the persistent identifier before you can assign objects to it." ) # FIXME: Desirable to not be able to assign to a deleted? if self.is_deleted(): raise Exception( "You cannot assign objects to a deleted persistent identifier." ) # Check for an existing object assigned to this pid existing_obj_id = self.get_assigned_object(object_type) if existing_obj_id and existing_obj_id != object_id: if not overwrite: raise Exception( "Persistent identifier is already assigned to another object" ) else: self.log( "ASSIGN", "Unassigned object %s:%s (overwrite requested)" % (self.object_type, self.object_id)) self.object_type = None self.object_id = None elif existing_obj_id and existing_obj_id == object_id: # The object is already assigned to this pid. return True self.object_type = object_type self.object_id = object_id db.session.commit() self.log("ASSIGN", "Assigned object %s:%s" % (self.object_type, self.object_id)) return True def update(self, with_deleted=False, *args, **kwargs): """ Update the persistent identifier with the provider. """ if self.is_new() or self.is_reserved(): raise Exception( "Persistent identifier has not yet been registered.") if not with_deleted and self.is_deleted(): raise Exception("Persistent identifier has been deleted.") provider = self.get_provider() if provider is None: self.log("UPDATE", "No provider found.") raise Exception("No provider found.") if provider.update(self, *args, **kwargs): if with_deleted and self.is_deleted(): self.status = CFG_STATUS_REGISTERED db.session.commit() return True return False def reserve(self, *args, **kwargs): """ Reserve the persistent identifier with the provider Note, the reserve method may be called multiple times, even if it was already reserved. """ if not (self.is_new() or self.is_reserved()): raise Exception( "Persistent identifier has already been registered.") provider = self.get_provider() if provider is None: self.log("RESERVE", "No provider found.") raise Exception("No provider found.") if provider.reserve(self, *args, **kwargs): self.status = CFG_STATUS_RESERVED db.session.commit() return True return False def register(self, *args, **kwargs): """ Register the persistent identifier with the provider """ if self.is_registered() or self.is_deleted(): raise Exception( "Persistent identifier has already been registered.") provider = self.get_provider() if provider is None: self.log("REGISTER", "No provider found.") raise Exception("No provider found.") if provider.register(self, *args, **kwargs): self.status = CFG_STATUS_REGISTERED db.session.commit() return True return False def delete(self, *args, **kwargs): """ Delete the persistent identifier """ if self.is_new(): # New DOI which haven't been registered yet. Just delete it # completely but keep log) # Remove links to log entries (but otherwise leave the log entries) PidLog.query.filter_by(id_pid=self.id).update({'id_pid': None}) db.session.delete(self) self.log("DELETE", "Unregistered PID successfully deleted") else: provider = self.get_provider() if not provider.delete(self, *args, **kwargs): return False self.status = CFG_STATUS_DELETED db.session.commit() return True def get_assigned_object(self, object_type=None): if object_type is not None and self.object_type == object_type: return self.object_id return None def is_registered(self): """ Returns true if the persistent identifier has been registered """ return self.status == CFG_STATUS_REGISTERED def is_deleted(self): """ Returns true if the persistent identifier has been deleted """ return self.status == CFG_STATUS_DELETED def is_new(self): """ Returns true if the persistent identifier has not yet been registered or reserved """ return self.status == CFG_STATUS_NEW def is_reserved(self): """ Returns true if the persistent identifier has not yet been reserved. """ return self.status == CFG_STATUS_RESERVED def log(self, action, message): if self.type and self.pid: message = "[%s:%s] %s" % (self.type, self.pid, message) p = PidLog(id_pid=self.id, action=action, message=message) db.session.add(p) db.session.commit()
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])) @property def is_deleted(self): return self.status != 'ok' def is_collapsed(self, id_user): """Returns 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 def collapse(self, id_user): """Collapses comment beloging to user.""" c = CmtCOLLAPSED(id_bibrec=self.id_bibrec, id_cmtRECORDCOMMENT=self.id, id_user=id_user) try: db.session.add(c) db.session.commit() except: db.session.rollback() def expand(self, id_user): """Expands 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__)