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, 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