cardo-python-utils 0.5.dev54__tar.gz → 0.5.dev56__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 (76) hide show
  1. {cardo_python_utils-0.5.dev54/cardo_python_utils.egg-info → cardo_python_utils-0.5.dev56}/PKG-INFO +1 -1
  2. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56/cardo_python_utils.egg-info}/PKG-INFO +1 -1
  3. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/pyproject.toml +1 -1
  4. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/README.md +0 -2
  5. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/api/ninja.py +3 -3
  6. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/auth/service.py +2 -2
  7. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/oidc_settings.py +8 -2
  8. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/LICENSE +0 -0
  9. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/MANIFEST.in +0 -0
  10. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/README.rst +0 -0
  11. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/cardo_python_utils.egg-info/SOURCES.txt +0 -0
  12. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/cardo_python_utils.egg-info/dependency_links.txt +0 -0
  13. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/cardo_python_utils.egg-info/requires.txt +0 -0
  14. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/cardo_python_utils.egg-info/top_level.txt +0 -0
  15. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/__init__.py +0 -0
  16. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/choices.py +0 -0
  17. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/data_structures.py +0 -0
  18. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/db.py +0 -0
  19. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/__init__.py +0 -0
  20. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/admin/__init__.py +0 -0
  21. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/admin/auth.py +0 -0
  22. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/admin/templates/__init__.py +0 -0
  23. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/admin/templates/user_groups_changelist.html +0 -0
  24. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/admin/user_group.py +0 -0
  25. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/admin/views.py +0 -0
  26. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/api/__init__.py +0 -0
  27. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/api/drf.py +0 -0
  28. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/api/utils.py +0 -0
  29. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/apps.py +0 -0
  30. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/celery/__init__.py +0 -0
  31. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/celery/tenant_aware_database_scheduler.py +0 -0
  32. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/celery/tenant_aware_task.py +0 -0
  33. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/db/__init__.py +0 -0
  34. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/db/alias.py +0 -0
  35. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/db/routers.py +0 -0
  36. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/db/transaction.py +0 -0
  37. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/db/utils.py +0 -0
  38. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/management/__init__.py +0 -0
  39. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/management/commands/__init__.py +0 -0
  40. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/management/commands/migrateall.py +0 -0
  41. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/management/commands/shell.py +0 -0
  42. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/management/commands/showmigrations.py +0 -0
  43. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/management/commands/tenant_aware_command.py +0 -0
  44. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/middleware/__init__.py +0 -0
  45. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/middleware/tenant_aware_http_middleware.py +0 -0
  46. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/middleware/tenant_aware_websocket_middleware.py +0 -0
  47. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/migrations/0001_initial.py +0 -0
  48. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/migrations/0001_initial_squashed_0005_alter_userrole_id.py +0 -0
  49. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/migrations/0002_auto_20220120_1617.py +0 -0
  50. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/migrations/0003_auto_20220513_1025.py +0 -0
  51. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/migrations/0004_auto_20220817_1526.py +0 -0
  52. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/migrations/0005_alter_userrole_id.py +0 -0
  53. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/migrations/0006_userrole_organization_and_more.py +0 -0
  54. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/migrations/0007_user_demo.py +0 -0
  55. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/migrations/0008_delete_userrole.py +0 -0
  56. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/migrations/__init__.py +0 -0
  57. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/models/__init__.py +0 -0
  58. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/models/user.py +0 -0
  59. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/models/user_group.py +0 -0
  60. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/redis/__init__.py +0 -0
  61. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/redis/key_function.py +0 -0
  62. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/settings.py +0 -0
  63. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/storage/__init__.py +0 -0
  64. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/storage/tenant_aware_storage.py +0 -0
  65. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/tenant_context.py +0 -0
  66. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/tests/__init__.py +0 -0
  67. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django/tests/conftest.py +0 -0
  68. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/django_utils.py +0 -0
  69. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/esma_choices.py +0 -0
  70. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/exceptions.py +0 -0
  71. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/imports.py +0 -0
  72. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/math.py +0 -0
  73. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/text.py +0 -0
  74. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/time.py +0 -0
  75. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/python_utils/types_hinting.py +0 -0
  76. {cardo_python_utils-0.5.dev54 → cardo_python_utils-0.5.dev56}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cardo-python-utils
3
- Version: 0.5.dev54
3
+ Version: 0.5.dev56
4
4
  Summary: Python library enhanced with a wide range of functions for different scenarios.
5
5
  Author-email: CardoAI <hello@cardoai.com>
6
6
  License: MIT
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cardo-python-utils
3
- Version: 0.5.dev54
3
+ Version: 0.5.dev56
4
4
  Summary: Python library enhanced with a wide range of functions for different scenarios.
5
5
  Author-email: CardoAI <hello@cardoai.com>
6
6
  License: MIT
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "cardo-python-utils"
7
- version = "0.5.dev54"
7
+ version = "0.5.dev56"
8
8
  description = "Python library enhanced with a wide range of functions for different scenarios."
9
9
  readme = "README.rst"
10
10
  requires-python = ">=3.8"
@@ -10,8 +10,6 @@ This package provides utilities for facilitating IDP communication and multi-ten
10
10
  - DATABASE_CONFIG
11
11
  - A JSON dictionary where each key is the tenant name and the value is a dict with the datase config.
12
12
  - If multiple 'DATABASE_CONFIG'-prefixed variables are set, they will be merged into a single dictionary.
13
- - KEYCLOAK_SERVER_URL
14
- - The URL of the Keycloak deployment
15
13
  - KEYCLOAK_CONFIDENTIAL_CLIENT_ID
16
14
  - The id of the confidential client of the backend service
17
15
  - KEYCLOAK_CONFIDENTIAL_CLIENT_SERVICE_ACCOUNT_TOKEN_FILE_PATHS
@@ -6,7 +6,7 @@ from jwt.exceptions import ExpiredSignatureError, InvalidTokenError, PyJWKClient
6
6
  from django.conf import settings
7
7
  from django.http import HttpRequest
8
8
  from ninja.security import HttpBearer
9
- from ninja.errors import AuthenticationError, AuthorizationError, HttpError
9
+ from ninja.errors import AuthenticationError, HttpError
10
10
 
11
11
  from .utils import (
12
12
  acreate_or_update_user,
@@ -64,13 +64,13 @@ class AuthBearer(HttpBearer):
64
64
  except ExpiredSignatureError as e:
65
65
  raise AuthenticationError("Token has expired.") from e
66
66
  except (InvalidTokenError, PyJWKClientError) as e:
67
- raise AuthorizationError(f"Invalid token: {str(e)}") from e
67
+ raise AuthenticationError(f"Invalid token: {str(e)}") from e
68
68
 
69
69
  def _get_username(self, payload: TokenPayload) -> str:
70
70
  try:
71
71
  return payload["preferred_username"]
72
72
  except KeyError as e:
73
- raise AuthorizationError("Invalid token: 'preferred_username' claim not present.") from e
73
+ raise AuthenticationError("Invalid token: 'preferred_username' claim not present.") from e
74
74
 
75
75
  def _verify_scopes(self, request, token_payload):
76
76
  allowed_scopes = self._get_view_allowed_scopes(request)
@@ -6,8 +6,8 @@ from keycloak import KeycloakOpenIDConnection
6
6
  from keycloak.exceptions import KeycloakGetError
7
7
 
8
8
  from ..oidc_settings import (
9
- KEYCLOAK_SERVER_URL,
10
9
  KEYCLOAK_CONFIDENTIAL_CLIENT_ID,
10
+ get_keycloak_server_url,
11
11
  get_oidc_confidential_client_token,
12
12
  )
13
13
  from ..tenant_context import TenantContext
@@ -70,7 +70,7 @@ class KeycloakService:
70
70
  tenant = TenantContext.get()
71
71
 
72
72
  keycloak_connection = KeycloakOpenIDConnection(
73
- server_url=KEYCLOAK_SERVER_URL,
73
+ server_url=get_keycloak_server_url(),
74
74
  realm_name=tenant,
75
75
  user_realm_name=tenant,
76
76
  client_id=KEYCLOAK_CONFIDENTIAL_CLIENT_ID,
@@ -12,7 +12,7 @@ from django.conf import settings
12
12
  from .tenant_context import TenantContext
13
13
 
14
14
 
15
- KEYCLOAK_SERVER_URL = os.getenv("KEYCLOAK_SERVER_URL", None)
15
+ KEYCLOAK_SERVER_URL_TEMPLATE = os.getenv("KEYCLOAK_SERVER_URL_TEMPLATE", "https://keycloak.{realm}.company.com")
16
16
  KEYCLOAK_CONFIDENTIAL_CLIENT_ID = os.getenv("KEYCLOAK_CONFIDENTIAL_CLIENT_ID", None)
17
17
 
18
18
  OIDC_CLIENT_AUTH_METHOD = getattr(settings, "OIDC_CLIENT_AUTH_METHOD", "client_assertion")
@@ -45,11 +45,17 @@ def get_realm_for_tenant(tenant: str) -> str:
45
45
  return TENANT_REALM_MAPPING.get(tenant, tenant)
46
46
 
47
47
 
48
+ def get_keycloak_server_url() -> str:
49
+ """Get the Keycloak server URL for the current tenant."""
50
+
51
+ return KEYCLOAK_SERVER_URL_TEMPLATE.format(realm=get_realm_for_tenant(TenantContext.get()))
52
+
53
+
48
54
  def get_oidc_op_base_url() -> str:
49
55
  """Get the base URL for the OIDC provider (Keycloak realm URL)."""
50
56
 
51
57
  realm = get_realm_for_tenant(TenantContext.get())
52
- return f"{KEYCLOAK_SERVER_URL}/realms/{realm}"
58
+ return f"{get_keycloak_server_url()}/realms/{realm}"
53
59
 
54
60
 
55
61
  def get_oidc_op_authorization_endpoint() -> str: