From 57ff7ec1d31fe2ff3707d27eb0d62fb6bd9c5ced Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Mon, 27 Jan 2025 15:48:28 -0600 Subject: [PATCH] fix: add `make_person()` method for people, auth handlers --- src/wuttjamaican/auth.py | 11 +++++++++++ src/wuttjamaican/people.py | 24 ++++++++++++++++++++++++ tests/test_auth.py | 23 ++++++++++++++++++++++- tests/test_people.py | 18 ++++++++++++++++++ 4 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/wuttjamaican/auth.py b/src/wuttjamaican/auth.py index 1ffb036..c69146d 100644 --- a/src/wuttjamaican/auth.py +++ b/src/wuttjamaican/auth.py @@ -225,6 +225,17 @@ class AuthHandler(GenericHandler): if person: return person.user + def make_person(self, **kwargs): + """ + Make and return a new + :class:`~wuttjamaican.db.model.base.Person`. + + This is a convenience wrapper around + :class:`~wuttjamaican.people.PeopleHandler.make_person()`. + """ + people = self.app.get_people_handler() + return people.make_person(**kwargs) + def make_user(self, session=None, **kwargs): """ Make and return a new diff --git a/src/wuttjamaican/people.py b/src/wuttjamaican/people.py index 7bc4f1d..1c855a8 100644 --- a/src/wuttjamaican/people.py +++ b/src/wuttjamaican/people.py @@ -39,6 +39,30 @@ class PeopleHandler(GenericHandler): things. """ + def make_person(self, **kwargs): + """ + Make and return a new Person. + + This mostly a convenience wrapper; it will auto-populate the + :attr:`~wuttjamaican.db.model.base.Person.full_name` if not + specified. + + :param \**kwargs: All kwargs are passed as-is to the model + class constructor. + + :rtype: :class:`~wuttjamaican.db.model.base.Person` + """ + model = self.app.model + + if 'full_name' not in kwargs: + full_name = self.app.make_full_name(kwargs.get('first_name'), + kwargs.get('middle_name'), + kwargs.get('last_name')) + if full_name: + kwargs['full_name'] = full_name + + return model.Person(**kwargs) + def get_person(self, obj, **kwargs): """ Return the :class:`~wuttjamaican.db.model.base.Person` diff --git a/tests/test_auth.py b/tests/test_auth.py index 8780ba4..d4d1a9c 100644 --- a/tests/test_auth.py +++ b/tests/test_auth.py @@ -17,7 +17,7 @@ else: def setUp(self): self.config = WuttaConfig() self.app = self.config.get_app() - self.handler = mod.AuthHandler(self.config) + self.handler = self.make_handler() self.engine = sa.create_engine('sqlite://') self.app.model.Base.metadata.create_all(bind=self.engine) @@ -30,6 +30,9 @@ else: def make_session(self): return self.app.make_session(bind=self.engine) + def make_handler(self): + return mod.AuthHandler(self.config) + def test_authenticate_user(self): model = self.app.model barney = model.User(username='barney') @@ -133,6 +136,24 @@ else: user = self.handler.get_user(myperson) self.assertIs(user, myuser) + def test_make_person(self): + model = self.app.model + handler = self.handler + + person = handler.make_person() + self.assertIsInstance(person, model.Person) + self.assertIsNone(person.first_name) + self.assertIsNone(person.last_name) + self.assertIsNone(person.full_name) + self.assertNotIn(person, self.session) + + person = handler.make_person(first_name='Barney', last_name='Rubble') + self.assertIsInstance(person, model.Person) + self.assertEqual(person.first_name, 'Barney') + self.assertEqual(person.last_name, 'Rubble') + self.assertEqual(person.full_name, 'Barney Rubble') + self.assertNotIn(person, self.session) + def test_make_user(self): model = self.app.model diff --git a/tests/test_people.py b/tests/test_people.py index 0ced117..be36fc7 100644 --- a/tests/test_people.py +++ b/tests/test_people.py @@ -36,3 +36,21 @@ else: self.session.commit() person = handler.get_person(myuser) self.assertIs(person, myperson) + + def test_make_person(self): + model = self.app.model + handler = self.make_handler() + + person = handler.make_person() + self.assertIsInstance(person, model.Person) + self.assertIsNone(person.first_name) + self.assertIsNone(person.last_name) + self.assertIsNone(person.full_name) + self.assertNotIn(person, self.session) + + person = handler.make_person(first_name='Barney', last_name='Rubble') + self.assertIsInstance(person, model.Person) + self.assertEqual(person.first_name, 'Barney') + self.assertEqual(person.last_name, 'Rubble') + self.assertEqual(person.full_name, 'Barney Rubble') + self.assertNotIn(person, self.session)