arthexis 0.1.17__tar.gz → 0.1.28__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.

Potentially problematic release.


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

Files changed (285) hide show
  1. {arthexis-0.1.17 → arthexis-0.1.28}/PKG-INFO +95 -41
  2. {arthexis-0.1.17 → arthexis-0.1.28}/README.md +69 -16
  3. {arthexis-0.1.17 → arthexis-0.1.28}/arthexis.egg-info/PKG-INFO +95 -41
  4. {arthexis-0.1.17 → arthexis-0.1.28}/arthexis.egg-info/SOURCES.txt +18 -12
  5. {arthexis-0.1.17 → arthexis-0.1.28}/arthexis.egg-info/requires.txt +25 -24
  6. {arthexis-0.1.17 → arthexis-0.1.28}/config/asgi.py +1 -15
  7. arthexis-0.1.28/config/middleware.py +71 -0
  8. {arthexis-0.1.17 → arthexis-0.1.28}/config/settings.py +18 -30
  9. arthexis-0.1.28/config/settings_helpers.py +284 -0
  10. {arthexis-0.1.17 → arthexis-0.1.28}/config/urls.py +69 -1
  11. {arthexis-0.1.17 → arthexis-0.1.28}/core/admin.py +751 -479
  12. {arthexis-0.1.17 → arthexis-0.1.28}/core/apps.py +6 -8
  13. {arthexis-0.1.17 → arthexis-0.1.28}/core/auto_upgrade.py +19 -4
  14. {arthexis-0.1.17 → arthexis-0.1.28}/core/backends.py +11 -3
  15. arthexis-0.1.28/core/celery_utils.py +73 -0
  16. {arthexis-0.1.17 → arthexis-0.1.28}/core/environment.py +4 -5
  17. {arthexis-0.1.17 → arthexis-0.1.28}/core/models.py +1787 -231
  18. {arthexis-0.1.17 → arthexis-0.1.28}/core/notifications.py +1 -1
  19. {arthexis-0.1.17 → arthexis-0.1.28}/core/reference_utils.py +10 -11
  20. {arthexis-0.1.17 → arthexis-0.1.28}/core/release.py +0 -5
  21. {arthexis-0.1.17 → arthexis-0.1.28}/core/sigil_builder.py +2 -2
  22. {arthexis-0.1.17 → arthexis-0.1.28}/core/sigil_resolver.py +1 -66
  23. {arthexis-0.1.17 → arthexis-0.1.28}/core/system.py +284 -3
  24. arthexis-0.1.28/core/tasks.py +713 -0
  25. {arthexis-0.1.17 → arthexis-0.1.28}/core/test_system_info.py +43 -5
  26. {arthexis-0.1.17 → arthexis-0.1.28}/core/tests.py +394 -18
  27. {arthexis-0.1.17 → arthexis-0.1.28}/core/user_data.py +94 -21
  28. {arthexis-0.1.17 → arthexis-0.1.28}/core/views.py +292 -181
  29. {arthexis-0.1.17 → arthexis-0.1.28}/nodes/admin.py +904 -67
  30. {arthexis-0.1.17 → arthexis-0.1.28}/nodes/apps.py +12 -1
  31. {arthexis-0.1.17 → arthexis-0.1.28}/nodes/feature_checks.py +30 -0
  32. {arthexis-0.1.17 → arthexis-0.1.28}/nodes/models.py +800 -127
  33. {arthexis-0.1.17 → arthexis-0.1.28}/nodes/rfid_sync.py +1 -1
  34. arthexis-0.1.28/nodes/tasks.py +141 -0
  35. {arthexis-0.1.17 → arthexis-0.1.28}/nodes/tests.py +1381 -152
  36. arthexis-0.1.28/nodes/urls.py +29 -0
  37. {arthexis-0.1.17 → arthexis-0.1.28}/nodes/utils.py +51 -3
  38. arthexis-0.1.28/nodes/views.py +1913 -0
  39. arthexis-0.1.28/ocpp/admin.py +2766 -0
  40. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/consumers.py +839 -34
  41. arthexis-0.1.28/ocpp/models.py +1883 -0
  42. arthexis-0.1.28/ocpp/network.py +398 -0
  43. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/store.py +411 -43
  44. arthexis-0.1.28/ocpp/tasks.py +443 -0
  45. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/test_export_import.py +1 -0
  46. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/test_rfid.py +146 -3
  47. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/tests.py +1805 -106
  48. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/transactions_io.py +9 -1
  49. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/urls.py +8 -3
  50. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/views.py +677 -48
  51. {arthexis-0.1.17 → arthexis-0.1.28}/pages/admin.py +262 -30
  52. arthexis-0.1.28/pages/apps.py +45 -0
  53. {arthexis-0.1.17 → arthexis-0.1.28}/pages/context_processors.py +28 -21
  54. {arthexis-0.1.17 → arthexis-0.1.28}/pages/defaults.py +1 -1
  55. {arthexis-0.1.17 → arthexis-0.1.28}/pages/forms.py +31 -8
  56. {arthexis-0.1.17 → arthexis-0.1.28}/pages/middleware.py +6 -2
  57. {arthexis-0.1.17 → arthexis-0.1.28}/pages/models.py +86 -2
  58. {arthexis-0.1.17 → arthexis-0.1.28}/pages/module_defaults.py +5 -5
  59. arthexis-0.1.28/pages/site_config.py +137 -0
  60. {arthexis-0.1.17 → arthexis-0.1.28}/pages/tests.py +1037 -138
  61. {arthexis-0.1.17 → arthexis-0.1.28}/pages/urls.py +14 -2
  62. arthexis-0.1.28/pages/utils.py +93 -0
  63. {arthexis-0.1.17 → arthexis-0.1.28}/pages/views.py +622 -56
  64. arthexis-0.1.28/pyproject.toml +26 -0
  65. arthexis-0.1.28/tests/test_admin_client_report.py +221 -0
  66. arthexis-0.1.28/tests/test_admin_system_stop.py +142 -0
  67. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_allowed_hosts_hostname.py +0 -1
  68. arthexis-0.1.28/tests/test_auto_upgrade_scheduler.py +90 -0
  69. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_celery_no_debug.py +1 -0
  70. arthexis-0.1.28/tests/test_client_report_form.py +84 -0
  71. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_client_report_generation.py +99 -12
  72. arthexis-0.1.28/tests/test_client_report_pdf.py +71 -0
  73. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_client_report_schedule.py +53 -6
  74. arthexis-0.1.28/tests/test_csrf_origin_subnet.py +138 -0
  75. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_email_inbox.py +1 -1
  76. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_email_profiles.py +0 -3
  77. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_email_transaction.py +1 -1
  78. arthexis-0.1.28/tests/test_env_refresh_dependency_conflict.py +114 -0
  79. arthexis-0.1.28/tests/test_env_refresh_pip.py +64 -0
  80. arthexis-0.1.28/tests/test_fixture_presence.py +65 -0
  81. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_install_script.py +27 -18
  82. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_invitation_login_view.py +32 -0
  83. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_localhost_admin_backend.py +14 -0
  84. arthexis-0.1.28/tests/test_model_verbose_name_capitalization.py +68 -0
  85. arthexis-0.1.28/tests/test_network_setup_interactive.py +78 -0
  86. arthexis-0.1.28/tests/test_nginx_config.py +26 -0
  87. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_node_info_view.py +20 -0
  88. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_odoo_product.py +38 -114
  89. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_odoo_profile.py +4 -4
  90. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_odoo_profile_admin.py +20 -0
  91. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_odoo_quote_report.py +1 -1
  92. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_power_admin_group.py +1 -1
  93. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_profile_inline_deletion.py +2 -44
  94. arthexis-0.1.28/tests/test_quality_drop.py +138 -0
  95. arthexis-0.1.28/tests/test_readme_assets.py +87 -0
  96. arthexis-0.1.28/tests/test_readme_editor.py +58 -0
  97. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_register_site_apps_command.py +1 -1
  98. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_release_build_flow.py +0 -35
  99. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_release_logs.py +8 -1
  100. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_release_progress.py +213 -112
  101. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_release_progress_pre_release_integration.py +10 -33
  102. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_release_push.py +62 -0
  103. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_release_tasks.py +118 -4
  104. arthexis-0.1.28/tests/test_render_nginx_default.py +52 -0
  105. arthexis-0.1.28/tests/test_render_nginx_sites.py +77 -0
  106. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_rfid_admin_print_labels.py +84 -1
  107. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_rfid_admin_scan_csrf.py +4 -0
  108. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_rfid_always_on.py +3 -0
  109. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_rfid_backend.py +46 -1
  110. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_seed_data.py +95 -6
  111. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_send_invite_command.py +1 -1
  112. arthexis-0.1.28/tests/test_settings_helpers.py +166 -0
  113. arthexis-0.1.28/tests/test_settings_mcp_port.py +35 -0
  114. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_shell_scripts.py +17 -0
  115. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_sigil_resolution.py +2 -66
  116. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_sites_utils.py +1 -1
  117. arthexis-0.1.28/tests/test_stop_script.py +100 -0
  118. arthexis-0.1.28/tests/test_suite_gateway.py +120 -0
  119. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_switch_role_script.py +0 -17
  120. arthexis-0.1.28/tests/test_system_changelog_report.py +114 -0
  121. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_temp_passwords.py +30 -1
  122. arthexis-0.1.28/tests/test_transaction_meter_readings.py +113 -0
  123. arthexis-0.1.28/tests/test_uninstall_script.py +9 -0
  124. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_urls_autodiscover.py +1 -1
  125. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_user_data_admin.py +19 -5
  126. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_version_endpoint.py +15 -0
  127. arthexis-0.1.28/tests/test_ws_script.py +19 -0
  128. arthexis-0.1.17/config/middleware.py +0 -25
  129. arthexis-0.1.17/config/settings_helpers.py +0 -109
  130. arthexis-0.1.17/core/tasks.py +0 -406
  131. arthexis-0.1.17/core/workgroup_urls.py +0 -17
  132. arthexis-0.1.17/core/workgroup_views.py +0 -94
  133. arthexis-0.1.17/nodes/tasks.py +0 -46
  134. arthexis-0.1.17/nodes/urls.py +0 -15
  135. arthexis-0.1.17/nodes/views.py +0 -683
  136. arthexis-0.1.17/ocpp/admin.py +0 -1030
  137. arthexis-0.1.17/ocpp/models.py +0 -932
  138. arthexis-0.1.17/ocpp/tasks.py +0 -185
  139. arthexis-0.1.17/pages/apps.py +0 -10
  140. arthexis-0.1.17/pages/utils.py +0 -23
  141. arthexis-0.1.17/pyproject.toml +0 -26
  142. arthexis-0.1.17/tests/test_admin_client_report.py +0 -117
  143. arthexis-0.1.17/tests/test_admin_system_stop.py +0 -63
  144. arthexis-0.1.17/tests/test_assistant_data_api.py +0 -32
  145. arthexis-0.1.17/tests/test_assistant_profile_admin.py +0 -168
  146. arthexis-0.1.17/tests/test_assistant_profile_api.py +0 -49
  147. arthexis-0.1.17/tests/test_auto_upgrade_scheduler.py +0 -41
  148. arthexis-0.1.17/tests/test_birthday_greetings.py +0 -30
  149. arthexis-0.1.17/tests/test_csrf_origin_subnet.py +0 -21
  150. arthexis-0.1.17/tests/test_env_refresh_pip.py +0 -28
  151. arthexis-0.1.17/tests/test_fixture_presence.py +0 -21
  152. arthexis-0.1.17/tests/test_mcp_asgi.py +0 -55
  153. arthexis-0.1.17/tests/test_mcp_auto_start.py +0 -170
  154. arthexis-0.1.17/tests/test_mcp_process.py +0 -43
  155. arthexis-0.1.17/tests/test_mcp_sigil_server.py +0 -182
  156. arthexis-0.1.17/tests/test_mcp_sigil_server_command.py +0 -42
  157. arthexis-0.1.17/tests/test_model_verbose_name_capitalization.py +0 -31
  158. arthexis-0.1.17/tests/test_network_setup_interactive.py +0 -31
  159. arthexis-0.1.17/tests/test_settings_helpers.py +0 -70
  160. arthexis-0.1.17/tests/test_system_changelog_report.py +0 -45
  161. arthexis-0.1.17/tests/test_uninstall_script.py +0 -20
  162. {arthexis-0.1.17 → arthexis-0.1.28}/LICENSE +0 -0
  163. {arthexis-0.1.17 → arthexis-0.1.28}/arthexis.egg-info/dependency_links.txt +0 -0
  164. {arthexis-0.1.17 → arthexis-0.1.28}/arthexis.egg-info/top_level.txt +0 -0
  165. {arthexis-0.1.17 → arthexis-0.1.28}/config/__init__.py +0 -0
  166. {arthexis-0.1.17 → arthexis-0.1.28}/config/active_app.py +0 -0
  167. {arthexis-0.1.17 → arthexis-0.1.28}/config/auth_app.py +0 -0
  168. {arthexis-0.1.17 → arthexis-0.1.28}/config/celery.py +0 -0
  169. {arthexis-0.1.17 → arthexis-0.1.28}/config/context_processors.py +0 -0
  170. {arthexis-0.1.17 → arthexis-0.1.28}/config/horologia_app.py +0 -0
  171. {arthexis-0.1.17 → arthexis-0.1.28}/config/loadenv.py +0 -0
  172. {arthexis-0.1.17 → arthexis-0.1.28}/config/logging.py +0 -0
  173. {arthexis-0.1.17 → arthexis-0.1.28}/config/offline.py +0 -0
  174. {arthexis-0.1.17 → arthexis-0.1.28}/config/wsgi.py +0 -0
  175. {arthexis-0.1.17 → arthexis-0.1.28}/core/__init__.py +0 -0
  176. {arthexis-0.1.17 → arthexis-0.1.28}/core/admin_history.py +0 -0
  177. {arthexis-0.1.17 → arthexis-0.1.28}/core/admindocs.py +0 -0
  178. {arthexis-0.1.17 → arthexis-0.1.28}/core/changelog.py +0 -0
  179. {arthexis-0.1.17 → arthexis-0.1.28}/core/entity.py +0 -0
  180. {arthexis-0.1.17 → arthexis-0.1.28}/core/fields.py +0 -0
  181. {arthexis-0.1.17 → arthexis-0.1.28}/core/form_fields.py +0 -0
  182. {arthexis-0.1.17 → arthexis-0.1.28}/core/github_helper.py +0 -0
  183. {arthexis-0.1.17 → arthexis-0.1.28}/core/github_issues.py +0 -0
  184. {arthexis-0.1.17 → arthexis-0.1.28}/core/github_repos.py +0 -0
  185. {arthexis-0.1.17 → arthexis-0.1.28}/core/lcd_screen.py +0 -0
  186. {arthexis-0.1.17 → arthexis-0.1.28}/core/liveupdate.py +0 -0
  187. {arthexis-0.1.17 → arthexis-0.1.28}/core/log_paths.py +0 -0
  188. {arthexis-0.1.17 → arthexis-0.1.28}/core/mailer.py +0 -0
  189. {arthexis-0.1.17 → arthexis-0.1.28}/core/middleware.py +0 -0
  190. {arthexis-0.1.17 → arthexis-0.1.28}/core/public_wifi.py +0 -0
  191. {arthexis-0.1.17 → arthexis-0.1.28}/core/rfid_import_export.py +0 -0
  192. {arthexis-0.1.17 → arthexis-0.1.28}/core/sigil_context.py +0 -0
  193. {arthexis-0.1.17 → arthexis-0.1.28}/core/temp_passwords.py +0 -0
  194. {arthexis-0.1.17 → arthexis-0.1.28}/core/tests_liveupdate.py +0 -0
  195. {arthexis-0.1.17 → arthexis-0.1.28}/core/urls.py +0 -0
  196. {arthexis-0.1.17 → arthexis-0.1.28}/core/widgets.py +0 -0
  197. {arthexis-0.1.17 → arthexis-0.1.28}/nodes/__init__.py +0 -0
  198. {arthexis-0.1.17 → arthexis-0.1.28}/nodes/backends.py +0 -0
  199. {arthexis-0.1.17 → arthexis-0.1.28}/nodes/dns.py +0 -0
  200. {arthexis-0.1.17 → arthexis-0.1.28}/nodes/lcd.py +0 -0
  201. {arthexis-0.1.17 → arthexis-0.1.28}/nodes/reports.py +0 -0
  202. {arthexis-0.1.17 → arthexis-0.1.28}/nodes/signals.py +0 -0
  203. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/__init__.py +0 -0
  204. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/apps.py +0 -0
  205. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/evcs.py +0 -0
  206. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/evcs_discovery.py +0 -0
  207. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/reference_utils.py +0 -0
  208. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/routing.py +0 -0
  209. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/simulator.py +0 -0
  210. {arthexis-0.1.17 → arthexis-0.1.28}/ocpp/status_display.py +0 -0
  211. {arthexis-0.1.17 → arthexis-0.1.28}/pages/__init__.py +0 -0
  212. {arthexis-0.1.17 → arthexis-0.1.28}/pages/checks.py +0 -0
  213. {arthexis-0.1.17 → arthexis-0.1.28}/pages/tasks.py +0 -0
  214. {arthexis-0.1.17 → arthexis-0.1.28}/setup.cfg +0 -0
  215. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_acronym_capitalization.py +0 -0
  216. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_admin_doc_commands.py +0 -0
  217. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_admin_doc_model_groups.py +0 -0
  218. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_admin_history.py +0 -0
  219. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_admin_index_actions.py +0 -0
  220. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_admin_model_graph.py +0 -0
  221. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_admin_object_history.py +0 -0
  222. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_admin_profile_link.py +0 -0
  223. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_api_login_required.py +0 -0
  224. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_awg_admin.py +0 -0
  225. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_benchmark_command.py +0 -0
  226. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_build_pypi_command.py +0 -0
  227. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_changelog_builder.py +0 -0
  228. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_check_admin_command.py +0 -0
  229. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_check_migrations_script.py +0 -0
  230. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_check_pypi_command.py +0 -0
  231. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_clean_release_logs_command.py +0 -0
  232. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_csrf_failure.py +0 -0
  233. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_dist_cleanup.py +0 -0
  234. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_email_collector.py +0 -0
  235. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_email_inbox_admin.py +0 -0
  236. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_email_inbox_search_action.py +0 -0
  237. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_email_outbox_admin.py +0 -0
  238. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_env_refresh_clean.py +0 -0
  239. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_env_refresh_unlink.py +0 -0
  240. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_experience_admin_group.py +0 -0
  241. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_footer_no_references.py +0 -0
  242. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_footer_presence.py +0 -0
  243. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_footer_render.py +0 -0
  244. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_git_checks.py +0 -0
  245. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_github_issue_reporting.py +0 -0
  246. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_language_switch.py +0 -0
  247. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_lcd_check_command.py +0 -0
  248. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_lcd_smbus2.py +0 -0
  249. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_log_paths.py +0 -0
  250. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_login_view_no_site.py +0 -0
  251. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_manage_debug_flag.py +0 -0
  252. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_manuals.py +0 -0
  253. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_message_command.py +0 -0
  254. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_migrations.py +0 -0
  255. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_notifications_fallback.py +0 -0
  256. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_notify_command.py +0 -0
  257. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_ocpp_session_lock.py +0 -0
  258. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_offline.py +0 -0
  259. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_package_admin_next_release.py +0 -0
  260. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_pypi_check.py +0 -0
  261. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_pypi_token.py +0 -0
  262. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_readme_language.py +0 -0
  263. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_reference_qr_code.py +0 -0
  264. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_reference_transaction_uuid.py +0 -0
  265. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_release_build.py +0 -0
  266. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_release_checklist.py +0 -0
  267. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_release_manager_admin.py +0 -0
  268. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_release_packages.py +0 -0
  269. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_request_invite.py +0 -0
  270. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_rfid_admin_reference_clear.py +0 -0
  271. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_rfid_background_reader.py +0 -0
  272. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_rfid_client_report.py +0 -0
  273. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_rfid_watch_command.py +0 -0
  274. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_role_marker_filtering.py +0 -0
  275. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_show_leads_command.py +0 -0
  276. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_sigil_builder.py +0 -0
  277. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_social_profile.py +0 -0
  278. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_staff_login_net_message.py +0 -0
  279. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_staff_required_decorator.py +0 -0
  280. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_totp_admin.py +0 -0
  281. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_totp_backend.py +0 -0
  282. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_update_fixtures_command.py +0 -0
  283. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_upgrade_report.py +0 -0
  284. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_version_file.py +0 -0
  285. {arthexis-0.1.17 → arthexis-0.1.28}/tests/test_vscode_manage.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arthexis
3
- Version: 0.1.17
3
+ Version: 0.1.28
4
4
  Summary: Power & Energy Infrastructure
5
5
  Author-email: "Rafael J. Guillén-Osorio" <tecnologia@gelectriic.com>
6
6
  License-Expression: GPL-3.0-only
@@ -15,7 +15,7 @@ Requires-Dist: amqp==5.3.1
15
15
  Requires-Dist: annotated-types==0.7.0
16
16
  Requires-Dist: anyio==4.9.0
17
17
  Requires-Dist: asgiref==3.10.0
18
- Requires-Dist: atproto==0.0.61
18
+ Requires-Dist: atproto<0.1.0,>=0.0.63
19
19
  Requires-Dist: attrs==25.3.0
20
20
  Requires-Dist: autobahn==24.4.2
21
21
  Requires-Dist: Automat==25.4.16
@@ -26,14 +26,14 @@ Requires-Dist: celery==5.5.3
26
26
  Requires-Dist: certifi==2025.7.14
27
27
  Requires-Dist: cffi==2.0.0
28
28
  Requires-Dist: channels==4.1.0
29
- Requires-Dist: charset-normalizer==3.4.2
29
+ Requires-Dist: charset-normalizer==3.4.4
30
30
  Requires-Dist: click==8.2.1
31
31
  Requires-Dist: click-didyoumean==0.3.1
32
32
  Requires-Dist: click-plugins==1.1.1.2
33
33
  Requires-Dist: click-repl==0.3.0
34
34
  Requires-Dist: colorama==0.4.6
35
35
  Requires-Dist: constantly==23.10.4
36
- Requires-Dist: cron-descriptor==1.4.5
36
+ Requires-Dist: cron-descriptor==2.0.6
37
37
  Requires-Dist: cryptography==45.0.5
38
38
  Requires-Dist: daphne==4.2.1
39
39
  Requires-Dist: diff-match-patch==20241021
@@ -41,47 +41,48 @@ Requires-Dist: defusedxml==0.7.1
41
41
  Requires-Dist: Django==5.2.7
42
42
  Requires-Dist: django-celery-beat==2.8.1
43
43
  Requires-Dist: django-debug-toolbar==6.0.0
44
- Requires-Dist: django-import-export==4.3.9
44
+ Requires-Dist: django-import-export==4.3.12
45
45
  Requires-Dist: django-object-actions==5.0.0
46
- Requires-Dist: django-otp==1.5.4
46
+ Requires-Dist: django-otp==1.6.3
47
47
  Requires-Dist: django-timezone-field==7.1
48
48
  Requires-Dist: dnspython==2.7.0
49
49
  Requires-Dist: docutils==0.22.2
50
50
  Requires-Dist: gpiozero==2.0.1; sys_platform == "linux"
51
+ Requires-Dist: graphene-django==3.2.2
51
52
  Requires-Dist: graphviz==0.21
53
+ Requires-Dist: geckodriver-autoinstaller==0.1.0
52
54
  Requires-Dist: h11==0.16.0
53
55
  Requires-Dist: httpcore==1.0.9
54
56
  Requires-Dist: httpx==0.28.1
55
57
  Requires-Dist: hyperlink==21.0.0
56
- Requires-Dist: idna==3.10
58
+ Requires-Dist: idna==3.11
57
59
  Requires-Dist: incremental==24.7.2
58
60
  Requires-Dist: kombu==5.5.4
59
- Requires-Dist: libipld==3.1.1
60
- Requires-Dist: Markdown==3.8.2
61
+ Requires-Dist: libipld==3.2.0
62
+ Requires-Dist: Markdown==3.9
61
63
  Requires-Dist: mdx_truly_sane_lists==1.3
62
- Requires-Dist: mcp==1.16.0
63
64
  Requires-Dist: mfrc522==0.0.7; sys_platform == "linux"
64
65
  Requires-Dist: outcome==1.3.0.post0
65
66
  Requires-Dist: packaging==25.0
66
- Requires-Dist: pillow==11.3.0
67
- Requires-Dist: prompt_toolkit==3.0.51
68
- Requires-Dist: psutil==5.9.8
67
+ Requires-Dist: pillow==12.0.0
68
+ Requires-Dist: prompt_toolkit==3.0.52
69
+ Requires-Dist: psutil==7.1.3
69
70
  Requires-Dist: psycopg==3.2.9
70
- Requires-Dist: psycopg-binary==3.2.9
71
+ Requires-Dist: psycopg-binary==3.2.12
71
72
  Requires-Dist: pyasn1==0.6.1
72
73
  Requires-Dist: pyasn1_modules==0.4.2
73
74
  Requires-Dist: pycparser==2.22
74
- Requires-Dist: pydantic==2.11.7
75
- Requires-Dist: pydantic_core==2.33.2
75
+ Requires-Dist: pydantic==2.12.3
76
+ Requires-Dist: pydantic_core==2.41.4
76
77
  Requires-Dist: pyOpenSSL==25.1.0
77
- Requires-Dist: pyperclip==1.9.0
78
+ Requires-Dist: pyperclip==1.11.0
78
79
  Requires-Dist: PySocks==1.7.1
79
80
  Requires-Dist: python-crontab==3.3.0
80
81
  Requires-Dist: python-dateutil==2.9.0.post0
81
82
  Requires-Dist: python-dotenv==1.1.1
82
83
  Requires-Dist: qrcode==8.2
83
- Requires-Dist: redis==5.0.8
84
- Requires-Dist: reportlab==4.2.2
84
+ Requires-Dist: redis==7.0.1
85
+ Requires-Dist: reportlab==4.4.4
85
86
  Requires-Dist: requests==2.32.5
86
87
  Requires-Dist: selenium==4.34.2
87
88
  Requires-Dist: service-identity==24.2.0
@@ -98,20 +99,20 @@ Requires-Dist: trio==0.30.0
98
99
  Requires-Dist: trio-websocket==0.12.2
99
100
  Requires-Dist: Twisted==25.5.0
100
101
  Requires-Dist: twine==6.1.0
101
- Requires-Dist: txaio==25.6.1
102
- Requires-Dist: typing-inspection==0.4.1
102
+ Requires-Dist: txaio==25.9.2
103
+ Requires-Dist: typing-inspection==0.4.2
103
104
  Requires-Dist: typing_extensions==4.14.1
104
105
  Requires-Dist: tzdata==2025.2
105
106
  Requires-Dist: urllib3==2.5.0
106
107
  Requires-Dist: vine==5.1.0
107
- Requires-Dist: wcwidth==0.2.13
108
+ Requires-Dist: wcwidth==0.2.14
108
109
  Requires-Dist: webencodings==0.5.1
109
110
  Requires-Dist: websocket-client==1.8.0
110
- Requires-Dist: websockets==13.1
111
- Requires-Dist: whitenoise==6.9.0
111
+ Requires-Dist: websockets==15.0.1
112
+ Requires-Dist: whitenoise==6.11.0
112
113
  Requires-Dist: plyer==2.1.0; sys_platform == "win32"
113
114
  Requires-Dist: wsproto==1.2.0
114
- Requires-Dist: zope.interface==7.2
115
+ Requires-Dist: zope.interface==8.0.1
115
116
  Dynamic: license-file
116
117
 
117
118
  # Arthexis Constellation
@@ -125,19 +126,43 @@ Arthexis Constellation is a [narrative-driven](https://en.wikipedia.org/wiki/Nar
125
126
 
126
127
  ## Current Features
127
128
 
128
- - Compatible with the [Open Charge Point Protocol (OCPP) 1.6](https://www.openchargealliance.org/protocols/ocpp-16/) central system, handling:
129
- - Lifecycle & sessions
130
- - `BootNotification`
131
- - `Heartbeat`
132
- - `StatusNotification`
133
- - `StartTransaction`
134
- - `StopTransaction`
135
- - Access & metering
136
- - `Authorize`
137
- - `MeterValues`
138
- - Maintenance & firmware
139
- - `DiagnosticsStatusNotification`
140
- - `FirmwareStatusNotification`
129
+ - Compatible with the [Open Charge Point Protocol (OCPP) 1.6](https://www.openchargealliance.org/protocols/ocpp-16/) central system. Supported actions are summarized below.
130
+
131
+ **Charge point → CSMS**
132
+
133
+ | Action | What we do |
134
+ | --- | --- |
135
+ | `Authorize` | Validate RFID or token authorization requests before a session starts. |
136
+ | `BootNotification` | Register the charge point and update identity, firmware, and status details. |
137
+ | `DataTransfer` | Accept vendor-specific payloads and record the results. |
138
+ | `DiagnosticsStatusNotification` | Track the progress of diagnostic uploads kicked off from the back office. |
139
+ | `FirmwareStatusNotification` | Track firmware update lifecycle events from charge points. |
140
+ | `Heartbeat` | Keep the websocket session alive and update last-seen timestamps. |
141
+ | `MeterValues` | Persist periodic energy and power readings while a transaction is active. |
142
+ | `StartTransaction` | Create charging sessions with initial meter values and identification data. |
143
+ | `StatusNotification` | Reflect connector availability and fault states in real time. |
144
+ | `StopTransaction` | Close charging sessions, capturing closing meter values and stop reasons. |
145
+
146
+ **CSMS → Charge point**
147
+
148
+ | Action | What we do |
149
+ | --- | --- |
150
+ | `CancelReservation` | Withdraw pending reservations and release connectors directly from the control center. |
151
+ | `ChangeAvailability` | Switch connectors or the whole station between operative and inoperative states. |
152
+ | `DataTransfer` | Send vendor-specific commands and log the charge point response. |
153
+ | `GetConfiguration` | Poll the device for the current values of tracked configuration keys. |
154
+ | `GetLocalListVersion` | Retrieve the current RFID whitelist version and synchronize entries reported by the charge point. |
155
+ | `RemoteStartTransaction` | Initiate a charging session remotely for an identified customer or token. |
156
+ | `RemoteStopTransaction` | Terminate active charging sessions from the control center. |
157
+ | `ReserveNow` | Reserve connectors for upcoming sessions with automatic connector selection and confirmation tracking. |
158
+ | `Reset` | Request a soft or hard reboot to recover from faults. |
159
+ | `SendLocalList` | Publish released and approved RFIDs as the charge point's local authorization list. |
160
+ | `TriggerMessage` | Ask the device to send an immediate update (for example status or diagnostics). |
161
+ | `UpdateFirmware` | Deliver firmware packages to chargers with secure download tokens and track installation responses. |
162
+
163
+ **OCPP 1.6 roadmap.** The following catalogue actions are in our backlog: `ChangeConfiguration`, `ClearCache`, `ClearChargingProfile`, `GetCompositeSchedule`, `GetDiagnostics`, `SetChargingProfile`, `UnlockConnector`.
164
+
165
+ - Charge point reservations with automated connector assignment, energy account and RFID linkage, EVCS confirmation tracking, and control-center cancellation support.
141
166
  - [API](https://en.wikipedia.org/wiki/API) integration with [Odoo](https://www.odoo.com/), syncing:
142
167
  - Employee credentials via `res.users`
143
168
  - Product catalog lookups via `product.product`
@@ -171,7 +196,7 @@ Arthexis Constellation ships in four node roles tailored to different deployment
171
196
  <td valign="top"><strong>Multi-Device Edge, Network &amp; Data Acquisition</strong><br />Features: AP Router, Celery Queue, NGINX Server, RFID Scanner</td>
172
197
  </tr>
173
198
  <tr>
174
- <td valign="top"><strong>Constellation</strong></td>
199
+ <td valign="top"><strong>Watchtower</strong></td>
175
200
  <td valign="top"><strong>Multi-User Cloud &amp; Orchestration</strong><br />Features: Celery Queue, NGINX Server</td>
176
201
  </tr>
177
202
  </tbody>
@@ -184,7 +209,7 @@ Arthexis Constellation ships in four node roles tailored to different deployment
184
209
  - **[Windows](https://en.wikipedia.org/wiki/Microsoft_Windows)**: open [PowerShell](https://learn.microsoft.com/powershell/) or [Git Bash](https://gitforwindows.org/) and run the same command.
185
210
 
186
211
  ### 2. Start and stop
187
- Terminal nodes can start directly with the scripts below without installing; Control, Satellite, and Constellation roles require installation first. Both approaches listen on [`http://localhost:8000/`](http://localhost:8000/) by default.
212
+ Terminal nodes can start directly with the scripts below without installing; Control, Satellite, and Watchtower roles require installation first. Both approaches listen on [`http://localhost:8888/`](http://localhost:8888/) by default.
188
213
 
189
214
  - **[VS Code](https://code.visualstudio.com/)**
190
215
  - Open the folder and go to the **Run and Debug** panel (`Ctrl+Shift+D`).
@@ -204,18 +229,47 @@ Terminal nodes can start directly with the scripts below without installing; Con
204
229
  - `--constellation` – enables the multi-user orchestration stack.
205
230
  - Use `./install.sh --help` to list every available flag if you need to customize the node beyond the role defaults.
206
231
  - Upgrade with [`./upgrade.sh`](upgrade.sh).
232
+ - Consult the [Install & Lifecycle Scripts Manual](docs/development/install-lifecycle-scripts-manual.md) for complete flag descriptions and operational notes.
233
+ - Review the [Upgrade Guide](docs/UPGRADE.md) for manual steps required after releases that stop automating specific migrations.
207
234
 
208
235
  - **Windows:**
209
236
  - Run [`install.bat`](install.bat) to install (Terminal role) and [`upgrade.bat`](upgrade.bat) to upgrade.
210
237
  - Installation is not required to start in Terminal mode (the default).
211
238
 
212
239
  ### 4. Administration
213
- Visit [`http://localhost:8000/admin/`](http://localhost:8000/admin/) for the [Django admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/) and [`http://localhost:8000/admindocs/`](http://localhost:8000/admindocs/) for the [admindocs](https://docs.djangoproject.com/en/stable/ref/contrib/admin/admindocs/). Use `--port` with the start scripts or installer when you need to expose a different port.
240
+ Visit [`http://localhost:8888/admin/`](http://localhost:8888/admin/) for the [Django admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/) and [`http://localhost:8888/admindocs/`](http://localhost:8888/admindocs/) for the [admindocs](https://docs.djangoproject.com/en/stable/ref/contrib/admin/admindocs/). Use `--port` with the start scripts or installer when you need to expose a different port.
241
+
242
+ ## Sigils
243
+
244
+ Sigils are bracketed tokens such as `[ENV.SMTP_PASSWORD]` that Arthexis expands at runtime. They make it possible to reference configuration secrets, system metadata, or records stored in other apps without duplicating values across the project.
245
+
246
+ ### Syntax at a glance
247
+
248
+ - `[PREFIX.KEY]` &mdash; returns a field or attribute. Hyphens and casing are normalized automatically.
249
+ - `[PREFIX=IDENTIFIER.FIELD]` &mdash; selects a specific record by primary key or any unique field.
250
+ - `[PREFIX:FIELD=VALUE.ATTRIBUTE]` &mdash; filters by a custom field instead of the primary key.
251
+ - `[PREFIX.FIELD=[OTHER.SIGIL]]` &mdash; nests sigils so the value after `=` resolves before the outer token.
252
+ - `[PREFIX]` &mdash; for entity prefixes, returns the serialized object in JSON; for configuration prefixes, resolves to an empty string when the key is missing.
253
+
254
+ The platform ships with three configuration prefixes:
255
+
256
+ - `ENV` reads environment variables.
257
+ - `CONF` reads Django settings.
258
+ - `SYS` exposes computed system information such as build metadata.
259
+
260
+ Additional prefixes are defined through **Sigil Roots**, which map a short code (for example `ROLE`, `ODOO`, or `USER`) to a Django model. You can review them from **Admin &rarr; Sigil Builder** (`/admin/sigil-builder/`), where a test console is also available.
261
+
262
+ Unknown prefixes remain in place (e.g. `[UNKNOWN.VALUE]`) and are logged.
214
263
 
215
264
  ## Support
216
265
 
217
266
  Contact us at [tecnologia@gelectriic.com](mailto:tecnologia@gelectriic.com) or visit our [web page](https://www.gelectriic.com/) for [professional services](https://en.wikipedia.org/wiki/Professional_services) and [commercial support](https://en.wikipedia.org/wiki/Technical_support).
218
267
 
268
+ ## Project Guidelines
269
+
270
+ - [AGENTS](AGENTS.md) – operating handbook for repository workflows, testing, and release management.
271
+ - [DESIGN](DESIGN.md) – visual, UX, and branding guidance that all interfaces must follow.
272
+
219
273
  ## About Me
220
274
 
221
275
  > "What, you want to know about me too? Well, I enjoy [developing software](https://en.wikipedia.org/wiki/Software_development), [role-playing games](https://en.wikipedia.org/wiki/Role-playing_game), long walks on the [beach](https://en.wikipedia.org/wiki/Beach) and a fourth secret thing."
@@ -9,19 +9,43 @@ Arthexis Constellation is a [narrative-driven](https://en.wikipedia.org/wiki/Nar
9
9
 
10
10
  ## Current Features
11
11
 
12
- - Compatible with the [Open Charge Point Protocol (OCPP) 1.6](https://www.openchargealliance.org/protocols/ocpp-16/) central system, handling:
13
- - Lifecycle & sessions
14
- - `BootNotification`
15
- - `Heartbeat`
16
- - `StatusNotification`
17
- - `StartTransaction`
18
- - `StopTransaction`
19
- - Access & metering
20
- - `Authorize`
21
- - `MeterValues`
22
- - Maintenance & firmware
23
- - `DiagnosticsStatusNotification`
24
- - `FirmwareStatusNotification`
12
+ - Compatible with the [Open Charge Point Protocol (OCPP) 1.6](https://www.openchargealliance.org/protocols/ocpp-16/) central system. Supported actions are summarized below.
13
+
14
+ **Charge point → CSMS**
15
+
16
+ | Action | What we do |
17
+ | --- | --- |
18
+ | `Authorize` | Validate RFID or token authorization requests before a session starts. |
19
+ | `BootNotification` | Register the charge point and update identity, firmware, and status details. |
20
+ | `DataTransfer` | Accept vendor-specific payloads and record the results. |
21
+ | `DiagnosticsStatusNotification` | Track the progress of diagnostic uploads kicked off from the back office. |
22
+ | `FirmwareStatusNotification` | Track firmware update lifecycle events from charge points. |
23
+ | `Heartbeat` | Keep the websocket session alive and update last-seen timestamps. |
24
+ | `MeterValues` | Persist periodic energy and power readings while a transaction is active. |
25
+ | `StartTransaction` | Create charging sessions with initial meter values and identification data. |
26
+ | `StatusNotification` | Reflect connector availability and fault states in real time. |
27
+ | `StopTransaction` | Close charging sessions, capturing closing meter values and stop reasons. |
28
+
29
+ **CSMS → Charge point**
30
+
31
+ | Action | What we do |
32
+ | --- | --- |
33
+ | `CancelReservation` | Withdraw pending reservations and release connectors directly from the control center. |
34
+ | `ChangeAvailability` | Switch connectors or the whole station between operative and inoperative states. |
35
+ | `DataTransfer` | Send vendor-specific commands and log the charge point response. |
36
+ | `GetConfiguration` | Poll the device for the current values of tracked configuration keys. |
37
+ | `GetLocalListVersion` | Retrieve the current RFID whitelist version and synchronize entries reported by the charge point. |
38
+ | `RemoteStartTransaction` | Initiate a charging session remotely for an identified customer or token. |
39
+ | `RemoteStopTransaction` | Terminate active charging sessions from the control center. |
40
+ | `ReserveNow` | Reserve connectors for upcoming sessions with automatic connector selection and confirmation tracking. |
41
+ | `Reset` | Request a soft or hard reboot to recover from faults. |
42
+ | `SendLocalList` | Publish released and approved RFIDs as the charge point's local authorization list. |
43
+ | `TriggerMessage` | Ask the device to send an immediate update (for example status or diagnostics). |
44
+ | `UpdateFirmware` | Deliver firmware packages to chargers with secure download tokens and track installation responses. |
45
+
46
+ **OCPP 1.6 roadmap.** The following catalogue actions are in our backlog: `ChangeConfiguration`, `ClearCache`, `ClearChargingProfile`, `GetCompositeSchedule`, `GetDiagnostics`, `SetChargingProfile`, `UnlockConnector`.
47
+
48
+ - Charge point reservations with automated connector assignment, energy account and RFID linkage, EVCS confirmation tracking, and control-center cancellation support.
25
49
  - [API](https://en.wikipedia.org/wiki/API) integration with [Odoo](https://www.odoo.com/), syncing:
26
50
  - Employee credentials via `res.users`
27
51
  - Product catalog lookups via `product.product`
@@ -55,7 +79,7 @@ Arthexis Constellation ships in four node roles tailored to different deployment
55
79
  <td valign="top"><strong>Multi-Device Edge, Network &amp; Data Acquisition</strong><br />Features: AP Router, Celery Queue, NGINX Server, RFID Scanner</td>
56
80
  </tr>
57
81
  <tr>
58
- <td valign="top"><strong>Constellation</strong></td>
82
+ <td valign="top"><strong>Watchtower</strong></td>
59
83
  <td valign="top"><strong>Multi-User Cloud &amp; Orchestration</strong><br />Features: Celery Queue, NGINX Server</td>
60
84
  </tr>
61
85
  </tbody>
@@ -68,7 +92,7 @@ Arthexis Constellation ships in four node roles tailored to different deployment
68
92
  - **[Windows](https://en.wikipedia.org/wiki/Microsoft_Windows)**: open [PowerShell](https://learn.microsoft.com/powershell/) or [Git Bash](https://gitforwindows.org/) and run the same command.
69
93
 
70
94
  ### 2. Start and stop
71
- Terminal nodes can start directly with the scripts below without installing; Control, Satellite, and Constellation roles require installation first. Both approaches listen on [`http://localhost:8000/`](http://localhost:8000/) by default.
95
+ Terminal nodes can start directly with the scripts below without installing; Control, Satellite, and Watchtower roles require installation first. Both approaches listen on [`http://localhost:8888/`](http://localhost:8888/) by default.
72
96
 
73
97
  - **[VS Code](https://code.visualstudio.com/)**
74
98
  - Open the folder and go to the **Run and Debug** panel (`Ctrl+Shift+D`).
@@ -88,18 +112,47 @@ Terminal nodes can start directly with the scripts below without installing; Con
88
112
  - `--constellation` – enables the multi-user orchestration stack.
89
113
  - Use `./install.sh --help` to list every available flag if you need to customize the node beyond the role defaults.
90
114
  - Upgrade with [`./upgrade.sh`](upgrade.sh).
115
+ - Consult the [Install & Lifecycle Scripts Manual](docs/development/install-lifecycle-scripts-manual.md) for complete flag descriptions and operational notes.
116
+ - Review the [Upgrade Guide](docs/UPGRADE.md) for manual steps required after releases that stop automating specific migrations.
91
117
 
92
118
  - **Windows:**
93
119
  - Run [`install.bat`](install.bat) to install (Terminal role) and [`upgrade.bat`](upgrade.bat) to upgrade.
94
120
  - Installation is not required to start in Terminal mode (the default).
95
121
 
96
122
  ### 4. Administration
97
- Visit [`http://localhost:8000/admin/`](http://localhost:8000/admin/) for the [Django admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/) and [`http://localhost:8000/admindocs/`](http://localhost:8000/admindocs/) for the [admindocs](https://docs.djangoproject.com/en/stable/ref/contrib/admin/admindocs/). Use `--port` with the start scripts or installer when you need to expose a different port.
123
+ Visit [`http://localhost:8888/admin/`](http://localhost:8888/admin/) for the [Django admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/) and [`http://localhost:8888/admindocs/`](http://localhost:8888/admindocs/) for the [admindocs](https://docs.djangoproject.com/en/stable/ref/contrib/admin/admindocs/). Use `--port` with the start scripts or installer when you need to expose a different port.
124
+
125
+ ## Sigils
126
+
127
+ Sigils are bracketed tokens such as `[ENV.SMTP_PASSWORD]` that Arthexis expands at runtime. They make it possible to reference configuration secrets, system metadata, or records stored in other apps without duplicating values across the project.
128
+
129
+ ### Syntax at a glance
130
+
131
+ - `[PREFIX.KEY]` &mdash; returns a field or attribute. Hyphens and casing are normalized automatically.
132
+ - `[PREFIX=IDENTIFIER.FIELD]` &mdash; selects a specific record by primary key or any unique field.
133
+ - `[PREFIX:FIELD=VALUE.ATTRIBUTE]` &mdash; filters by a custom field instead of the primary key.
134
+ - `[PREFIX.FIELD=[OTHER.SIGIL]]` &mdash; nests sigils so the value after `=` resolves before the outer token.
135
+ - `[PREFIX]` &mdash; for entity prefixes, returns the serialized object in JSON; for configuration prefixes, resolves to an empty string when the key is missing.
136
+
137
+ The platform ships with three configuration prefixes:
138
+
139
+ - `ENV` reads environment variables.
140
+ - `CONF` reads Django settings.
141
+ - `SYS` exposes computed system information such as build metadata.
142
+
143
+ Additional prefixes are defined through **Sigil Roots**, which map a short code (for example `ROLE`, `ODOO`, or `USER`) to a Django model. You can review them from **Admin &rarr; Sigil Builder** (`/admin/sigil-builder/`), where a test console is also available.
144
+
145
+ Unknown prefixes remain in place (e.g. `[UNKNOWN.VALUE]`) and are logged.
98
146
 
99
147
  ## Support
100
148
 
101
149
  Contact us at [tecnologia@gelectriic.com](mailto:tecnologia@gelectriic.com) or visit our [web page](https://www.gelectriic.com/) for [professional services](https://en.wikipedia.org/wiki/Professional_services) and [commercial support](https://en.wikipedia.org/wiki/Technical_support).
102
150
 
151
+ ## Project Guidelines
152
+
153
+ - [AGENTS](AGENTS.md) – operating handbook for repository workflows, testing, and release management.
154
+ - [DESIGN](DESIGN.md) – visual, UX, and branding guidance that all interfaces must follow.
155
+
103
156
  ## About Me
104
157
 
105
158
  > "What, you want to know about me too? Well, I enjoy [developing software](https://en.wikipedia.org/wiki/Software_development), [role-playing games](https://en.wikipedia.org/wiki/Role-playing_game), long walks on the [beach](https://en.wikipedia.org/wiki/Beach) and a fourth secret thing."
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: arthexis
3
- Version: 0.1.17
3
+ Version: 0.1.28
4
4
  Summary: Power & Energy Infrastructure
5
5
  Author-email: "Rafael J. Guillén-Osorio" <tecnologia@gelectriic.com>
6
6
  License-Expression: GPL-3.0-only
@@ -15,7 +15,7 @@ Requires-Dist: amqp==5.3.1
15
15
  Requires-Dist: annotated-types==0.7.0
16
16
  Requires-Dist: anyio==4.9.0
17
17
  Requires-Dist: asgiref==3.10.0
18
- Requires-Dist: atproto==0.0.61
18
+ Requires-Dist: atproto<0.1.0,>=0.0.63
19
19
  Requires-Dist: attrs==25.3.0
20
20
  Requires-Dist: autobahn==24.4.2
21
21
  Requires-Dist: Automat==25.4.16
@@ -26,14 +26,14 @@ Requires-Dist: celery==5.5.3
26
26
  Requires-Dist: certifi==2025.7.14
27
27
  Requires-Dist: cffi==2.0.0
28
28
  Requires-Dist: channels==4.1.0
29
- Requires-Dist: charset-normalizer==3.4.2
29
+ Requires-Dist: charset-normalizer==3.4.4
30
30
  Requires-Dist: click==8.2.1
31
31
  Requires-Dist: click-didyoumean==0.3.1
32
32
  Requires-Dist: click-plugins==1.1.1.2
33
33
  Requires-Dist: click-repl==0.3.0
34
34
  Requires-Dist: colorama==0.4.6
35
35
  Requires-Dist: constantly==23.10.4
36
- Requires-Dist: cron-descriptor==1.4.5
36
+ Requires-Dist: cron-descriptor==2.0.6
37
37
  Requires-Dist: cryptography==45.0.5
38
38
  Requires-Dist: daphne==4.2.1
39
39
  Requires-Dist: diff-match-patch==20241021
@@ -41,47 +41,48 @@ Requires-Dist: defusedxml==0.7.1
41
41
  Requires-Dist: Django==5.2.7
42
42
  Requires-Dist: django-celery-beat==2.8.1
43
43
  Requires-Dist: django-debug-toolbar==6.0.0
44
- Requires-Dist: django-import-export==4.3.9
44
+ Requires-Dist: django-import-export==4.3.12
45
45
  Requires-Dist: django-object-actions==5.0.0
46
- Requires-Dist: django-otp==1.5.4
46
+ Requires-Dist: django-otp==1.6.3
47
47
  Requires-Dist: django-timezone-field==7.1
48
48
  Requires-Dist: dnspython==2.7.0
49
49
  Requires-Dist: docutils==0.22.2
50
50
  Requires-Dist: gpiozero==2.0.1; sys_platform == "linux"
51
+ Requires-Dist: graphene-django==3.2.2
51
52
  Requires-Dist: graphviz==0.21
53
+ Requires-Dist: geckodriver-autoinstaller==0.1.0
52
54
  Requires-Dist: h11==0.16.0
53
55
  Requires-Dist: httpcore==1.0.9
54
56
  Requires-Dist: httpx==0.28.1
55
57
  Requires-Dist: hyperlink==21.0.0
56
- Requires-Dist: idna==3.10
58
+ Requires-Dist: idna==3.11
57
59
  Requires-Dist: incremental==24.7.2
58
60
  Requires-Dist: kombu==5.5.4
59
- Requires-Dist: libipld==3.1.1
60
- Requires-Dist: Markdown==3.8.2
61
+ Requires-Dist: libipld==3.2.0
62
+ Requires-Dist: Markdown==3.9
61
63
  Requires-Dist: mdx_truly_sane_lists==1.3
62
- Requires-Dist: mcp==1.16.0
63
64
  Requires-Dist: mfrc522==0.0.7; sys_platform == "linux"
64
65
  Requires-Dist: outcome==1.3.0.post0
65
66
  Requires-Dist: packaging==25.0
66
- Requires-Dist: pillow==11.3.0
67
- Requires-Dist: prompt_toolkit==3.0.51
68
- Requires-Dist: psutil==5.9.8
67
+ Requires-Dist: pillow==12.0.0
68
+ Requires-Dist: prompt_toolkit==3.0.52
69
+ Requires-Dist: psutil==7.1.3
69
70
  Requires-Dist: psycopg==3.2.9
70
- Requires-Dist: psycopg-binary==3.2.9
71
+ Requires-Dist: psycopg-binary==3.2.12
71
72
  Requires-Dist: pyasn1==0.6.1
72
73
  Requires-Dist: pyasn1_modules==0.4.2
73
74
  Requires-Dist: pycparser==2.22
74
- Requires-Dist: pydantic==2.11.7
75
- Requires-Dist: pydantic_core==2.33.2
75
+ Requires-Dist: pydantic==2.12.3
76
+ Requires-Dist: pydantic_core==2.41.4
76
77
  Requires-Dist: pyOpenSSL==25.1.0
77
- Requires-Dist: pyperclip==1.9.0
78
+ Requires-Dist: pyperclip==1.11.0
78
79
  Requires-Dist: PySocks==1.7.1
79
80
  Requires-Dist: python-crontab==3.3.0
80
81
  Requires-Dist: python-dateutil==2.9.0.post0
81
82
  Requires-Dist: python-dotenv==1.1.1
82
83
  Requires-Dist: qrcode==8.2
83
- Requires-Dist: redis==5.0.8
84
- Requires-Dist: reportlab==4.2.2
84
+ Requires-Dist: redis==7.0.1
85
+ Requires-Dist: reportlab==4.4.4
85
86
  Requires-Dist: requests==2.32.5
86
87
  Requires-Dist: selenium==4.34.2
87
88
  Requires-Dist: service-identity==24.2.0
@@ -98,20 +99,20 @@ Requires-Dist: trio==0.30.0
98
99
  Requires-Dist: trio-websocket==0.12.2
99
100
  Requires-Dist: Twisted==25.5.0
100
101
  Requires-Dist: twine==6.1.0
101
- Requires-Dist: txaio==25.6.1
102
- Requires-Dist: typing-inspection==0.4.1
102
+ Requires-Dist: txaio==25.9.2
103
+ Requires-Dist: typing-inspection==0.4.2
103
104
  Requires-Dist: typing_extensions==4.14.1
104
105
  Requires-Dist: tzdata==2025.2
105
106
  Requires-Dist: urllib3==2.5.0
106
107
  Requires-Dist: vine==5.1.0
107
- Requires-Dist: wcwidth==0.2.13
108
+ Requires-Dist: wcwidth==0.2.14
108
109
  Requires-Dist: webencodings==0.5.1
109
110
  Requires-Dist: websocket-client==1.8.0
110
- Requires-Dist: websockets==13.1
111
- Requires-Dist: whitenoise==6.9.0
111
+ Requires-Dist: websockets==15.0.1
112
+ Requires-Dist: whitenoise==6.11.0
112
113
  Requires-Dist: plyer==2.1.0; sys_platform == "win32"
113
114
  Requires-Dist: wsproto==1.2.0
114
- Requires-Dist: zope.interface==7.2
115
+ Requires-Dist: zope.interface==8.0.1
115
116
  Dynamic: license-file
116
117
 
117
118
  # Arthexis Constellation
@@ -125,19 +126,43 @@ Arthexis Constellation is a [narrative-driven](https://en.wikipedia.org/wiki/Nar
125
126
 
126
127
  ## Current Features
127
128
 
128
- - Compatible with the [Open Charge Point Protocol (OCPP) 1.6](https://www.openchargealliance.org/protocols/ocpp-16/) central system, handling:
129
- - Lifecycle & sessions
130
- - `BootNotification`
131
- - `Heartbeat`
132
- - `StatusNotification`
133
- - `StartTransaction`
134
- - `StopTransaction`
135
- - Access & metering
136
- - `Authorize`
137
- - `MeterValues`
138
- - Maintenance & firmware
139
- - `DiagnosticsStatusNotification`
140
- - `FirmwareStatusNotification`
129
+ - Compatible with the [Open Charge Point Protocol (OCPP) 1.6](https://www.openchargealliance.org/protocols/ocpp-16/) central system. Supported actions are summarized below.
130
+
131
+ **Charge point → CSMS**
132
+
133
+ | Action | What we do |
134
+ | --- | --- |
135
+ | `Authorize` | Validate RFID or token authorization requests before a session starts. |
136
+ | `BootNotification` | Register the charge point and update identity, firmware, and status details. |
137
+ | `DataTransfer` | Accept vendor-specific payloads and record the results. |
138
+ | `DiagnosticsStatusNotification` | Track the progress of diagnostic uploads kicked off from the back office. |
139
+ | `FirmwareStatusNotification` | Track firmware update lifecycle events from charge points. |
140
+ | `Heartbeat` | Keep the websocket session alive and update last-seen timestamps. |
141
+ | `MeterValues` | Persist periodic energy and power readings while a transaction is active. |
142
+ | `StartTransaction` | Create charging sessions with initial meter values and identification data. |
143
+ | `StatusNotification` | Reflect connector availability and fault states in real time. |
144
+ | `StopTransaction` | Close charging sessions, capturing closing meter values and stop reasons. |
145
+
146
+ **CSMS → Charge point**
147
+
148
+ | Action | What we do |
149
+ | --- | --- |
150
+ | `CancelReservation` | Withdraw pending reservations and release connectors directly from the control center. |
151
+ | `ChangeAvailability` | Switch connectors or the whole station between operative and inoperative states. |
152
+ | `DataTransfer` | Send vendor-specific commands and log the charge point response. |
153
+ | `GetConfiguration` | Poll the device for the current values of tracked configuration keys. |
154
+ | `GetLocalListVersion` | Retrieve the current RFID whitelist version and synchronize entries reported by the charge point. |
155
+ | `RemoteStartTransaction` | Initiate a charging session remotely for an identified customer or token. |
156
+ | `RemoteStopTransaction` | Terminate active charging sessions from the control center. |
157
+ | `ReserveNow` | Reserve connectors for upcoming sessions with automatic connector selection and confirmation tracking. |
158
+ | `Reset` | Request a soft or hard reboot to recover from faults. |
159
+ | `SendLocalList` | Publish released and approved RFIDs as the charge point's local authorization list. |
160
+ | `TriggerMessage` | Ask the device to send an immediate update (for example status or diagnostics). |
161
+ | `UpdateFirmware` | Deliver firmware packages to chargers with secure download tokens and track installation responses. |
162
+
163
+ **OCPP 1.6 roadmap.** The following catalogue actions are in our backlog: `ChangeConfiguration`, `ClearCache`, `ClearChargingProfile`, `GetCompositeSchedule`, `GetDiagnostics`, `SetChargingProfile`, `UnlockConnector`.
164
+
165
+ - Charge point reservations with automated connector assignment, energy account and RFID linkage, EVCS confirmation tracking, and control-center cancellation support.
141
166
  - [API](https://en.wikipedia.org/wiki/API) integration with [Odoo](https://www.odoo.com/), syncing:
142
167
  - Employee credentials via `res.users`
143
168
  - Product catalog lookups via `product.product`
@@ -171,7 +196,7 @@ Arthexis Constellation ships in four node roles tailored to different deployment
171
196
  <td valign="top"><strong>Multi-Device Edge, Network &amp; Data Acquisition</strong><br />Features: AP Router, Celery Queue, NGINX Server, RFID Scanner</td>
172
197
  </tr>
173
198
  <tr>
174
- <td valign="top"><strong>Constellation</strong></td>
199
+ <td valign="top"><strong>Watchtower</strong></td>
175
200
  <td valign="top"><strong>Multi-User Cloud &amp; Orchestration</strong><br />Features: Celery Queue, NGINX Server</td>
176
201
  </tr>
177
202
  </tbody>
@@ -184,7 +209,7 @@ Arthexis Constellation ships in four node roles tailored to different deployment
184
209
  - **[Windows](https://en.wikipedia.org/wiki/Microsoft_Windows)**: open [PowerShell](https://learn.microsoft.com/powershell/) or [Git Bash](https://gitforwindows.org/) and run the same command.
185
210
 
186
211
  ### 2. Start and stop
187
- Terminal nodes can start directly with the scripts below without installing; Control, Satellite, and Constellation roles require installation first. Both approaches listen on [`http://localhost:8000/`](http://localhost:8000/) by default.
212
+ Terminal nodes can start directly with the scripts below without installing; Control, Satellite, and Watchtower roles require installation first. Both approaches listen on [`http://localhost:8888/`](http://localhost:8888/) by default.
188
213
 
189
214
  - **[VS Code](https://code.visualstudio.com/)**
190
215
  - Open the folder and go to the **Run and Debug** panel (`Ctrl+Shift+D`).
@@ -204,18 +229,47 @@ Terminal nodes can start directly with the scripts below without installing; Con
204
229
  - `--constellation` – enables the multi-user orchestration stack.
205
230
  - Use `./install.sh --help` to list every available flag if you need to customize the node beyond the role defaults.
206
231
  - Upgrade with [`./upgrade.sh`](upgrade.sh).
232
+ - Consult the [Install & Lifecycle Scripts Manual](docs/development/install-lifecycle-scripts-manual.md) for complete flag descriptions and operational notes.
233
+ - Review the [Upgrade Guide](docs/UPGRADE.md) for manual steps required after releases that stop automating specific migrations.
207
234
 
208
235
  - **Windows:**
209
236
  - Run [`install.bat`](install.bat) to install (Terminal role) and [`upgrade.bat`](upgrade.bat) to upgrade.
210
237
  - Installation is not required to start in Terminal mode (the default).
211
238
 
212
239
  ### 4. Administration
213
- Visit [`http://localhost:8000/admin/`](http://localhost:8000/admin/) for the [Django admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/) and [`http://localhost:8000/admindocs/`](http://localhost:8000/admindocs/) for the [admindocs](https://docs.djangoproject.com/en/stable/ref/contrib/admin/admindocs/). Use `--port` with the start scripts or installer when you need to expose a different port.
240
+ Visit [`http://localhost:8888/admin/`](http://localhost:8888/admin/) for the [Django admin](https://docs.djangoproject.com/en/stable/ref/contrib/admin/) and [`http://localhost:8888/admindocs/`](http://localhost:8888/admindocs/) for the [admindocs](https://docs.djangoproject.com/en/stable/ref/contrib/admin/admindocs/). Use `--port` with the start scripts or installer when you need to expose a different port.
241
+
242
+ ## Sigils
243
+
244
+ Sigils are bracketed tokens such as `[ENV.SMTP_PASSWORD]` that Arthexis expands at runtime. They make it possible to reference configuration secrets, system metadata, or records stored in other apps without duplicating values across the project.
245
+
246
+ ### Syntax at a glance
247
+
248
+ - `[PREFIX.KEY]` &mdash; returns a field or attribute. Hyphens and casing are normalized automatically.
249
+ - `[PREFIX=IDENTIFIER.FIELD]` &mdash; selects a specific record by primary key or any unique field.
250
+ - `[PREFIX:FIELD=VALUE.ATTRIBUTE]` &mdash; filters by a custom field instead of the primary key.
251
+ - `[PREFIX.FIELD=[OTHER.SIGIL]]` &mdash; nests sigils so the value after `=` resolves before the outer token.
252
+ - `[PREFIX]` &mdash; for entity prefixes, returns the serialized object in JSON; for configuration prefixes, resolves to an empty string when the key is missing.
253
+
254
+ The platform ships with three configuration prefixes:
255
+
256
+ - `ENV` reads environment variables.
257
+ - `CONF` reads Django settings.
258
+ - `SYS` exposes computed system information such as build metadata.
259
+
260
+ Additional prefixes are defined through **Sigil Roots**, which map a short code (for example `ROLE`, `ODOO`, or `USER`) to a Django model. You can review them from **Admin &rarr; Sigil Builder** (`/admin/sigil-builder/`), where a test console is also available.
261
+
262
+ Unknown prefixes remain in place (e.g. `[UNKNOWN.VALUE]`) and are logged.
214
263
 
215
264
  ## Support
216
265
 
217
266
  Contact us at [tecnologia@gelectriic.com](mailto:tecnologia@gelectriic.com) or visit our [web page](https://www.gelectriic.com/) for [professional services](https://en.wikipedia.org/wiki/Professional_services) and [commercial support](https://en.wikipedia.org/wiki/Technical_support).
218
267
 
268
+ ## Project Guidelines
269
+
270
+ - [AGENTS](AGENTS.md) – operating handbook for repository workflows, testing, and release management.
271
+ - [DESIGN](DESIGN.md) – visual, UX, and branding guidance that all interfaces must follow.
272
+
219
273
  ## About Me
220
274
 
221
275
  > "What, you want to know about me too? Well, I enjoy [developing software](https://en.wikipedia.org/wiki/Software_development), [role-playing games](https://en.wikipedia.org/wiki/Role-playing_game), long walks on the [beach](https://en.wikipedia.org/wiki/Beach) and a fourth secret thing."