django-clerk-users 0.1.1__tar.gz → 0.1.2__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 (107) hide show
  1. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/PKG-INFO +1 -1
  2. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/pyproject.toml +1 -1
  3. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/utils.py +34 -7
  4. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/uv.lock +1 -1
  5. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/.flake8 +0 -0
  6. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/.github/workflows/main.yaml +0 -0
  7. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/.gitignore +0 -0
  8. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/.pre-commit-config.yaml +0 -0
  9. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/.python-version +0 -0
  10. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/CLAUDE.md +0 -0
  11. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/HYBRID_AUTH.md +0 -0
  12. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/LICENSE +0 -0
  13. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/README.md +0 -0
  14. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/README.md +0 -0
  15. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/TESTING.md +0 -0
  16. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/.env.example +0 -0
  17. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/.gitignore +0 -0
  18. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/api/__init__.py +0 -0
  19. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/api/admin.py +0 -0
  20. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/api/apps.py +0 -0
  21. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/api/migrations/__init__.py +0 -0
  22. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/api/models.py +0 -0
  23. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/api/tests.py +0 -0
  24. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/api/urls.py +0 -0
  25. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/api/views.py +0 -0
  26. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/backend/__init__.py +0 -0
  27. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/backend/asgi.py +0 -0
  28. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/backend/settings.py +0 -0
  29. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/backend/urls.py +0 -0
  30. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/backend/wsgi.py +0 -0
  31. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/backend/manage.py +0 -0
  32. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/e2e/fixtures/test-users.ts +0 -0
  33. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/e2e/global-setup.ts +0 -0
  34. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/e2e/package.json +0 -0
  35. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/e2e/playwright.config.ts +0 -0
  36. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/e2e/scripts/setup-test-users.ts +0 -0
  37. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/e2e/tests/auth.spec.ts +0 -0
  38. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/e2e/tests/protected-api.spec.ts +0 -0
  39. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/e2e/tsconfig.json +0 -0
  40. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/.env.example +0 -0
  41. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/.gitignore +0 -0
  42. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/.nvmrc +0 -0
  43. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/README.md +0 -0
  44. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/eslint.config.js +0 -0
  45. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/index.html +0 -0
  46. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/package-lock.json +0 -0
  47. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/package.json +0 -0
  48. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/public/vite.svg +0 -0
  49. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/src/App.css +0 -0
  50. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/src/App.jsx +0 -0
  51. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/src/assets/react.svg +0 -0
  52. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/src/index.css +0 -0
  53. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/src/main.jsx +0 -0
  54. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/examples/django_react_example/frontend/vite.config.js +0 -0
  55. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/rav.yaml +0 -0
  56. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/__init__.py +0 -0
  57. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/apps.py +0 -0
  58. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/authentication/__init__.py +0 -0
  59. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/authentication/backends.py +0 -0
  60. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/authentication/drf.py +0 -0
  61. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/authentication/utils.py +0 -0
  62. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/caching.py +0 -0
  63. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/checks.py +0 -0
  64. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/client.py +0 -0
  65. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/decorators.py +0 -0
  66. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/exceptions.py +0 -0
  67. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/management/__init__.py +0 -0
  68. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/management/commands/__init__.py +0 -0
  69. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/management/commands/migrate_users_to_clerk.py +0 -0
  70. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/management/commands/sync_clerk_organizations.py +0 -0
  71. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/management/commands/sync_clerk_users.py +0 -0
  72. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/managers.py +0 -0
  73. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/middleware/__init__.py +0 -0
  74. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/middleware/auth.py +0 -0
  75. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/migrations/0001_initial.py +0 -0
  76. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/migrations/0002_make_clerk_id_nullable.py +0 -0
  77. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/migrations/__init__.py +0 -0
  78. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/models.py +0 -0
  79. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/organizations/__init__.py +0 -0
  80. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/organizations/admin.py +0 -0
  81. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/organizations/apps.py +0 -0
  82. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/organizations/middleware.py +0 -0
  83. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/organizations/migrations/0001_initial.py +0 -0
  84. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/organizations/migrations/__init__.py +0 -0
  85. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/organizations/models.py +0 -0
  86. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/organizations/webhooks.py +0 -0
  87. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/settings.py +0 -0
  88. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/testing.py +0 -0
  89. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/webhooks/__init__.py +0 -0
  90. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/webhooks/handlers.py +0 -0
  91. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/webhooks/security.py +0 -0
  92. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/webhooks/signals.py +0 -0
  93. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/src/django_clerk_users/webhooks/views.py +0 -0
  94. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/__init__.py +0 -0
  95. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/settings.py +0 -0
  96. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/test_authentication.py +0 -0
  97. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/test_caching.py +0 -0
  98. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/test_decorators.py +0 -0
  99. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/test_drf.py +0 -0
  100. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/test_hybrid_auth.py +0 -0
  101. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/test_import.py +0 -0
  102. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/test_middleware.py +0 -0
  103. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/test_models.py +0 -0
  104. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/test_organizations.py +0 -0
  105. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/test_testing.py +0 -0
  106. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/test_utils.py +0 -0
  107. {django_clerk_users-0.1.1 → django_clerk_users-0.1.2}/tests/test_webhooks.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-clerk-users
3
- Version: 0.1.1
3
+ Version: 0.1.2
4
4
  Summary: Integrate Clerk with Django
5
5
  Project-URL: Changelog, https://github.com/jmitchel3/django-clerk-users
6
6
  Project-URL: Documentation, https://github.com/jmitchel3/django-clerk-users
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "django-clerk-users"
7
- version = "0.1.1"
7
+ version = "0.1.2"
8
8
  description = "Integrate Clerk with Django"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -28,7 +28,9 @@ def update_or_create_clerk_user(
28
28
  Update or create a Django user from Clerk data.
29
29
 
30
30
  Fetches user data from the Clerk API and creates or updates
31
- the corresponding Django user.
31
+ the corresponding Django user. If a user with the same email
32
+ already exists (e.g., a superuser created via createsuperuser),
33
+ it will be linked to the Clerk ID rather than creating a duplicate.
32
34
 
33
35
  Args:
34
36
  clerk_user_id: The Clerk user ID.
@@ -70,17 +72,42 @@ def update_or_create_clerk_user(
70
72
 
71
73
  # Prepare user data
72
74
  user_data = {
73
- "email": primary_email,
74
75
  "first_name": getattr(clerk_user, "first_name", "") or "",
75
76
  "last_name": getattr(clerk_user, "last_name", "") or "",
76
77
  "image_url": getattr(clerk_user, "image_url", "") or "",
77
78
  }
78
79
 
79
- # Update or create the Django user
80
- user, created = User.objects.update_or_create(
81
- clerk_id=clerk_user_id,
82
- defaults=user_data,
83
- )
80
+ # First, try to find by clerk_id
81
+ user = User.objects.filter(clerk_id=clerk_user_id).first()
82
+ created = False
83
+
84
+ if user:
85
+ # Update existing Clerk-linked user
86
+ for key, value in user_data.items():
87
+ setattr(user, key, value)
88
+ user.email = primary_email
89
+ user.save()
90
+ else:
91
+ # No user with this clerk_id - check if email already exists
92
+ user = User.objects.filter(email__iexact=primary_email).first()
93
+
94
+ if user:
95
+ # Link existing Django user to Clerk
96
+ user.clerk_id = clerk_user_id
97
+ for key, value in user_data.items():
98
+ setattr(user, key, value)
99
+ user.save()
100
+ logger.info(
101
+ f"Linked existing user {user.email} to Clerk ID {clerk_user_id}"
102
+ )
103
+ else:
104
+ # Create new user
105
+ user = User.objects.create(
106
+ clerk_id=clerk_user_id,
107
+ email=primary_email,
108
+ **user_data,
109
+ )
110
+ created = True
84
111
 
85
112
  # Update cache
86
113
  set_cached_user(clerk_user_id, user)
@@ -289,7 +289,7 @@ wheels = [
289
289
 
290
290
  [[package]]
291
291
  name = "django-clerk-users"
292
- version = "0.1.0"
292
+ version = "0.1.1"
293
293
  source = { editable = "." }
294
294
  dependencies = [
295
295
  { name = "clerk-backend-api" },