Exemplo n.º 1
0
class Chat(BaseModel):
    __tablename__ = "chat"

    id = db.Column(db.String(length=32),
                   nullable=False,
                   unique=True,
                   default=generate_uuid)
    internal_id = db.Column(db.BigInteger,
                            primary_key=True,
                            autoincrement=True)
    visitor_id = db.Column(db.String(length=32), nullable=False, unique=True)
    tags = db.Column(ARRAY(JSON()), nullable=False, server_default="{}")
    severity_level = db.Column(db.SmallInteger,
                               nullable=False,
                               default=DEFAULT_SEVERITY_LEVEL_OF_CHAT)
    created_at = db.Column(db.BigInteger, nullable=False, default=unix_time)
    updated_at = db.Column(db.BigInteger, onupdate=unix_time)

    # Index
    _idx_chat_id = db.Index("idx_chat_id", "id")
    _idx_chat_visitor = db.Index("idx_chat_visitor", "visitor_id")
    _idx_chat_severity_level = db.Index("idx_chat_severity_level",
                                        "severity_level")

    @classmethod
    async def get_or_create(cls, **kwargs):
        created_attempt = await get_one(cls, **kwargs)

        # Update the number of attempts in Quiz, if no previous attempts of the user are found
        if not created_attempt:
            data = await create_one(cls, **kwargs)
            return serialize_to_dict(data)

        return serialize_to_dict(created_attempt)
Exemplo n.º 2
0
class Setting(BaseModel):
    """A global settings for the app, such as turning on/off the toggles."""

    __tablename__ = "setting"

    id = db.Column(db.String(length=32), nullable=False, default=generate_uuid)
    internal_id = db.Column(db.BigInteger,
                            primary_key=True,
                            autoincrement=True)
    key = db.Column(db.String, nullable=False, unique=True)
    value = db.Column(db.SmallInteger, nullable=False)
    created_at = db.Column(db.BigInteger, nullable=False, default=unix_time)
    updated_at = db.Column(db.BigInteger, onupdate=unix_time)

    # Index
    _idx_settings_id = db.Index("idx_settings_id", "id")
    _idx_settings_key = db.Index("idx_settings_key", "key")

    @classmethod
    async def modify_if_exists(cls, get_kwargs, update_kwargs):
        payload = await get_one(cls, **get_kwargs)
        if not payload:
            return None

        data = await update_one(payload, **update_kwargs)
        return serialize_to_dict(data)
Exemplo n.º 3
0
class ChatMessage(BaseModel):
    __tablename__ = "chat_message"

    id = db.Column(db.String(length=32),
                   primary_key=True,
                   default=generate_uuid)
    sequence_num = db.Column(db.BigInteger, nullable=False, default=0)
    chat_id = db.Column(db.String(length=32), nullable=False)
    type_id = db.Column(db.SmallInteger, nullable=False, default=1)
    sender = db.Column(db.String(length=32), nullable=True)
    content = db.Column(JSON(), nullable=False, server_default="{}")
    created_at = db.Column(db.BigInteger, nullable=False, default=unix_time)
    updated_at = db.Column(db.BigInteger, onupdate=unix_time)

    # Index
    _idx_chat_msg_id = db.Index("idx_chat_msg_id", "id")
    _idx_chat_msg_chat_id = db.Index("idx_chat_msg_chat_id", "chat_id")
    _idx_chat_msg_sender = db.Index("idx_chat_msg_sender", "sender")

    @classmethod
    async def get(cls, *, chat_id, **kwargs):
        messages = await get_messages(cls, User, chat_id=chat_id, **kwargs)
        return messages

    @classmethod
    async def get_first_message_of_chat(cls, chat_id, **kwargs):
        data = await get_one_oldest(cls,
                                    chat_id=chat_id,
                                    order_by="sequence_num")
        return serialize_to_dict(data)
Exemplo n.º 4
0
class Organisation(BaseModel):
    __tablename__ = "organisation"
    permissions = {
        "GET": ROLES,
        "POST": {},
        "PUT": {},
        "PATCH": {},
        "DELETE": {}
    }

    id = db.Column(db.String(length=32),
                   nullable=False,
                   unique=True,
                   default=generate_uuid)
    internal_id = db.Column(db.BigInteger,
                            primary_key=True,
                            autoincrement=True)
    name = db.Column(db.String, nullable=False)
    disabled = db.Column(db.Boolean, nullable=False, default=False)
    created_at = db.Column(db.BigInteger, nullable=False, default=unix_time)
    updated_at = db.Column(db.BigInteger, onupdate=unix_time)

    # Index
    _idx_org_id = db.Index("idx_org_id", "id")
    _idx_org_disabled = db.Index("idx_org_disabled", "disabled")
Exemplo n.º 5
0
class StaffSubscriptionChat(BaseModel):
    __tablename__ = "staff_subscription_chat"

    id = db.Column(db.String(length=32),
                   primary_key=True,
                   default=generate_uuid)
    internal_id = db.Column(db.BigInteger,
                            primary_key=True,
                            autoincrement=True)
    visitor_id = db.Column(db.String(length=32), nullable=False)
    staff_id = db.Column(db.String(length=32), nullable=False)
    created_at = db.Column(db.BigInteger, nullable=False, default=unix_time)
    updated_at = db.Column(db.BigInteger, onupdate=unix_time)

    # Index
    _idx_bookmark_visitor_id = db.Index("idx_staff_subscription_chat_id", "id")
    _idx_bookmark_visitor_staff_id = db.Index(
        "idx_staff_subscription_chat_staff_id", "staff_id")
    _idx_bookmark_visitor_staff_visitor = db.Index(
        "idx_staff_subscription_visitor_staff_chat",
        "staff_id",
        "visitor_id",
        unique=True,
    )

    @classmethod
    async def get_or_create(cls, **kwargs):
        payload = await get_one(cls, **kwargs)
        if payload:
            return serialize_to_dict(payload)

        # Create
        data = await create_one(cls,
                                staff_id=kwargs["staff_id"],
                                chat_id=kwargs["chat_id"])
        return serialize_to_dict(data)

    @classmethod
    async def update_or_create(cls, get_kwargs, update_kwargs):
        payload = await get_one(cls, **get_kwargs)

        if not payload:
            data = await create_one(
                cls,
                **update_kwargs,
                staff_id=get_kwargs["staff_id"],
                chat_id=get_kwargs["chat_id"],
            )
            return serialize_to_dict(data)
        # Update the existing one
        data = await update_one(payload, **update_kwargs)
        return serialize_to_dict(data)
Exemplo n.º 6
0
class ChatMessageSeen(BaseModel):
    __tablename__ = "chat_message_seen"

    id = db.Column(db.String(length=32),
                   nullable=False,
                   unique=True,
                   default=generate_uuid)
    internal_id = db.Column(db.BigInteger,
                            primary_key=True,
                            autoincrement=True)
    staff_id = db.Column(db.String(length=32), nullable=False)
    chat_id = db.Column(db.String(length=32), nullable=False)
    last_seen_msg_id = db.Column(db.String(length=32), nullable=True)
    created_at = db.Column(db.BigInteger, nullable=False, default=unix_time)
    updated_at = db.Column(db.BigInteger, onupdate=unix_time)

    # Index
    _idx_chat_msg_seen_id = db.Index("idx_chat_msg_seen_id", "id")
    _idx_chat_msg_seen_staff_chat = db.Index("idx_chat_msg_seen_staff_chat",
                                             "staff_id", "chat_id")

    @classmethod
    async def get_or_create(cls, **kwargs):
        payload = await get_one(cls, **kwargs)
        if payload:
            return serialize_to_dict(payload)

        # Create
        data = await create_one(cls,
                                staff_id=kwargs["staff_id"],
                                chat_id=kwargs["chat_id"])
        return serialize_to_dict(data)

    @classmethod
    async def update_or_create(cls, get_kwargs, update_kwargs):
        payload = await get_one(cls, **get_kwargs)

        if not payload:
            data = await create_one(
                cls,
                **update_kwargs,
                staff_id=get_kwargs["staff_id"],
                chat_id=get_kwargs["chat_id"],
            )
            return serialize_to_dict(data)
        # Update the existing one
        data = await update_one(payload, **update_kwargs)
        return serialize_to_dict(data)
Exemplo n.º 7
0
class ChatUnhandled(BaseModel):
    __tablename__ = "chat_unhandled"

    id = db.Column(db.String(length=32), nullable=False, default=generate_uuid)
    internal_id = db.Column(db.BigInteger,
                            autoincrement=True,
                            primary_key=True,
                            nullable=False)
    visitor_id = db.Column(db.String(length=32), nullable=False, unique=True)
    created_at = db.Column(db.BigInteger, nullable=False, default=unix_time)
    updated_at = db.Column(db.BigInteger, onupdate=unix_time)

    # Index
    _idx_chat_unhandled_id = db.Index("idx_chat_unhandled_id", "id")
    _idx_chat_unhandled_vistor_id = db.Index("idx_chat_unhandled_vistor_id",
                                             "visitor_id")
Exemplo n.º 8
0
class StaffNotificationSetting(BaseModel):
    __tablename__ = "staff_notification_setting"

    id = db.Column(db.String(length=32), nullable=False, default=generate_uuid)
    internal_id = db.Column(db.BigInteger,
                            primary_key=True,
                            autoincrement=True)
    staff_id = db.Column(db.String, nullable=False)
    receive_emails = db.Column(db.Boolean, nullable=False, default=False)
    created_at = db.Column(db.BigInteger, nullable=False, default=unix_time)
    updated_at = db.Column(db.BigInteger, onupdate=unix_time)

    # Index
    _idx_staff_notification_setting_id = db.Index(
        "idx_staff_notification_setting_id", "id")
    _idx_staff_notification_setting_staff_id = db.Index(
        "idx_staff_notification_setting_staff_id", "staff_id")
Exemplo n.º 9
0
class RolePermission(BaseModel):
    __tablename__ = "role_permission"

    id = db.Column(db.String(length=32), nullable=False, default=generate_uuid)
    internal_id = db.Column(db.BigInteger,
                            primary_key=True,
                            autoincrement=True)
    name = db.Column(db.String, nullable=False)
    role_id = db.Column(db.SmallInteger,
                        db.ForeignKey("user_role.id"),
                        nullable=False)
    created_at = db.Column(db.BigInteger, nullable=False, default=unix_time)
    updated_at = db.Column(db.BigInteger, onupdate=unix_time)

    # Index
    _idx_role_permission_id = db.Index("idx_role_permission_id", "id")
    _idx_role_permission_role_id = db.Index("idx_role_permission_role_id",
                                            "role_id")
    _idx_role_permission_name = db.Index("idx_role_permission_key", "name")
    _idx_role_permission_name_role_id = db.Index(
        "idx_role_permission_key_role_id", "name", "role_id", unique=True)
Exemplo n.º 10
0
class Visitor(BaseUser):
    __tablename__ = "visitor"

    id = db.Column(db.String(length=32),
                   nullable=False,
                   unique=True,
                   default=generate_uuid)
    internal_id = db.Column(db.BigInteger,
                            primary_key=True,
                            autoincrement=True)
    name = db.Column(db.String, nullable=False)
    email = db.Column(db.String, unique=True, nullable=True)
    password = db.Column(db.String, nullable=True)
    is_anonymous = db.Column(db.Boolean, nullable=False, default=False)
    disabled = db.Column(db.Boolean, nullable=False, default=False)
    created_at = db.Column(db.BigInteger, nullable=False, default=unix_time)
    updated_at = db.Column(db.BigInteger, onupdate=unix_time)

    # Index
    _idx_visitor_id = db.Index("idx_visitor_id", "id")
    _idx_visitor_email = db.Index("idx_visitor_email", "email")
Exemplo n.º 11
0
class NotificationStaff(BaseModel):
    __tablename__ = "notification_staff"

    id = db.Column(db.String(length=32), nullable=False, default=generate_uuid)
    internal_id = db.Column(db.BigInteger,
                            primary_key=True,
                            autoincrement=True)
    staff_id = db.Column(db.String, nullable=False)
    content = db.Column(JSON(), nullable=False, server_default="{}")
    created_at = db.Column(db.BigInteger, nullable=False, default=unix_time)
    updated_at = db.Column(db.BigInteger, onupdate=unix_time)

    # Index
    _idx_notification_staff_id = db.Index("idx_notification_staff_id", "id")
    _idx_notification_staff_staff_id = db.Index(
        "idx_notification_staff_staff_id", "staff_id")

    @classmethod
    async def bulk_upsert(cls, notifications):
        await insert(
            cls.__table__
        ).values(notifications).on_conflict_do_nothing().gino.scalar()
Exemplo n.º 12
0
class User(BaseUser):
    __tablename__ = "user"
    permissions = {
        "GET": ROLES,
        "POST": {"supervisor", "admin"},
        "PUT": {"supervisor", "admin"},
        "PATCH": {"supervisor", "admin"},
        "DELETE": {"supervisor", "admin"},
    }

    id = db.Column(db.String(length=32),
                   nullable=False,
                   unique=True,
                   default=generate_uuid)
    internal_id = db.Column(db.BigInteger,
                            primary_key=True,
                            autoincrement=True)
    full_name = db.Column(db.String, nullable=False)
    display_name = db.Column(db.String)
    role_id = db.Column(db.SmallInteger,
                        db.ForeignKey("user_role.id"),
                        nullable=False,
                        default=3)
    email = db.Column(db.String, unique=True, nullable=False)
    password = db.Column(db.String, nullable=False)
    disabled = db.Column(db.Boolean, nullable=False, default=False)
    organisation_id = db.Column(db.String(length=32),
                                db.ForeignKey("organisation.id"),
                                nullable=False)
    created_at = db.Column(db.BigInteger, nullable=False, default=unix_time)
    updated_at = db.Column(db.BigInteger, onupdate=unix_time)

    # Index
    _idx_user_id = db.Index("idx_user_id", "id")
    _idx_user_email = db.Index("idx_user_email", "email")
    _idx_user_role_id = db.Index("idx_user_role_id", "role_id")
    _idx_user_organisation_id = db.Index("_idx_user_organisation_id",
                                         "organisation_id")
Exemplo n.º 13
0
class UserRole(BaseModel):
    __tablename__ = "user_role"

    id = db.Column(db.BigInteger,
                   primary_key=True,
                   autoincrement=False,
                   unique=True)
    internal_id = db.Column(db.BigInteger, autoincrement=True, unique=True)
    name = db.Column(db.String, nullable=False)
    created_at = db.Column(db.BigInteger, nullable=False, default=unix_time)
    updated_at = db.Column(db.BigInteger, onupdate=unix_time)

    # Index
    _idx_user_role_table_id = db.Index("idx_user_role_table_id", "id")
Exemplo n.º 14
0
class NotificationStaffRead(BaseModel):
    __tablename__ = "notification_staff_read"

    internal_id = db.Column(db.BigInteger,
                            primary_key=True,
                            autoincrement=True)
    staff_id = db.Column(db.String, unique=True, nullable=False)
    last_read_internal_id = db.Column(db.BigInteger, nullable=True)

    # Index
    _idx_notification_staff_read_staff_id = db.Index(
        "idx_notification_staff_read_staff_id", "staff_id")

    @classmethod
    async def get_or_create(cls, serialized=True, **kwargs):
        payload = await get_one(cls, **kwargs)
        if payload:
            return serialize_to_dict(payload) if serialized else payload

        # Create
        data = await create_one(cls, staff_id=kwargs["staff_id"])
        return serialize_to_dict(data) if serialized else data

    @classmethod
    async def update_or_create(cls, get_kwargs, update_kwargs):
        payload = await get_one(cls, **get_kwargs)

        if not payload:
            data = await create_one(cls,
                                    **update_kwargs,
                                    staff_id=get_kwargs["staff_id"])
            return serialize_to_dict(data)

        # Update the existing one
        data = await update_one(payload, **update_kwargs)
        return serialize_to_dict(data)