From af51b5c4604636408d78d015b49bfbc0e8d7de27 Mon Sep 17 00:00:00 2001 From: Kevin Morris Date: Sat, 7 Aug 2021 19:35:50 -0700 Subject: [PATCH] User: add several utility methods Added: - User.voted_for(package) - Has a user voted for a particular package? - User.notified(package) - Is a user being notified about a particular package? - User.packages() - Entire collection of Package objects related to User. Signed-off-by: Kevin Morris --- aurweb/models/user.py | 36 +++++++++++++++++++++++++++++++++++- test/test_user.py | 36 +++++++++++++++++++++++++++++++++++- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/aurweb/models/user.py b/aurweb/models/user.py index 4705c050..0ccf7329 100644 --- a/aurweb/models/user.py +++ b/aurweb/models/user.py @@ -5,13 +5,14 @@ from datetime import datetime import bcrypt from fastapi import Request -from sqlalchemy import Column, ForeignKey, Integer, String, text +from sqlalchemy import Column, ForeignKey, Integer, String, or_, text from sqlalchemy.orm import backref, relationship import aurweb.config import aurweb.models.account_type import aurweb.schema +from aurweb import db from aurweb.models.ban import is_banned from aurweb.models.declarative import Base @@ -177,6 +178,39 @@ class User(Base): """ return self == user or self.is_trusted_user() or self.is_developer() + def voted_for(self, package) -> bool: + """ Has this User voted for package? """ + from aurweb.models.package_vote import PackageVote + return bool(package.PackageBase.package_votes.filter( + PackageVote.UsersID == self.ID + ).scalar()) + + def notified(self, package) -> bool: + """ Is this User being notified about package? """ + from aurweb.models.package_notification import PackageNotification + return bool(package.PackageBase.package_notifications.filter( + PackageNotification.UserID == self.ID + ).scalar()) + + def packages(self): + """ Returns an ORM query to Package objects owned by this user. + + This should really be replaced with an internal ORM join + configured for the User model. This has not been done yet + due to issues I've been encountering in the process, so + sticking with this function until we can properly implement it. + + :return: ORM query of User-packaged or maintained Package objects + """ + from aurweb.models.package import Package + from aurweb.models.package_base import PackageBase + return db.query(Package).join(PackageBase).filter( + or_( + PackageBase.PackagerUID == self.ID, + PackageBase.MaintainerUID == self.ID + ) + ) + def __repr__(self): return "" % ( self.ID, str(self.AccountType), self.Username) diff --git a/test/test_user.py b/test/test_user.py index 9ab40801..7756cff3 100644 --- a/test/test_user.py +++ b/test/test_user.py @@ -12,6 +12,10 @@ import aurweb.config from aurweb.db import commit, create, query from aurweb.models.account_type import AccountType from aurweb.models.ban import Ban +from aurweb.models.package import Package +from aurweb.models.package_base import PackageBase +from aurweb.models.package_notification import PackageNotification +from aurweb.models.package_vote import PackageVote from aurweb.models.session import Session from aurweb.models.ssh_pub_key import SSHPubKey from aurweb.models.user import User @@ -25,7 +29,16 @@ account_type = user = None def setup(): global account_type, user - setup_test_db("Users", "Sessions", "Bans", "SSHPubKeys") + setup_test_db( + User.__tablename__, + Session.__tablename__, + Ban.__tablename__, + SSHPubKey.__tablename__, + Package.__tablename__, + PackageBase.__tablename__, + PackageVote.__tablename__, + PackageNotification.__tablename__ + ) account_type = query(AccountType, AccountType.AccountType == "User").first() @@ -249,3 +262,24 @@ def test_user_is_developer(): user.AccountType = dev_type commit() assert user.is_developer() is True + + +def test_user_voted_for(): + now = int(datetime.utcnow().timestamp()) + pkgbase = create(PackageBase, Name="pkg1", Maintainer=user) + pkg = create(Package, PackageBase=pkgbase, Name=pkgbase.Name) + create(PackageVote, PackageBase=pkgbase, User=user, VoteTS=now) + assert user.voted_for(pkg) + + +def test_user_notified(): + pkgbase = create(PackageBase, Name="pkg1", Maintainer=user) + pkg = create(Package, PackageBase=pkgbase, Name=pkgbase.Name) + create(PackageNotification, PackageBase=pkgbase, User=user) + assert user.notified(pkg) + + +def test_user_packages(): + pkgbase = create(PackageBase, Name="pkg1", Maintainer=user) + pkg = create(Package, PackageBase=pkgbase, Name=pkgbase.Name) + assert pkg in user.packages()