arthexis 0.1.16__py3-none-any.whl → 0.1.28__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 (67) hide show
  1. {arthexis-0.1.16.dist-info → arthexis-0.1.28.dist-info}/METADATA +95 -41
  2. arthexis-0.1.28.dist-info/RECORD +112 -0
  3. config/asgi.py +1 -15
  4. config/middleware.py +47 -1
  5. config/settings.py +21 -30
  6. config/settings_helpers.py +176 -1
  7. config/urls.py +69 -1
  8. core/admin.py +805 -473
  9. core/apps.py +6 -8
  10. core/auto_upgrade.py +19 -4
  11. core/backends.py +13 -3
  12. core/celery_utils.py +73 -0
  13. core/changelog.py +66 -5
  14. core/environment.py +4 -5
  15. core/models.py +1825 -218
  16. core/notifications.py +1 -1
  17. core/reference_utils.py +10 -11
  18. core/release.py +55 -7
  19. core/sigil_builder.py +2 -2
  20. core/sigil_resolver.py +1 -66
  21. core/system.py +285 -4
  22. core/tasks.py +439 -138
  23. core/test_system_info.py +43 -5
  24. core/tests.py +516 -18
  25. core/user_data.py +94 -21
  26. core/views.py +348 -186
  27. nodes/admin.py +904 -67
  28. nodes/apps.py +12 -1
  29. nodes/feature_checks.py +30 -0
  30. nodes/models.py +800 -127
  31. nodes/rfid_sync.py +1 -1
  32. nodes/tasks.py +98 -3
  33. nodes/tests.py +1381 -152
  34. nodes/urls.py +15 -1
  35. nodes/utils.py +51 -3
  36. nodes/views.py +1382 -152
  37. ocpp/admin.py +1970 -152
  38. ocpp/consumers.py +839 -34
  39. ocpp/models.py +968 -17
  40. ocpp/network.py +398 -0
  41. ocpp/store.py +411 -43
  42. ocpp/tasks.py +261 -3
  43. ocpp/test_export_import.py +1 -0
  44. ocpp/test_rfid.py +194 -6
  45. ocpp/tests.py +1918 -87
  46. ocpp/transactions_io.py +9 -1
  47. ocpp/urls.py +8 -3
  48. ocpp/views.py +700 -53
  49. pages/admin.py +262 -30
  50. pages/apps.py +35 -0
  51. pages/context_processors.py +28 -21
  52. pages/defaults.py +1 -1
  53. pages/forms.py +31 -8
  54. pages/middleware.py +6 -2
  55. pages/models.py +86 -2
  56. pages/module_defaults.py +5 -5
  57. pages/site_config.py +137 -0
  58. pages/tests.py +1050 -126
  59. pages/urls.py +14 -2
  60. pages/utils.py +70 -0
  61. pages/views.py +622 -56
  62. arthexis-0.1.16.dist-info/RECORD +0 -111
  63. core/workgroup_urls.py +0 -17
  64. core/workgroup_views.py +0 -94
  65. {arthexis-0.1.16.dist-info → arthexis-0.1.28.dist-info}/WHEEL +0 -0
  66. {arthexis-0.1.16.dist-info → arthexis-0.1.28.dist-info}/licenses/LICENSE +0 -0
  67. {arthexis-0.1.16.dist-info → arthexis-0.1.28.dist-info}/top_level.txt +0 -0
pages/urls.py CHANGED
@@ -6,11 +6,24 @@ app_name = "pages"
6
6
 
7
7
  urlpatterns = [
8
8
  path("", views.index, name="index"),
9
- path("readme/", views.readme, name="readme"),
9
+ path(
10
+ "read/assets/<str:source>/<path:asset>",
11
+ views.readme_asset,
12
+ name="readme-asset",
13
+ ),
14
+ path("read/<path:doc>/edit/", views.readme_edit, name="readme-edit"),
15
+ path("read/", views.readme, name="readme"),
16
+ path("read/<path:doc>", views.readme, name="readme-document"),
10
17
  path("sitemap.xml", views.sitemap, name="pages-sitemap"),
11
18
  path("release/", views.release_admin_redirect, name="release-admin"),
12
19
  path("client-report/", views.client_report, name="client-report"),
20
+ path(
21
+ "client-report/download/<int:report_id>/",
22
+ views.client_report_download,
23
+ name="client-report-download",
24
+ ),
13
25
  path("release-checklist", views.release_checklist, name="release-checklist"),
26
+ path("login/rfid/", views.rfid_login_page, name="rfid-login"),
14
27
  path("login/", views.login_view, name="login"),
15
28
  path("authenticator/setup/", views.authenticator_setup, name="authenticator-setup"),
16
29
  path("request-invite/", views.request_invite, name="request-invite"),
@@ -19,7 +32,6 @@ urlpatterns = [
19
32
  views.invitation_login,
20
33
  name="invitation-login",
21
34
  ),
22
- path("datasette-auth/", views.datasette_auth, name="datasette-auth"),
23
35
  path("man/", views.manual_list, name="manual-list"),
24
36
  path("man/<slug:slug>/", views.manual_detail, name="manual-detail"),
25
37
  path("man/<slug:slug>/pdf/", views.manual_pdf, name="manual-pdf"),
pages/utils.py CHANGED
@@ -1,6 +1,15 @@
1
+ from __future__ import annotations
2
+
3
+ from urllib.parse import urlsplit
4
+
5
+ from django.core.exceptions import DisallowedHost
6
+ from django.http.request import split_domain_port
1
7
  from django.urls import path as django_path
2
8
 
3
9
 
10
+ ORIGINAL_REFERER_SESSION_KEY = "pages:original_referer"
11
+
12
+
4
13
  def landing(label=None):
5
14
  """Decorator to mark a view as a landing page."""
6
15
 
@@ -12,6 +21,67 @@ def landing(label=None):
12
21
  return decorator
13
22
 
14
23
 
24
+ def cache_original_referer(request) -> None:
25
+ """Persist the first external referer observed for the session."""
26
+
27
+ session = getattr(request, "session", None)
28
+ if not hasattr(session, "get"):
29
+ return
30
+
31
+ original = session.get(ORIGINAL_REFERER_SESSION_KEY)
32
+ if original:
33
+ request.original_referer = original
34
+ return
35
+
36
+ referer = (request.META.get("HTTP_REFERER") or "").strip()
37
+ if not referer:
38
+ return
39
+
40
+ try:
41
+ parsed = urlsplit(referer)
42
+ except ValueError:
43
+ return
44
+
45
+ if parsed.scheme not in {"http", "https"} or not parsed.netloc:
46
+ return
47
+
48
+ try:
49
+ host = request.get_host()
50
+ except DisallowedHost:
51
+ host = ""
52
+
53
+ referer_host, _ = split_domain_port(parsed.netloc)
54
+ request_host, _ = split_domain_port(host)
55
+
56
+ if referer_host and request_host:
57
+ if referer_host.lower() == request_host.lower():
58
+ return
59
+
60
+ referer_value = referer[:1000]
61
+ session[ORIGINAL_REFERER_SESSION_KEY] = referer_value
62
+ request.original_referer = referer_value
63
+
64
+
65
+ def get_original_referer(request) -> str:
66
+ """Return the original external referer recorded for the session."""
67
+
68
+ if hasattr(request, "original_referer"):
69
+ return request.original_referer or ""
70
+
71
+ session = getattr(request, "session", None)
72
+ if hasattr(session, "get"):
73
+ referer = session.get(ORIGINAL_REFERER_SESSION_KEY)
74
+ if referer:
75
+ request.original_referer = referer
76
+ return referer
77
+
78
+ referer = (request.META.get("HTTP_REFERER") or "").strip()
79
+ if referer:
80
+ referer = referer[:1000]
81
+ request.original_referer = referer
82
+ return referer
83
+
84
+
15
85
  def landing_leads_supported() -> bool:
16
86
  """Return ``True`` when the local node supports landing lead tracking."""
17
87