django-cfg 1.1.67__py3-none-any.whl → 1.1.70__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.
Files changed (34) hide show
  1. django_cfg/__init__.py +1 -1
  2. django_cfg/apps/accounts/admin/__init__.py +2 -0
  3. django_cfg/apps/accounts/admin/activity.py +9 -2
  4. django_cfg/apps/accounts/admin/filters.py +42 -0
  5. django_cfg/apps/accounts/admin/registration_source.py +8 -1
  6. django_cfg/apps/accounts/admin/resources.py +271 -0
  7. django_cfg/apps/accounts/admin/twilio_response.py +7 -1
  8. django_cfg/apps/accounts/admin/user.py +9 -1
  9. django_cfg/apps/accounts/migrations/0005_twilioresponse.py +43 -0
  10. django_cfg/apps/accounts/models.py +83 -0
  11. django_cfg/apps/leads/admin/__init__.py +9 -0
  12. django_cfg/apps/leads/{admin.py → admin/leads_admin.py} +10 -2
  13. django_cfg/apps/leads/admin/resources.py +119 -0
  14. django_cfg/apps/newsletter/admin/__init__.py +12 -0
  15. django_cfg/apps/newsletter/{admin.py → admin/newsletter_admin.py} +20 -5
  16. django_cfg/apps/newsletter/admin/resources.py +241 -0
  17. django_cfg/apps/support/admin/__init__.py +10 -0
  18. django_cfg/apps/support/admin/resources.py +183 -0
  19. django_cfg/apps/support/{admin.py → admin/support_admin.py} +16 -6
  20. django_cfg/apps/support/templates/support/chat/ticket_chat.html +1 -1
  21. django_cfg/apps/urls.py +1 -2
  22. django_cfg/archive/django_sample.zip +0 -0
  23. django_cfg/core/config.py +1 -0
  24. django_cfg/core/generation.py +2 -1
  25. django_cfg/integration.py +14 -16
  26. django_cfg/management/commands/migrator.py +49 -13
  27. django_cfg/utils/smart_defaults.py +11 -1
  28. {django_cfg-1.1.67.dist-info → django_cfg-1.1.70.dist-info}/METADATA +2 -1
  29. {django_cfg-1.1.67.dist-info → django_cfg-1.1.70.dist-info}/RECORD +34 -26
  30. /django_cfg/apps/newsletter/{admin_filters.py → admin/filters.py} +0 -0
  31. /django_cfg/apps/support/{admin_filters.py → admin/filters.py} +0 -0
  32. {django_cfg-1.1.67.dist-info → django_cfg-1.1.70.dist-info}/WHEEL +0 -0
  33. {django_cfg-1.1.67.dist-info → django_cfg-1.1.70.dist-info}/entry_points.txt +0 -0
  34. {django_cfg-1.1.67.dist-info → django_cfg-1.1.70.dist-info}/licenses/LICENSE +0 -0
django_cfg/core/config.py CHANGED
@@ -54,6 +54,7 @@ DEFAULT_APPS = [
54
54
  "rest_framework_simplejwt.token_blacklist",
55
55
  "rest_framework_nested",
56
56
  "rangefilter",
57
+ "import_export",
57
58
  "django_filters",
58
59
  "drf_spectacular",
59
60
  "drf_spectacular_sidecar",
@@ -257,7 +257,8 @@ class SettingsGenerator:
257
257
  config.security_domains,
258
258
  config._environment,
259
259
  config.debug,
260
- config.ssl_redirect
260
+ config.ssl_redirect,
261
+ config.cors_allow_headers
261
262
  )
262
263
  settings.update(security_defaults)
263
264
 
django_cfg/integration.py CHANGED
@@ -92,24 +92,22 @@ def get_django_cfg_urls_info() -> dict:
92
92
  from django_cfg.modules.base import BaseModule
93
93
  base_module = BaseModule()
94
94
 
95
- # All business logic apps are handled by Django Revolution zones
96
- # if base_module.is_support_enabled():
97
- # endpoints.append("cfg/support/")
98
- # if base_module.is_accounts_enabled():
99
- # endpoints.append("cfg/accounts/")
100
- # Newsletter and Leads are handled by Django Revolution zones
101
- # if base_module.is_newsletter_enabled():
102
- # endpoints.append("cfg/newsletter/")
103
- # if base_module.is_leads_enabled():
104
- # endpoints.append("cfg/leads/")
95
+ # Support URLs - needed for admin interface
96
+ if base_module.is_support_enabled():
97
+ endpoints.append("cfg/support/")
98
+
99
+ if base_module.is_accounts_enabled():
100
+ endpoints.append("cfg/accounts/")
101
+
102
+ if base_module.is_newsletter_enabled():
103
+ endpoints.append("cfg/newsletter/")
104
+
105
+ if base_module.is_leads_enabled():
106
+ endpoints.append("cfg/leads/")
107
+
105
108
  except Exception:
106
109
  # Fallback: show all possible endpoints
107
- endpoints.extend([
108
- "cfg/support/",
109
- "cfg/accounts/",
110
- "cfg/newsletter/",
111
- "cfg/leads/",
112
- ])
110
+ pass
113
111
 
114
112
  info = {
115
113
  "django_cfg": {
@@ -265,19 +265,40 @@ class Command(BaseCommand):
265
265
  self.stdout.write(self.style.ERROR(f"❌ Error getting Django config info: {e}"))
266
266
 
267
267
  def get_apps_for_database(self, db_name: str):
268
- """Get apps for specific database with smart logic for default"""
268
+ """Get apps for specific database using Django-CFG configuration"""
269
+ try:
270
+ # Try to get Django-CFG config
271
+ from django_cfg.core.config import get_current_config
272
+ config = get_current_config()
273
+
274
+ if config and hasattr(config, 'databases'):
275
+ if db_name in config.databases:
276
+ db_config = config.databases[db_name]
277
+ if hasattr(db_config, 'apps') and db_config.apps:
278
+ return db_config.apps
279
+
280
+ # For default database, get all apps not in other databases
281
+ if db_name == "default":
282
+ all_apps = self.get_all_installed_apps()
283
+ apps_in_other_dbs = set()
284
+
285
+ # Collect apps from all non-default databases
286
+ for other_db_name, other_db_config in config.databases.items():
287
+ if other_db_name != "default" and hasattr(other_db_config, 'apps'):
288
+ apps_in_other_dbs.update(other_db_config.apps)
289
+
290
+ return [app for app in all_apps if app not in apps_in_other_dbs]
291
+
292
+ except Exception as e:
293
+ self.stdout.write(self.style.WARNING(f"⚠️ Could not get Django-CFG config: {e}"))
294
+
295
+ # Fallback to old routing rules method
296
+ routing_rules = getattr(settings, "DATABASE_ROUTING_RULES", {})
269
297
  if db_name == "default":
270
- # For default database, get all apps that are not in other databases
271
298
  all_apps = self.get_all_installed_apps()
272
- apps_in_other_dbs = self.get_apps_in_other_databases()
299
+ apps_in_other_dbs = set(routing_rules.keys())
273
300
  return [app for app in all_apps if app not in apps_in_other_dbs]
274
301
  else:
275
- # For other databases, use configured apps from routing rules
276
- routing_rules = getattr(settings, "DATABASE_ROUTING_RULES", {})
277
-
278
- # Routing rules are now in Django settings
279
- pass
280
-
281
302
  return [app for app, db in routing_rules.items() if db == db_name]
282
303
 
283
304
  def get_all_installed_apps(self):
@@ -304,11 +325,26 @@ class Command(BaseCommand):
304
325
 
305
326
  def get_apps_in_other_databases(self) -> set:
306
327
  """Get all apps that are configured for non-default databases."""
328
+ try:
329
+ # Try to get Django-CFG config
330
+ from django_cfg.core.config import get_current_config
331
+ config = get_current_config()
332
+
333
+ if config and hasattr(config, 'databases'):
334
+ apps_in_other_dbs = set()
335
+
336
+ # Collect apps from all non-default databases
337
+ for db_name, db_config in config.databases.items():
338
+ if db_name != "default" and hasattr(db_config, 'apps'):
339
+ apps_in_other_dbs.update(db_config.apps)
340
+
341
+ return apps_in_other_dbs
342
+
343
+ except Exception:
344
+ pass
345
+
346
+ # Fallback to old routing rules method
307
347
  routing_rules = getattr(settings, "DATABASE_ROUTING_RULES", {})
308
-
309
- # Routing rules are now in Django settings
310
- pass
311
-
312
348
  return set(routing_rules.keys())
313
349
 
314
350
  def get_all_database_names(self):
@@ -168,7 +168,8 @@ class SmartDefaults:
168
168
  domains: List[str],
169
169
  environment: Optional[str] = None,
170
170
  debug: bool = False,
171
- ssl_redirect: Optional[bool] = None
171
+ ssl_redirect: Optional[bool] = None,
172
+ cors_allow_headers: Optional[List[str]] = None
172
173
  ) -> Dict[str, Any]:
173
174
  """
174
175
  Get security defaults based on environment and domains.
@@ -178,6 +179,7 @@ class SmartDefaults:
178
179
  environment: Current environment
179
180
  debug: Django DEBUG setting
180
181
  ssl_redirect: Force SSL redirect on/off (None = auto based on domains)
182
+ cors_allow_headers: Custom CORS allowed headers
181
183
 
182
184
  Returns:
183
185
  Security settings dictionary
@@ -192,6 +194,10 @@ class SmartDefaults:
192
194
  settings['CORS_ALLOW_ALL_ORIGINS'] = True
193
195
  settings['CORS_ALLOW_CREDENTIALS'] = True
194
196
 
197
+ # Add custom headers if provided
198
+ if cors_allow_headers:
199
+ settings['CORS_ALLOW_HEADERS'] = cors_allow_headers
200
+
195
201
  # For development, add ALL domains to CSRF trusted origins
196
202
  # This allows testing with production domains in dev environment
197
203
  csrf_trusted_origins = []
@@ -241,6 +247,10 @@ class SmartDefaults:
241
247
  settings['CORS_ALLOWED_ORIGINS'] = allowed_origins
242
248
  settings['CORS_ALLOW_CREDENTIALS'] = True
243
249
 
250
+ # Add custom headers if provided
251
+ if cors_allow_headers:
252
+ settings['CORS_ALLOW_HEADERS'] = cors_allow_headers
253
+
244
254
  # Set CSRF trusted origins for HTTPS domains
245
255
  if csrf_trusted_origins:
246
256
  settings['CSRF_TRUSTED_ORIGINS'] = csrf_trusted_origins
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: django-cfg
3
- Version: 1.1.67
3
+ Version: 1.1.70
4
4
  Summary: 🚀 Production-ready Django configuration framework with type-safe settings, smart automation, and modern developer experience
5
5
  Project-URL: Homepage, https://github.com/markolofsen/django-cfg
6
6
  Project-URL: Documentation, https://django-cfg.readthedocs.io
@@ -42,6 +42,7 @@ Requires-Dist: django-constance>=4.3.2
42
42
  Requires-Dist: django-cors-headers>=4.7.0
43
43
  Requires-Dist: django-extensions>=4.1
44
44
  Requires-Dist: django-filter>=25.0
45
+ Requires-Dist: django-import-export<5.0.0,>=4.3.9
45
46
  Requires-Dist: django-json-widget>=2.0.3
46
47
  Requires-Dist: django-ratelimit<5.0.0,>=4.1.0
47
48
  Requires-Dist: django-redis>=6.0.0
@@ -1,28 +1,29 @@
1
1
  django_cfg/README.md,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- django_cfg/__init__.py,sha256=0oD3s07HXDJe1Lh77JGRkbdjvOswiB3TDppOegeq5kk,14288
2
+ django_cfg/__init__.py,sha256=fM4K_cJmlssCq5hJF4G4km8vWWQCG_4osKy8Y4OONms,14288
3
3
  django_cfg/apps.py,sha256=k84brkeXJI7EgKZLEpTkM9YFZofKI4PzhFOn1cl9Msc,1656
4
4
  django_cfg/exceptions.py,sha256=RTQEoU3PfR8lqqNNv5ayd_HY2yJLs3eioqUy8VM6AG4,10378
5
- django_cfg/integration.py,sha256=-7hvd-4ohLdzH4eufCZTOe3yTzPoQyB_HCfvsSm9AAw,5218
5
+ django_cfg/integration.py,sha256=jUO-uZXLmBXy9iugqgsl_xnYA_xoH3LZg5RxZbobVrc,4988
6
6
  django_cfg/pyproject.toml,sha256=l_JhZm2DDUtS_ekHMEflpnfRtqHek3W_ASHMFBmCx7k,9250
7
7
  django_cfg/routers.py,sha256=O954Hm1BKMyN9-tIK2SByxTHafy_SGzbHLjCbBaf4lg,2622
8
8
  django_cfg/version_check.py,sha256=jI4v3YMdQriUEeb_TvRl511sDghy6I75iKRDUaNpucs,4800
9
9
  django_cfg/apps/__init__.py,sha256=JtDmEYt1OcleWM2ZaeX0LKDnRQzPOavfaXBWG4ECB5Q,26
10
- django_cfg/apps/urls.py,sha256=aQemCAjtBYZJwGqb5Az_kiZ_43bJTLH74EZjn_A40Vw,2125
10
+ django_cfg/apps/urls.py,sha256=U2WjXOsW0cOI2JtQBRe0IJZWYoNCWqXvsBZBjT0PryY,2052
11
11
  django_cfg/apps/accounts/README.md,sha256=sXyAC_x46ymFRWnU86IWzLkUd62wJY90Ypxn-30WwwU,8262
12
12
  django_cfg/apps/accounts/__init__.py,sha256=osecEQhMJVP8ejhZzElNsAqA1fX-GPD3K5_yNwDk6IE,100
13
13
  django_cfg/apps/accounts/apps.py,sha256=Xd4XNpY1tw3zOqk_M9L6MR6oFdfFMYrfmrmbj0uelUs,492
14
- django_cfg/apps/accounts/models.py,sha256=P02cyikxJVgJ7o4z9_NKtZwGzHm4vdTI9DkLt1CJm8E,8179
14
+ django_cfg/apps/accounts/models.py,sha256=1tavqm0ICfGRggcplzU_GhrhR__hnoWOd8CYZWXtBSw,11631
15
15
  django_cfg/apps/accounts/signals.py,sha256=AlFLAOF5OKUa5qnwoZQXvYhBsfEM1ISnde1Qrv7Or3U,5930
16
16
  django_cfg/apps/accounts/urls.py,sha256=x3-0UMe8TKsuJ_GyC2hW0Un7wvnIVfuUSJ_x4HN5FWY,1334
17
- django_cfg/apps/accounts/admin/__init__.py,sha256=6lzAXnF9vQJm0x1lvsq0O-IWMWluIKqbQTfdF7eDOMo,439
18
- django_cfg/apps/accounts/admin/activity.py,sha256=u9THKq0cJhYhtdF4o_pY-Bkub2VArXOorRRq70WWl2c,3209
19
- django_cfg/apps/accounts/admin/filters.py,sha256=TabpyV2kySP6_zyU1vIoVu3c36eUlGi9lCUzAHtLPVs,3101
17
+ django_cfg/apps/accounts/admin/__init__.py,sha256=2bC4EGpUXbGGcWqDfASXPL10VPLvTv2RP9y-OU37kuY,515
18
+ django_cfg/apps/accounts/admin/activity.py,sha256=gyr7Z1FPLicourmIBPHhNgptgQcwTkAIqBe55YUx1Xw,3508
19
+ django_cfg/apps/accounts/admin/filters.py,sha256=MTlC031RYuYnv9rRo206CLV-KEM_3fCGp2MkkhVJGLk,4433
20
20
  django_cfg/apps/accounts/admin/group.py,sha256=ga4SbJInm6ZFoQXj_oZDt-GYUgDT8xCW3U5fA-WRuFg,440
21
21
  django_cfg/apps/accounts/admin/inlines.py,sha256=dIYktvTb1JoSfwGToyZ3Q92nRJkZedolLKgV2TxRpNU,4512
22
22
  django_cfg/apps/accounts/admin/otp.py,sha256=tWnmgbsUDurdPqixHDNqyiL4N9h6cu0wxFqxXS46DaM,1581
23
- django_cfg/apps/accounts/admin/registration_source.py,sha256=mct-Dg7jx1fF9z-1YJZaKPe7HoyZiCWib8ogN6pGIlQ,2851
24
- django_cfg/apps/accounts/admin/twilio_response.py,sha256=-Q2Kvu8V576e3whc5i6ITBqzIcSrpHxmlKJ7Rwe5-hA,6678
25
- django_cfg/apps/accounts/admin/user.py,sha256=d-zYHCSfZpsFTEDp2H7uWHknpNcGyglMjsBXlMYDB20,10231
23
+ django_cfg/apps/accounts/admin/registration_source.py,sha256=wu_vtYytlAee3lI6djO2Ga4TJNHjq0NowBOZRqwZBUg,3202
24
+ django_cfg/apps/accounts/admin/resources.py,sha256=ZCs8Yl6r_m8bQuYQuzmymCnd1IvKAtdQLneOFC1yBD4,7511
25
+ django_cfg/apps/accounts/admin/twilio_response.py,sha256=0K424Yn1Gle41i7xCuFs821GxYQnJ3NurFhazdH8NrQ,6950
26
+ django_cfg/apps/accounts/admin/user.py,sha256=h9c0wCZ4--_DLZ8rKNMPOtKECxHO8N_228TDnKLFdVA,10571
26
27
  django_cfg/apps/accounts/management/commands/test_otp.py,sha256=NPlANZtGgq9kqOHWneaTyWUIsyvpIbrP6wM0jASSfhA,6980
27
28
  django_cfg/apps/accounts/managers/__init__.py,sha256=NtY-cQl-6TUVum9HEVud4RKbR72xEiYzK14mbd9Y2Y0,50
28
29
  django_cfg/apps/accounts/managers/user_manager.py,sha256=TVUgPIYh82f7HNu6tl446KGm65yWA9IFrzbb0fZprw4,14852
@@ -30,6 +31,7 @@ django_cfg/apps/accounts/migrations/0001_initial.py,sha256=j139MrNVgq7g7bpV5B14R
30
31
  django_cfg/apps/accounts/migrations/0002_add_phone_otp_clean.py,sha256=z7FYr6BF_CCyZSjfJqlvcUH1Jfla4JN5uqmlkNyxO4A,1490
31
32
  django_cfg/apps/accounts/migrations/0003_twilioresponse.py,sha256=KBeWBm8UJwqV5UG6KTl9Ugz3Mqe3yJ0ufzwdf8YE4Vo,3172
32
33
  django_cfg/apps/accounts/migrations/0004_delete_twilioresponse.py,sha256=ounUBBUkukjCxdrfbaYO3nswGeluPfwzqKADJ3RUep0,311
34
+ django_cfg/apps/accounts/migrations/0005_twilioresponse.py,sha256=G0rrkn9CnlRJdkrJfoZ_qQk4jul80rqbKalUsRwSR6w,3174
33
35
  django_cfg/apps/accounts/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
34
36
  django_cfg/apps/accounts/serializers/__init__.py,sha256=ROvk50GAJY84w7hMCsB6XnnKd__k08SYsanZnONWks0,480
35
37
  django_cfg/apps/accounts/serializers/otp.py,sha256=PrqldpMRlXfZ95HJKa2zgof5BeSJW-IMUqBT8Fg3k9c,4538
@@ -58,7 +60,6 @@ django_cfg/apps/api/health/urls.py,sha256=jd1UTpxPCRIh7veAlTB51mvBcQzdfC8MYcPik4
58
60
  django_cfg/apps/api/health/views.py,sha256=CWbrq_ChAOHhsD4P2YdjKCzxuHb5xznnZxbZ2kN9p0s,8474
59
61
  django_cfg/apps/leads/README.md,sha256=QjYHj_33zQyKzOtPeUqbkTy0fvLgIexKH7JxnzxEKTY,3444
60
62
  django_cfg/apps/leads/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
61
- django_cfg/apps/leads/admin.py,sha256=Zdl1-S3ScuoH2KgRiM_fjCl9cbqcFDIOxijQh1Y6KtU,2231
62
63
  django_cfg/apps/leads/apps.py,sha256=YH2S1mFBZyemPereDgDUiDmblXbFTm-e1BFCcT2Pwvk,407
63
64
  django_cfg/apps/leads/models.py,sha256=Eco7HrQIl8jK4N8I6yYgNckb4nM9Vkp0kHpx7vEW9OE,3059
64
65
  django_cfg/apps/leads/serializers.py,sha256=dg-FmFmaKrOBQetJDs9Inoya6WqY5DZhvE6pVS14ONg,1569
@@ -66,17 +67,22 @@ django_cfg/apps/leads/signals.py,sha256=exZm9xhHs53a16jI6xTWsz0hDS7WYQppWKL-Qx24
66
67
  django_cfg/apps/leads/tests.py,sha256=uM7qcaJfNT-fFjla5s4vr7hQiGzXf7CUzqyX1QDwwfE,10686
67
68
  django_cfg/apps/leads/urls.py,sha256=KFCdB9x0LySJODeUElQ2c-dxcl_z79xzYNC_9i6vFPk,355
68
69
  django_cfg/apps/leads/views.py,sha256=3tnnxAwEnD_ycIhZeIvTqzOyNaMTA00gxnbywtnPe8A,3212
70
+ django_cfg/apps/leads/admin/__init__.py,sha256=81WXUqQ5lACzV_G8n_PdPIoGeb95NKow_xcHv-Y13YM,111
71
+ django_cfg/apps/leads/admin/leads_admin.py,sha256=VGLYkXPln4ObaXaR2Y9GeUcELHDfG83iRuow9Fvng1U,2556
72
+ django_cfg/apps/leads/admin/resources.py,sha256=bJdydBmPMZ08N5_IylaZEtSY4JySs1-h9pJoKFm04BA,3742
69
73
  django_cfg/apps/leads/migrations/0001_initial.py,sha256=mBDupgmgmaLQFO9bLaBOODN7pervwAnN_EfsS08MoB4,4876
70
74
  django_cfg/apps/leads/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
71
75
  django_cfg/apps/newsletter/README.md,sha256=cnNXnAUsCVtelMNGYc4a8qJsoiVb--J2OOSh_Jw8piA,3202
72
76
  django_cfg/apps/newsletter/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
73
- django_cfg/apps/newsletter/admin.py,sha256=7uZIL-BVtB0l22vgsofQi02Lgub_kJ66RcB154uQunQ,8816
74
- django_cfg/apps/newsletter/admin_filters.py,sha256=lPMtHULDOisTsN9_2BMoGu23ICkFEJDZst5Fhj5Sv5c,3675
75
77
  django_cfg/apps/newsletter/apps.py,sha256=TXrULqE2HbmEIHaLomw7z9bkC19le1rKwlUWhK1xrVo,566
76
78
  django_cfg/apps/newsletter/models.py,sha256=tc5IEUJZUAdYbQOhT_XvfiGL86FIb5LvPAuq7TOPrAM,8930
77
79
  django_cfg/apps/newsletter/serializers.py,sha256=Nse8ZmBDNdhzfgZu53LNp_JOR327rI1fSHpgdJtCoV8,4133
78
80
  django_cfg/apps/newsletter/signals.py,sha256=0wkOxEXnwBnLA1B72sZ_nb_x2ycsvQSQ3jvMwYi92zk,2974
79
81
  django_cfg/apps/newsletter/urls.py,sha256=Zfbgj0NZ06dMu503JOn4GGgmKpQ3tOjTIyUmEslaJdE,1609
82
+ django_cfg/apps/newsletter/admin/__init__.py,sha256=dXCym_3qp9HxT0sUV_LBGgEkKv1k_Mj3a0TTZYnH2yI,290
83
+ django_cfg/apps/newsletter/admin/filters.py,sha256=lPMtHULDOisTsN9_2BMoGu23ICkFEJDZst5Fhj5Sv5c,3675
84
+ django_cfg/apps/newsletter/admin/newsletter_admin.py,sha256=QJ-28f7LW7E5F8xfihYtjbbzUBNu4kqiFhTwHWQcEaQ,9508
85
+ django_cfg/apps/newsletter/admin/resources.py,sha256=BGgKJSvUG5ZBOZiZ9YymAm2TE5BY8IXB8t-DgUHpbzA,6956
80
86
  django_cfg/apps/newsletter/management/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
81
87
  django_cfg/apps/newsletter/management/commands/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
82
88
  django_cfg/apps/newsletter/management/commands/test_newsletter.py,sha256=T6Jfhq6kx8UNLooEqbs5diWz6TQ6gOy_KRVM9EBrBkY,5870
@@ -93,20 +99,22 @@ django_cfg/apps/newsletter/views/newsletters.py,sha256=gb8skjDYxHd8R2DAVUhSe6z4l
93
99
  django_cfg/apps/newsletter/views/subscriptions.py,sha256=marHLbRT6a6e8tMjKVtKG_0K6G_gcjKCU9LmMGihKwg,4774
94
100
  django_cfg/apps/newsletter/views/tracking.py,sha256=EJlAltpASzc_0nslVPJt-6mnIqI_QCEmz3MQEGPKzmU,2481
95
101
  django_cfg/apps/support/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
96
- django_cfg/apps/support/admin.py,sha256=-fcegtqoCcwPiBXwyNLMftcYCTTbTRRBpWItyeNNkDY,8827
97
- django_cfg/apps/support/admin_filters.py,sha256=ZpKtetRxppRAMwIr-pwDbXAyh7qouDfTCEZoo1YJfFs,2179
98
102
  django_cfg/apps/support/apps.py,sha256=t-MzsKjXx6ZXACkG72Wa8GSmRYOERxfhrZUwUwjqCak,304
99
103
  django_cfg/apps/support/models.py,sha256=a_m4CWpfR7A2KlVRUYOGPdpNyNPJflD3Mq7EkiwzICA,2465
100
104
  django_cfg/apps/support/serializers.py,sha256=N-PP8d1H00mHSWT6x5DwDYrJoR3PS3AKrUW80L4lncs,1385
101
105
  django_cfg/apps/support/signals.py,sha256=z465Nr7xin7S82YA7v-E5bNlimpv3ewN7kLoJzlGxtQ,2816
102
106
  django_cfg/apps/support/urls.py,sha256=t3r4wGRUqQS-BDCQgSXwSF9pbucyvr7lo7_pJ1uZ52Q,899
107
+ django_cfg/apps/support/admin/__init__.py,sha256=vVoUWfKj6qBHhwr6zG2ZH8ZpUegYNJvzuAxdFoHEo_0,153
108
+ django_cfg/apps/support/admin/filters.py,sha256=ZpKtetRxppRAMwIr-pwDbXAyh7qouDfTCEZoo1YJfFs,2179
109
+ django_cfg/apps/support/admin/resources.py,sha256=8F0s_3Taz5LCUwlxdRPEcM9tkf08ZS0jBrHc2yHzXb4,5033
110
+ django_cfg/apps/support/admin/support_admin.py,sha256=UEz4f12VQ_fZeykpC2DG3qOuw101O-7Ptxbq5imTVOk,9237
103
111
  django_cfg/apps/support/managers/message_manager.py,sha256=lwfhkuCksIRHL_6563irk6pS0IHvHma9VVVqBMVuq7s,1159
104
112
  django_cfg/apps/support/managers/ticket_manager.py,sha256=SEoiGvesTNEZtrwS7HC76F_-fVbDqQrcL5zyO7Mpkl4,3058
105
113
  django_cfg/apps/support/migrations/0001_initial.py,sha256=AUUXqMiRbv_bRhogBWKWdrxvHpCXxzS2Ku4O6pkq3nU,2986
106
114
  django_cfg/apps/support/migrations/0002_alter_message_ticket.py,sha256=MxdjTW7hJ1B0yQloKR3sVOgujOzSA6eZp5YCmCuXht0,571
107
115
  django_cfg/apps/support/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
108
116
  django_cfg/apps/support/templates/support/chat/access_denied.html,sha256=QdVXR-61aUHmh9Vlag_zXGcS_BG7a807LesIbduqnag,1094
109
- django_cfg/apps/support/templates/support/chat/ticket_chat.html,sha256=b2UvCQp122-CRl567J_sLCvcp_zZi21VG4DOy7dmjM8,14471
117
+ django_cfg/apps/support/templates/support/chat/ticket_chat.html,sha256=Xz5Z0ADP9aZpiE_cJdcRP9UJpJhY32h1h1sLfI94zgU,14483
110
118
  django_cfg/apps/support/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
111
119
  django_cfg/apps/support/utils/support_email_service.py,sha256=0l4dXqAG6oN2UR7W3JzuRhlomaWa41IT7ceVcanluKs,5570
112
120
  django_cfg/apps/support/views/__init__.py,sha256=E-Iqiy888SncfBTiSyXyGCjaNrMa5Klvapzb3ItYPXc,448
@@ -137,7 +145,7 @@ django_cfg/apps/tasks/templates/tasks/components/tab_navigation.html,sha256=Sxb7
137
145
  django_cfg/apps/tasks/templates/tasks/components/task_details_modal.html,sha256=DeJjj3dxYcBEAj8Hv4Ii4koEMaNRVHta9_R25qZyK4w,6317
138
146
  django_cfg/apps/tasks/templates/tasks/components/tasks_tab.html,sha256=Yd6SPgdQX1p_6miitu3nZHjdZOtbsXMhUP4DnXSntPs,1826
139
147
  django_cfg/apps/tasks/templates/tasks/components/workers_tab.html,sha256=4Ud4QpG6bnxBsrBDKGXdy4GcIne43wC13Ch1szZzrbo,1580
140
- django_cfg/archive/django_sample.zip,sha256=BWQUWaM6yP4q-oL2JsAi2dQhY1fdZvFqtRt9tJ5_uCI,624553
148
+ django_cfg/archive/django_sample.zip,sha256=MDARugxPFDXNEj-BXdtK1HdNR8pZ35Wq7JtUoYM3_Lo,624971
141
149
  django_cfg/cli/README.md,sha256=m0pkw3h-g_dJ4wU1N5eMxQP_ecGUDTM_3l0tDNDxByQ,11669
142
150
  django_cfg/cli/__init__.py,sha256=i3ksFngCqZCBvaimQcBD1P2_gr5PiM--4efLScCjvvU,152
143
151
  django_cfg/cli/main.py,sha256=6PfG3ec2AmPHLmUGYc472CId1gs8cRKYrHcvd3ECPxU,998
@@ -146,9 +154,9 @@ django_cfg/cli/commands/__init__.py,sha256=EKLXDAx-QttnGmdjsmVANAfhxWplxl2V_2I0S
146
154
  django_cfg/cli/commands/create_project.py,sha256=bxgf_YCVAhaGx-mvpuJvcx8fjMJe-EPiuw7pbD4iNxA,21053
147
155
  django_cfg/cli/commands/info.py,sha256=tLZmiZX2nEpwrcN9cUwrGKb95X7dasuoeePrqTmK2do,4932
148
156
  django_cfg/core/__init__.py,sha256=eVK57qFOok9kTeHoNEMQ1BplkUOaQ7NB9kP9eQK1vg0,358
149
- django_cfg/core/config.py,sha256=EO6l39BncNRnvxkWHqyGNAiP-rhoAfwtBtr_UmWLYL8,27799
157
+ django_cfg/core/config.py,sha256=J8SZhirJTw0nJ7Z6wkiUqFan4s7IXUmgB-QbvLAWd_k,27820
150
158
  django_cfg/core/environment.py,sha256=AXNKVxcV_3_3gtlafDx3wFTnTPPMGQ9gl40vYm2w-Hg,9101
151
- django_cfg/core/generation.py,sha256=z4yDoYM-_q6RGIn4ZesLXS8frcHoiHz5oBIREcJON4U,24668
159
+ django_cfg/core/generation.py,sha256=i3c0RI4vUk3X2JZiULfoH5_H8ZjO7rOZTY83eJDfDYA,24715
152
160
  django_cfg/core/validation.py,sha256=j0q57oJEJjI6ylb3AzvsgupmvBKsUcrxpmkfKF3ZRF4,6585
153
161
  django_cfg/management/__init__.py,sha256=z8p1jlyajNUleDxRUXL3iXUI99xXWFYNtFAe5nKy1kA,43
154
162
  django_cfg/management/commands/__init__.py,sha256=z8p1jlyajNUleDxRUXL3iXUI99xXWFYNtFAe5nKy1kA,43
@@ -157,7 +165,7 @@ django_cfg/management/commands/clear_constance.py,sha256=bSUhxEIKFLmXVilQGn3s9FZ
157
165
  django_cfg/management/commands/create_token.py,sha256=beHtUTuyFZhG97F9vSkaX-u7tieAZW-C6pntujGw1C8,11796
158
166
  django_cfg/management/commands/generate.py,sha256=w0BF7IMftxNjxTxFuY8cw5pNKGW-LmTScJ8kZpxHu_8,4248
159
167
  django_cfg/management/commands/list_urls.py,sha256=D8ikInA3uE1LbQGLWmfdLnEqPg7wqrI3caQA6iTe_-0,11009
160
- django_cfg/management/commands/migrator.py,sha256=mhMM63uv_Jp9zHVVM7TMwCB90uv3iFZn1vOG-rXyi3s,16191
168
+ django_cfg/management/commands/migrator.py,sha256=swU9bA0eV4ILgcmrn0vJZrmKNYkrTZ7eYOf3qLdmyH8,17969
161
169
  django_cfg/management/commands/rundramatiq.py,sha256=62l7PvtVabtfRtrdktj_5uBbXDXi8oEde0W4IsmoHXw,8980
162
170
  django_cfg/management/commands/runserver_ngrok.py,sha256=mcTioDIzHgha6sGo5eazlJhdKr8y5-uEQIc3qG3AvCI,5237
163
171
  django_cfg/management/commands/script.py,sha256=I6zOEQEGaED0HoLxl2EqKz39HwbKg9HhdxnGKybfH5s,16974
@@ -253,9 +261,9 @@ django_cfg/templates/admin/snippets/zones/zones_table.html,sha256=2oaiCXVof2F7Li
253
261
  django_cfg/templates/emails/base_email.html,sha256=TWcvYa2IHShlF_E8jf1bWZStRO0v8G4L_GexPxvz6XQ,8836
254
262
  django_cfg/utils/__init__.py,sha256=64wwXJuXytvwt8Ze_erSR2HmV07nGWJ6DV5wloRBvYE,435
255
263
  django_cfg/utils/path_resolution.py,sha256=eML-6-RIGTs5TePktIQN8nxfDUEFJ3JA0AzWBcihAbs,13894
256
- django_cfg/utils/smart_defaults.py,sha256=iL6_n3jGDW5812whylWAwXik0xBSYihdLp4IJ26T5eA,20547
257
- django_cfg-1.1.67.dist-info/METADATA,sha256=vCpTaHqQCl_CG0RoDY9rCre3SUoyn6u14zHkRLYZnlo,44084
258
- django_cfg-1.1.67.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
259
- django_cfg-1.1.67.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
260
- django_cfg-1.1.67.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
261
- django_cfg-1.1.67.dist-info/RECORD,,
264
+ django_cfg/utils/smart_defaults.py,sha256=H0Q3dzXOok3mNV7358lZLNYOJoiX_eIay8c83ugvygk,21049
265
+ django_cfg-1.1.70.dist-info/METADATA,sha256=9Vvp1wGezwIVA7mJ92DrD4jZxvFVGV5Xg0B0O3WvE5s,44134
266
+ django_cfg-1.1.70.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
267
+ django_cfg-1.1.70.dist-info/entry_points.txt,sha256=Ucmde4Z2wEzgb4AggxxZ0zaYDb9HpyE5blM3uJ0_VNg,56
268
+ django_cfg-1.1.70.dist-info/licenses/LICENSE,sha256=xHuytiUkSZCRG3N11nk1X6q1_EGQtv6aL5O9cqNRhKE,1071
269
+ django_cfg-1.1.70.dist-info/RECORD,,