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.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)

View file

@ -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,37 +6,10 @@ TRUSTED_USER = "Trusted User"
DEVELOPER = "Developer"
TRUSTED_USER_AND_DEV = "Trusted User & Developer"
class AccountType(Base):
""" An ORM model of a single AccountTypes record. """
__tablename__ = "AccountTypes"
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.
USER_ID = 1
TRUSTED_USER_ID = 2
DEVELOPER_ID = 3
TRUSTED_USER_AND_DEV_ID = 4
# Map string constants to integer constants.
ACCOUNT_TYPE_ID = {
@ -50,3 +21,20 @@ ACCOUNT_TYPE_ID = {
# Reversed ACCOUNT_TYPE_ID mapping.
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 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)

View file

@ -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")

View file

@ -2,8 +2,6 @@ import json
from sqlalchemy.ext.declarative import declarative_base
import aurweb.db
from aurweb import util
@ -25,12 +23,10 @@ Base = declarative_base()
# 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()

View file

@ -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 @@ MAKEDEPENDS = "makedepends"
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]}
__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

View file

@ -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)

View file

@ -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)

View file

@ -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 @@ OFFICIAL_BASE = "https://aur.archlinux.org"
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)

View file

@ -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)

View file

@ -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"}

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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 @@ REJECTED_ID = 3
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,

View file

@ -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)

View file

@ -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)

View file

@ -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]}
__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

View file

@ -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]}
__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

View file

@ -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)

View file

@ -3,30 +3,23 @@ import tempfile
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):

View file

@ -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)

View file

@ -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)

View file

@ -2,27 +2,22 @@ import typing
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)

View file

@ -5,14 +5,14 @@ from datetime import datetime
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 @@ SALT_ROUNDS_DEFAULT = 12
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",