change(fastapi): unify all model relationship behavior

Now, we allow the direct relationships and their foreign keys to
be set in all of our models. Previously, we constrained this to
direct relationships, and this forced users to perform a query
in most situations to satisfy that requirement. Now, IDs can be
passed directly.

Additionally, this change removes the need for extraneous imports
when users which to use relationships. We now import and use models
directly instead of passing string-references to them.

Signed-off-by: Kevin Morris <kevr@0cost.org>
This commit is contained in:
Kevin Morris 2021-10-16 16:16:44 -07:00
parent 0c37216626
commit 51320ab22a
No known key found for this signature in database
GPG key ID: F7E46DED420788F3
24 changed files with 181 additions and 297 deletions

View file

@ -2,10 +2,9 @@ from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.models.term
import aurweb.models.user
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):
@ -14,33 +13,28 @@ class AcceptedTerm(Base):
UsersID = Column(Integer, ForeignKey("Users.ID", ondelete="CASCADE"),
nullable=False)
User = relationship(
"User", backref=backref("accepted_terms", lazy="dynamic"),
_User, backref=backref("accepted_terms", lazy="dynamic"),
foreign_keys=[UsersID])
TermsID = Column(Integer, ForeignKey("Terms.ID", ondelete="CASCADE"),
nullable=False)
Term = relationship(
"Term", backref=backref("accepted_terms", lazy="dynamic"),
_Term, backref=backref("accepted_terms", lazy="dynamic"),
foreign_keys=[TermsID])
__mapper_args__ = {"primary_key": [TermsID]}
def __init__(self,
User: aurweb.models.user.User = None,
Term: aurweb.models.term.Term = None,
Revision: int = None):
self.User = User
if not self.User:
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.User and not self.UsersID:
raise IntegrityError(
statement="Foreign key UserID cannot be null.",
statement="Foreign key UsersID cannot be null.",
orig="AcceptedTerms.UserID",
params=("NULL"))
self.Term = Term
if not self.Term:
if not self.Term and not self.TermsID:
raise IntegrityError(
statement="Foreign key TermID cannot be null.",
orig="AcceptedTerms.TermID",
params=("NULL"))
self.Revision = Revision

View file

@ -11,20 +11,15 @@ class ApiRateLimit(Base):
__mapper_args__ = {"primary_key": [IP]}
def __init__(self,
IP: str = None,
Requests: int = None,
WindowStart: int = None):
self.IP = IP
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.Requests = Requests
if self.Requests is None:
raise IntegrityError(
statement="Column Requests cannot be null.",
orig="ApiRateLimit.Requests",
params=("NULL"))
self.WindowStart = WindowStart
if self.WindowStart is None:
raise IntegrityError(
statement="Column WindowStart cannot be null.",

View file

@ -11,9 +11,9 @@ class Group(Base):
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, Name: str = None):
self.Name = Name
if not self.Name:
def __init__(self, **kwargs):
super().__init__(**kwargs)
if self.Name is None:
raise IntegrityError(
statement="Column Name cannot be null.",
orig="Groups.Name",

View file

@ -11,8 +11,9 @@ class License(Base):
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, Name: str = None):
self.Name = Name
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.Name:
raise IntegrityError(
statement="Column Name cannot be null.",

View file

@ -3,6 +3,7 @@ from sqlalchemy.exc import IntegrityError
from aurweb.models.declarative import Base
# TODO: Fix this! Official packages aren't from aur.archlinux.org...
OFFICIAL_BASE = "https://aur.archlinux.org"
@ -13,25 +14,21 @@ class OfficialProvider(Base):
__mapper_args__ = {"primary_key": [ID]}
def __init__(self,
Name: str = None,
Repo: str = None,
Provides: str = None):
self.Name = Name
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.Name:
raise IntegrityError(
statement="Column Name cannot be null.",
orig="OfficialProviders.Name",
params=("NULL"))
self.Repo = Repo
if not self.Repo:
raise IntegrityError(
statement="Column Repo cannot be null.",
orig="OfficialProviders.Repo",
params=("NULL"))
self.Provides = Provides
if not self.Provides:
raise IntegrityError(
statement="Column Provides cannot be null.",

View file

@ -2,10 +2,8 @@ from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.db
import aurweb.models.package_base
from aurweb.models.declarative import Base
from aurweb.models.package_base import PackageBase as _PackageBase
class Package(Base):
@ -17,31 +15,22 @@ class Package(Base):
Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"),
nullable=False)
PackageBase = relationship(
"PackageBase", backref=backref("packages", lazy="dynamic"),
_PackageBase, backref=backref("packages", lazy="dynamic"),
foreign_keys=[PackageBaseID])
__mapper_args__ = {"primary_key": [ID]}
def __init__(self,
PackageBase: aurweb.models.package_base.PackageBase = None,
Name: str = None,
Version: str = None,
Description: str = None,
URL: str = None):
self.PackageBase = PackageBase
if not self.PackageBase:
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.PackageBase and not self.PackageBaseID:
raise IntegrityError(
statement="Foreign key PackageBaseID cannot be null.",
orig="Packages.PackageBaseID",
params=("NULL"))
self.Name = Name
if not self.Name:
if self.Name is None:
raise IntegrityError(
statement="Column Name cannot be null.",
orig="Packages.Name",
params=("NULL"))
self.Version = Version
self.Description = Description
self.URL = URL

View file

@ -4,9 +4,8 @@ from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.models.user
from aurweb.models.declarative import Base
from aurweb.models.user import User as _User
class PackageBase(Base):
@ -15,56 +14,48 @@ class PackageBase(Base):
FlaggerUID = Column(Integer,
ForeignKey("Users.ID", ondelete="SET NULL"))
Flagger = relationship(
"User", backref=backref("flagged_bases", lazy="dynamic"),
_User, backref=backref("flagged_bases", lazy="dynamic"),
foreign_keys=[FlaggerUID])
SubmitterUID = Column(Integer,
ForeignKey("Users.ID", ondelete="SET NULL"))
Submitter = relationship(
"User", backref=backref("submitted_bases", lazy="dynamic"),
_User, backref=backref("submitted_bases", lazy="dynamic"),
foreign_keys=[SubmitterUID])
MaintainerUID = Column(Integer,
ForeignKey("Users.ID", ondelete="SET NULL"))
Maintainer = relationship(
"User", backref=backref("maintained_bases", lazy="dynamic"),
_User, backref=backref("maintained_bases", lazy="dynamic"),
foreign_keys=[MaintainerUID])
PackagerUID = Column(Integer, ForeignKey("Users.ID", ondelete="SET NULL"))
Packager = relationship(
"User", backref=backref("package_bases", lazy="dynamic"),
_User, backref=backref("package_bases", lazy="dynamic"),
foreign_keys=[PackagerUID])
# A set used to check for floatable values.
TO_FLOAT = {"Popularity"}
def __init__(self, Name: str = None,
Flagger: aurweb.models.user.User = None,
Maintainer: aurweb.models.user.User = None,
Submitter: aurweb.models.user.User = None,
Packager: aurweb.models.user.User = None,
**kwargs):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.Name = Name
if not self.Name:
if self.Name is None:
raise IntegrityError(
statement="Column Name cannot be null.",
orig="PackageBases.Name",
params=("NULL"))
self.Flagger = Flagger
self.Maintainer = Maintainer
self.Submitter = Submitter
self.Packager = Packager
# If no SubmittedTS/ModifiedTS is provided on creation, set them
# here to the current utc timestamp.
now = datetime.utcnow().timestamp()
if not self.SubmittedTS:
self.SubmittedTS = now
if not self.ModifiedTS:
self.ModifiedTS = now
self.NumVotes = kwargs.get("NumVotes")
self.Popularity = kwargs.get("Popularity")
self.OutOfDateTS = kwargs.get("OutOfDateTS")
self.FlaggerComment = kwargs.get("FlaggerComment", str())
self.SubmittedTS = kwargs.get("SubmittedTS",
datetime.utcnow().timestamp())
self.ModifiedTS = kwargs.get("ModifiedTS",
datetime.utcnow().timestamp())
if not self.FlaggerComment:
self.FlaggerComment = str()
def __getattribute__(self, key: str):
attr = super().__getattribute__(key)

View file

@ -11,8 +11,9 @@ class PackageBlacklist(Base):
__mapper_args__ = {"primary_key": [ID]}
def __init__(self, Name: str = None):
self.Name = Name
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.Name:
raise IntegrityError(
statement="Column Name cannot be null.",

View file

@ -2,10 +2,9 @@ from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.models.package_base
import aurweb.models.user
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):
@ -15,37 +14,33 @@ class PackageComaintainer(Base):
Integer, ForeignKey("Users.ID", ondelete="CASCADE"),
nullable=False)
User = relationship(
"User", backref=backref("comaintained", lazy="dynamic"),
_User, backref=backref("comaintained", lazy="dynamic"),
foreign_keys=[UsersID])
PackageBaseID = Column(
Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"),
nullable=False)
PackageBase = relationship(
"PackageBase", backref=backref("comaintainers", lazy="dynamic"),
_PackageBase, backref=backref("comaintainers", lazy="dynamic"),
foreign_keys=[PackageBaseID])
__mapper_args__ = {"primary_key": [UsersID, PackageBaseID]}
def __init__(self,
User: aurweb.models.user.User = None,
PackageBase: aurweb.models.package_base.PackageBase = None,
Priority: int = None):
self.User = User
if not self.User:
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.User and not self.UsersID:
raise IntegrityError(
statement="Foreign key UsersID cannot be null.",
orig="PackageComaintainers.UsersID",
params=("NULL"))
self.PackageBase = PackageBase
if not self.PackageBase:
if not self.PackageBase and not self.PackageBaseID:
raise IntegrityError(
statement="Foreign key PackageBaseID cannot be null.",
orig="PackageComaintainers.PackageBaseID",
params=("NULL"))
self.Priority = Priority
if not self.Priority:
raise IntegrityError(
statement="Column Priority cannot be null.",

View file

@ -2,10 +2,9 @@ from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.models.package_base
import aurweb.models.user
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):
@ -17,44 +16,39 @@ class PackageComment(Base):
Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"),
nullable=False)
PackageBase = relationship(
"PackageBase", backref=backref("comments", lazy="dynamic",
cascade="all,delete"),
_PackageBase, backref=backref("comments", lazy="dynamic",
cascade="all,delete"),
foreign_keys=[PackageBaseID])
UsersID = Column(Integer, ForeignKey("Users.ID", ondelete="SET NULL"))
User = relationship(
"User", backref=backref("package_comments", lazy="dynamic"),
_User, backref=backref("package_comments", lazy="dynamic"),
foreign_keys=[UsersID])
EditedUsersID = Column(
Integer, ForeignKey("Users.ID", ondelete="SET NULL"))
Editor = relationship(
"User", backref=backref("edited_comments", lazy="dynamic"),
_User, backref=backref("edited_comments", lazy="dynamic"),
foreign_keys=[EditedUsersID])
DelUsersID = Column(
Integer, ForeignKey("Users.ID", ondelete="SET NULL"))
Deleter = relationship(
"User", backref=backref("deleted_comments", lazy="dynamic"),
_User, backref=backref("deleted_comments", lazy="dynamic"),
foreign_keys=[DelUsersID])
__mapper_args__ = {"primary_key": [ID]}
def __init__(self,
PackageBase: aurweb.models.package_base.PackageBase = None,
User: aurweb.models.user.User = None,
**kwargs):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.PackageBase = PackageBase
if not self.PackageBase:
if not self.PackageBase and not self.PackageBaseID:
raise IntegrityError(
statement="Foreign key PackageBaseID cannot be null.",
orig="PackageComments.PackageBaseID",
params=("NULL"))
self.User = User
if not self.User:
if not self.User and not self.UsersID:
raise IntegrityError(
statement="Foreign key UsersID cannot be null.",
orig="PackageComments.UsersID",

View file

@ -2,10 +2,9 @@ from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.models.package
from aurweb.models import dependency_type
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):
@ -15,15 +14,15 @@ class PackageDependency(Base):
Integer, ForeignKey("Packages.ID", ondelete="CASCADE"),
nullable=False)
Package = relationship(
"Package", backref=backref("package_dependencies", lazy="dynamic",
cascade="all,delete"),
_Package, backref=backref("package_dependencies", lazy="dynamic",
cascade="all,delete"),
foreign_keys=[PackageID])
DepTypeID = Column(
Integer, ForeignKey("DependencyTypes.ID", ondelete="NO ACTION"),
nullable=False)
DependencyType = relationship(
"DependencyType",
_DependencyType,
backref=backref("package_dependencies", lazy="dynamic"),
foreign_keys=[DepTypeID])
@ -31,39 +30,29 @@ class PackageDependency(Base):
__mapper_args__ = {"primary_key": [PackageID, DepName]}
def __init__(self,
Package: aurweb.models.package.Package = None,
DependencyType: dependency_type.DependencyType = None,
DepName: str = None,
DepDesc: str = None,
DepCondition: str = None,
DepArch: str = None):
self.Package = Package
if not self.Package:
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.Package and not self.PackageID:
raise IntegrityError(
statement="Foreign key PackageID cannot be null.",
orig="PackageDependencies.PackageID",
params=("NULL"))
self.DependencyType = DependencyType
if not self.DependencyType:
if not self.DependencyType and not self.DepTypeID:
raise IntegrityError(
statement="Foreign key DepTypeID cannot be null.",
orig="PackageDependencies.DepTypeID",
params=("NULL"))
self.DepName = DepName
if not self.DepName:
if self.DepName is None:
raise IntegrityError(
statement="Column DepName cannot be null.",
orig="PackageDependencies.DepName",
params=("NULL"))
self.DepDesc = DepDesc
self.DepCondition = DepCondition
self.DepArch = DepArch
def is_package(self) -> bool:
# TODO: Improve the speed of this query if possible.
from aurweb import db
from aurweb.models.official_provider import OfficialProvider
from aurweb.models.package import Package

View file

@ -2,10 +2,9 @@ from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.models.group
import aurweb.models.package
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):
@ -14,29 +13,27 @@ class PackageGroup(Base):
PackageID = Column(Integer, ForeignKey("Packages.ID", ondelete="CASCADE"),
primary_key=True, nullable=True)
Package = relationship(
"Package", backref=backref("package_groups", lazy="dynamic"),
_Package, backref=backref("package_groups", lazy="dynamic"),
foreign_keys=[PackageID])
GroupID = Column(Integer, ForeignKey("Groups.ID", ondelete="CASCADE"),
primary_key=True, nullable=True)
Group = relationship(
"Group", backref=backref("package_groups", lazy="dynamic"),
_Group, backref=backref("package_groups", lazy="dynamic"),
foreign_keys=[GroupID])
__mapper_args__ = {"primary_key": [PackageID, GroupID]}
def __init__(self,
Package: aurweb.models.package.Package = None,
Group: aurweb.models.group.Group = None):
self.Package = Package
if not self.Package:
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.Package and not self.PackageID:
raise IntegrityError(
statement="Primary key PackageID cannot be null.",
orig="PackageGroups.PackageID",
params=("NULL"))
self.Group = Group
if not self.Group:
if not self.Group and not self.GroupID:
raise IntegrityError(
statement="Primary key GroupID cannot be null.",
orig="PackageGroups.GroupID",

View file

@ -2,10 +2,8 @@ from sqlalchemy import Column, ForeignKey, Integer, String, text
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.db
import aurweb.models.package_base
from aurweb.models.declarative import Base
from aurweb.models.package_base import PackageBase as _PackageBase
class PackageKeyword(Base):
@ -15,7 +13,7 @@ class PackageKeyword(Base):
Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"),
primary_key=True, nullable=True)
PackageBase = relationship(
"PackageBase", backref=backref("keywords", lazy="dynamic"),
_PackageBase, backref=backref("keywords", lazy="dynamic"),
foreign_keys=[PackageBaseID])
Keyword = Column(
@ -24,14 +22,11 @@ class PackageKeyword(Base):
__mapper_args__ = {"primary_key": [PackageBaseID, Keyword]}
def __init__(self,
PackageBase: aurweb.models.package_base.PackageBase = None,
Keyword: str = None):
self.PackageBase = PackageBase
if not self.PackageBase:
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.PackageBase and not self.PackageBaseID:
raise IntegrityError(
statement="Primary key PackageBaseID cannot be null.",
orig="PackageKeywords.PackageBaseID",
params=("NULL"))
self.Keyword = Keyword

View file

@ -2,10 +2,9 @@ from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.models.license
import aurweb.models.package
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):
@ -15,30 +14,28 @@ class PackageLicense(Base):
Integer, ForeignKey("Packages.ID", ondelete="CASCADE"),
primary_key=True, nullable=True)
Package = relationship(
"Package", backref=backref("package_license", uselist=False),
_Package, backref=backref("package_license", uselist=False),
foreign_keys=[PackageID])
LicenseID = Column(
Integer, ForeignKey("Licenses.ID", ondelete="CASCADE"),
primary_key=True, nullable=True)
License = relationship(
"License", backref=backref("package_license", uselist=False),
_License, backref=backref("package_license", uselist=False),
foreign_keys=[LicenseID])
__mapper_args__ = {"primary_key": [PackageID, LicenseID]}
def __init__(self,
Package: aurweb.models.package.Package = None,
License: aurweb.models.license.License = None):
self.Package = Package
if not self.Package:
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.Package and not self.PackageID:
raise IntegrityError(
statement="Primary key PackageID cannot be null.",
orig="PackageLicenses.PackageID",
params=("NULL"))
self.License = License
if not self.License:
if not self.License and not self.LicenseID:
raise IntegrityError(
statement="Primary key LicenseID cannot be null.",
orig="PackageLicenses.LicenseID",

View file

@ -2,10 +2,9 @@ from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.models.package_base
import aurweb.models.user
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):
@ -15,32 +14,29 @@ class PackageNotification(Base):
Integer, ForeignKey("Users.ID", ondelete="CASCADE"),
nullable=False)
User = relationship(
"User", backref=backref("notifications", lazy="dynamic"),
_User, backref=backref("notifications", lazy="dynamic"),
foreign_keys=[UserID])
PackageBaseID = Column(
Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"),
nullable=False)
PackageBase = relationship(
"PackageBase",
_PackageBase,
backref=backref("notifications", lazy="dynamic"),
foreign_keys=[PackageBaseID])
__mapper_args__ = {"primary_key": [UserID, PackageBaseID]}
def __init__(self,
User: aurweb.models.user.User = None,
PackageBase: aurweb.models.package_base.PackageBase = None,
NotificationTS: int = None):
self.User = User
if not self.User:
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.User and not self.UserID:
raise IntegrityError(
statement="Foreign key UserID cannot be null.",
orig="PackageNotifications.UserID",
params=("NULL"))
self.PackageBase = PackageBase
if not self.PackageBase:
if not self.PackageBase and not self.PackageBaseID:
raise IntegrityError(
statement="Foreign key PackageBaseID cannot be null.",
orig="PackageNotifications.PackageBaseID",

View file

@ -2,11 +2,9 @@ from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.db
import aurweb.models.package
import aurweb.models.relation_type
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):
@ -16,46 +14,38 @@ class PackageRelation(Base):
Integer, ForeignKey("Packages.ID", ondelete="CASCADE"),
nullable=False)
Package = relationship(
"Package", backref=backref("package_relations", lazy="dynamic",
cascade="all,delete"),
_Package, backref=backref("package_relations", lazy="dynamic",
cascade="all,delete"),
foreign_keys=[PackageID])
RelTypeID = Column(
Integer, ForeignKey("RelationTypes.ID", ondelete="CASCADE"),
nullable=False)
RelationType = relationship(
"RelationType", backref=backref("package_relations", lazy="dynamic"),
_RelationType, backref=backref("package_relations", lazy="dynamic"),
foreign_keys=[RelTypeID])
RelName = Column(String(255), unique=True)
__mapper_args__ = {"primary_key": [PackageID, RelName]}
def __init__(self,
Package: aurweb.models.package.Package = None,
RelationType: aurweb.models.relation_type.RelationType = None,
RelName: str = None, RelCondition: str = None,
RelArch: str = None):
self.Package = Package
if not self.Package:
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.Package and not self.PackageID:
raise IntegrityError(
statement="Foreign key PackageID cannot be null.",
orig="PackageRelations.PackageID",
params=("NULL"))
self.RelationType = RelationType
if not self.RelationType:
if not self.RelationType and not self.RelTypeID:
raise IntegrityError(
statement="Foreign key RelTypeID cannot be null.",
orig="PackageRelations.RelTypeID",
params=("NULL"))
self.RelName = RelName # nullable=False
if not self.RelName:
raise IntegrityError(
statement="Column RelName cannot be null.",
orig="PackageRelations.RelName",
params=("NULL"))
self.RelCondition = RelCondition
self.RelArch = RelArch

View file

@ -2,11 +2,10 @@ from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.models.package_base
import aurweb.models.request_type
import aurweb.models.user
from aurweb.models.declarative import Base
from aurweb.models.package_base import PackageBase as _PackageBase
from aurweb.models.request_type import RequestType as _RequestType
from aurweb.models.user import User as _User
PENDING = "Pending"
CLOSED = "Closed"
@ -29,24 +28,24 @@ class PackageRequest(Base):
Integer, ForeignKey("RequestTypes.ID", ondelete="NO ACTION"),
nullable=False)
RequestType = relationship(
"RequestType", backref=backref("package_requests", lazy="dynamic"),
_RequestType, backref=backref("package_requests", lazy="dynamic"),
foreign_keys=[ReqTypeID])
UsersID = Column(Integer, ForeignKey("Users.ID", ondelete="SET NULL"))
User = relationship(
"User", backref=backref("package_requests", lazy="dynamic"),
_User, backref=backref("package_requests", lazy="dynamic"),
foreign_keys=[UsersID])
PackageBaseID = Column(
Integer, ForeignKey("PackageBases.ID", ondelete="SET NULL"),
nullable=False)
PackageBase = relationship(
"PackageBase", backref=backref("requests", lazy="dynamic"),
_PackageBase, backref=backref("requests", lazy="dynamic"),
foreign_keys=[PackageBaseID])
ClosedUID = Column(Integer, ForeignKey("Users.ID", ondelete="SET NULL"))
Closer = relationship(
"User", backref=backref("closed_requests", lazy="dynamic"),
_User, backref=backref("closed_requests", lazy="dynamic"),
foreign_keys=[ClosedUID])
__mapper_args__ = {"primary_key": [ID]}
@ -58,52 +57,39 @@ class PackageRequest(Base):
REJECTED_ID: REJECTED
}
def __init__(self,
RequestType: aurweb.models.request_type.RequestType = None,
PackageBase: aurweb.models.package_base.PackageBase = None,
PackageBaseName: str = None,
User: aurweb.models.user.User = None,
Comments: str = None,
ClosureComment: str = None,
**kwargs):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.RequestType = RequestType
if not self.RequestType:
if not self.RequestType and not self.ReqTypeID:
raise IntegrityError(
statement="Foreign key ReqTypeID cannot be null.",
orig="PackageRequests.ReqTypeID",
params=("NULL"))
self.PackageBase = PackageBase
if not self.PackageBase:
if not self.PackageBase and not self.PackageBaseID:
raise IntegrityError(
statement="Foreign key PackageBaseID cannot be null.",
orig="PackageRequests.PackageBaseID",
params=("NULL"))
self.PackageBaseName = PackageBaseName
if not self.PackageBaseName:
raise IntegrityError(
statement="Column PackageBaseName cannot be null.",
orig="PackageRequests.PackageBaseName",
params=("NULL"))
self.User = User
if not self.User:
if not self.User and not self.UsersID:
raise IntegrityError(
statement="Foreign key UsersID cannot be null.",
orig="PackageRequests.UsersID",
params=("NULL"))
self.Comments = Comments
if self.Comments is None:
raise IntegrityError(
statement="Column Comments cannot be null.",
orig="PackageRequests.Comments",
params=("NULL"))
self.ClosureComment = ClosureComment
if self.ClosureComment is None:
raise IntegrityError(
statement="Column ClosureComment cannot be null.",

View file

@ -2,9 +2,8 @@ from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.models.package
from aurweb.models.declarative import Base
from aurweb.models.package import Package as _Package
class PackageSource(Base):
@ -13,19 +12,16 @@ class PackageSource(Base):
PackageID = Column(Integer, ForeignKey("Packages.ID", ondelete="CASCADE"),
nullable=False)
Package = relationship(
"Package", backref=backref("package_sources", lazy="dynamic",
cascade="all,delete"),
_Package, backref=backref("package_sources", lazy="dynamic",
cascade="all,delete"),
foreign_keys=[PackageID])
__mapper_args__ = {"primary_key": [PackageID]}
def __init__(self,
Package: aurweb.models.package.Package = None,
**kwargs):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.Package = Package
if not self.Package:
if not self.Package and not self.PackageID:
raise IntegrityError(
statement="Foreign key PackageID cannot be null.",
orig="PackageSources.PackageID",

View file

@ -2,10 +2,9 @@ from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.models.package_base
import aurweb.models.user
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):
@ -15,37 +14,33 @@ class PackageVote(Base):
Integer, ForeignKey("Users.ID", ondelete="CASCADE"),
nullable=False)
User = relationship(
"User", backref=backref("package_votes", lazy="dynamic"),
_User, backref=backref("package_votes", lazy="dynamic"),
foreign_keys=[UsersID])
PackageBaseID = Column(
Integer, ForeignKey("PackageBases.ID", ondelete="CASCADE"),
nullable=False)
PackageBase = relationship(
"PackageBase", backref=backref("package_votes", lazy="dynamic"),
_PackageBase, backref=backref("package_votes", lazy="dynamic"),
foreign_keys=[PackageBaseID])
__mapper_args__ = {"primary_key": [UsersID, PackageBaseID]}
def __init__(self,
User: aurweb.models.user.User = None,
PackageBase: aurweb.models.package_base.PackageBase = None,
VoteTS: int = None):
self.User = User
if not self.User:
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.User and not self.UsersID:
raise IntegrityError(
statement="Foreign key UsersID cannot be null.",
orig="PackageVotes.UsersID",
params=("NULL"))
self.PackageBase = PackageBase
if not self.PackageBase:
if not self.PackageBase and not self.PackageBaseID:
raise IntegrityError(
statement="Foreign key PackageBaseID cannot be null.",
orig="PackageVotes.PackageBaseID",
params=("NULL"))
self.VoteTS = VoteTS
if not self.VoteTS:
raise IntegrityError(
statement="Column VoteTS cannot be null.",

View file

@ -4,7 +4,7 @@ from sqlalchemy.orm import backref, relationship
from aurweb.db import make_random_value, query
from aurweb.models.declarative import Base
from aurweb.models.user import User
from aurweb.models.user import User as _User
class Session(Base):
@ -14,22 +14,24 @@ class Session(Base):
Integer, ForeignKey("Users.ID", ondelete="CASCADE"),
nullable=False)
User = relationship(
"User", backref=backref("session", uselist=False),
_User, backref=backref("session", uselist=False),
foreign_keys=[UsersID])
__mapper_args__ = {"primary_key": [UsersID]}
def __init__(self, **kwargs):
self.UsersID = kwargs.get("UsersID")
if not query(User, User.ID == self.UsersID).first():
super().__init__(**kwargs)
user_exists = query(
query(_User).filter(_User.ID == self.UsersID).exists()
).scalar()
if not user_exists:
raise IntegrityError(
statement="Foreign key UsersID cannot be null.",
statement=("Foreign key UsersID cannot be null and "
"must be a valid user's ID."),
orig="Sessions.UsersID",
params=("NULL"))
self.SessionID = kwargs.get("SessionID")
self.LastUpdateTS = kwargs.get("LastUpdateTS")
def generate_unique_sid():
return make_random_value(Session, Session.SessionID)

View file

@ -11,21 +11,17 @@ class Term(Base):
__mapper_args__ = {"primary_key": [ID]}
def __init__(self,
Description: str = None, URL: str = None,
Revision: int = None):
self.Description = Description
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.Description:
raise IntegrityError(
statement="Column Description cannot be null.",
orig="Terms.Description",
params=("NULL"))
self.URL = URL
if not self.URL:
raise IntegrityError(
statement="Column URL cannot be null.",
orig="Terms.URL",
params=("NULL"))
self.Revision = Revision

View file

@ -2,10 +2,9 @@ from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.models.tu_voteinfo
import aurweb.models.user
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):
@ -14,29 +13,27 @@ class TUVote(Base):
VoteID = Column(Integer, ForeignKey("TU_VoteInfo.ID", ondelete="CASCADE"),
nullable=False)
VoteInfo = relationship(
"TUVoteInfo", backref=backref("tu_votes", lazy="dynamic"),
_TUVoteInfo, backref=backref("tu_votes", lazy="dynamic"),
foreign_keys=[VoteID])
UserID = Column(Integer, ForeignKey("Users.ID", ondelete="CASCADE"),
nullable=False)
User = relationship(
"User", backref=backref("tu_votes", lazy="dynamic"),
_User, backref=backref("tu_votes", lazy="dynamic"),
foreign_keys=[UserID])
__mapper_args__ = {"primary_key": [VoteID, UserID]}
def __init__(self,
VoteInfo: aurweb.models.tu_voteinfo.TUVoteInfo = None,
User: aurweb.models.user.User = None):
self.VoteInfo = VoteInfo
if self.VoteInfo is None:
def __init__(self, **kwargs):
super().__init__(**kwargs)
if not self.VoteInfo and not self.VoteID:
raise IntegrityError(
statement="Foreign key VoteID cannot be null.",
orig="TU_Votes.VoteID",
params=("NULL"))
self.User = User
if self.User is None:
if not self.User and not self.UserID:
raise IntegrityError(
statement="Foreign key UserID cannot be null.",
orig="TU_Votes.UserID",

View file

@ -6,9 +6,8 @@ from sqlalchemy import Column, ForeignKey, Integer
from sqlalchemy.exc import IntegrityError
from sqlalchemy.orm import backref, relationship
import aurweb.models.user
from aurweb.models.declarative import Base
from aurweb.models.user import User as _User
class TUVoteInfo(Base):
@ -20,57 +19,44 @@ class TUVoteInfo(Base):
Integer, ForeignKey("Users.ID", ondelete="CASCADE"),
nullable=False)
Submitter = relationship(
"User", backref=backref("tu_voteinfo_set", lazy="dynamic"),
_User, backref=backref("tu_voteinfo_set", lazy="dynamic"),
foreign_keys=[SubmitterID])
__mapper_args__ = {"primary_key": [ID]}
def __init__(self,
Agenda: str = None,
User: str = None,
Submitted: int = None,
End: int = None,
Quorum: float = None,
Submitter: aurweb.models.user.User = None,
**kwargs):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.Agenda = Agenda
if self.Agenda is None:
raise IntegrityError(
statement="Column Agenda cannot be null.",
orig="TU_VoteInfo.Agenda",
params=("NULL"))
self.User = User
if self.User is None:
raise IntegrityError(
statement="Column User cannot be null.",
orig="TU_VoteInfo.User",
params=("NULL"))
self.Submitted = Submitted
if self.Submitted is None:
raise IntegrityError(
statement="Column Submitted cannot be null.",
orig="TU_VoteInfo.Submitted",
params=("NULL"))
self.End = End
if self.End is None:
raise IntegrityError(
statement="Column End cannot be null.",
orig="TU_VoteInfo.End",
params=("NULL"))
if Quorum is None:
if self.Quorum is None:
raise IntegrityError(
statement="Column Quorum cannot be null.",
orig="TU_VoteInfo.Quorum",
params=("NULL"))
self.Quorum = Quorum
self.Submitter = Submitter
if not self.Submitter:
raise IntegrityError(
statement="Foreign key SubmitterID cannot be null.",
@ -86,7 +72,11 @@ class TUVoteInfo(Base):
def __getattribute__(self, key: str):
""" Customize getattr to floatify any fetched Quorum values. """
attr = super().__getattribute__(key)
return float(attr) if key == "Quorum" else attr
if attr is None:
return attr
elif key == "Quorum":
return float(attr)
return attr
def is_running(self):
return self.End > int(datetime.utcnow().timestamp())

View file

@ -13,6 +13,7 @@ import aurweb.models.account_type
import aurweb.schema
from aurweb import db
from aurweb.models.account_type import AccountType as _AccountType
from aurweb.models.ban import is_banned
from aurweb.models.declarative import Base
@ -29,7 +30,7 @@ class User(Base):
Integer, ForeignKey("AccountTypes.ID", ondelete="NO ACTION"),
nullable=False, server_default=text("1"))
AccountType = relationship(
"AccountType",
_AccountType,
backref=backref("users", lazy="dynamic"),
foreign_keys=[AccountTypeID],
uselist=False)