Source code for mxcubeweb.core.models.usermodels

import pytz
import tzlocal
from flask_security import (
    RoleMixin,
    UserMixin,
)
from sqlalchemy import (
    JSON,
    Boolean,
    Column,
    DateTime,
    ForeignKey,
    Integer,
    String,
    Text,
    Unicode,
)
from sqlalchemy.orm import (
    backref,
    relationship,
)

from mxcubeweb.core.components.user.database import Base


[docs]class RolesUsers(Base): __tablename__ = "roles_users" id = Column(Integer(), primary_key=True) user_id = Column("user_id", Integer(), ForeignKey("user.id")) role_id = Column("role_id", Integer(), ForeignKey("role.id"))
[docs]class Role(Base, RoleMixin): __tablename__ = "role" id = Column(Integer(), primary_key=True) name = Column(String(80), unique=True) description = Column(String(255))
[docs]class MessagesUsers(Base): __tablename__ = "messages_users" id = Column(Integer(), primary_key=True) user_id = Column("user_id", Integer(), ForeignKey("user.id")) message_id = Column("message_id", Integer(), ForeignKey("message.id"))
[docs]class Message(Base): __tablename__ = "message" id = Column(Integer(), primary_key=True) at = Column(DateTime()) message = Column(Text()) read = Column(Boolean(False)) from_username = Column(String(255), unique=False) from_nickname = Column(String(255), unique=False) from_host = Column(String(255), unique=False)
[docs]class User(Base, UserMixin): __tablename__ = "user" id = Column(Integer, primary_key=True) email = Column(String(255), unique=True) username = Column(Unicode, unique=True, nullable=True) nickname = Column(String(255), unique=False) fullname = Column(String(255), unique=False) password = Column(String(255), nullable=False) session_id = Column(String(255), unique=False) socketio_session_id = Column(String(255), unique=False) last_login_at = Column(DateTime()) current_login_at = Column(DateTime()) last_login_ip = Column(String(100)) current_login_ip = Column(String(100)) login_count = Column(Integer) active = Column(Boolean()) fs_uniquifier = Column(String(255), unique=True, nullable=False) confirmed_at = Column(DateTime()) requests_control = Column(Boolean(False)) requests_control_msg = Column(String(255)) in_control = Column(Boolean(False)) selected_proposal = Column(String(255), unique=False) proposal_list = Column(JSON, unique=False) current_limssession = Column(JSON, unique=False) limsdata = Column(JSON, unique=False) last_request_timestamp = Column(DateTime()) refresh_token = Column(String(255), unique=True) token = Column(String(255), unique=True) roles = relationship( "Role", secondary="roles_users", backref=backref("users", lazy="dynamic"), ) messages = relationship( "Message", secondary="messages_users", backref=backref("users", lazy="dynamic"), ) def has_roles(self, *args): return set(args).issubset({role.name for role in self.roles}) @property def isstaff(self): return "staff" in self.roles def todict(self): # Database stores dates in UTC current_login_at_str = "" if self.current_login_at: clt_dt = self.current_login_at.replace(tzinfo=pytz.timezone("UTC")) current_login_at_str = clt_dt.astimezone(tzlocal.get_localzone()).strftime( "%Y/%m/%d, %H:%M:%S" ) return { "username": self.username, "email": self.email, "isstaff": "staff" in self.roles, "nickname": self.nickname, "inControl": self.in_control, "ip": self.current_login_ip, "currentLoginAt": current_login_at_str, "requestsControl": self.requests_control, "requestsControlMsg": self.requests_control_msg, "fullname": self.fullname, }