arthexis 0.1.13__py3-none-any.whl → 0.1.14__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.

Potentially problematic release.


This version of arthexis might be problematic. Click here for more details.

Files changed (107) hide show
  1. {arthexis-0.1.13.dist-info → arthexis-0.1.14.dist-info}/METADATA +222 -221
  2. arthexis-0.1.14.dist-info/RECORD +109 -0
  3. {arthexis-0.1.13.dist-info → arthexis-0.1.14.dist-info}/licenses/LICENSE +674 -674
  4. config/__init__.py +5 -5
  5. config/active_app.py +15 -15
  6. config/asgi.py +43 -43
  7. config/auth_app.py +7 -7
  8. config/celery.py +32 -32
  9. config/context_processors.py +67 -69
  10. config/horologia_app.py +7 -7
  11. config/loadenv.py +11 -11
  12. config/logging.py +59 -48
  13. config/middleware.py +25 -25
  14. config/offline.py +49 -49
  15. config/settings.py +691 -682
  16. config/settings_helpers.py +109 -109
  17. config/urls.py +171 -166
  18. config/wsgi.py +17 -17
  19. core/admin.py +3771 -2809
  20. core/admin_history.py +50 -50
  21. core/admindocs.py +151 -151
  22. core/apps.py +356 -272
  23. core/auto_upgrade.py +57 -57
  24. core/backends.py +265 -236
  25. core/changelog.py +342 -0
  26. core/entity.py +133 -133
  27. core/environment.py +61 -61
  28. core/fields.py +168 -168
  29. core/form_fields.py +75 -75
  30. core/github_helper.py +188 -25
  31. core/github_issues.py +178 -172
  32. core/github_repos.py +72 -0
  33. core/lcd_screen.py +78 -78
  34. core/liveupdate.py +25 -25
  35. core/log_paths.py +100 -100
  36. core/mailer.py +85 -85
  37. core/middleware.py +91 -91
  38. core/models.py +3609 -2795
  39. core/notifications.py +105 -105
  40. core/public_wifi.py +267 -227
  41. core/reference_utils.py +108 -108
  42. core/release.py +721 -368
  43. core/rfid_import_export.py +113 -0
  44. core/sigil_builder.py +149 -149
  45. core/sigil_context.py +20 -20
  46. core/sigil_resolver.py +315 -315
  47. core/system.py +752 -493
  48. core/tasks.py +408 -394
  49. core/temp_passwords.py +181 -181
  50. core/test_system_info.py +186 -139
  51. core/tests.py +2095 -1521
  52. core/tests_liveupdate.py +17 -17
  53. core/urls.py +11 -11
  54. core/user_data.py +641 -633
  55. core/views.py +2175 -1417
  56. core/widgets.py +213 -94
  57. core/workgroup_urls.py +17 -17
  58. core/workgroup_views.py +94 -94
  59. nodes/admin.py +1720 -1161
  60. nodes/apps.py +87 -85
  61. nodes/backends.py +160 -160
  62. nodes/dns.py +203 -203
  63. nodes/feature_checks.py +133 -133
  64. nodes/lcd.py +165 -165
  65. nodes/models.py +1737 -1597
  66. nodes/reports.py +411 -411
  67. nodes/rfid_sync.py +195 -0
  68. nodes/signals.py +18 -0
  69. nodes/tasks.py +46 -46
  70. nodes/tests.py +3810 -3116
  71. nodes/urls.py +15 -14
  72. nodes/utils.py +121 -105
  73. nodes/views.py +683 -619
  74. ocpp/admin.py +948 -948
  75. ocpp/apps.py +25 -25
  76. ocpp/consumers.py +1565 -1459
  77. ocpp/evcs.py +844 -844
  78. ocpp/evcs_discovery.py +158 -158
  79. ocpp/models.py +917 -917
  80. ocpp/reference_utils.py +42 -42
  81. ocpp/routing.py +11 -11
  82. ocpp/simulator.py +745 -745
  83. ocpp/status_display.py +26 -26
  84. ocpp/store.py +601 -541
  85. ocpp/tasks.py +31 -31
  86. ocpp/test_export_import.py +130 -130
  87. ocpp/test_rfid.py +913 -702
  88. ocpp/tests.py +4445 -4094
  89. ocpp/transactions_io.py +189 -189
  90. ocpp/urls.py +50 -50
  91. ocpp/views.py +1479 -1251
  92. pages/admin.py +708 -539
  93. pages/apps.py +10 -10
  94. pages/checks.py +40 -40
  95. pages/context_processors.py +127 -119
  96. pages/defaults.py +13 -13
  97. pages/forms.py +198 -198
  98. pages/middleware.py +205 -153
  99. pages/models.py +607 -426
  100. pages/tests.py +2612 -2200
  101. pages/urls.py +25 -25
  102. pages/utils.py +12 -12
  103. pages/views.py +1165 -1128
  104. arthexis-0.1.13.dist-info/RECORD +0 -105
  105. nodes/actions.py +0 -70
  106. {arthexis-0.1.13.dist-info → arthexis-0.1.14.dist-info}/WHEEL +0 -0
  107. {arthexis-0.1.13.dist-info → arthexis-0.1.14.dist-info}/top_level.txt +0 -0
@@ -1,109 +1,109 @@
1
- """Utility helpers shared by :mod:`config.settings` and related tests."""
2
-
3
- from __future__ import annotations
4
-
5
- import contextlib
6
- import ipaddress
7
- import os
8
- from pathlib import Path
9
- from typing import Mapping, MutableMapping
10
-
11
- from django.core.management.utils import get_random_secret_key
12
- from django.http import request as http_request
13
- from django.http.request import split_domain_port
14
-
15
-
16
- __all__ = [
17
- "extract_ip_from_host",
18
- "install_validate_host_with_subnets",
19
- "load_secret_key",
20
- "strip_ipv6_brackets",
21
- "validate_host_with_subnets",
22
- ]
23
-
24
-
25
- def strip_ipv6_brackets(host: str) -> str:
26
- """Return ``host`` without IPv6 URL literal brackets."""
27
-
28
- if host.startswith("[") and host.endswith("]"):
29
- return host[1:-1]
30
- return host
31
-
32
-
33
- def extract_ip_from_host(host: str):
34
- """Return an :mod:`ipaddress` object for ``host`` when possible."""
35
-
36
- candidate = strip_ipv6_brackets(host)
37
- try:
38
- return ipaddress.ip_address(candidate)
39
- except ValueError:
40
- domain, _port = split_domain_port(host)
41
- if domain and domain != host:
42
- candidate = strip_ipv6_brackets(domain)
43
- try:
44
- return ipaddress.ip_address(candidate)
45
- except ValueError:
46
- return None
47
- return None
48
-
49
-
50
- def validate_host_with_subnets(host, allowed_hosts, original_validate=None):
51
- """Extend Django's host validation to honor subnet CIDR notation."""
52
-
53
- if original_validate is None:
54
- original_validate = http_request.validate_host
55
-
56
- ip = extract_ip_from_host(host)
57
- if ip is None:
58
- return original_validate(host, allowed_hosts)
59
-
60
- for pattern in allowed_hosts:
61
- try:
62
- network = ipaddress.ip_network(pattern)
63
- except ValueError:
64
- continue
65
- if ip in network:
66
- return True
67
- return original_validate(host, allowed_hosts)
68
-
69
-
70
- def install_validate_host_with_subnets() -> None:
71
- """Monkeypatch Django's host validator to recognize subnet patterns."""
72
-
73
- original_validate = http_request.validate_host
74
-
75
- def _patched(host, allowed_hosts):
76
- return validate_host_with_subnets(host, allowed_hosts, original_validate)
77
-
78
- http_request.validate_host = _patched
79
-
80
-
81
- def load_secret_key(
82
- base_dir: Path,
83
- env: Mapping[str, str] | MutableMapping[str, str] | None = None,
84
- secret_file: Path | None = None,
85
- ) -> str:
86
- """Load the Django secret key from the environment or a persisted file."""
87
-
88
- if env is None:
89
- env = os.environ
90
-
91
- for env_var in ("DJANGO_SECRET_KEY", "SECRET_KEY"):
92
- value = env.get(env_var)
93
- if value:
94
- return value
95
-
96
- if secret_file is None:
97
- secret_file = base_dir / "locks" / "django-secret.key"
98
-
99
- with contextlib.suppress(OSError):
100
- stored_key = secret_file.read_text(encoding="utf-8").strip()
101
- if stored_key:
102
- return stored_key
103
-
104
- generated_key = get_random_secret_key()
105
- with contextlib.suppress(OSError):
106
- secret_file.parent.mkdir(parents=True, exist_ok=True)
107
- secret_file.write_text(generated_key, encoding="utf-8")
108
-
109
- return generated_key
1
+ """Utility helpers shared by :mod:`config.settings` and related tests."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import contextlib
6
+ import ipaddress
7
+ import os
8
+ from pathlib import Path
9
+ from typing import Mapping, MutableMapping
10
+
11
+ from django.core.management.utils import get_random_secret_key
12
+ from django.http import request as http_request
13
+ from django.http.request import split_domain_port
14
+
15
+
16
+ __all__ = [
17
+ "extract_ip_from_host",
18
+ "install_validate_host_with_subnets",
19
+ "load_secret_key",
20
+ "strip_ipv6_brackets",
21
+ "validate_host_with_subnets",
22
+ ]
23
+
24
+
25
+ def strip_ipv6_brackets(host: str) -> str:
26
+ """Return ``host`` without IPv6 URL literal brackets."""
27
+
28
+ if host.startswith("[") and host.endswith("]"):
29
+ return host[1:-1]
30
+ return host
31
+
32
+
33
+ def extract_ip_from_host(host: str):
34
+ """Return an :mod:`ipaddress` object for ``host`` when possible."""
35
+
36
+ candidate = strip_ipv6_brackets(host)
37
+ try:
38
+ return ipaddress.ip_address(candidate)
39
+ except ValueError:
40
+ domain, _port = split_domain_port(host)
41
+ if domain and domain != host:
42
+ candidate = strip_ipv6_brackets(domain)
43
+ try:
44
+ return ipaddress.ip_address(candidate)
45
+ except ValueError:
46
+ return None
47
+ return None
48
+
49
+
50
+ def validate_host_with_subnets(host, allowed_hosts, original_validate=None):
51
+ """Extend Django's host validation to honor subnet CIDR notation."""
52
+
53
+ if original_validate is None:
54
+ original_validate = http_request.validate_host
55
+
56
+ ip = extract_ip_from_host(host)
57
+ if ip is None:
58
+ return original_validate(host, allowed_hosts)
59
+
60
+ for pattern in allowed_hosts:
61
+ try:
62
+ network = ipaddress.ip_network(pattern)
63
+ except ValueError:
64
+ continue
65
+ if ip in network:
66
+ return True
67
+ return original_validate(host, allowed_hosts)
68
+
69
+
70
+ def install_validate_host_with_subnets() -> None:
71
+ """Monkeypatch Django's host validator to recognize subnet patterns."""
72
+
73
+ original_validate = http_request.validate_host
74
+
75
+ def _patched(host, allowed_hosts):
76
+ return validate_host_with_subnets(host, allowed_hosts, original_validate)
77
+
78
+ http_request.validate_host = _patched
79
+
80
+
81
+ def load_secret_key(
82
+ base_dir: Path,
83
+ env: Mapping[str, str] | MutableMapping[str, str] | None = None,
84
+ secret_file: Path | None = None,
85
+ ) -> str:
86
+ """Load the Django secret key from the environment or a persisted file."""
87
+
88
+ if env is None:
89
+ env = os.environ
90
+
91
+ for env_var in ("DJANGO_SECRET_KEY", "SECRET_KEY"):
92
+ value = env.get(env_var)
93
+ if value:
94
+ return value
95
+
96
+ if secret_file is None:
97
+ secret_file = base_dir / "locks" / "django-secret.key"
98
+
99
+ with contextlib.suppress(OSError):
100
+ stored_key = secret_file.read_text(encoding="utf-8").strip()
101
+ if stored_key:
102
+ return stored_key
103
+
104
+ generated_key = get_random_secret_key()
105
+ with contextlib.suppress(OSError):
106
+ secret_file.parent.mkdir(parents=True, exist_ok=True)
107
+ secret_file.write_text(generated_key, encoding="utf-8")
108
+
109
+ return generated_key
config/urls.py CHANGED
@@ -1,166 +1,171 @@
1
- """Project URL configuration with automatic app discovery.
2
-
3
- This module includes URL patterns from any installed application that exposes
4
- an internal ``urls`` module. This allows new apps with URL configurations to be
5
- added without editing this file, except for top-level routes such as the admin
6
- interface or the main pages.
7
- """
8
-
9
- from importlib import import_module
10
- from pathlib import Path
11
-
12
- from django.apps import apps
13
- from django.conf import settings
14
- from django.conf.urls.static import static
15
- from django.contrib.staticfiles.urls import staticfiles_urlpatterns
16
- from django.contrib import admin
17
- from django.urls import include, path
18
- import teams.admin # noqa: F401
19
- from django.views.decorators.csrf import csrf_exempt
20
- from django.views.generic import RedirectView
21
- from django.views.i18n import set_language
22
- from django.utils.translation import gettext_lazy as _
23
- from core import views as core_views
24
- from core.admindocs import (
25
- CommandsView,
26
- ModelGraphIndexView,
27
- OrderedModelIndexView,
28
- )
29
- from pages import views as pages_views
30
-
31
- admin.site.site_header = _("Constellation")
32
- admin.site.site_title = _("Constellation")
33
-
34
- # Apps that require a custom prefix for their URLs
35
- URL_PREFIX_OVERRIDES = {"core": "api/rfid"}
36
-
37
-
38
- def autodiscovered_urlpatterns():
39
- """Collect URL patterns from project apps automatically.
40
-
41
- Scans all installed apps located inside the project directory. If an app
42
- exposes a ``urls`` module, it is included under ``/<app_label>/`` unless a
43
- custom prefix is defined in :data:`URL_PREFIX_OVERRIDES`.
44
- """
45
-
46
- patterns = []
47
- base_dir = Path(settings.BASE_DIR).resolve()
48
- for app_config in apps.get_app_configs():
49
- app_path = Path(app_config.path).resolve()
50
- try:
51
- app_path.relative_to(base_dir)
52
- except ValueError:
53
- # Skip third-party apps outside of the project
54
- continue
55
-
56
- if app_config.label == "pages":
57
- # Root pages URLs are handled explicitly below
58
- continue
59
-
60
- module_name = f"{app_config.name}.urls"
61
- try:
62
- import_module(module_name)
63
- except ModuleNotFoundError:
64
- continue
65
-
66
- prefix = URL_PREFIX_OVERRIDES.get(app_config.label, app_config.label)
67
- patterns.append(path(f"{prefix}/", include(module_name)))
68
-
69
- return patterns
70
-
71
-
72
- urlpatterns = [
73
- path(
74
- "admin/doc/manuals/",
75
- pages_views.admin_manual_list,
76
- name="django-admindocs-manuals",
77
- ),
78
- path(
79
- "admin/doc/manuals/<slug:slug>/",
80
- pages_views.admin_manual_detail,
81
- name="django-admindocs-manual-detail",
82
- ),
83
- path(
84
- "admin/doc/manuals/<slug:slug>/pdf/",
85
- pages_views.manual_pdf,
86
- name="django-admindocs-manual-pdf",
87
- ),
88
- path(
89
- "admin/doc/commands/",
90
- CommandsView.as_view(),
91
- name="django-admindocs-commands",
92
- ),
93
- path(
94
- "admin/doc/commands/",
95
- RedirectView.as_view(pattern_name="django-admindocs-commands"),
96
- ),
97
- path(
98
- "admin/doc/model-graphs/",
99
- ModelGraphIndexView.as_view(),
100
- name="django-admindocs-model-graphs",
101
- ),
102
- path(
103
- "admindocs/model-graphs/",
104
- RedirectView.as_view(pattern_name="django-admindocs-model-graphs"),
105
- ),
106
- path(
107
- "admindocs/models/",
108
- OrderedModelIndexView.as_view(),
109
- name="django-admindocs-models-index",
110
- ),
111
- path("admindocs/", include("django.contrib.admindocs.urls")),
112
- path(
113
- "admin/doc/",
114
- RedirectView.as_view(pattern_name="django-admindocs-docroot"),
115
- ),
116
- path(
117
- "admin/model-graph/<str:app_label>/",
118
- admin.site.admin_view(pages_views.admin_model_graph),
119
- name="admin-model-graph",
120
- ),
121
- path("version/", core_views.version_info, name="version-info"),
122
- path(
123
- "admin/core/releases/<int:pk>/<str:action>/",
124
- core_views.release_progress,
125
- name="release-progress",
126
- ),
127
- path(
128
- "admin/core/todos/<int:pk>/focus/",
129
- core_views.todo_focus,
130
- name="todo-focus",
131
- ),
132
- path(
133
- "admin/core/todos/<int:pk>/done/",
134
- core_views.todo_done,
135
- name="todo-done",
136
- ),
137
- path(
138
- "admin/core/odoo-products/",
139
- core_views.odoo_products,
140
- name="odoo-products",
141
- ),
142
- path("admin/", admin.site.urls),
143
- path("i18n/setlang/", csrf_exempt(set_language), name="set_language"),
144
- path("api/", include("core.workgroup_urls")),
145
- path("", include("pages.urls")),
146
- ]
147
-
148
- urlpatterns += autodiscovered_urlpatterns()
149
-
150
- if settings.DEBUG:
151
- try:
152
- import debug_toolbar
153
- except ModuleNotFoundError: # pragma: no cover - optional dependency
154
- pass
155
- else:
156
- urlpatterns = [
157
- path(
158
- "__debug__/",
159
- include(
160
- ("debug_toolbar.urls", "debug_toolbar"), namespace="debug_toolbar"
161
- ),
162
- )
163
- ] + urlpatterns
164
-
165
- urlpatterns += staticfiles_urlpatterns()
166
- urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
1
+ """Project URL configuration with automatic app discovery.
2
+
3
+ This module includes URL patterns from any installed application that exposes
4
+ an internal ``urls`` module. This allows new apps with URL configurations to be
5
+ added without editing this file, except for top-level routes such as the admin
6
+ interface or the main pages.
7
+ """
8
+
9
+ from importlib import import_module
10
+ from pathlib import Path
11
+
12
+ from django.apps import apps
13
+ from django.conf import settings
14
+ from django.conf.urls.static import static
15
+ from django.contrib.staticfiles.urls import staticfiles_urlpatterns
16
+ from django.contrib import admin
17
+ from django.urls import include, path
18
+ import teams.admin # noqa: F401
19
+ from django.views.decorators.csrf import csrf_exempt
20
+ from django.views.generic import RedirectView
21
+ from django.views.i18n import set_language
22
+ from django.utils.translation import gettext_lazy as _
23
+ from core import views as core_views
24
+ from core.admindocs import (
25
+ CommandsView,
26
+ ModelGraphIndexView,
27
+ OrderedModelIndexView,
28
+ )
29
+ from pages import views as pages_views
30
+
31
+ admin.site.site_header = _("Constellation")
32
+ admin.site.site_title = _("Constellation")
33
+
34
+ # Apps that require a custom prefix for their URLs
35
+ URL_PREFIX_OVERRIDES = {"core": "api/rfid"}
36
+
37
+
38
+ def autodiscovered_urlpatterns():
39
+ """Collect URL patterns from project apps automatically.
40
+
41
+ Scans all installed apps located inside the project directory. If an app
42
+ exposes a ``urls`` module, it is included under ``/<app_label>/`` unless a
43
+ custom prefix is defined in :data:`URL_PREFIX_OVERRIDES`.
44
+ """
45
+
46
+ patterns = []
47
+ base_dir = Path(settings.BASE_DIR).resolve()
48
+ for app_config in apps.get_app_configs():
49
+ app_path = Path(app_config.path).resolve()
50
+ try:
51
+ app_path.relative_to(base_dir)
52
+ except ValueError:
53
+ # Skip third-party apps outside of the project
54
+ continue
55
+
56
+ if app_config.label == "pages":
57
+ # Root pages URLs are handled explicitly below
58
+ continue
59
+
60
+ module_name = f"{app_config.name}.urls"
61
+ try:
62
+ import_module(module_name)
63
+ except ModuleNotFoundError:
64
+ continue
65
+
66
+ prefix = URL_PREFIX_OVERRIDES.get(app_config.label, app_config.label)
67
+ patterns.append(path(f"{prefix}/", include(module_name)))
68
+
69
+ return patterns
70
+
71
+
72
+ urlpatterns = [
73
+ path(
74
+ "admin/doc/manuals/",
75
+ pages_views.admin_manual_list,
76
+ name="django-admindocs-manuals",
77
+ ),
78
+ path(
79
+ "admin/doc/manuals/<slug:slug>/",
80
+ pages_views.admin_manual_detail,
81
+ name="django-admindocs-manual-detail",
82
+ ),
83
+ path(
84
+ "admin/doc/manuals/<slug:slug>/pdf/",
85
+ pages_views.manual_pdf,
86
+ name="django-admindocs-manual-pdf",
87
+ ),
88
+ path(
89
+ "admin/doc/commands/",
90
+ CommandsView.as_view(),
91
+ name="django-admindocs-commands",
92
+ ),
93
+ path(
94
+ "admin/doc/commands/",
95
+ RedirectView.as_view(pattern_name="django-admindocs-commands"),
96
+ ),
97
+ path(
98
+ "admin/doc/model-graphs/",
99
+ ModelGraphIndexView.as_view(),
100
+ name="django-admindocs-model-graphs",
101
+ ),
102
+ path(
103
+ "admindocs/model-graphs/",
104
+ RedirectView.as_view(pattern_name="django-admindocs-model-graphs"),
105
+ ),
106
+ path(
107
+ "admindocs/models/",
108
+ OrderedModelIndexView.as_view(),
109
+ name="django-admindocs-models-index",
110
+ ),
111
+ path("admindocs/", include("django.contrib.admindocs.urls")),
112
+ path(
113
+ "admin/doc/",
114
+ RedirectView.as_view(pattern_name="django-admindocs-docroot"),
115
+ ),
116
+ path(
117
+ "admin/model-graph/<str:app_label>/",
118
+ admin.site.admin_view(pages_views.admin_model_graph),
119
+ name="admin-model-graph",
120
+ ),
121
+ path("version/", core_views.version_info, name="version-info"),
122
+ path(
123
+ "admin/core/releases/<int:pk>/<str:action>/",
124
+ core_views.release_progress,
125
+ name="release-progress",
126
+ ),
127
+ path(
128
+ "admin/core/todos/<int:pk>/focus/",
129
+ core_views.todo_focus,
130
+ name="todo-focus",
131
+ ),
132
+ path(
133
+ "admin/core/todos/<int:pk>/done/",
134
+ core_views.todo_done,
135
+ name="todo-done",
136
+ ),
137
+ path(
138
+ "admin/core/odoo-products/",
139
+ core_views.odoo_products,
140
+ name="odoo-products",
141
+ ),
142
+ path(
143
+ "admin/core/odoo-quote-report/",
144
+ core_views.odoo_quote_report,
145
+ name="odoo-quote-report",
146
+ ),
147
+ path("admin/", admin.site.urls),
148
+ path("i18n/setlang/", csrf_exempt(set_language), name="set_language"),
149
+ path("api/", include("core.workgroup_urls")),
150
+ path("", include("pages.urls")),
151
+ ]
152
+
153
+ urlpatterns += autodiscovered_urlpatterns()
154
+
155
+ if settings.DEBUG:
156
+ try:
157
+ import debug_toolbar
158
+ except ModuleNotFoundError: # pragma: no cover - optional dependency
159
+ pass
160
+ else:
161
+ urlpatterns = [
162
+ path(
163
+ "__debug__/",
164
+ include(
165
+ ("debug_toolbar.urls", "debug_toolbar"), namespace="debug_toolbar"
166
+ ),
167
+ )
168
+ ] + urlpatterns
169
+
170
+ urlpatterns += staticfiles_urlpatterns()
171
+ urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
config/wsgi.py CHANGED
@@ -1,17 +1,17 @@
1
- """
2
- WSGI config for config project.
3
-
4
- It exposes the WSGI callable as a module-level variable named ``application``.
5
-
6
- For more information on this file, see
7
- https://docs.djangoproject.com/en/5.2/howto/deployment/wsgi/
8
- """
9
-
10
- import os
11
- from config.loadenv import loadenv
12
- from django.core.wsgi import get_wsgi_application
13
-
14
- loadenv()
15
- os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
16
-
17
- application = get_wsgi_application()
1
+ """
2
+ WSGI config for config project.
3
+
4
+ It exposes the WSGI callable as a module-level variable named ``application``.
5
+
6
+ For more information on this file, see
7
+ https://docs.djangoproject.com/en/5.2/howto/deployment/wsgi/
8
+ """
9
+
10
+ import os
11
+ from config.loadenv import loadenv
12
+ from django.core.wsgi import get_wsgi_application
13
+
14
+ loadenv()
15
+ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
16
+
17
+ application = get_wsgi_application()