From 8a47afd2ea8ce56b17aba95503d7c97f22023dff Mon Sep 17 00:00:00 2001 From: Kevin Morris Date: Mon, 29 Mar 2021 15:20:32 -0700 Subject: [PATCH] add aurweb.models.user.User + Added aurweb.models.user.User class. This is the first example of an sqlalchemy ORM model. We can search for users via for example: `session.query(User).filter(User.ID==1).first()`, where `session` is a configured `aurweb.db.session` object. + Along with the User class, defined the AccountType class. Each User maintains a relationship to its AccountType via User.AccountType. + Added AccountType.users backref. Signed-off-by: Kevin Morris --- aurweb/models/user.py | 43 +++++++++++++++++++++++++++++++++++ test/test_user.py | 52 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) create mode 100644 aurweb/models/user.py create mode 100644 test/test_user.py diff --git a/aurweb/models/user.py b/aurweb/models/user.py new file mode 100644 index 00000000..ba91c439 --- /dev/null +++ b/aurweb/models/user.py @@ -0,0 +1,43 @@ +from sqlalchemy.orm import backref, mapper, relationship + +from aurweb.models.account_type import AccountType +from aurweb.schema import Users + + +class User: + """ An ORM model of a single Users record. """ + + def __init__(self, **kwargs): + self.AccountTypeID = kwargs.get("AccountTypeID") + + account_type = kwargs.get("AccountType") + if account_type: + self.AccountType = account_type + + self.Username = kwargs.get("Username") + self.Email = kwargs.get("Email") + self.BackupEmail = kwargs.get("BackupEmail") + self.Passwd = kwargs.get("Passwd") + self.Salt = kwargs.get("Salt") + self.RealName = kwargs.get("RealName") + self.LangPreference = kwargs.get("LangPreference") + self.Timezone = kwargs.get("Timezone") + self.Homepage = kwargs.get("Homepage") + self.IRCNick = kwargs.get("IRCNick") + self.PGPKey = kwargs.get("PGPKey") + self.RegistrationTS = kwargs.get("RegistrationTS") + self.CommentNotify = kwargs.get("CommentNotify") + self.UpdateNotify = kwargs.get("UpdateNotify") + self.OwnershipNotify = kwargs.get("OwnershipNotify") + self.SSOAccountID = kwargs.get("SSOAccountID") + + def __repr__(self): + return "" % ( + self.ID, str(self.AccountType), self.Username) + + +# Map schema.Users to User and give it some relationships. +mapper(User, Users, properties={ + "AccountType": relationship(AccountType, + backref=backref("users", lazy="dynamic")) +}) diff --git a/test/test_user.py b/test/test_user.py new file mode 100644 index 00000000..8ac9b00b --- /dev/null +++ b/test/test_user.py @@ -0,0 +1,52 @@ +import pytest + +from aurweb.models.account_type import AccountType +from aurweb.models.user import User +from aurweb.testing import setup_test_db + + +@pytest.fixture(autouse=True) +def setup(): + setup_test_db("Users") + + +def test_user(): + """ Test creating a user and reading its columns. """ + from aurweb.db import session + + # First, grab our target AccountType. + account_type = session.query(AccountType).filter( + AccountType.AccountType == "User").first() + + user = User( + AccountType=account_type, + RealName="Test User", Username="test", + Email="test@example.org", Passwd="abcd", + IRCNick="tester", + Salt="efgh", ResetKey="blahblah") + session.add(user) + session.commit() + + assert user in account_type.users + + # Make sure the user was created and given an ID. + assert bool(user.ID) + + # Search for the user via query API. + result = session.query(User).filter(User.ID == user.ID).first() + + # Compare the result and our original user. + assert result.ID == user.ID + assert result.AccountType.ID == user.AccountType.ID + assert result.Username == user.Username + assert result.Email == user.Email + + # Ensure we've got the correct account type. + assert user.AccountType.ID == account_type.ID + assert user.AccountType.AccountType == account_type.AccountType + + # Test out user string functions. + assert repr(user) == f"" + + session.delete(user)