BmorricalDjangoWorkflows 2.1.2__tar.gz → 2.1.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/BmorricalDjangoWorkflows.egg-info/PKG-INFO +1 -1
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/PKG-INFO +1 -1
- bmorricaldjangoworkflows-2.1.3/VERSION +1 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/users/services/auth_flow.py +3 -5
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/users/views.py +2 -2
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/tests/test_auth_flow.py +24 -1
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/tests/test_user_views.py +0 -2
- bmorricaldjangoworkflows-2.1.2/VERSION +0 -1
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/BmorricalDjangoWorkflows.egg-info/SOURCES.txt +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/BmorricalDjangoWorkflows.egg-info/dependency_links.txt +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/BmorricalDjangoWorkflows.egg-info/requires.txt +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/BmorricalDjangoWorkflows.egg-info/top_level.txt +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/LICENSE +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/MANIFEST.in +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/README.md +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/__init__.py +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/services/__init__.py +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/services/email.py +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/users/__init__.py +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/users/services/__init__.py +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/users/urls.py +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/setup.cfg +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/setup.py +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/tests/__init__.py +0 -0
- {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/tests/test_email.py +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
2.1.3
|
|
@@ -609,11 +609,9 @@ def update_user(user: Any, data: dict[str, Any]) -> UserUpdateResult:
|
|
|
609
609
|
)
|
|
610
610
|
|
|
611
611
|
email_value = data.get("email")
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
user.username = next_email
|
|
616
|
-
user.email = next_email
|
|
612
|
+
if email_value is not None:
|
|
613
|
+
user.username = email_value
|
|
614
|
+
user.email = email_value
|
|
617
615
|
processed_update = True
|
|
618
616
|
user_fields_updated = True
|
|
619
617
|
|
{bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/users/views.py
RENAMED
|
@@ -276,8 +276,8 @@ class UserListView(APIView):
|
|
|
276
276
|
|
|
277
277
|
# Route: GET /user/
|
|
278
278
|
# Route: PATCH /user/
|
|
279
|
-
# PATCH body params: optional id,
|
|
280
|
-
# Notes: when id is omitted the authenticated user is updated; updating another user by id requires the User Manager group
|
|
279
|
+
# PATCH body params: optional id, email, firstName, lastName, password, isActive, optional groups as [{name, enabled}]
|
|
280
|
+
# Notes: when id is omitted the authenticated user is updated; updating another user by id requires the User Manager group; username stays aligned to email
|
|
281
281
|
class UserDetailView(APIView):
|
|
282
282
|
permission_classes = [IsAuthenticated]
|
|
283
283
|
|
|
@@ -1526,6 +1526,10 @@ class AuthFlowTests(TestCase):
|
|
|
1526
1526
|
self.assertTrue(result.success)
|
|
1527
1527
|
self.assertEqual(user.first_name, "Updated")
|
|
1528
1528
|
self.assertEqual(user.last_name, "Person")
|
|
1529
|
+
self.assertEqual(user.username, "member@example.com")
|
|
1530
|
+
self.assertEqual(user.email, "member@example.com")
|
|
1531
|
+
user.set_password.assert_not_called()
|
|
1532
|
+
user.save.assert_called_once()
|
|
1529
1533
|
mock_sync_user_groups.assert_not_called()
|
|
1530
1534
|
|
|
1531
1535
|
@patch.object(auth_flow, "_get_group_model")
|
|
@@ -1607,6 +1611,26 @@ class AuthFlowTests(TestCase):
|
|
|
1607
1611
|
self.assertEqual(result.message, "groups must be a list of objects with name and enabled.")
|
|
1608
1612
|
user.save.assert_not_called()
|
|
1609
1613
|
|
|
1614
|
+
def test_update_user_ignores_username_when_email_is_omitted(self):
|
|
1615
|
+
user = SimpleNamespace(
|
|
1616
|
+
username="member@example.com",
|
|
1617
|
+
email="member@example.com",
|
|
1618
|
+
first_name="Member",
|
|
1619
|
+
last_name="User",
|
|
1620
|
+
is_active=True,
|
|
1621
|
+
groups=SimpleNamespace(add=MagicMock(), remove=MagicMock()),
|
|
1622
|
+
save=MagicMock(),
|
|
1623
|
+
set_password=MagicMock(),
|
|
1624
|
+
)
|
|
1625
|
+
|
|
1626
|
+
result = auth_flow.update_user(user, {"username": "updated@example.com"})
|
|
1627
|
+
|
|
1628
|
+
self.assertFalse(result.success)
|
|
1629
|
+
self.assertEqual(result.message, "No valid fields provided.")
|
|
1630
|
+
self.assertEqual(user.username, "member@example.com")
|
|
1631
|
+
self.assertEqual(user.email, "member@example.com")
|
|
1632
|
+
user.save.assert_not_called()
|
|
1633
|
+
|
|
1610
1634
|
def test_update_user_returns_conflict_when_save_hits_integrity_error(self):
|
|
1611
1635
|
user = SimpleNamespace(
|
|
1612
1636
|
username="member@example.com",
|
|
@@ -1623,7 +1647,6 @@ class AuthFlowTests(TestCase):
|
|
|
1623
1647
|
user,
|
|
1624
1648
|
{
|
|
1625
1649
|
"email": "taken@example.com",
|
|
1626
|
-
"username": "taken@example.com",
|
|
1627
1650
|
},
|
|
1628
1651
|
)
|
|
1629
1652
|
|
|
@@ -373,7 +373,6 @@ class PackageUserDetailViewTest(SimpleTestCase):
|
|
|
373
373
|
data={
|
|
374
374
|
"id": 9,
|
|
375
375
|
"email": "target@example.com",
|
|
376
|
-
"username": "target@example.com",
|
|
377
376
|
"isActive": 1,
|
|
378
377
|
"groups": [{"name": "Time Entry User", "enabled": True}],
|
|
379
378
|
},
|
|
@@ -402,7 +401,6 @@ class PackageUserDetailViewTest(SimpleTestCase):
|
|
|
402
401
|
data={
|
|
403
402
|
"id": 9,
|
|
404
403
|
"email": "member@example.com",
|
|
405
|
-
"username": "member@example.com",
|
|
406
404
|
"firstName": "Updated",
|
|
407
405
|
},
|
|
408
406
|
)
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
2.1.2
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/services/email.py
RENAMED
|
File without changes
|
{bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/users/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/users/urls.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|