cardo-python-utils 0.5.dev41__py3-none-any.whl → 0.5.dev43__py3-none-any.whl

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.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: cardo-python-utils
3
- Version: 0.5.dev41
3
+ Version: 0.5.dev43
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,4 +1,4 @@
1
- cardo_python_utils-0.5.dev41.dist-info/licenses/LICENSE,sha256=N-YtxDy8n5A1Mo7JKKItNIlboiK_pMOZ48ojx76jo3g,1046
1
+ cardo_python_utils-0.5.dev43.dist-info/licenses/LICENSE,sha256=N-YtxDy8n5A1Mo7JKKItNIlboiK_pMOZ48ojx76jo3g,1046
2
2
  python_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  python_utils/choices.py,sha256=_sLNkSnQqhg55gGKNRsOQCJ75W6gnz8J8Q00528MEYk,2548
4
4
  python_utils/data_structures.py,sha256=ZqkZYPy20zyGYOVhwb9qst4vF_P7X2A9z5E36rMUC6I,16820
@@ -14,9 +14,9 @@ python_utils/types_hinting.py,sha256=QVWzmXRgNxhvln14tEX_FbQYryuVYhjWJ0dVOnlF6G4
14
14
  python_utils/django/README.md,sha256=01QcXWGfWcVaI2fFxcC2twYOabTCmTwh-OyyKPtcOdM,6027
15
15
  python_utils/django/__init__.py,sha256=uXyqF-_5gZAlSIKoQkUTedAeBjnUHqh6lR6SzA1DEOM,64
16
16
  python_utils/django/apps.py,sha256=rgGdSsvptNVQ5QOEfYTdX7eA9EBgEPqq3LKIBLxaFLo,103
17
- python_utils/django/oidc_settings.py,sha256=Moc3ZEOIb40sCcvJtl4Xo51SjC__9Ki85sRhFuoX9dg,3926
18
- python_utils/django/settings.py,sha256=tapr6NaZyYBN8XRq6CmzhLiTtdW_4v1XiytZP4rDLf4,646
19
- python_utils/django/tenant_context.py,sha256=XBAS8vsGarj9y9O8wswM_H6MlDnikW2UMQmHf8C3vkY,3221
17
+ python_utils/django/oidc_settings.py,sha256=EQlZeJrYy0c5X2Q3jmr4XEUm6HOUZqeKPFeM1HwKHbM,4330
18
+ python_utils/django/settings.py,sha256=dbu4QPvG8N_z7P8eisEgI4qNwy2T8ZPNDkx9FoK4FEs,624
19
+ python_utils/django/tenant_context.py,sha256=9LN15__PGhajy7raK382vVx8r5k90VUwUZJS4ylW0yA,3231
20
20
  python_utils/django/admin/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  python_utils/django/admin/auth.py,sha256=c3BunWJZKCvp0px27jCrqj_BtY7lkS7ATpjxbqdZQMA,2809
22
22
  python_utils/django/admin/user_group.py,sha256=7bt9IyE1o4u0u97vrbRWra6698SBsRrEh_9It1djn4k,6060
@@ -50,7 +50,7 @@ python_utils/django/storage/__init__.py,sha256=mNn2YmD7pkXhBLHMM1444BLsCMq78YdYx
50
50
  python_utils/django/storage/tenant_aware_storage.py,sha256=5dDes6xLv7_R8hIBbFIzRvPL7HL9K_RM-G6LI8qUSxM,2550
51
51
  python_utils/django/tests/__init__.py,sha256=Nkt0a7LEHyjLvuEBZ7113VjjAWJlyZlMy-H-JZ5tNcs,252
52
52
  python_utils/django/tests/conftest.py,sha256=KozXmXUWVcDLbkVAb7Aq4sDydGLh2YZkbRa4tkA8Z6U,3167
53
- cardo_python_utils-0.5.dev41.dist-info/METADATA,sha256=WToATgEn0RTXNSf1QnVIpAE-ryr8r7BZidjczKl57qA,3007
54
- cardo_python_utils-0.5.dev41.dist-info/WHEEL,sha256=YCfwYGOYMi5Jhw2fU4yNgwErybb2IX5PEwBKV4ZbdBo,91
55
- cardo_python_utils-0.5.dev41.dist-info/top_level.txt,sha256=zAx6OfEsjJs8BEW3okSiG_j9gpkI69xWShzum6oBgKI,13
56
- cardo_python_utils-0.5.dev41.dist-info/RECORD,,
53
+ cardo_python_utils-0.5.dev43.dist-info/METADATA,sha256=ePioR5YT-zRz8Bj6vdRh8_vtJ8UkgeLWysyWHPdHN6w,3007
54
+ cardo_python_utils-0.5.dev43.dist-info/WHEEL,sha256=YCfwYGOYMi5Jhw2fU4yNgwErybb2IX5PEwBKV4ZbdBo,91
55
+ cardo_python_utils-0.5.dev43.dist-info/top_level.txt,sha256=zAx6OfEsjJs8BEW3okSiG_j9gpkI69xWShzum6oBgKI,13
56
+ cardo_python_utils-0.5.dev43.dist-info/RECORD,,
@@ -32,11 +32,23 @@ KEYCLOAK_CONFIDENTIAL_CLIENT_SECRETS: dict[str, str] = json.loads(
32
32
  os.getenv("KEYCLOAK_CONFIDENTIAL_CLIENT_SECRETS", "{}")
33
33
  )
34
34
 
35
+ TENANT_REALM_MAPPING: dict[str, str] = getattr(
36
+ settings, "TENANT_REALM_MAPPING", json.loads(os.getenv("TENANT_REALM_MAPPING", "{}"))
37
+ )
38
+
39
+
40
+ def get_realm_for_tenant(tenant: str) -> str:
41
+ """
42
+ Get the Keycloak realm name for a given tenant.
43
+ By default, we assume the realm name is the same as the tenant name.
44
+ """
45
+ return TENANT_REALM_MAPPING.get(tenant, tenant)
46
+
35
47
 
36
48
  def get_oidc_op_base_url() -> str:
37
49
  """Get the base URL for the OIDC provider (Keycloak realm URL)."""
38
50
 
39
- realm = TenantContext.get()
51
+ realm = get_realm_for_tenant(TenantContext.get())
40
52
  return f"{KEYCLOAK_SERVER_URL}/realms/{realm}"
41
53
 
42
54
 
@@ -1,7 +1,6 @@
1
1
  from django.conf import settings
2
2
 
3
3
  TENANT_KEY = "tenant"
4
- DATABASES = settings.DATABASES
5
4
  TENANT_DATABASES = set(settings.DATABASES.keys()) - {"default"}
6
5
 
7
6
  TENANT_AWARE_EXCLUDED_PATHS = getattr(settings, "TENANT_AWARE_EXCLUDED_PATHS", ())
@@ -20,4 +19,4 @@ if DEVELOPMENT_TENANT is None:
20
19
  if TENANT_DATABASES:
21
20
  DEVELOPMENT_TENANT = list(TENANT_DATABASES)[0]
22
21
  else:
23
- DEVELOPMENT_TENANT = list(DATABASES.keys())[0]
22
+ DEVELOPMENT_TENANT = list(settings.DATABASES.keys())[0]
@@ -3,7 +3,7 @@ from contextlib import ContextDecorator
3
3
  from contextvars import ContextVar
4
4
  from typing import Optional
5
5
 
6
- from .settings import DATABASES
6
+ from django.conf import settings
7
7
 
8
8
  logger = logging.getLogger(__name__)
9
9
 
@@ -84,7 +84,7 @@ class TenantContext(ContextDecorator):
84
84
  # If the tenant is already set to the same value, we do nothing and return None.
85
85
  return None
86
86
 
87
- if tenant not in DATABASES:
87
+ if tenant not in settings.DATABASES:
88
88
  raise ValueError(f"Tenant '{tenant}' not found in DATABASES settings.")
89
89
 
90
90
  token = _tenant_var.set(tenant)