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 <kevr@0cost.org>
This commit is contained in:
Kevin Morris 2021-11-07 17:26:05 -08:00
parent e4a5b7fae9
commit 446a082352
No known key found for this signature in database
GPG key ID: F7E46DED420788F3
31 changed files with 212 additions and 356 deletions

View file

@ -1,28 +1,24 @@
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.term import Term as _Term from aurweb.models.term import Term as _Term
from aurweb.models.user import User as _User from aurweb.models.user import User as _User
class AcceptedTerm(Base): 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 = relationship(
_User, backref=backref("accepted_terms", lazy="dynamic"), _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 = relationship(
_Term, backref=backref("accepted_terms", lazy="dynamic"), _Term, backref=backref("accepted_terms", lazy="dynamic"),
foreign_keys=[TermsID]) foreign_keys=[__table__.c.TermsID])
__mapper_args__ = {"primary_key": [TermsID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,6 +1,4 @@
from sqlalchemy import Column, Integer from aurweb import schema
from aurweb import db
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
USER = "User" USER = "User"
@ -8,37 +6,10 @@ TRUSTED_USER = "Trusted User"
DEVELOPER = "Developer" DEVELOPER = "Developer"
TRUSTED_USER_AND_DEV = "Trusted User & Developer" TRUSTED_USER_AND_DEV = "Trusted User & Developer"
USER_ID = 1
class AccountType(Base): TRUSTED_USER_ID = 2
""" An ORM model of a single AccountTypes record. """ DEVELOPER_ID = 3
__tablename__ = "AccountTypes" TRUSTED_USER_AND_DEV_ID = 4
ID = Column(Integer, primary_key=True)
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, **kwargs):
self.AccountType = kwargs.pop("AccountType")
def __str__(self):
return str(self.AccountType)
def __repr__(self):
return "<AccountType(ID='%s', AccountType='%s')>" % (
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. # Map string constants to integer constants.
ACCOUNT_TYPE_ID = { ACCOUNT_TYPE_ID = {
@ -50,3 +21,20 @@ ACCOUNT_TYPE_ID = {
# Reversed ACCOUNT_TYPE_ID mapping. # Reversed ACCOUNT_TYPE_ID mapping.
ACCOUNT_TYPE_NAME = {v: k for k, v in ACCOUNT_TYPE_ID.items()} ACCOUNT_TYPE_NAME = {v: k for k, v in ACCOUNT_TYPE_ID.items()}
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")
def __str__(self):
return str(self.AccountType)
def __repr__(self):
return "<AccountType(ID='%s', AccountType='%s')>" % (
self.ID, str(self))

View file

@ -1,15 +1,13 @@
from sqlalchemy import Column, String
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
class ApiRateLimit(Base): class ApiRateLimit(Base):
__tablename__ = "ApiRateLimit" __table__ = schema.ApiRateLimit
__tablename__ = __table__.name
IP = Column(String(45), primary_key=True, unique=True, default=str()) __mapper_args__ = {"primary_key": [__table__.c.IP]}
__mapper_args__ = {"primary_key": [IP]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,15 +1,13 @@
from fastapi import Request from fastapi import Request
from sqlalchemy import Column, String
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
class Ban(Base): class Ban(Base):
__tablename__ = "Bans" __table__ = schema.Bans
__tablename__ = __table__.name
IPAddress = Column(String(45), primary_key=True) __mapper_args__ = {"primary_key": [__table__.c.IPAddress]}
__mapper_args__ = {"primary_key": [IPAddress]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
self.IPAddress = kwargs.get("IPAddress") self.IPAddress = kwargs.get("IPAddress")

View file

@ -2,8 +2,6 @@ import json
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.declarative import declarative_base
import aurweb.db
from aurweb import util from aurweb import util
@ -25,12 +23,10 @@ Base = declarative_base()
# Setup __table_args__ applicable to every table. # Setup __table_args__ applicable to every table.
Base.__table_args__ = { Base.__table_args__ = {
"autoload": True, "autoload": False,
"autoload_with": aurweb.db.get_engine(),
"extend_existing": True "extend_existing": True
} }
# Setup Base.as_dict and Base.json. # Setup Base.as_dict and Base.json.
# #
# With this, declarative models can use .as_dict() or .json() # With this, declarative models can use .as_dict() or .json()

View file

@ -1,6 +1,4 @@
from sqlalchemy import Column, Integer from aurweb import schema
from aurweb import db
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
DEPENDS = "depends" DEPENDS = "depends"
@ -8,23 +6,16 @@ MAKEDEPENDS = "makedepends"
CHECKDEPENDS = "checkdepends" CHECKDEPENDS = "checkdepends"
OPTDEPENDS = "optdepends" OPTDEPENDS = "optdepends"
DEPENDS_ID = 1
MAKEDEPENDS_ID = 2
CHECKDEPENDS_ID = 3
OPTDEPENDS_ID = 4
class DependencyType(Base): class DependencyType(Base):
__tablename__ = "DependencyTypes" __table__ = schema.DependencyTypes
__tablename__ = __table__.name
ID = Column(Integer, primary_key=True) __mapper_args__ = {"primary_key": [__table__.c.ID]}
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, Name: str = None): def __init__(self, Name: str = None):
self.Name = Name 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

View file

@ -1,15 +1,13 @@
from sqlalchemy import Column, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
class Group(Base): class Group(Base):
__tablename__ = "Groups" __table__ = schema.Groups
__tablename__ = __table__.name
ID = Column(Integer, primary_key=True) __mapper_args__ = {"primary_key": [__table__.c.ID]}
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,15 +1,13 @@
from sqlalchemy import Column, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
class License(Base): class License(Base):
__tablename__ = "Licenses" __table__ = schema.Licenses
__tablename__ = __table__.name
ID = Column(Integer, primary_key=True) __mapper_args__ = {"primary_key": [__table__.c.ID]}
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,6 +1,6 @@
from sqlalchemy import Column, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
# TODO: Fix this! Official packages aren't from aur.archlinux.org... # TODO: Fix this! Official packages aren't from aur.archlinux.org...
@ -8,11 +8,9 @@ OFFICIAL_BASE = "https://aur.archlinux.org"
class OfficialProvider(Base): class OfficialProvider(Base):
__tablename__ = "OfficialProviders" __table__ = schema.OfficialProviders
__tablename__ = __table__.name
ID = Column(Integer, primary_key=True) __mapper_args__ = {"primary_key": [__table__.c.ID]}
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,24 +1,19 @@
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.package_base import PackageBase as _PackageBase from aurweb.models.package_base import PackageBase as _PackageBase
class Package(Base): 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 = relationship(
_PackageBase, backref=backref("packages", lazy="dynamic"), _PackageBase, backref=backref("packages", lazy="dynamic"),
foreign_keys=[PackageBaseID]) foreign_keys=[__table__.c.PackageBaseID])
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,38 +1,33 @@
from datetime import datetime from datetime import datetime
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.user import User as _User from aurweb.models.user import User as _User
class PackageBase(Base): 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( Flagger = relationship(
_User, backref=backref("flagged_bases", lazy="dynamic"), _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( Submitter = relationship(
_User, backref=backref("submitted_bases", lazy="dynamic"), _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( Maintainer = relationship(
_User, backref=backref("maintained_bases", lazy="dynamic"), _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( Packager = relationship(
_User, backref=backref("package_bases", lazy="dynamic"), _User, backref=backref("package_bases", lazy="dynamic"),
foreign_keys=[PackagerUID]) foreign_keys=[__table__.c.PackagerUID])
# A set used to check for floatable values. # A set used to check for floatable values.
TO_FLOAT = {"Popularity"} TO_FLOAT = {"Popularity"}

View file

@ -1,15 +1,13 @@
from sqlalchemy import Column, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
class PackageBlacklist(Base): class PackageBlacklist(Base):
__tablename__ = "PackageBlacklist" __table__ = schema.PackageBlacklist
__tablename__ = __table__.name
ID = Column(Integer, primary_key=True) __mapper_args__ = {"primary_key": [__table__.c.ID]}
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,30 +1,26 @@
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.package_base import PackageBase as _PackageBase from aurweb.models.package_base import PackageBase as _PackageBase
from aurweb.models.user import User as _User from aurweb.models.user import User as _User
class PackageComaintainer(Base): 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 = relationship(
_User, backref=backref("comaintained", lazy="dynamic"), _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 = relationship(
_PackageBase, backref=backref("comaintainers", lazy="dynamic"), _PackageBase, backref=backref("comaintainers", lazy="dynamic"),
foreign_keys=[PackageBaseID]) foreign_keys=[__table__.c.PackageBaseID])
__mapper_args__ = {"primary_key": [UsersID, PackageBaseID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,43 +1,33 @@
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.package_base import PackageBase as _PackageBase from aurweb.models.package_base import PackageBase as _PackageBase
from aurweb.models.user import User as _User from aurweb.models.user import User as _User
class PackageComment(Base): 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 = relationship(
_PackageBase, backref=backref("comments", lazy="dynamic", _PackageBase, backref=backref("comments", lazy="dynamic",
cascade="all, delete"), cascade="all, delete"),
foreign_keys=[PackageBaseID]) foreign_keys=[__table__.c.PackageBaseID])
UsersID = Column(Integer, ForeignKey("Users.ID", ondelete="SET NULL"))
User = relationship( User = relationship(
_User, backref=backref("package_comments", lazy="dynamic"), _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( Editor = relationship(
_User, backref=backref("edited_comments", lazy="dynamic"), _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( Deleter = relationship(
_User, backref=backref("deleted_comments", lazy="dynamic"), _User, backref=backref("deleted_comments", lazy="dynamic"),
foreign_keys=[DelUsersID]) foreign_keys=[__table__.c.DelUsersID])
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,34 +1,28 @@
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.dependency_type import DependencyType as _DependencyType from aurweb.models.dependency_type import DependencyType as _DependencyType
from aurweb.models.package import Package as _Package from aurweb.models.package import Package as _Package
class PackageDependency(Base): 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 = relationship(
_Package, backref=backref("package_dependencies", lazy="dynamic", _Package, backref=backref("package_dependencies", lazy="dynamic",
cascade="all, delete"), 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 = relationship(
_DependencyType, _DependencyType,
backref=backref("package_dependencies", lazy="dynamic"), backref=backref("package_dependencies", lazy="dynamic"),
foreign_keys=[DepTypeID]) foreign_keys=[__table__.c.DepTypeID])
DepName = Column(String(255), nullable=False)
__mapper_args__ = {"primary_key": [PackageID, DepName]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,28 +1,26 @@
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.group import Group as _Group from aurweb.models.group import Group as _Group
from aurweb.models.package import Package as _Package from aurweb.models.package import Package as _Package
class PackageGroup(Base): 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 = relationship(
_Package, backref=backref("package_groups", lazy="dynamic"), _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 = relationship(
_Group, backref=backref("package_groups", lazy="dynamic"), _Group, backref=backref("package_groups", lazy="dynamic"),
foreign_keys=[GroupID]) foreign_keys=[__table__.c.GroupID])
__mapper_args__ = {"primary_key": [PackageID, GroupID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,27 +1,22 @@
from sqlalchemy import Column, ForeignKey, Integer, String, text
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.package_base import PackageBase as _PackageBase from aurweb.models.package_base import PackageBase as _PackageBase
class PackageKeyword(Base): 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 = relationship(
_PackageBase, backref=backref("keywords", lazy="dynamic", _PackageBase, backref=backref("keywords", lazy="dynamic",
cascade="all, delete"), cascade="all, delete"),
foreign_keys=[PackageBaseID]) foreign_keys=[__table__.c.PackageBaseID])
Keyword = Column(
String(255), primary_key=True, nullable=False,
server_default=text("''"))
__mapper_args__ = {"primary_key": [PackageBaseID, Keyword]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,32 +1,28 @@
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.license import License as _License from aurweb.models.license import License as _License
from aurweb.models.package import Package as _Package from aurweb.models.package import Package as _Package
class PackageLicense(Base): 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 = relationship(
_Package, backref=backref("package_licenses", lazy="dynamic", _Package, backref=backref("package_licenses", lazy="dynamic",
cascade="all, delete"), 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 = relationship(
_License, backref=backref("package_licenses", lazy="dynamic", _License, backref=backref("package_licenses", lazy="dynamic",
cascade="all, delete"), cascade="all, delete"),
foreign_keys=[LicenseID]) foreign_keys=[__table__.c.LicenseID])
__mapper_args__ = {"primary_key": [PackageID, LicenseID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,31 +1,27 @@
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.package_base import PackageBase as _PackageBase from aurweb.models.package_base import PackageBase as _PackageBase
from aurweb.models.user import User as _User from aurweb.models.user import User as _User
class PackageNotification(Base): 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 = relationship(
_User, backref=backref("notifications", lazy="dynamic"), _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 = relationship(
_PackageBase, _PackageBase,
backref=backref("notifications", lazy="dynamic"), backref=backref("notifications", lazy="dynamic"),
foreign_keys=[PackageBaseID]) foreign_keys=[__table__.c.PackageBaseID])
__mapper_args__ = {"primary_key": [UserID, PackageBaseID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,33 +1,27 @@
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.package import Package as _Package from aurweb.models.package import Package as _Package
from aurweb.models.relation_type import RelationType as _RelationType from aurweb.models.relation_type import RelationType as _RelationType
class PackageRelation(Base): 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 = relationship(
_Package, backref=backref("package_relations", lazy="dynamic", _Package, backref=backref("package_relations", lazy="dynamic",
cascade="all, delete"), cascade="all, delete"),
foreign_keys=[PackageID]) foreign_keys=[__table__.c.PackageID])
RelTypeID = Column(
Integer, ForeignKey("RelationTypes.ID", ondelete="CASCADE"),
nullable=False)
RelationType = relationship( RelationType = relationship(
_RelationType, backref=backref("package_relations", lazy="dynamic"), _RelationType, backref=backref("package_relations", lazy="dynamic"),
foreign_keys=[RelTypeID]) foreign_keys=[__table__.c.RelTypeID])
RelName = Column(String(255), unique=True)
__mapper_args__ = {"primary_key": [PackageID, RelName]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,7 +1,7 @@
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.package_base import PackageBase as _PackageBase from aurweb.models.package_base import PackageBase as _PackageBase
from aurweb.models.request_type import RequestType as _RequestType from aurweb.models.request_type import RequestType as _RequestType
@ -20,34 +20,25 @@ REJECTED_ID = 3
class PackageRequest(Base): 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 = relationship(
_RequestType, backref=backref("package_requests", lazy="dynamic"), _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 = relationship(
_User, backref=backref("package_requests", lazy="dynamic"), _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 = relationship(
_PackageBase, backref=backref("requests", lazy="dynamic"), _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( Closer = relationship(
_User, backref=backref("closed_requests", lazy="dynamic"), _User, backref=backref("closed_requests", lazy="dynamic"),
foreign_keys=[ClosedUID]) foreign_keys=[__table__.c.ClosedUID])
__mapper_args__ = {"primary_key": [ID]}
STATUS_DISPLAY = { STATUS_DISPLAY = {
PENDING_ID: PENDING, PENDING_ID: PENDING,

View file

@ -1,22 +1,22 @@
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.package import Package as _Package from aurweb.models.package import Package as _Package
class PackageSource(Base): 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 = relationship(
_Package, backref=backref("package_sources", lazy="dynamic", _Package, backref=backref("package_sources", lazy="dynamic",
cascade="all, delete"), cascade="all, delete"),
foreign_keys=[PackageID]) foreign_keys=[__table__.c.PackageID])
__mapper_args__ = {"primary_key": [PackageID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,30 +1,26 @@
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.package_base import PackageBase as _PackageBase from aurweb.models.package_base import PackageBase as _PackageBase
from aurweb.models.user import User as _User from aurweb.models.user import User as _User
class PackageVote(Base): 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 = relationship(
_User, backref=backref("package_votes", lazy="dynamic"), _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 = relationship(
_PackageBase, backref=backref("package_votes", lazy="dynamic"), _PackageBase, backref=backref("package_votes", lazy="dynamic"),
foreign_keys=[PackageBaseID]) foreign_keys=[__table__.c.PackageBaseID])
__mapper_args__ = {"primary_key": [UsersID, PackageBaseID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,27 +1,19 @@
from sqlalchemy import Column, Integer from aurweb import schema
from aurweb import db
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
CONFLICTS = "conflicts" CONFLICTS = "conflicts"
PROVIDES = "provides" PROVIDES = "provides"
REPLACES = "replaces" REPLACES = "replaces"
CONFLICTS_ID = 1
PROVIDES_ID = 2
REPLACES_ID = 3
class RelationType(Base): class RelationType(Base):
__tablename__ = "RelationTypes" __table__ = schema.RelationTypes
__tablename__ = __table__.name
ID = Column(Integer, primary_key=True) __mapper_args__ = {"primary_key": [__table__.c.ID]}
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, Name: str = None): def __init__(self, Name: str = None):
self.Name = Name 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

View file

@ -1,25 +1,20 @@
from sqlalchemy import Column, Integer from aurweb import schema
from aurweb import db
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
DELETION = "deletion" DELETION = "deletion"
ORPHAN = "orphan" ORPHAN = "orphan"
MERGE = "merge" MERGE = "merge"
DELETION_ID = 1
ORPHAN_ID = 2
MERGE_ID = 3
class RequestType(Base): class RequestType(Base):
__tablename__ = "RequestTypes" __table__ = schema.RequestTypes
__tablename__ = __table__.name
ID = Column(Integer, primary_key=True) __mapper_args__ = {"primary_key": [__table__.c.ID]}
__mapper_args__ = {"primary_key": [ID]}
def name_display(self) -> str: def name_display(self) -> str:
""" Return the Name column with its first char capitalized. """ """ Return the Name column with its first char capitalized. """
return self.Name.title() 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

View file

@ -1,23 +1,20 @@
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.db import make_random_value, query from aurweb.db import make_random_value, query
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.user import User as _User from aurweb.models.user import User as _User
class Session(Base): 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 = relationship(
_User, backref=backref("session", uselist=False), _User, backref=backref("session", uselist=False),
foreign_keys=[UsersID]) foreign_keys=[__table__.c.UsersID])
__mapper_args__ = {"primary_key": [UsersID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -3,30 +3,23 @@ import tempfile
from subprocess import PIPE, Popen from subprocess import PIPE, Popen
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
class SSHPubKey(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 = relationship(
"User", backref=backref("ssh_pub_key", uselist=False), "User", backref=backref("ssh_pub_key", uselist=False),
foreign_keys=[UserID]) foreign_keys=[__table__.c.UserID])
Fingerprint = Column(String(44), primary_key=True)
__mapper_args__ = {"primary_key": Fingerprint}
def __init__(self, **kwargs): def __init__(self, **kwargs):
self.UserID = kwargs.get("UserID") super().__init__(**kwargs)
self.Fingerprint = kwargs.get("Fingerprint")
self.PubKey = kwargs.get("PubKey")
def get_fingerprint(pubkey): def get_fingerprint(pubkey):

View file

@ -1,15 +1,13 @@
from sqlalchemy import Column, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
class Term(Base): class Term(Base):
__tablename__ = "Terms" __table__ = schema.Terms
__tablename__ = __table__.name
ID = Column(Integer, primary_key=True) __mapper_args__ = {"primary_key": [__table__.c.ID]}
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -1,28 +1,26 @@
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.tu_voteinfo import TUVoteInfo as _TUVoteInfo from aurweb.models.tu_voteinfo import TUVoteInfo as _TUVoteInfo
from aurweb.models.user import User as _User from aurweb.models.user import User as _User
class TUVote(Base): 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( VoteInfo = relationship(
_TUVoteInfo, backref=backref("tu_votes", lazy="dynamic"), _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 = relationship(
_User, backref=backref("tu_votes", lazy="dynamic"), _User, backref=backref("tu_votes", lazy="dynamic"),
foreign_keys=[UserID]) foreign_keys=[__table__.c.UserID])
__mapper_args__ = {"primary_key": [VoteID, UserID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -2,27 +2,22 @@ import typing
from datetime import datetime from datetime import datetime
from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
from aurweb import schema
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
from aurweb.models.user import User as _User from aurweb.models.user import User as _User
class TUVoteInfo(Base): 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( Submitter = relationship(
_User, backref=backref("tu_voteinfo_set", lazy="dynamic"), _User, backref=backref("tu_voteinfo_set", lazy="dynamic"),
foreign_keys=[SubmitterID]) foreign_keys=[__table__.c.SubmitterID])
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, **kwargs): def __init__(self, **kwargs):
super().__init__(**kwargs) super().__init__(**kwargs)

View file

@ -5,14 +5,14 @@ from datetime import datetime
import bcrypt import bcrypt
from fastapi import Request from fastapi import Request
from sqlalchemy import Column, ForeignKey, Integer, String, or_, text from sqlalchemy import or_
from sqlalchemy.orm import backref, relationship from sqlalchemy.orm import backref, relationship
import aurweb.config import aurweb.config
import aurweb.models.account_type import aurweb.models.account_type
import aurweb.schema import aurweb.schema
from aurweb import db from aurweb import db, schema
from aurweb.models.account_type import AccountType as _AccountType from aurweb.models.account_type import AccountType as _AccountType
from aurweb.models.ban import is_banned from aurweb.models.ban import is_banned
from aurweb.models.declarative import Base from aurweb.models.declarative import Base
@ -22,23 +22,16 @@ SALT_ROUNDS_DEFAULT = 12
class User(Base): class User(Base):
""" An ORM model of a single Users record. """ """ 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 = relationship(
_AccountType, _AccountType,
backref=backref("users", lazy="dynamic"), backref=backref("users", lazy="dynamic"),
foreign_keys=[AccountTypeID], foreign_keys=[__table__.c.AccountTypeID],
uselist=False) uselist=False)
Passwd = Column(String(255), default=str())
__mapper_args__ = {"primary_key": [ID]}
# High-level variables used to track authentication (not in DB). # High-level variables used to track authentication (not in DB).
authenticated = False authenticated = False
nonce = None nonce = None
@ -49,7 +42,7 @@ class User(Base):
SALT_ROUNDS_DEFAULT) SALT_ROUNDS_DEFAULT)
def __init__(self, Passwd: str = str(), **kwargs): 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. # Run this again in the constructor in case we rehashed config.
self.salt_rounds = aurweb.config.getint("options", "salt_rounds", self.salt_rounds = aurweb.config.getint("options", "salt_rounds",