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.
Files changed (25) hide show
  1. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/BmorricalDjangoWorkflows.egg-info/PKG-INFO +1 -1
  2. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/PKG-INFO +1 -1
  3. bmorricaldjangoworkflows-2.1.3/VERSION +1 -0
  4. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/users/services/auth_flow.py +3 -5
  5. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/users/views.py +2 -2
  6. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/tests/test_auth_flow.py +24 -1
  7. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/tests/test_user_views.py +0 -2
  8. bmorricaldjangoworkflows-2.1.2/VERSION +0 -1
  9. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/BmorricalDjangoWorkflows.egg-info/SOURCES.txt +0 -0
  10. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/BmorricalDjangoWorkflows.egg-info/dependency_links.txt +0 -0
  11. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/BmorricalDjangoWorkflows.egg-info/requires.txt +0 -0
  12. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/BmorricalDjangoWorkflows.egg-info/top_level.txt +0 -0
  13. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/LICENSE +0 -0
  14. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/MANIFEST.in +0 -0
  15. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/README.md +0 -0
  16. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/__init__.py +0 -0
  17. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/services/__init__.py +0 -0
  18. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/services/email.py +0 -0
  19. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/users/__init__.py +0 -0
  20. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/users/services/__init__.py +0 -0
  21. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/django_workflows/users/urls.py +0 -0
  22. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/setup.cfg +0 -0
  23. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/setup.py +0 -0
  24. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/tests/__init__.py +0 -0
  25. {bmorricaldjangoworkflows-2.1.2 → bmorricaldjangoworkflows-2.1.3}/tests/test_email.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: BmorricalDjangoWorkflows
3
- Version: 2.1.2
3
+ Version: 2.1.3
4
4
  Summary: Reusable Django Workflows
5
5
  Home-page: https://github.com/Bmorrical/django-workflows
6
6
  Author: Bradley Morrical
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: BmorricalDjangoWorkflows
3
- Version: 2.1.2
3
+ Version: 2.1.3
4
4
  Summary: Reusable Django Workflows
5
5
  Home-page: https://github.com/Bmorrical/django-workflows
6
6
  Author: Bradley Morrical
@@ -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
- username_value = data.get("username")
613
- if email_value is not None or username_value is not None:
614
- next_email = email_value if email_value is not None else username_value
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
 
@@ -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, username, 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
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