Exemplo n.º 1
0
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')
Exemplo n.º 2
0
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')
Exemplo n.º 3
0
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))
Exemplo n.º 4
0
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')
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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)
Exemplo n.º 7
0
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__)
Exemplo n.º 8
0
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)
Exemplo n.º 9
0
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')
Exemplo n.º 10
0
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)
Exemplo n.º 11
0
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
Exemplo n.º 12
0
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()
Exemplo n.º 13
0
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')
Exemplo n.º 14
0
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)
Exemplo n.º 15
0
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
Exemplo n.º 16
0
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')
Exemplo n.º 17
0
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)
Exemplo n.º 18
0
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))
Exemplo n.º 19
0
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()
Exemplo n.º 20
0
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__)