From 57ff7ec1d31fe2ff3707d27eb0d62fb6bd9c5ced Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Mon, 27 Jan 2025 15:48:28 -0600 Subject: [PATCH 1/2] 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) From ac2e370daede95efac04ec76d25ba8d8d63ab399 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Sat, 1 Feb 2025 15:16:18 -0600 Subject: [PATCH 2/2] =?UTF-8?q?bump:=20version=200.20.3=20=E2=86=92=200.20?= =?UTF-8?q?.4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 6 ++++++ pyproject.toml | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 276ba0f..1e75cda 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,12 @@ All notable changes to WuttJamaican will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## v0.20.4 (2025-02-01) + +### Fix + +- add `make_person()` method for people, auth handlers + ## v0.20.3 (2025-01-25) ### Fix diff --git a/pyproject.toml b/pyproject.toml index 06b7569..8906379 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -6,7 +6,7 @@ build-backend = "hatchling.build" [project] name = "WuttJamaican" -version = "0.20.3" +version = "0.20.4" description = "Base package for Wutta Framework" readme = "README.md" authors = [{name = "Lance Edgar", email = "lance@wuttaproject.org"}]