import struct
import threading
import time
+import typing
import urllib.parse
import tornado.locale
from sqlalchemy import BigInteger, Boolean, Column, DateTime, ForeignKey, Integer
from sqlalchemy import Interval, LargeBinary, Text, UUID
+import sqlmodel
+
+from uuid import UUID
+
from . import base
from . import bugtracker
from . import builds
return key.decode()
-class User(database.Base, database.BackendMixin, database.SoftDeleteMixin):
+class User(sqlmodel.SQLModel, database.BackendMixin, database.SoftDeleteMixin, table=True):
__tablename__ = "users"
def __str__(self):
# ID
- id = Column(Integer, primary_key=True)
+ id : int = sqlmodel.Field(primary_key=True)
# Name
- name = Column(Text, nullable=False)
+ name : str
# Link
# Admin
- admin = Column(Boolean, nullable=False, default=False)
+ admin : bool = sqlmodel.Field(default=False)
# Admin?
# No permission
return False
- # Sessions
-
- sessions = sqlalchemy.orm.relationship("Session", back_populates="user")
-
# Bugzilla API Key
- bugzilla_api_key = Column(Text)
+ bugzilla_api_key : str
# Bugzilla
# Build Quota
- daily_build_quota = Column(Interval)
+ daily_build_quota : datetime.timedelta | None
# Build Times
# Storage Quota
- storage_quota = Column(BigInteger)
+ storage_quota : int # TODO Ensure this is a BIGINT
async def has_exceeded_storage_quota(self, size=None):
"""
return True
-class UserPushSubscription(database.Base, database.BackendMixin):
+class UserPushSubscription(sqlmodel.SQLModel, database.BackendMixin, table=True):
__tablename__ = "user_push_subscriptions"
# ID
- id = Column(Integer, primary_key=True)
+ id : int = sqlmodel.Field(primary_key=True)
# User ID
- user_id = Column(Integer, ForeignKey("users.id"), nullable=False)
+ user_id : int = sqlmodel.Field(foreign_key="users.id")
# User
- user = sqlalchemy.orm.relationship("User", lazy="joined", innerjoin=True)
+ user : "User" = sqlmodel.Relationship()
# UUID
- uuid = Column(UUID, unique=True, nullable=False,
- server_default=sqlalchemy.func.gen_random_uuid())
+ uuid: UUID = sqlmodel.Field(
+ unique = True,
+ sa_column_kwargs = {
+ "server_default" : sqlalchemy.text("gen_random_uuid()"),
+ },
+ )
# Created At
- created_at = Column(DateTime(timezone=False), nullable=False,
- server_default=sqlalchemy.func.current_timestamp())
+ created_at : datetime.datetime = sqlmodel.Field(
+ sa_column_kwargs = {"server_default" : sqlalchemy.text("CURRENT_TIMESTAMP")}
+ )
# User Agent
- user_agent = Column(Text)
+ user_agent : str | None
# Endpoint
- endpoint = Column(Text, nullable=False)
+ endpoint : str
# P256DH
- p256dh = Column(LargeBinary, nullable=False)
+ p256dh : bytes
# Auth
- auth = Column(LargeBinary, nullable=False)
+ auth : bytes
@property
def vapid_private_key(self):