From 446a082352bf2bb8d7398afbdbe9dfad42f21fed Mon Sep 17 00:00:00 2001 From: Kevin Morris Date: Sun, 7 Nov 2021 17:26:05 -0800 Subject: [PATCH] change(fastapi): refactor database ORM model definitions We don't want to depend on the database to load up data about the models we define. We now leverage the existing `aurweb.schema` module for table definitions and set __table_args__["autoload"] to False. Signed-off-by: Kevin Morris --- aurweb/models/accepted_term.py | 16 ++++----- aurweb/models/account_type.py | 52 +++++++++++---------------- aurweb/models/api_rate_limit.py | 10 +++--- aurweb/models/ban.py | 10 +++--- aurweb/models/declarative.py | 6 +--- aurweb/models/dependency_type.py | 27 +++++--------- aurweb/models/group.py | 10 +++--- aurweb/models/license.py | 10 +++--- aurweb/models/official_provider.py | 10 +++--- aurweb/models/package.py | 15 +++----- aurweb/models/package_base.py | 21 +++++------ aurweb/models/package_blacklist.py | 10 +++--- aurweb/models/package_comaintainer.py | 20 +++++------ aurweb/models/package_comment.py | 26 +++++--------- aurweb/models/package_dependency.py | 22 +++++------- aurweb/models/package_group.py | 18 +++++----- aurweb/models/package_keyword.py | 19 ++++------ aurweb/models/package_license.py | 20 +++++------ aurweb/models/package_notification.py | 20 +++++------ aurweb/models/package_relation.py | 22 +++++------- aurweb/models/package_request.py | 25 +++++-------- aurweb/models/package_source.py | 14 ++++---- aurweb/models/package_vote.py | 20 +++++------ aurweb/models/relation_type.py | 24 +++++-------- aurweb/models/request_type.py | 21 +++++------ aurweb/models/session.py | 13 +++---- aurweb/models/ssh_pub_key.py | 19 ++++------ aurweb/models/term.py | 10 +++--- aurweb/models/tu_vote.py | 18 +++++----- aurweb/models/tu_voteinfo.py | 15 +++----- aurweb/models/user.py | 21 ++++------- 31 files changed, 210 insertions(+), 354 deletions(-) diff --git a/aurweb/models/accepted_term.py b/aurweb/models/accepted_term.py index b4dbb410..0f9b187e 100644 --- a/aurweb/models/accepted_term.py +++ b/aurweb/models/accepted_term.py @@ -1,28 +1,24 @@ -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.term import Term as _Term from aurweb.models.user import User as _User class AcceptedTerm(Base): - __tablename__ = "AcceptedTerms" + __table__ = schema.AcceptedTerms + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.TermsID]} - UsersID = Column(Integer, ForeignKey("Users.ID", ondelete="CASCADE"), - nullable=False) User = relationship( _User, backref=backref("accepted_terms", lazy="dynamic"), - foreign_keys=[UsersID]) + foreign_keys=[__table__.c.UsersID]) - TermsID = Column(Integer, ForeignKey("Terms.ID", ondelete="CASCADE"), - nullable=False) Term = relationship( _Term, backref=backref("accepted_terms", lazy="dynamic"), - foreign_keys=[TermsID]) - - __mapper_args__ = {"primary_key": [TermsID]} + foreign_keys=[__table__.c.TermsID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/account_type.py b/aurweb/models/account_type.py index 7aa7733c..a849df02 100644 --- a/aurweb/models/account_type.py +++ b/aurweb/models/account_type.py @@ -1,6 +1,4 @@ -from sqlalchemy import Column, Integer - -from aurweb import db +from aurweb import schema from aurweb.models.declarative import Base USER = "User" @@ -8,14 +6,28 @@ DEVELOPER = "Developer" TRUSTED_USER_AND_DEV = "Trusted User & Developer" +USER_ID = 1 +TRUSTED_USER_ID = 2 +DEVELOPER_ID = 3 +TRUSTED_USER_AND_DEV_ID = 4 -class AccountType(Base): - """ An ORM model of a single AccountTypes record. """ - __tablename__ = "AccountTypes" +# Map string constants to integer constants. +ACCOUNT_TYPE_ID = { + USER: USER_ID, + TRUSTED_USER: TRUSTED_USER_ID, + DEVELOPER: DEVELOPER_ID, + TRUSTED_USER_AND_DEV: TRUSTED_USER_AND_DEV_ID +} + +# Reversed ACCOUNT_TYPE_ID mapping. +ACCOUNT_TYPE_NAME = {v: k for k, v in ACCOUNT_TYPE_ID.items()} - ID = Column(Integer, primary_key=True) - __mapper_args__ = {"primary_key": [ID]} +class AccountType(Base): + """ An ORM model of a single AccountTypes record. """ + __table__ = schema.AccountTypes + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} def __init__(self, **kwargs): self.AccountType = kwargs.pop("AccountType") @@ -26,27 +38,3 @@ def __str__(self): def __repr__(self): return "" % ( self.ID, str(self)) - - -# Fetch account type IDs from the database for constants. -_account_types = db.query(AccountType) -USER_ID = _account_types.filter( - AccountType.AccountType == USER).first().ID -TRUSTED_USER_ID = _account_types.filter( - AccountType.AccountType == TRUSTED_USER).first().ID -DEVELOPER_ID = _account_types.filter( - AccountType.AccountType == DEVELOPER).first().ID -TRUSTED_USER_AND_DEV_ID = _account_types.filter( - AccountType.AccountType == TRUSTED_USER_AND_DEV).first().ID -_account_types = None # Get rid of the query handle. - -# Map string constants to integer constants. -ACCOUNT_TYPE_ID = { - USER: USER_ID, - TRUSTED_USER: TRUSTED_USER_ID, - DEVELOPER: DEVELOPER_ID, - TRUSTED_USER_AND_DEV: TRUSTED_USER_AND_DEV_ID -} - -# Reversed ACCOUNT_TYPE_ID mapping. -ACCOUNT_TYPE_NAME = {v: k for k, v in ACCOUNT_TYPE_ID.items()} diff --git a/aurweb/models/api_rate_limit.py b/aurweb/models/api_rate_limit.py index f8641896..19b656df 100644 --- a/aurweb/models/api_rate_limit.py +++ b/aurweb/models/api_rate_limit.py @@ -1,15 +1,13 @@ -from sqlalchemy import Column, String from sqlalchemy.exc import IntegrityError +from aurweb import schema from aurweb.models.declarative import Base class ApiRateLimit(Base): - __tablename__ = "ApiRateLimit" - - IP = Column(String(45), primary_key=True, unique=True, default=str()) - - __mapper_args__ = {"primary_key": [IP]} + __table__ = schema.ApiRateLimit + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.IP]} def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/ban.py b/aurweb/models/ban.py index e10087b0..a70be7b9 100644 --- a/aurweb/models/ban.py +++ b/aurweb/models/ban.py @@ -1,15 +1,13 @@ from fastapi import Request -from sqlalchemy import Column, String +from aurweb import schema from aurweb.models.declarative import Base class Ban(Base): - __tablename__ = "Bans" - - IPAddress = Column(String(45), primary_key=True) - - __mapper_args__ = {"primary_key": [IPAddress]} + __table__ = schema.Bans + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.IPAddress]} def __init__(self, **kwargs): self.IPAddress = kwargs.get("IPAddress") diff --git a/aurweb/models/declarative.py b/aurweb/models/declarative.py index 96ee1829..20ddd20c 100644 --- a/aurweb/models/declarative.py +++ b/aurweb/models/declarative.py @@ -2,8 +2,6 @@ from sqlalchemy.ext.declarative import declarative_base -import aurweb.db - from aurweb import util @@ -25,12 +23,10 @@ def to_json(model, indent: int = None): # Setup __table_args__ applicable to every table. Base.__table_args__ = { - "autoload": True, - "autoload_with": aurweb.db.get_engine(), + "autoload": False, "extend_existing": True } - # Setup Base.as_dict and Base.json. # # With this, declarative models can use .as_dict() or .json() diff --git a/aurweb/models/dependency_type.py b/aurweb/models/dependency_type.py index 3b5fafcc..98418802 100644 --- a/aurweb/models/dependency_type.py +++ b/aurweb/models/dependency_type.py @@ -1,6 +1,4 @@ -from sqlalchemy import Column, Integer - -from aurweb import db +from aurweb import schema from aurweb.models.declarative import Base DEPENDS = "depends" @@ -8,23 +6,16 @@ CHECKDEPENDS = "checkdepends" OPTDEPENDS = "optdepends" +DEPENDS_ID = 1 +MAKEDEPENDS_ID = 2 +CHECKDEPENDS_ID = 3 +OPTDEPENDS_ID = 4 -class DependencyType(Base): - __tablename__ = "DependencyTypes" - - ID = Column(Integer, primary_key=True) - __mapper_args__ = {"primary_key": [ID]} +class DependencyType(Base): + __table__ = schema.DependencyTypes + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} def __init__(self, Name: str = None): self.Name = Name - - -DEPENDS_ID = db.query(DependencyType).filter( - DependencyType.Name == DEPENDS).first().ID -MAKEDEPENDS_ID = db.query(DependencyType).filter( - DependencyType.Name == MAKEDEPENDS).first().ID -CHECKDEPENDS_ID = db.query(DependencyType).filter( - DependencyType.Name == CHECKDEPENDS).first().ID -OPTDEPENDS_ID = db.query(DependencyType).filter( - DependencyType.Name == OPTDEPENDS).first().ID diff --git a/aurweb/models/group.py b/aurweb/models/group.py index 5493bb7f..0275ed94 100644 --- a/aurweb/models/group.py +++ b/aurweb/models/group.py @@ -1,15 +1,13 @@ -from sqlalchemy import Column, Integer from sqlalchemy.exc import IntegrityError +from aurweb import schema from aurweb.models.declarative import Base class Group(Base): - __tablename__ = "Groups" - - ID = Column(Integer, primary_key=True) - - __mapper_args__ = {"primary_key": [ID]} + __table__ = schema.Groups + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/license.py b/aurweb/models/license.py index fa863379..86aeaa86 100644 --- a/aurweb/models/license.py +++ b/aurweb/models/license.py @@ -1,15 +1,13 @@ -from sqlalchemy import Column, Integer from sqlalchemy.exc import IntegrityError +from aurweb import schema from aurweb.models.declarative import Base class License(Base): - __tablename__ = "Licenses" - - ID = Column(Integer, primary_key=True) - - __mapper_args__ = {"primary_key": [ID]} + __table__ = schema.Licenses + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/official_provider.py b/aurweb/models/official_provider.py index a273dd06..a8282ff1 100644 --- a/aurweb/models/official_provider.py +++ b/aurweb/models/official_provider.py @@ -1,6 +1,6 @@ -from sqlalchemy import Column, Integer from sqlalchemy.exc import IntegrityError +from aurweb import schema from aurweb.models.declarative import Base # TODO: Fix this! Official packages aren't from aur.archlinux.org... @@ -8,11 +8,9 @@ class OfficialProvider(Base): - __tablename__ = "OfficialProviders" - - ID = Column(Integer, primary_key=True) - - __mapper_args__ = {"primary_key": [ID]} + __table__ = schema.OfficialProviders + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/package.py b/aurweb/models/package.py index ef119f3c..8f82dadd 100644 --- a/aurweb/models/package.py +++ b/aurweb/models/package.py @@ -1,24 +1,19 @@ -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.package_base import PackageBase as _PackageBase class Package(Base): - __tablename__ = "Packages" + __table__ = schema.Packages + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} - ID = Column(Integer, primary_key=True) - - PackageBaseID = Column( - Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"), - nullable=False) PackageBase = relationship( _PackageBase, backref=backref("packages", lazy="dynamic"), - foreign_keys=[PackageBaseID]) - - __mapper_args__ = {"primary_key": [ID]} + foreign_keys=[__table__.c.PackageBaseID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/package_base.py b/aurweb/models/package_base.py index e6f28050..8c88b7b5 100644 --- a/aurweb/models/package_base.py +++ b/aurweb/models/package_base.py @@ -1,38 +1,33 @@ from datetime import datetime -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.user import User as _User class PackageBase(Base): - __tablename__ = "PackageBases" + __table__ = schema.PackageBases + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} - FlaggerUID = Column(Integer, - ForeignKey("Users.ID", ondelete="SET NULL")) Flagger = relationship( _User, backref=backref("flagged_bases", lazy="dynamic"), - foreign_keys=[FlaggerUID]) + foreign_keys=[__table__.c.FlaggerUID]) - SubmitterUID = Column(Integer, - ForeignKey("Users.ID", ondelete="SET NULL")) Submitter = relationship( _User, backref=backref("submitted_bases", lazy="dynamic"), - foreign_keys=[SubmitterUID]) + foreign_keys=[__table__.c.SubmitterUID]) - MaintainerUID = Column(Integer, - ForeignKey("Users.ID", ondelete="SET NULL")) Maintainer = relationship( _User, backref=backref("maintained_bases", lazy="dynamic"), - foreign_keys=[MaintainerUID]) + foreign_keys=[__table__.c.MaintainerUID]) - PackagerUID = Column(Integer, ForeignKey("Users.ID", ondelete="SET NULL")) Packager = relationship( _User, backref=backref("package_bases", lazy="dynamic"), - foreign_keys=[PackagerUID]) + foreign_keys=[__table__.c.PackagerUID]) # A set used to check for floatable values. TO_FLOAT = {"Popularity"} diff --git a/aurweb/models/package_blacklist.py b/aurweb/models/package_blacklist.py index 4ba3f308..0f8f0cee 100644 --- a/aurweb/models/package_blacklist.py +++ b/aurweb/models/package_blacklist.py @@ -1,15 +1,13 @@ -from sqlalchemy import Column, Integer from sqlalchemy.exc import IntegrityError +from aurweb import schema from aurweb.models.declarative import Base class PackageBlacklist(Base): - __tablename__ = "PackageBlacklist" - - ID = Column(Integer, primary_key=True) - - __mapper_args__ = {"primary_key": [ID]} + __table__ = schema.PackageBlacklist + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/package_comaintainer.py b/aurweb/models/package_comaintainer.py index 2f77782c..7641fb43 100644 --- a/aurweb/models/package_comaintainer.py +++ b/aurweb/models/package_comaintainer.py @@ -1,30 +1,26 @@ -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.package_base import PackageBase as _PackageBase from aurweb.models.user import User as _User class PackageComaintainer(Base): - __tablename__ = "PackageComaintainers" + __table__ = schema.PackageComaintainers + __tablename__ = __table__.name + __mapper_args__ = { + "primary_key": [__table__.c.UsersID, __table__.c.PackageBaseID] + } - UsersID = Column( - Integer, ForeignKey("Users.ID", ondelete="CASCADE"), - nullable=False) User = relationship( _User, backref=backref("comaintained", lazy="dynamic"), - foreign_keys=[UsersID]) + foreign_keys=[__table__.c.UsersID]) - PackageBaseID = Column( - Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"), - nullable=False) PackageBase = relationship( _PackageBase, backref=backref("comaintainers", lazy="dynamic"), - foreign_keys=[PackageBaseID]) - - __mapper_args__ = {"primary_key": [UsersID, PackageBaseID]} + foreign_keys=[__table__.c.PackageBaseID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/package_comment.py b/aurweb/models/package_comment.py index a511df9b..2a529c9c 100644 --- a/aurweb/models/package_comment.py +++ b/aurweb/models/package_comment.py @@ -1,43 +1,33 @@ -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.package_base import PackageBase as _PackageBase from aurweb.models.user import User as _User class PackageComment(Base): - __tablename__ = "PackageComments" + __table__ = schema.PackageComments + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} - ID = Column(Integer, primary_key=True) - - PackageBaseID = Column( - Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"), - nullable=False) PackageBase = relationship( _PackageBase, backref=backref("comments", lazy="dynamic", cascade="all, delete"), - foreign_keys=[PackageBaseID]) + foreign_keys=[__table__.c.PackageBaseID]) - UsersID = Column(Integer, ForeignKey("Users.ID", ondelete="SET NULL")) User = relationship( _User, backref=backref("package_comments", lazy="dynamic"), - foreign_keys=[UsersID]) + foreign_keys=[__table__.c.UsersID]) - EditedUsersID = Column( - Integer, ForeignKey("Users.ID", ondelete="SET NULL")) Editor = relationship( _User, backref=backref("edited_comments", lazy="dynamic"), - foreign_keys=[EditedUsersID]) + foreign_keys=[__table__.c.EditedUsersID]) - DelUsersID = Column( - Integer, ForeignKey("Users.ID", ondelete="SET NULL")) Deleter = relationship( _User, backref=backref("deleted_comments", lazy="dynamic"), - foreign_keys=[DelUsersID]) - - __mapper_args__ = {"primary_key": [ID]} + foreign_keys=[__table__.c.DelUsersID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/package_dependency.py b/aurweb/models/package_dependency.py index 3f4e2baa..edaa6538 100644 --- a/aurweb/models/package_dependency.py +++ b/aurweb/models/package_dependency.py @@ -1,34 +1,28 @@ -from sqlalchemy import Column, ForeignKey, Integer, String from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.dependency_type import DependencyType as _DependencyType from aurweb.models.package import Package as _Package class PackageDependency(Base): - __tablename__ = "PackageDepends" + __table__ = schema.PackageDepends + __tablename__ = __table__.name + __mapper_args__ = { + "primary_key": [__table__.c.PackageID, __table__.c.DepName] + } - PackageID = Column( - Integer, ForeignKey("Packages.ID", ondelete="CASCADE"), - nullable=False) Package = relationship( _Package, backref=backref("package_dependencies", lazy="dynamic", cascade="all, delete"), - foreign_keys=[PackageID]) + foreign_keys=[__table__.c.PackageID]) - DepTypeID = Column( - Integer, ForeignKey("DependencyTypes.ID", ondelete="NO ACTION"), - nullable=False) DependencyType = relationship( _DependencyType, backref=backref("package_dependencies", lazy="dynamic"), - foreign_keys=[DepTypeID]) - - DepName = Column(String(255), nullable=False) - - __mapper_args__ = {"primary_key": [PackageID, DepName]} + foreign_keys=[__table__.c.DepTypeID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/package_group.py b/aurweb/models/package_group.py index c1d1e4f8..3b6db37d 100644 --- a/aurweb/models/package_group.py +++ b/aurweb/models/package_group.py @@ -1,28 +1,26 @@ -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.group import Group as _Group from aurweb.models.package import Package as _Package class PackageGroup(Base): - __tablename__ = "PackageGroups" + __table__ = schema.PackageGroups + __tablename__ = __table__.name + __mapper_args__ = { + "primary_key": [__table__.c.PackageID, __table__.c.GroupID] + } - PackageID = Column(Integer, ForeignKey("Packages.ID", ondelete="CASCADE"), - primary_key=True, nullable=True) Package = relationship( _Package, backref=backref("package_groups", lazy="dynamic"), - foreign_keys=[PackageID]) + foreign_keys=[__table__.c.PackageID]) - GroupID = Column(Integer, ForeignKey("Groups.ID", ondelete="CASCADE"), - primary_key=True, nullable=True) Group = relationship( _Group, backref=backref("package_groups", lazy="dynamic"), - foreign_keys=[GroupID]) - - __mapper_args__ = {"primary_key": [PackageID, GroupID]} + foreign_keys=[__table__.c.GroupID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/package_keyword.py b/aurweb/models/package_keyword.py index 25bd340b..581aafdc 100644 --- a/aurweb/models/package_keyword.py +++ b/aurweb/models/package_keyword.py @@ -1,27 +1,22 @@ -from sqlalchemy import Column, ForeignKey, Integer, String, text from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.package_base import PackageBase as _PackageBase class PackageKeyword(Base): - __tablename__ = "PackageKeywords" + __table__ = schema.PackageKeywords + __tablename__ = __table__.name + __mapper_args__ = { + "primary_key": [__table__.c.PackageBaseID, __table__.c.Keyword] + } - PackageBaseID = Column( - Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"), - primary_key=True, nullable=True) PackageBase = relationship( _PackageBase, backref=backref("keywords", lazy="dynamic", cascade="all, delete"), - foreign_keys=[PackageBaseID]) - - Keyword = Column( - String(255), primary_key=True, nullable=False, - server_default=text("''")) - - __mapper_args__ = {"primary_key": [PackageBaseID, Keyword]} + foreign_keys=[__table__.c.PackageBaseID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/package_license.py b/aurweb/models/package_license.py index db12a7c3..43dd0339 100644 --- a/aurweb/models/package_license.py +++ b/aurweb/models/package_license.py @@ -1,32 +1,28 @@ -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.license import License as _License from aurweb.models.package import Package as _Package class PackageLicense(Base): - __tablename__ = "PackageLicenses" + __table__ = schema.PackageLicenses + __tablename__ = __table__.name + __mapper_args__ = { + "primary_key": [__table__.c.PackageID, __table__.c.LicenseID] + } - PackageID = Column( - Integer, ForeignKey("Packages.ID", ondelete="CASCADE"), - primary_key=True, nullable=True) Package = relationship( _Package, backref=backref("package_licenses", lazy="dynamic", cascade="all, delete"), - foreign_keys=[PackageID]) + foreign_keys=[__table__.c.PackageID]) - LicenseID = Column( - Integer, ForeignKey("Licenses.ID", ondelete="CASCADE"), - primary_key=True, nullable=True) License = relationship( _License, backref=backref("package_licenses", lazy="dynamic", cascade="all, delete"), - foreign_keys=[LicenseID]) - - __mapper_args__ = {"primary_key": [PackageID, LicenseID]} + foreign_keys=[__table__.c.LicenseID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/package_notification.py b/aurweb/models/package_notification.py index 221067e1..97dbe38f 100644 --- a/aurweb/models/package_notification.py +++ b/aurweb/models/package_notification.py @@ -1,31 +1,27 @@ -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.package_base import PackageBase as _PackageBase from aurweb.models.user import User as _User class PackageNotification(Base): - __tablename__ = "PackageNotifications" + __table__ = schema.PackageNotifications + __tablename__ = __table__.name + __mapper_args__ = { + "primary_key": [__table__.c.UserID, __table__.c.PackageBaseID] + } - UserID = Column( - Integer, ForeignKey("Users.ID", ondelete="CASCADE"), - nullable=False) User = relationship( _User, backref=backref("notifications", lazy="dynamic"), - foreign_keys=[UserID]) + foreign_keys=[__table__.c.UserID]) - PackageBaseID = Column( - Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"), - nullable=False) PackageBase = relationship( _PackageBase, backref=backref("notifications", lazy="dynamic"), - foreign_keys=[PackageBaseID]) - - __mapper_args__ = {"primary_key": [UserID, PackageBaseID]} + foreign_keys=[__table__.c.PackageBaseID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/package_relation.py b/aurweb/models/package_relation.py index e79a90d6..eb6caa84 100644 --- a/aurweb/models/package_relation.py +++ b/aurweb/models/package_relation.py @@ -1,33 +1,27 @@ -from sqlalchemy import Column, ForeignKey, Integer, String from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.package import Package as _Package from aurweb.models.relation_type import RelationType as _RelationType class PackageRelation(Base): - __tablename__ = "PackageRelations" + __table__ = schema.PackageRelations + __tablename__ = __table__.name + __mapper_args__ = { + "primary_key": [__table__.c.PackageID, __table__.c.RelName] + } - PackageID = Column( - Integer, ForeignKey("Packages.ID", ondelete="CASCADE"), - nullable=False) Package = relationship( _Package, backref=backref("package_relations", lazy="dynamic", cascade="all, delete"), - foreign_keys=[PackageID]) + foreign_keys=[__table__.c.PackageID]) - RelTypeID = Column( - Integer, ForeignKey("RelationTypes.ID", ondelete="CASCADE"), - nullable=False) RelationType = relationship( _RelationType, backref=backref("package_relations", lazy="dynamic"), - foreign_keys=[RelTypeID]) - - RelName = Column(String(255), unique=True) - - __mapper_args__ = {"primary_key": [PackageID, RelName]} + foreign_keys=[__table__.c.RelTypeID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/package_request.py b/aurweb/models/package_request.py index f600566c..9669ec46 100644 --- a/aurweb/models/package_request.py +++ b/aurweb/models/package_request.py @@ -1,7 +1,7 @@ -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.package_base import PackageBase as _PackageBase from aurweb.models.request_type import RequestType as _RequestType @@ -20,34 +20,25 @@ class PackageRequest(Base): - __tablename__ = "PackageRequests" + __table__ = schema.PackageRequests + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} - ID = Column(Integer, primary_key=True) - - ReqTypeID = Column( - Integer, ForeignKey("RequestTypes.ID", ondelete="NO ACTION"), - nullable=False) RequestType = relationship( _RequestType, backref=backref("package_requests", lazy="dynamic"), - foreign_keys=[ReqTypeID]) + foreign_keys=[__table__.c.ReqTypeID]) - UsersID = Column(Integer, ForeignKey("Users.ID", ondelete="SET NULL")) User = relationship( _User, backref=backref("package_requests", lazy="dynamic"), - foreign_keys=[UsersID]) + foreign_keys=[__table__.c.UsersID]) - PackageBaseID = Column( - Integer, ForeignKey("PackageBases.ID", ondelete="SET NULL")) PackageBase = relationship( _PackageBase, backref=backref("requests", lazy="dynamic"), - foreign_keys=[PackageBaseID]) + foreign_keys=[__table__.c.PackageBaseID]) - ClosedUID = Column(Integer, ForeignKey("Users.ID", ondelete="SET NULL")) Closer = relationship( _User, backref=backref("closed_requests", lazy="dynamic"), - foreign_keys=[ClosedUID]) - - __mapper_args__ = {"primary_key": [ID]} + foreign_keys=[__table__.c.ClosedUID]) STATUS_DISPLAY = { PENDING_ID: PENDING, diff --git a/aurweb/models/package_source.py b/aurweb/models/package_source.py index db983272..59046bbd 100644 --- a/aurweb/models/package_source.py +++ b/aurweb/models/package_source.py @@ -1,22 +1,22 @@ -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.package import Package as _Package class PackageSource(Base): - __tablename__ = "PackageSources" + __table__ = schema.PackageSources + __tablename__ = __table__.name + __mapper_args__ = { + "primary_key": [__table__.c.PackageID] + } - PackageID = Column(Integer, ForeignKey("Packages.ID", ondelete="CASCADE"), - nullable=False) Package = relationship( _Package, backref=backref("package_sources", lazy="dynamic", cascade="all, delete"), - foreign_keys=[PackageID]) - - __mapper_args__ = {"primary_key": [PackageID]} + foreign_keys=[__table__.c.PackageID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/package_vote.py b/aurweb/models/package_vote.py index 2d70be16..7221d527 100644 --- a/aurweb/models/package_vote.py +++ b/aurweb/models/package_vote.py @@ -1,30 +1,26 @@ -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.package_base import PackageBase as _PackageBase from aurweb.models.user import User as _User class PackageVote(Base): - __tablename__ = "PackageVotes" + __table__ = schema.PackageVotes + __tablename__ = __table__.name + __mapper_args__ = { + "primary_key": [__table__.c.UsersID, __table__.c.PackageBaseID] + } - UsersID = Column( - Integer, ForeignKey("Users.ID", ondelete="CASCADE"), - nullable=False) User = relationship( _User, backref=backref("package_votes", lazy="dynamic"), - foreign_keys=[UsersID]) + foreign_keys=[__table__.c.UsersID]) - PackageBaseID = Column( - Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"), - nullable=False) PackageBase = relationship( _PackageBase, backref=backref("package_votes", lazy="dynamic"), - foreign_keys=[PackageBaseID]) - - __mapper_args__ = {"primary_key": [UsersID, PackageBaseID]} + foreign_keys=[__table__.c.PackageBaseID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/relation_type.py b/aurweb/models/relation_type.py index 71b6adbb..b52c91ec 100644 --- a/aurweb/models/relation_type.py +++ b/aurweb/models/relation_type.py @@ -1,27 +1,19 @@ -from sqlalchemy import Column, Integer - -from aurweb import db +from aurweb import schema from aurweb.models.declarative import Base CONFLICTS = "conflicts" PROVIDES = "provides" REPLACES = "replaces" +CONFLICTS_ID = 1 +PROVIDES_ID = 2 +REPLACES_ID = 3 -class RelationType(Base): - __tablename__ = "RelationTypes" - - ID = Column(Integer, primary_key=True) - __mapper_args__ = {"primary_key": [ID]} +class RelationType(Base): + __table__ = schema.RelationTypes + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} def __init__(self, Name: str = None): self.Name = Name - - -CONFLICTS_ID = db.query(RelationType).filter( - RelationType.Name == CONFLICTS).first().ID -PROVIDES_ID = db.query(RelationType).filter( - RelationType.Name == PROVIDES).first().ID -REPLACES_ID = db.query(RelationType).filter( - RelationType.Name == REPLACES).first().ID diff --git a/aurweb/models/request_type.py b/aurweb/models/request_type.py index 4578464c..cabab3d2 100644 --- a/aurweb/models/request_type.py +++ b/aurweb/models/request_type.py @@ -1,25 +1,20 @@ -from sqlalchemy import Column, Integer - -from aurweb import db +from aurweb import schema from aurweb.models.declarative import Base DELETION = "deletion" ORPHAN = "orphan" MERGE = "merge" +DELETION_ID = 1 +ORPHAN_ID = 2 +MERGE_ID = 3 -class RequestType(Base): - __tablename__ = "RequestTypes" - - ID = Column(Integer, primary_key=True) - __mapper_args__ = {"primary_key": [ID]} +class RequestType(Base): + __table__ = schema.RequestTypes + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} def name_display(self) -> str: """ Return the Name column with its first char capitalized. """ return self.Name.title() - - -DELETION_ID = db.query(RequestType, RequestType.Name == DELETION).first().ID -ORPHAN_ID = db.query(RequestType, RequestType.Name == ORPHAN).first().ID -MERGE_ID = db.query(RequestType, RequestType.Name == MERGE).first().ID diff --git a/aurweb/models/session.py b/aurweb/models/session.py index a4034678..96f88d85 100644 --- a/aurweb/models/session.py +++ b/aurweb/models/session.py @@ -1,23 +1,20 @@ -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.db import make_random_value, query from aurweb.models.declarative import Base from aurweb.models.user import User as _User class Session(Base): - __tablename__ = "Sessions" + __table__ = schema.Sessions + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.UsersID]} - UsersID = Column( - Integer, ForeignKey("Users.ID", ondelete="CASCADE"), - nullable=False) User = relationship( _User, backref=backref("session", uselist=False), - foreign_keys=[UsersID]) - - __mapper_args__ = {"primary_key": [UsersID]} + foreign_keys=[__table__.c.UsersID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/ssh_pub_key.py b/aurweb/models/ssh_pub_key.py index 268a585b..789be629 100644 --- a/aurweb/models/ssh_pub_key.py +++ b/aurweb/models/ssh_pub_key.py @@ -3,30 +3,23 @@ from subprocess import PIPE, Popen -from sqlalchemy import Column, ForeignKey, Integer, String from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base class SSHPubKey(Base): - __tablename__ = "SSHPubKeys" + __table__ = schema.SSHPubKeys + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.Fingerprint]} - UserID = Column( - Integer, ForeignKey("Users.ID", ondelete="CASCADE"), - nullable=False) User = relationship( "User", backref=backref("ssh_pub_key", uselist=False), - foreign_keys=[UserID]) - - Fingerprint = Column(String(44), primary_key=True) - - __mapper_args__ = {"primary_key": Fingerprint} + foreign_keys=[__table__.c.UserID]) def __init__(self, **kwargs): - self.UserID = kwargs.get("UserID") - self.Fingerprint = kwargs.get("Fingerprint") - self.PubKey = kwargs.get("PubKey") + super().__init__(**kwargs) def get_fingerprint(pubkey): diff --git a/aurweb/models/term.py b/aurweb/models/term.py index 0985cd76..59534bbc 100644 --- a/aurweb/models/term.py +++ b/aurweb/models/term.py @@ -1,15 +1,13 @@ -from sqlalchemy import Column, Integer from sqlalchemy.exc import IntegrityError +from aurweb import schema from aurweb.models.declarative import Base class Term(Base): - __tablename__ = "Terms" - - ID = Column(Integer, primary_key=True) - - __mapper_args__ = {"primary_key": [ID]} + __table__ = schema.Terms + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/tu_vote.py b/aurweb/models/tu_vote.py index 634c041e..efb23b19 100644 --- a/aurweb/models/tu_vote.py +++ b/aurweb/models/tu_vote.py @@ -1,28 +1,26 @@ -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.tu_voteinfo import TUVoteInfo as _TUVoteInfo from aurweb.models.user import User as _User class TUVote(Base): - __tablename__ = "TU_Votes" + __table__ = schema.TU_Votes + __tablename__ = __table__.name + __mapper_args__ = { + "primary_key": [__table__.c.VoteID, __table__.c.UserID] + } - VoteID = Column(Integer, ForeignKey("TU_VoteInfo.ID", ondelete="CASCADE"), - nullable=False) VoteInfo = relationship( _TUVoteInfo, backref=backref("tu_votes", lazy="dynamic"), - foreign_keys=[VoteID]) + foreign_keys=[__table__.c.VoteID]) - UserID = Column(Integer, ForeignKey("Users.ID", ondelete="CASCADE"), - nullable=False) User = relationship( _User, backref=backref("tu_votes", lazy="dynamic"), - foreign_keys=[UserID]) - - __mapper_args__ = {"primary_key": [VoteID, UserID]} + foreign_keys=[__table__.c.UserID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/tu_voteinfo.py b/aurweb/models/tu_voteinfo.py index da43b097..35675ccc 100644 --- a/aurweb/models/tu_voteinfo.py +++ b/aurweb/models/tu_voteinfo.py @@ -2,27 +2,22 @@ from datetime import datetime -from sqlalchemy import Column, ForeignKey, Integer from sqlalchemy.exc import IntegrityError from sqlalchemy.orm import backref, relationship +from aurweb import schema from aurweb.models.declarative import Base from aurweb.models.user import User as _User class TUVoteInfo(Base): - __tablename__ = "TU_VoteInfo" + __table__ = schema.TU_VoteInfo + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} - ID = Column(Integer, primary_key=True) - - SubmitterID = Column( - Integer, ForeignKey("Users.ID", ondelete="CASCADE"), - nullable=False) Submitter = relationship( _User, backref=backref("tu_voteinfo_set", lazy="dynamic"), - foreign_keys=[SubmitterID]) - - __mapper_args__ = {"primary_key": [ID]} + foreign_keys=[__table__.c.SubmitterID]) def __init__(self, **kwargs): super().__init__(**kwargs) diff --git a/aurweb/models/user.py b/aurweb/models/user.py index e4223144..8db34c38 100644 --- a/aurweb/models/user.py +++ b/aurweb/models/user.py @@ -5,14 +5,14 @@ import bcrypt from fastapi import Request -from sqlalchemy import Column, ForeignKey, Integer, String, or_, text +from sqlalchemy import or_ from sqlalchemy.orm import backref, relationship import aurweb.config import aurweb.models.account_type import aurweb.schema -from aurweb import db +from aurweb import db, schema from aurweb.models.account_type import AccountType as _AccountType from aurweb.models.ban import is_banned from aurweb.models.declarative import Base @@ -22,23 +22,16 @@ class User(Base): """ An ORM model of a single Users record. """ - __tablename__ = "Users" + __table__ = schema.Users + __tablename__ = __table__.name + __mapper_args__ = {"primary_key": [__table__.c.ID]} - ID = Column(Integer, primary_key=True) - - AccountTypeID = Column( - Integer, ForeignKey("AccountTypes.ID", ondelete="NO ACTION"), - nullable=False, server_default=text("1")) AccountType = relationship( _AccountType, backref=backref("users", lazy="dynamic"), - foreign_keys=[AccountTypeID], + foreign_keys=[__table__.c.AccountTypeID], uselist=False) - Passwd = Column(String(255), default=str()) - - __mapper_args__ = {"primary_key": [ID]} - # High-level variables used to track authentication (not in DB). authenticated = False nonce = None @@ -49,7 +42,7 @@ class User(Base): SALT_ROUNDS_DEFAULT) def __init__(self, Passwd: str = str(), **kwargs): - super().__init__(**kwargs) + super().__init__(**kwargs, Passwd=str()) # Run this again in the constructor in case we rehashed config. self.salt_rounds = aurweb.config.getint("options", "salt_rounds",