argus-server 2.7.0__tar.gz → 2.8.1__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.
Files changed (735) hide show
  1. argus_server-2.8.1/.claude/hooks/check-test-names.sh +30 -0
  2. argus_server-2.8.1/.claude/settings.json +16 -0
  3. {argus_server-2.7.0 → argus_server-2.8.1}/.gitignore +10 -3
  4. {argus_server-2.7.0 → argus_server-2.8.1}/CHANGELOG.md +111 -0
  5. {argus_server-2.7.0 → argus_server-2.8.1}/Makefile +14 -3
  6. {argus_server-2.7.0 → argus_server-2.8.1}/NOTES.md +147 -0
  7. {argus_server-2.7.0 → argus_server-2.8.1}/PKG-INFO +3 -2
  8. {argus_server-2.7.0 → argus_server-2.8.1}/README.md +1 -1
  9. argus_server-2.8.1/checks/check_test_names.py +200 -0
  10. {argus_server-2.7.0 → argus_server-2.8.1}/codecov.yml +1 -0
  11. {argus_server-2.7.0 → argus_server-2.8.1}/docker/Dockerfile +4 -2
  12. {argus_server-2.7.0 → argus_server-2.8.1}/docker/README.md +11 -0
  13. argus_server-2.8.1/docker/cmd-argus.sh +22 -0
  14. argus_server-2.8.1/docker/cmd-dbqueue.sh +3 -0
  15. argus_server-2.8.1/docker-compose.yml +38 -0
  16. {argus_server-2.7.0 → argus_server-2.8.1}/docs/conf.py +2 -2
  17. {argus_server-2.7.0 → argus_server-2.8.1}/docs/customization/htmx-frontend.rst +188 -62
  18. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/htmx-frontend/override_templates.rst +6 -4
  19. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/release-checklist.rst +6 -0
  20. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/makefile-rules.rst +18 -6
  21. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/management-commands.rst +27 -0
  22. {argus_server-2.7.0 → argus_server-2.8.1}/docs/index.rst +1 -0
  23. argus_server-2.8.1/docs/production/task-queue.rst +110 -0
  24. argus_server-2.8.1/docs/production.rst +8 -0
  25. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/htmx-frontend.rst +6 -5
  26. argus_server-2.8.1/docs/reference/img/ER_model.png +0 -0
  27. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/site-specific-settings.rst +30 -0
  28. {argus_server-2.7.0 → argus_server-2.8.1}/pyproject.toml +20 -2
  29. {argus_server-2.7.0 → argus_server-2.8.1}/requirements-django52.txt +21 -5
  30. {argus_server-2.7.0 → argus_server-2.8.1}/requirements-django60.txt +19 -3
  31. {argus_server-2.7.0 → argus_server-2.8.1}/requirements.txt +21 -5
  32. argus_server-2.8.1/src/argus/constants.py +4 -0
  33. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/apps.py +4 -1
  34. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/checks.py +1 -1
  35. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/context_processors.py +7 -1
  36. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/defaults.py +9 -36
  37. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/destination/forms.py +4 -2
  38. argus_server-2.8.1/src/argus/htmx/destination/urls.py +16 -0
  39. argus_server-2.8.1/src/argus/htmx/destination/views.py +205 -0
  40. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/incident/columns.py +1 -0
  41. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/incident/filter.py +3 -1
  42. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/incident/urls.py +0 -1
  43. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/incident/views.py +8 -12
  44. argus_server-2.8.1/src/argus/htmx/management/commands/tailwind_config.py +76 -0
  45. argus_server-2.8.1/src/argus/htmx/notificationprofile/urls.py +13 -0
  46. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/notificationprofile/views.py +77 -103
  47. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/plannedmaintenance/urls.py +1 -0
  48. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/plannedmaintenance/views.py +67 -2
  49. argus_server-2.8.1/src/argus/htmx/static/styles.css +5220 -0
  50. argus_server-2.8.1/src/argus/htmx/tailwindtheme/README.md +10 -0
  51. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/tailwindtheme/config.py +12 -3
  52. argus_server-2.8.1/src/argus/htmx/tailwindtheme/cssconfig.py +99 -0
  53. argus_server-2.8.1/src/argus/htmx/tailwindtheme/custom-themes/README.md +7 -0
  54. argus_server-2.8.1/src/argus/htmx/tailwindtheme/generate_css_config.py +52 -0
  55. argus_server-2.8.1/src/argus/htmx/tailwindtheme/snippets/11-extensions.css +37 -0
  56. argus_server-2.8.1/src/argus/htmx/tailwindtheme/snippets/12-daisy-compat.css +141 -0
  57. argus_server-2.8.1/src/argus/htmx/tailwindtheme/snippets/15-alert-message.css +21 -0
  58. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/tailwindtheme/snippets/25-choices.css +43 -9
  59. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/tailwindtheme/snippets/30-incident-table.css +2 -4
  60. argus_server-2.8.1/src/argus/htmx/tailwindtheme/snippets/32-filter-pane.css +30 -0
  61. argus_server-2.8.1/src/argus/htmx/tailwindtheme/snippets/35-cards.css +44 -0
  62. argus_server-2.8.1/src/argus/htmx/tailwindtheme/styles.css +13 -0
  63. argus_server-2.8.1/src/argus/htmx/tailwindtheme/tailwind.css +45 -0
  64. argus_server-2.8.1/src/argus/htmx/tailwindtheme/themes/README.md +6 -0
  65. argus_server-2.8.1/src/argus/htmx/tailwindtheme/themes/argus.css +24 -0
  66. argus_server-2.8.1/src/argus/htmx/tailwindtheme/themes/sikt-dark.css +38 -0
  67. argus_server-2.8.1/src/argus/htmx/tailwindtheme/themes/sikt.css +38 -0
  68. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/tailwindtheme/utils.py +3 -0
  69. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/_base_form_modal.html +13 -5
  70. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/_base_form_modal_button.html +1 -1
  71. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/base.html +1 -1
  72. argus_server-2.8.1/src/argus/htmx/templates/htmx/destination/_content.html +3 -0
  73. argus_server-2.8.1/src/argus/htmx/templates/htmx/destination/_destination_create_row.html +31 -0
  74. argus_server-2.8.1/src/argus/htmx/templates/htmx/destination/_destination_table.html +148 -0
  75. argus_server-2.8.1/src/argus/htmx/templates/htmx/destination/destination_list.html +17 -0
  76. argus_server-2.8.1/src/argus/htmx/templates/htmx/forms/choices_select_multiple.html +36 -0
  77. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/forms/dropdown_select_multiple.html +5 -5
  78. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_base_incident_table.html +1 -1
  79. argus_server-2.8.1/src/argus/htmx/templates/htmx/incident/_filter_controls.html +52 -0
  80. argus_server-2.8.1/src/argus/htmx/templates/htmx/incident/_filter_controls_script.html +124 -0
  81. argus_server-2.8.1/src/argus/htmx/templates/htmx/incident/_filter_delete_dialog.html +24 -0
  82. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_filter_select.html +3 -1
  83. argus_server-2.8.1/src/argus/htmx/templates/htmx/incident/_filter_update_dialog.html +27 -0
  84. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_filterbox.html +2 -4
  85. argus_server-2.8.1/src/argus/htmx/templates/htmx/incident/_incident_list_menubar.html +5 -0
  86. argus_server-2.8.1/src/argus/htmx/templates/htmx/incident/_incident_list_update_menu.html +10 -0
  87. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_table_paginator.html +1 -5
  88. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_table_row.html +1 -1
  89. argus_server-2.8.1/src/argus/htmx/templates/htmx/incident/_incident_toolbar.html +13 -0
  90. argus_server-2.8.1/src/argus/htmx/templates/htmx/incident/cells/_incident_age.html +8 -0
  91. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_checkbox.html +1 -1
  92. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_compact_severity_filter.html +1 -1
  93. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_events.html +1 -1
  94. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_filterable_column_header_content.html +1 -1
  95. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_list_select_all_checkbox_header.html +1 -1
  96. argus_server-2.8.1/src/argus/htmx/templates/htmx/incident/cells/_incident_maintenance.html +35 -0
  97. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_start_time_and_age.html +5 -1
  98. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/filter_list.html +9 -7
  99. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/incident_list.html +8 -10
  100. argus_server-2.8.1/src/argus/htmx/templates/htmx/notificationprofile/_notificationprofile_card.html +15 -0
  101. argus_server-2.8.1/src/argus/htmx/templates/htmx/notificationprofile/_notificationprofile_form.html +46 -0
  102. argus_server-2.8.1/src/argus/htmx/templates/htmx/notificationprofile/_notificationprofile_form_content.html +32 -0
  103. argus_server-2.8.1/src/argus/htmx/templates/htmx/notificationprofile/_notificationprofile_form_div.html +43 -0
  104. argus_server-2.8.1/src/argus/htmx/templates/htmx/notificationprofile/_notificationprofile_summary.html +42 -0
  105. argus_server-2.8.1/src/argus/htmx/templates/htmx/notificationprofile/base.html +15 -0
  106. argus_server-2.8.1/src/argus/htmx/templates/htmx/notificationprofile/notificationprofile_list.html +18 -0
  107. argus_server-2.8.1/src/argus/htmx/templates/htmx/notifications/_tabs.html +11 -0
  108. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/plannedmaintenance/_cancel_confirm_dialog.html +0 -3
  109. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/plannedmaintenance/_delete_confirm_dialog.html +0 -3
  110. argus_server-2.8.1/src/argus/htmx/templates/htmx/plannedmaintenance/_filter_preview.html +23 -0
  111. argus_server-2.8.1/src/argus/htmx/templates/htmx/plannedmaintenance/_plannedmaintenance_form_script.html +60 -0
  112. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/plannedmaintenance/plannedmaintenance_form.html +34 -43
  113. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/plannedmaintenance/plannedmaintenance_list.html +47 -7
  114. argus_server-2.8.1/src/argus/htmx/templates/htmx/timeslot/_timeslot_card.html +14 -0
  115. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/timeslot/_timeslot_form.html +16 -7
  116. argus_server-2.8.1/src/argus/htmx/templates/htmx/timeslot/_timeslot_form_content.html +37 -0
  117. argus_server-2.8.1/src/argus/htmx/templates/htmx/timeslot/_timeslot_summary.html +12 -0
  118. argus_server-2.8.1/src/argus/htmx/templates/htmx/timeslot/base.html +20 -0
  119. argus_server-2.8.1/src/argus/htmx/templates/htmx/timeslot/timerecurrence_div.html +65 -0
  120. argus_server-2.8.1/src/argus/htmx/templates/htmx/timeslot/timeslot_list.html +17 -0
  121. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/_preference_choice_preview_theme.html +1 -6
  122. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/_user_menu.html +11 -9
  123. argus_server-2.8.1/src/argus/htmx/templates/htmx/user/_user_menu_notification_config.html +3 -0
  124. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/preference_form/_base_form.html +2 -2
  125. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx_base.html +15 -0
  126. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/messages/_notification_message.html +2 -5
  127. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/registration/login.html +1 -1
  128. argus_server-2.8.1/src/argus/htmx/templates/tailwind/styles.css +3 -0
  129. argus_server-2.8.1/src/argus/htmx/templates/tailwind/tailwind.css +45 -0
  130. argus_server-2.8.1/src/argus/htmx/themes/utils.py +113 -0
  131. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/timeslot/views.py +38 -20
  132. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/urls.py +10 -3
  133. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/apps.py +0 -5
  134. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/models.py +12 -9
  135. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/signals.py +1 -25
  136. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/views.py +0 -1
  137. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/admin.py +2 -1
  138. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/apps.py +10 -0
  139. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/factories.py +1 -0
  140. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/media/__init__.py +10 -3
  141. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/media/base.py +48 -14
  142. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/media/email.py +14 -41
  143. argus_server-2.8.1/src/argus/notificationprofile/migrations/0003_destinationconfig_managed.py +18 -0
  144. argus_server-2.8.1/src/argus/notificationprofile/migrations/0004_move_synced_to_managed.py +30 -0
  145. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/models.py +17 -0
  146. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/signals.py +52 -20
  147. argus_server-2.8.1/src/argus/notificationprofile/tasks.py +36 -0
  148. argus_server-2.8.1/src/argus/notificationprofile/utils.py +29 -0
  149. {argus_server-2.7.0/src/argus/notificationprofile → argus_server-2.8.1/src/argus/notificationprofile/v2}/serializers.py +19 -10
  150. {argus_server-2.7.0/src/argus/notificationprofile → argus_server-2.8.1/src/argus/notificationprofile/v2}/views.py +18 -6
  151. argus_server-2.8.1/src/argus/notificationprofile/v3/serializers.py +29 -0
  152. argus_server-2.8.1/src/argus/notificationprofile/v3/urls.py +10 -0
  153. argus_server-2.8.1/src/argus/notificationprofile/v3/views.py +88 -0
  154. argus_server-2.8.1/src/argus/plannedmaintenance/apps.py +12 -0
  155. argus_server-2.8.1/src/argus/plannedmaintenance/migrations/0003_alter_plannedmaintenancetask_incidents.py +25 -0
  156. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/plannedmaintenance/models.py +7 -1
  157. argus_server-2.8.1/src/argus/plannedmaintenance/signals.py +12 -0
  158. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/api_v2_urls.py +1 -1
  159. argus_server-2.8.1/src/argus/site/api_v3_urls.py +14 -0
  160. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/settings/base.py +11 -1
  161. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/urls.py +13 -3
  162. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/views.py +4 -2
  163. argus_server-2.8.1/src/argus/util/testing.py +27 -0
  164. argus_server-2.8.1/src/argus/version.py +1 -0
  165. argus_server-2.8.1/tests/htmx/destination/test_views.py +273 -0
  166. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/incident/test_filter.py +136 -2
  167. argus_server-2.8.1/tests/htmx/management/test_tailwind_config.py +44 -0
  168. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/notificationprofile/test_forms.py +24 -0
  169. argus_server-2.8.1/tests/htmx/notificationprofile/test_views.py +166 -0
  170. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/plannedmaintenance/test_views.py +132 -2
  171. argus_server-2.8.1/tests/htmx/test_management_commands_tailwind_config.py +21 -0
  172. argus_server-2.8.1/tests/htmx/test_themes_utils.py +26 -0
  173. argus_server-2.8.1/tests/htmx/themes/test_utils.py +59 -0
  174. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/timeslot/test_views.py +82 -31
  175. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/test_incident.py +32 -0
  176. argus_server-2.8.1/tests/incident/unit/__init__.py +0 -0
  177. argus_server-2.8.1/tests/notificationprofile/destinations/__init__.py +0 -0
  178. {argus_server-2.7.0 → argus_server-2.8.1}/tests/notificationprofile/destinations/test_email.py +27 -34
  179. {argus_server-2.7.0 → argus_server-2.8.1}/tests/notificationprofile/destinations/test_sms.py +1 -1
  180. argus_server-2.8.1/tests/notificationprofile/migrations/__init__.py +0 -0
  181. {argus_server-2.7.0 → argus_server-2.8.1}/tests/notificationprofile/test_models.py +23 -0
  182. {argus_server-2.7.0 → argus_server-2.8.1}/tests/notificationprofile/test_serializers.py +1 -1
  183. argus_server-2.8.1/tests/notificationprofile/test_signals.py +30 -0
  184. argus_server-2.8.1/tests/notificationprofile/test_tasks.py +59 -0
  185. argus_server-2.8.1/tests/notificationprofile/test_utils.py +30 -0
  186. {argus_server-2.7.0 → argus_server-2.8.1}/tests/notificationprofile/test_views.py +17 -6
  187. argus_server-2.8.1/tests/notificationprofile/v3/__init__.py +0 -0
  188. argus_server-2.8.1/tests/notificationprofile/v3/test_serializers.py +19 -0
  189. argus_server-2.8.1/tests/notificationprofile/v3/test_views.py +104 -0
  190. argus_server-2.8.1/tests/plannedmaintenance/__init__.py +0 -0
  191. argus_server-2.8.1/tests/site/__init__.py +0 -0
  192. argus_server-2.8.1/tests/util/__init__.py +0 -0
  193. {argus_server-2.7.0 → argus_server-2.8.1}/tox.ini +6 -2
  194. argus_server-2.7.0/docker/docker-entrypoint.sh +0 -10
  195. argus_server-2.7.0/docker-compose.yml +0 -31
  196. argus_server-2.7.0/docs/reference/img/ER_model.png +0 -0
  197. argus_server-2.7.0/htmlcov/.gitignore +0 -2
  198. argus_server-2.7.0/src/argus/htmx/destination/urls.py +0 -11
  199. argus_server-2.7.0/src/argus/htmx/destination/views.py +0 -139
  200. argus_server-2.7.0/src/argus/htmx/management/commands/tailwind_config.py +0 -120
  201. argus_server-2.7.0/src/argus/htmx/notificationprofile/urls.py +0 -19
  202. argus_server-2.7.0/src/argus/htmx/static/styles.css +0 -6611
  203. argus_server-2.7.0/src/argus/htmx/tailwindtheme/README.md +0 -6
  204. argus_server-2.7.0/src/argus/htmx/tailwindtheme/snippets/10-tailwind.css +0 -3
  205. argus_server-2.7.0/src/argus/htmx/tailwindtheme/snippets/15-alert-message.css +0 -23
  206. argus_server-2.7.0/src/argus/htmx/tailwindtheme/snippets/35-cards.css +0 -15
  207. argus_server-2.7.0/src/argus/htmx/tailwindtheme/styles.css +0 -6
  208. argus_server-2.7.0/src/argus/htmx/tailwindtheme/tailwind.config.js +0 -83
  209. argus_server-2.7.0/src/argus/htmx/templates/htmx/destination/_collapse_with_forms.html +0 -14
  210. argus_server-2.7.0/src/argus/htmx/templates/htmx/destination/_content.html +0 -4
  211. argus_server-2.7.0/src/argus/htmx/templates/htmx/destination/_create_form.html +0 -20
  212. argus_server-2.7.0/src/argus/htmx/templates/htmx/destination/_delete_form.html +0 -9
  213. argus_server-2.7.0/src/argus/htmx/templates/htmx/destination/_edit_form.html +0 -20
  214. argus_server-2.7.0/src/argus/htmx/templates/htmx/destination/_form_list.html +0 -5
  215. argus_server-2.7.0/src/argus/htmx/templates/htmx/destination/destination_list.html +0 -7
  216. argus_server-2.7.0/src/argus/htmx/templates/htmx/incident/_delete_filter_confirm_dialog.html +0 -4
  217. argus_server-2.7.0/src/argus/htmx/templates/htmx/incident/_existing_filters.html +0 -11
  218. argus_server-2.7.0/src/argus/htmx/templates/htmx/incident/_filter_controls.html +0 -6
  219. argus_server-2.7.0/src/argus/htmx/templates/htmx/incident/_filter_delete_dropdown.html +0 -14
  220. argus_server-2.7.0/src/argus/htmx/templates/htmx/incident/_filter_update_dropdown.html +0 -14
  221. argus_server-2.7.0/src/argus/htmx/templates/htmx/incident/_incident_list_menubar.html +0 -28
  222. argus_server-2.7.0/src/argus/htmx/templates/htmx/incident/_incident_list_update_menu.html +0 -10
  223. argus_server-2.7.0/src/argus/htmx/templates/htmx/incident/_update_filter_confirm_dialog.html +0 -5
  224. argus_server-2.7.0/src/argus/htmx/templates/htmx/incident/cells/_incident_age.html +0 -4
  225. argus_server-2.7.0/src/argus/htmx/templates/htmx/incident/cells/_incident_maintenance.html +0 -4
  226. argus_server-2.7.0/src/argus/htmx/templates/htmx/notificationprofile/_notificationprofile_form.html +0 -17
  227. argus_server-2.7.0/src/argus/htmx/templates/htmx/notificationprofile/_notificationprofile_form_div.html +0 -34
  228. argus_server-2.7.0/src/argus/htmx/templates/htmx/notificationprofile/base.html +0 -8
  229. argus_server-2.7.0/src/argus/htmx/templates/htmx/notificationprofile/notificationprofile_list.html +0 -12
  230. argus_server-2.7.0/src/argus/htmx/templates/htmx/timeslot/_delete_timeslot_confirm_dialog.html +0 -6
  231. argus_server-2.7.0/src/argus/htmx/templates/htmx/timeslot/_timeslot_detail.html +0 -16
  232. argus_server-2.7.0/src/argus/htmx/templates/htmx/timeslot/base.html +0 -8
  233. argus_server-2.7.0/src/argus/htmx/templates/htmx/timeslot/timerecurrence_div.html +0 -25
  234. argus_server-2.7.0/src/argus/htmx/templates/htmx/timeslot/timeslot_list.html +0 -12
  235. argus_server-2.7.0/src/argus/htmx/templates/htmx/user/_user_menu_notification_config.html +0 -14
  236. argus_server-2.7.0/src/argus/htmx/templates/tailwind/styles.css +0 -2
  237. argus_server-2.7.0/src/argus/htmx/templates/tailwind/tailwind.config.js +0 -34
  238. argus_server-2.7.0/src/argus/htmx/themes/utils.py +0 -68
  239. argus_server-2.7.0/src/argus/plannedmaintenance/apps.py +0 -6
  240. argus_server-2.7.0/src/argus/util/testing.py +0 -27
  241. argus_server-2.7.0/src/argus/version.py +0 -1
  242. {argus_server-2.7.0 → argus_server-2.8.1}/.git-blame-ignore-revs +0 -0
  243. {argus_server-2.7.0 → argus_server-2.8.1}/.gitattributes +0 -0
  244. {argus_server-2.7.0 → argus_server-2.8.1}/.mailmap +0 -0
  245. {argus_server-2.7.0 → argus_server-2.8.1}/.pre-commit-config.yaml +0 -0
  246. {argus_server-2.7.0 → argus_server-2.8.1}/.readthedocs.yaml +0 -0
  247. {argus_server-2.7.0 → argus_server-2.8.1}/.sonarcloud.properties +0 -0
  248. {argus_server-2.7.0 → argus_server-2.8.1}/CONTRIBUTING.rst +0 -0
  249. {argus_server-2.7.0 → argus_server-2.8.1}/CONTRIBUTORS.md +0 -0
  250. {argus_server-2.7.0 → argus_server-2.8.1}/Dockerfile +0 -0
  251. {argus_server-2.7.0 → argus_server-2.8.1}/LICENSE +0 -0
  252. {argus_server-2.7.0 → argus_server-2.8.1}/MAINTAINING.rst +0 -0
  253. {argus_server-2.7.0 → argus_server-2.8.1}/UPGRADING.md +0 -0
  254. {argus_server-2.7.0 → argus_server-2.8.1}/changelog.d/.gitkeep +0 -0
  255. {argus_server-2.7.0 → argus_server-2.8.1}/cmd.sh-template +0 -0
  256. {argus_server-2.7.0 → argus_server-2.8.1}/constraints.txt +0 -0
  257. {argus_server-2.7.0 → argus_server-2.8.1}/docker/dockersettings.py +0 -0
  258. {argus_server-2.7.0 → argus_server-2.8.1}/docs/Makefile +0 -0
  259. {argus_server-2.7.0 → argus_server-2.8.1}/docs/_exts/djangodocs.py +0 -0
  260. {argus_server-2.7.0 → argus_server-2.8.1}/docs/_static/.gitkeep +0 -0
  261. {argus_server-2.7.0 → argus_server-2.8.1}/docs/_templates/.gitkeep +0 -0
  262. {argus_server-2.7.0 → argus_server-2.8.1}/docs/about-argus.rst +0 -0
  263. {argus_server-2.7.0 → argus_server-2.8.1}/docs/customization.rst +0 -0
  264. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/add-more-preferences.rst +0 -0
  265. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/change-settings.rst +0 -0
  266. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/changelog-entry.rst +0 -0
  267. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/commit-messages.rst +0 -0
  268. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/customizing-filtering.rst +0 -0
  269. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/federated-logins.rst +0 -0
  270. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/howtos-for-git.rst +0 -0
  271. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/howtos-for-github.rst +0 -0
  272. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/htmx-frontend/column_for_specific_ack_group.rst +0 -0
  273. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/htmx-frontend/column_for_specific_tag.rst +0 -0
  274. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/htmx-frontend/custom-incident-actions.rst +0 -0
  275. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/htmx-frontend/customize-filtering.rst +0 -0
  276. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/htmx-frontend/dependencies.rst +0 -0
  277. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/htmx-frontend/font_awesome.rst +0 -0
  278. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/htmx-frontend.rst +0 -0
  279. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/notification-system-testing.rst +0 -0
  280. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/recover-from-migration-trouble.rst +0 -0
  281. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/regenerate-the-ER-diagram.rst +0 -0
  282. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/sonarqube.rst +0 -0
  283. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/toggle-django-debug-toolbar.rst +0 -0
  284. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/trigger-test-error-pages.rst +0 -0
  285. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/update-contributors.rst +0 -0
  286. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos/vendor-a-repo.rst +0 -0
  287. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/howtos.rst +0 -0
  288. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/notes.rst +0 -0
  289. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/styleguide.rst +0 -0
  290. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development/troubleshooting.rst +0 -0
  291. {argus_server-2.7.0 → argus_server-2.8.1}/docs/development.rst +0 -0
  292. {argus_server-2.7.0 → argus_server-2.8.1}/docs/django_settings.py +0 -0
  293. {argus_server-2.7.0 → argus_server-2.8.1}/docs/img/default_timeslot.png +0 -0
  294. {argus_server-2.7.0 → argus_server-2.8.1}/docs/img/destinations_view.png +0 -0
  295. {argus_server-2.7.0 → argus_server-2.8.1}/docs/img/example_timeslot.png +0 -0
  296. {argus_server-2.7.0 → argus_server-2.8.1}/docs/img/filter_selector.png +0 -0
  297. {argus_server-2.7.0 → argus_server-2.8.1}/docs/img/incident_details_view.png +0 -0
  298. {argus_server-2.7.0 → argus_server-2.8.1}/docs/img/incidents_filter.png +0 -0
  299. {argus_server-2.7.0 → argus_server-2.8.1}/docs/img/incidents_page.png +0 -0
  300. {argus_server-2.7.0 → argus_server-2.8.1}/docs/img/new_notification_profile.png +0 -0
  301. {argus_server-2.7.0 → argus_server-2.8.1}/docs/img/notification_profiles.png +0 -0
  302. {argus_server-2.7.0 → argus_server-2.8.1}/docs/img/synced_destination_delete_error.png +0 -0
  303. {argus_server-2.7.0 → argus_server-2.8.1}/docs/img/timeslots_view.png +0 -0
  304. {argus_server-2.7.0 → argus_server-2.8.1}/docs/img/unsaved_recurrence.png +0 -0
  305. {argus_server-2.7.0 → argus_server-2.8.1}/docs/img/user_menu.png +0 -0
  306. {argus_server-2.7.0 → argus_server-2.8.1}/docs/integrations/_note.rst +0 -0
  307. {argus_server-2.7.0 → argus_server-2.8.1}/docs/integrations/glue-services/index.rst +0 -0
  308. {argus_server-2.7.0 → argus_server-2.8.1}/docs/integrations/glue-services/writing-glueservices.rst +0 -0
  309. {argus_server-2.7.0 → argus_server-2.8.1}/docs/integrations/index.rst +0 -0
  310. {argus_server-2.7.0 → argus_server-2.8.1}/docs/integrations/notifications/email-plugin.rst +0 -0
  311. {argus_server-2.7.0 → argus_server-2.8.1}/docs/integrations/notifications/index.rst +0 -0
  312. {argus_server-2.7.0 → argus_server-2.8.1}/docs/integrations/notifications/sms-plugin.rst +0 -0
  313. {argus_server-2.7.0 → argus_server-2.8.1}/docs/integrations/notifications/writing-notification-plugins.rst +0 -0
  314. {argus_server-2.7.0 → argus_server-2.8.1}/docs/integrations/ticket-systems/index.rst +0 -0
  315. {argus_server-2.7.0 → argus_server-2.8.1}/docs/integrations/ticket-systems/writing-ticket-system-plugins.rst +0 -0
  316. {argus_server-2.7.0 → argus_server-2.8.1}/docs/make.bat +0 -0
  317. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/admin.rst +0 -0
  318. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/api/v2.rst +0 -0
  319. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/api.rst +0 -0
  320. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/authentication.rst +0 -0
  321. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/glossary.rst +0 -0
  322. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/ack.png +0 -0
  323. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/ack_icon.png +0 -0
  324. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/age.png +0 -0
  325. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/color_status.png +0 -0
  326. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/combined_status.png +0 -0
  327. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/combined_status_icons.png +0 -0
  328. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/compact_level.png +0 -0
  329. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/compact_select_levels.png +0 -0
  330. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/description.png +0 -0
  331. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/end_time.png +0 -0
  332. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/has_ticket_url.png +0 -0
  333. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/id.png +0 -0
  334. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/level.png +0 -0
  335. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/narrow_end_time.png +0 -0
  336. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/narrow_start_time.png +0 -0
  337. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/row_select.png +0 -0
  338. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/search_description.png +0 -0
  339. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/search_id.png +0 -0
  340. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/search_ticket_url.png +0 -0
  341. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/select_levels.png +0 -0
  342. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/source.png +0 -0
  343. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/start_time.png +0 -0
  344. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/start_time_and_age.png +0 -0
  345. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/status.png +0 -0
  346. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/status_icon.png +0 -0
  347. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/tags.png +0 -0
  348. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/ticket.png +0 -0
  349. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/img/columns/under_maintenance.png +0 -0
  350. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/models.rst +0 -0
  351. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference/planned-maintenance.rst +0 -0
  352. {argus_server-2.7.0 → argus_server-2.8.1}/docs/reference.rst +0 -0
  353. {argus_server-2.7.0 → argus_server-2.8.1}/docs/user-manual.rst +0 -0
  354. {argus_server-2.7.0 → argus_server-2.8.1}/requirements/dev.txt +0 -0
  355. {argus_server-2.7.0 → argus_server-2.8.1}/requirements/django52.txt +0 -0
  356. {argus_server-2.7.0 → argus_server-2.8.1}/requirements/django60.txt +0 -0
  357. {argus_server-2.7.0 → argus_server-2.8.1}/requirements/please-pip-sync.txt +0 -0
  358. {argus_server-2.7.0 → argus_server-2.8.1}/requirements/test.txt +0 -0
  359. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/__init__.py +0 -0
  360. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/__init__.py +0 -0
  361. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/admin.py +0 -0
  362. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/apps.py +0 -0
  363. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/authentication.py +0 -0
  364. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/context_processors.py +0 -0
  365. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/drftoken/__init__.py +0 -0
  366. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/drftoken/serializers.py +0 -0
  367. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/drftoken/urls.py +0 -0
  368. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/drftoken/views.py +0 -0
  369. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/factories.py +0 -0
  370. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/knox/__init__.py +0 -0
  371. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/knox/serializers.py +0 -0
  372. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/knox/urls.py +0 -0
  373. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/knox/views.py +0 -0
  374. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/management/__init__.py +0 -0
  375. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/management/commands/__init__.py +0 -0
  376. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/management/commands/changeuser.py +0 -0
  377. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/management/commands/createuser.py +0 -0
  378. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/management/commands/grantsuperuser.py +0 -0
  379. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/management/commands/revokesuperuser.py +0 -0
  380. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/management/commands/setpassword.py +0 -0
  381. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/migrations/0001_initial.py +0 -0
  382. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/migrations/0002_alter_user_first_name.py +0 -0
  383. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/migrations/0002_squashed_auth_20250512_add_preferences_model.py +0 -0
  384. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/migrations/0003_delete_phonenumber.py +0 -0
  385. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/migrations/0004_add_preferences_model.py +0 -0
  386. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/migrations/__init__.py +0 -0
  387. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/models.py +0 -0
  388. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/serializers.py +0 -0
  389. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/urls.py +0 -0
  390. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/utils.py +0 -0
  391. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/auth/views.py +0 -0
  392. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/base/__init__.py +0 -0
  393. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/base/apps.py +0 -0
  394. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/base/static/favicon.svg +0 -0
  395. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/base/templates/base.html +0 -0
  396. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/base/templates/index.html +0 -0
  397. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/compat.py +0 -0
  398. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/__init__.py +0 -0
  399. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/apps.py +0 -0
  400. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/__init__.py +0 -0
  401. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/commands/__init__.py +0 -0
  402. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/commands/bulk_incidents.py +0 -0
  403. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/commands/check_ended_maintenance.py +0 -0
  404. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/commands/check_started_maintenance.py +0 -0
  405. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/commands/check_token_expiry.py +0 -0
  406. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/commands/close_incident.py +0 -0
  407. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/commands/create_fake_incident.py +0 -0
  408. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/commands/create_source.py +0 -0
  409. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/commands/gen_secret_key.py +0 -0
  410. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/commands/initial_setup.py +0 -0
  411. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/commands/list_filters.py +0 -0
  412. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/commands/stresstest.py +0 -0
  413. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/management/commands/toggle_profile_activation.py +0 -0
  414. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/dev/utils.py +0 -0
  415. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/drf/__init__.py +0 -0
  416. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/drf/permissions.py +0 -0
  417. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/filter/__init__.py +0 -0
  418. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/filter/apps.py +0 -0
  419. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/filter/checks.py +0 -0
  420. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/filter/default.py +0 -0
  421. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/filter/factories.py +0 -0
  422. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/filter/filters.py +0 -0
  423. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/filter/filterwrapper.py +0 -0
  424. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/filter/primitive_serializers.py +0 -0
  425. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/filter/queryset_filters.py +0 -0
  426. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/filter/serializers.py +0 -0
  427. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/filter/swappable/__init__.py +0 -0
  428. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/filter/swappable/serializers.py +0 -0
  429. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/filter/validators.py +0 -0
  430. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/__init__.py +0 -0
  431. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/appconfig.py +0 -0
  432. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/auth/__init__.py +0 -0
  433. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/auth/views.py +0 -0
  434. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/constants.py +0 -0
  435. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/dateformat/__init__.py +0 -0
  436. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/dateformat/constants.py +0 -0
  437. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/destination/__init__.py +0 -0
  438. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/forms.py +0 -0
  439. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/htmx_urls.py +0 -0
  440. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/incident/__init__.py +0 -0
  441. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/incident/constants.py +0 -0
  442. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/incident/forms/__init__.py +0 -0
  443. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/incident/forms/base.py +0 -0
  444. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/incident/forms/incident_actions.py +0 -0
  445. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/incident/forms/incident_filters.py +0 -0
  446. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/incident/utils.py +0 -0
  447. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/management/__init__.py +0 -0
  448. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/management/commands/__init__.py +0 -0
  449. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/middleware.py +0 -0
  450. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/migrations/0001_initial.py +0 -0
  451. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/migrations/__init__.py +0 -0
  452. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/modals.py +0 -0
  453. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/models.py +0 -0
  454. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/notificationprofile/__init__.py +0 -0
  455. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/plannedmaintenance/__init__.py +0 -0
  456. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/request.py +0 -0
  457. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/root_urls.py +0 -0
  458. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/settings.py +0 -0
  459. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/static/choices-11.1.0.min.js +0 -0
  460. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/static/flatpickr-4.6.13.min.css +0 -0
  461. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/static/flatpickr-4.6.13.min.js +0 -0
  462. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/static/htmx-2.0.2.min.js +0 -0
  463. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/static/hyperscript-0.9.13.min.js +0 -0
  464. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/static/logo_white.svg +0 -0
  465. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/tailwindtheme/__init__.py +0 -0
  466. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/tailwindtheme/get_tailwind.py +0 -0
  467. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/tailwindtheme/snippets/20-loading-box.css +0 -0
  468. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/400.html +0 -0
  469. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/401.html +0 -0
  470. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/403.html +0 -0
  471. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/404.html +0 -0
  472. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/410.html +0 -0
  473. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/500.html +0 -0
  474. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/errors/dict/ul.html +0 -0
  475. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/errors/list/ul.html +0 -0
  476. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/field.html +0 -0
  477. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/label.html +0 -0
  478. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/widgets/attrs.html +0 -0
  479. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/widgets/checkbox.html +0 -0
  480. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/widgets/checkbox_option.html +0 -0
  481. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/widgets/classless_attrs.html +0 -0
  482. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/widgets/date.html +0 -0
  483. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/widgets/datetime.html +0 -0
  484. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/widgets/input.html +0 -0
  485. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/widgets/radio_option.html +0 -0
  486. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/widgets/range.html +0 -0
  487. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/widgets/select.html +0 -0
  488. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/django/forms/widgets/time.html +0 -0
  489. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/_base_confirm_dialog.html +0 -0
  490. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/_base_form_modal_experimental.html +0 -0
  491. /argus_server-2.7.0/src/argus/htmx/templatetags/__init__.py → /argus_server-2.8.1/src/argus/htmx/templates/htmx/_blank.html +0 -0
  492. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/components/_page_title.html +0 -0
  493. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/components/incident_list_refresh_info_select.html +0 -0
  494. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/forms/badge_dropdown_select_multiple.html +0 -0
  495. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/forms/checkbox_select_multiple.html +0 -0
  496. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/forms/input_field.html +0 -0
  497. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/forms/search_select_multiple.html +0 -0
  498. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_base.html +0 -0
  499. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_base_incident_update_modal.html +0 -0
  500. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_filter_create_modal.html +0 -0
  501. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_acknowledge_modal.html +0 -0
  502. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_close_modal.html +0 -0
  503. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_list_refresh_info.html +0 -0
  504. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_reopen_modal.html +0 -0
  505. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_table.html +0 -0
  506. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_table_autorefresh.html +0 -0
  507. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_table_cell_wrapper_default.html +0 -0
  508. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_table_cell_wrapper_link_to_details.html +0 -0
  509. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_table_footer.html +0 -0
  510. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_table_paginator_pageitem.html +0 -0
  511. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_table_rows.html +0 -0
  512. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_ticket_autocreate_modal.html +0 -0
  513. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_ticket_edit_modal.html +0 -0
  514. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_incident_ticket_manual_create_modal.html +0 -0
  515. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/_unpaged_incident_table.html +0 -0
  516. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_ack.html +0 -0
  517. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_ack_icon.html +0 -0
  518. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_actions.html +0 -0
  519. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_color_status.html +0 -0
  520. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_combined_status.html +0 -0
  521. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_combined_status_icons.html +0 -0
  522. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_compact_severity_header.html +0 -0
  523. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_description.html +0 -0
  524. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_end_time.html +0 -0
  525. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_filterable_column_header.html +0 -0
  526. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_level.html +0 -0
  527. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_level_compact.html +0 -0
  528. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_pk.html +0 -0
  529. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_sort_button.html +0 -0
  530. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_sort_button_element.html +0 -0
  531. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_sortable_column_header.html +0 -0
  532. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_source.html +0 -0
  533. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_source_type.html +0 -0
  534. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_start_time.html +0 -0
  535. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_start_time_header.html +0 -0
  536. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_status.html +0 -0
  537. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_status_icon.html +0 -0
  538. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_tag.html +0 -0
  539. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_tags.html +0 -0
  540. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/_incident_ticket.html +0 -0
  541. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/cells/search_fields/input_search.html +0 -0
  542. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/incident_detail.html +0 -0
  543. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/responses/_incident_list_refresh.html +0 -0
  544. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/incident/responses/empty_list_item.html +0 -0
  545. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/notificationprofile/notificationprofile_confirm_delete.html +0 -0
  546. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/notificationprofile/notificationprofile_form.html +0 -0
  547. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/plannedmaintenance/base.html +0 -0
  548. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/styleguide.html +0 -0
  549. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/timeslot/checkbox_option.html +0 -0
  550. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/timeslot/timeslot_confirm_delete.html +0 -0
  551. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/timeslot/timeslot_form.html +0 -0
  552. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/_current_theme.html +0 -0
  553. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/_dateformat_dropdown.html +0 -0
  554. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/_incidents_table_columns_dropdown.html +0 -0
  555. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/_incidents_table_layout_dropdown.html +0 -0
  556. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/_page_size_dropdown.html +0 -0
  557. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/_preference_choice_nopreview.html +0 -0
  558. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/_preference_choice_preview_datetime.html +0 -0
  559. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/_theme_dropdown.html +0 -0
  560. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/_update_interval_dropdown.html +0 -0
  561. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/_user_menu_logout.html +0 -0
  562. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/preference_field_form.html +0 -0
  563. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/preference_form/_incident_table_form.html +0 -0
  564. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/preference_form/_incident_table_preview.html +0 -0
  565. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/preference_form/_preference_form_script.html +0 -0
  566. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/preference_form/_theme_and_format_form.html +0 -0
  567. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/preferences_list.html +0 -0
  568. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/htmx/user/radio_option.html +0 -0
  569. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/messages/_banner.html +0 -0
  570. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/messages/_notification_messages.html +0 -0
  571. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/messages/_notification_messages_htmx_append.html +0 -0
  572. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templates/tailwind_whitelist.html +0 -0
  573. {argus_server-2.7.0/src/argus/htmx/themes → argus_server-2.8.1/src/argus/htmx/templatetags}/__init__.py +0 -0
  574. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/templatetags/argus_htmx.py +0 -0
  575. {argus_server-2.7.0/src/argus/htmx/timeslot → argus_server-2.8.1/src/argus/htmx/themes}/__init__.py +0 -0
  576. {argus_server-2.7.0/src/argus/htmx/user/preferences → argus_server-2.8.1/src/argus/htmx/timeslot}/__init__.py +0 -0
  577. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/timeslot/urls.py +0 -0
  578. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/user/__init__.py +0 -0
  579. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/user/factories.py +0 -0
  580. {argus_server-2.7.0/src/argus/incident/migrations → argus_server-2.8.1/src/argus/htmx/user/preferences}/__init__.py +0 -0
  581. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/user/preferences/forms.py +0 -0
  582. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/user/preferences/models.py +0 -0
  583. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/user/preferences/utils.py +0 -0
  584. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/user/urls.py +0 -0
  585. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/user/views.py +0 -0
  586. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/utils.py +0 -0
  587. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/views.py +0 -0
  588. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/htmx/widgets.py +0 -0
  589. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/__init__.py +0 -0
  590. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/admin.py +0 -0
  591. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/constants.py +0 -0
  592. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/factories.py +0 -0
  593. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/fields.py +0 -0
  594. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/forms.py +0 -0
  595. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/migrations/0001_initial.py +0 -0
  596. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/migrations/0001_squashed_incident_20250514.py +0 -0
  597. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/migrations/0002_empty_source_incident_id.py +0 -0
  598. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/migrations/0003_incident_level.py +0 -0
  599. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/migrations/0004_add_ChangeEvent_proxy.py +0 -0
  600. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/migrations/0005_alter_event_type.py +0 -0
  601. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/migrations/0006_incident_search_text.py +0 -0
  602. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/migrations/0007_alter_event_type.py +0 -0
  603. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/migrations/0008_incident_metadata.py +0 -0
  604. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/migrations/0009_use_bigautofield_on_quickly_growing_tables.py +0 -0
  605. {argus_server-2.7.0/src/argus/incident/ticket → argus_server-2.8.1/src/argus/incident/migrations}/__init__.py +0 -0
  606. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/serializers.py +0 -0
  607. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/templates/incident/admin/fake_incident_add_form.html +0 -0
  608. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/templates/incident/admin/incident_change_list.html +0 -0
  609. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/templates/incident/admin/widgets/split_datetime_infinity.html +0 -0
  610. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/templates/incident/ticket/default_ticket_body.html +0 -0
  611. {argus_server-2.7.0/src/argus/notificationprofile/migrations → argus_server-2.8.1/src/argus/incident/ticket}/__init__.py +0 -0
  612. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/ticket/base.py +0 -0
  613. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/ticket/dummy.py +0 -0
  614. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/ticket/utils.py +0 -0
  615. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/urls.py +0 -0
  616. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/validators.py +0 -0
  617. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/incident/widgets.py +0 -0
  618. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/__init__.py +0 -0
  619. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/checks.py +0 -0
  620. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/filterwrapper.py +0 -0
  621. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/media/sms_as_email.py +0 -0
  622. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/migrations/0001_squashed_0015_remove_days_alter_days_array.py +0 -0
  623. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/migrations/0001_squashed_notificationprofile_20250512.py +0 -0
  624. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/migrations/0002_filter_public.py +0 -0
  625. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/migrations/0016_noop.py +0 -0
  626. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/migrations/0017_change_event_type_to_event_types.py +0 -0
  627. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/migrations/0018_remove_closed_and_unacked_from_filterblob.py +0 -0
  628. {argus_server-2.7.0/src/argus/plannedmaintenance → argus_server-2.8.1/src/argus/notificationprofile/migrations}/__init__.py +0 -0
  629. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/templates/notificationprofile/email.html +0 -0
  630. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/templates/notificationprofile/email.txt +0 -0
  631. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/notificationprofile/templates/schemawrapper.html +0 -0
  632. {argus_server-2.7.0/src/argus/plannedmaintenance/migrations → argus_server-2.8.1/src/argus/notificationprofile/v2}/__init__.py +0 -0
  633. {argus_server-2.7.0/src/argus/notificationprofile → argus_server-2.8.1/src/argus/notificationprofile/v2}/urls.py +0 -0
  634. {argus_server-2.7.0/src/argus/site → argus_server-2.8.1/src/argus/notificationprofile/v3}/__init__.py +0 -0
  635. {argus_server-2.7.0/src/argus/util → argus_server-2.8.1/src/argus/plannedmaintenance}/__init__.py +0 -0
  636. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/plannedmaintenance/admin.py +0 -0
  637. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/plannedmaintenance/factories.py +0 -0
  638. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/plannedmaintenance/migrations/0001_initial.py +0 -0
  639. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/plannedmaintenance/migrations/0002_incidents_connection.py +0 -0
  640. {argus_server-2.7.0/tests → argus_server-2.8.1/src/argus/plannedmaintenance/migrations}/__init__.py +0 -0
  641. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/plannedmaintenance/templates/plannedmaintenance/admin/planned_maintenance_change_form.html +0 -0
  642. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/plannedmaintenance/utils.py +0 -0
  643. {argus_server-2.7.0/tests/auth/management_commands → argus_server-2.8.1/src/argus/site}/__init__.py +0 -0
  644. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/logging.py +0 -0
  645. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/serializers.py +0 -0
  646. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/settings/__init__.py +0 -0
  647. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/settings/_serializers.py +0 -0
  648. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/settings/backend.py +0 -0
  649. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/settings/dev.py +0 -0
  650. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/settings/dockerdev.py +0 -0
  651. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/settings/prod.py +0 -0
  652. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/settings/test_CI.py +0 -0
  653. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/utils.py +0 -0
  654. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/site/wsgi.py +0 -0
  655. {argus_server-2.7.0/tests/dev → argus_server-2.8.1/src/argus/util}/__init__.py +0 -0
  656. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/util/admin_utils.py +0 -0
  657. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/util/datetime_utils.py +0 -0
  658. {argus_server-2.7.0 → argus_server-2.8.1}/src/argus/util/utils.py +0 -0
  659. {argus_server-2.7.0/tests/filter → argus_server-2.8.1/tests}/__init__.py +0 -0
  660. {argus_server-2.7.0 → argus_server-2.8.1}/tests/auth/__init__.py +0 -0
  661. {argus_server-2.7.0/tests/htmx → argus_server-2.8.1/tests/auth/management_commands}/__init__.py +0 -0
  662. {argus_server-2.7.0 → argus_server-2.8.1}/tests/auth/management_commands/test_changeuser.py +0 -0
  663. {argus_server-2.7.0 → argus_server-2.8.1}/tests/auth/management_commands/test_createuser.py +0 -0
  664. {argus_server-2.7.0 → argus_server-2.8.1}/tests/auth/models.py +0 -0
  665. {argus_server-2.7.0 → argus_server-2.8.1}/tests/auth/test_auth.py +0 -0
  666. {argus_server-2.7.0 → argus_server-2.8.1}/tests/auth/test_knox_views.py +0 -0
  667. {argus_server-2.7.0 → argus_server-2.8.1}/tests/auth/test_models.py +0 -0
  668. {argus_server-2.7.0 → argus_server-2.8.1}/tests/auth/test_utils.py +0 -0
  669. {argus_server-2.7.0 → argus_server-2.8.1}/tests/auth/test_views.py +0 -0
  670. {argus_server-2.7.0/tests/htmx/incident → argus_server-2.8.1/tests/dev}/__init__.py +0 -0
  671. {argus_server-2.7.0 → argus_server-2.8.1}/tests/dev/test_bulk_incidents.py +0 -0
  672. {argus_server-2.7.0 → argus_server-2.8.1}/tests/dev/test_check_token_expiry.py +0 -0
  673. {argus_server-2.7.0 → argus_server-2.8.1}/tests/dev/test_close_incident.py +0 -0
  674. {argus_server-2.7.0 → argus_server-2.8.1}/tests/dev/test_create_fake_incident.py +0 -0
  675. {argus_server-2.7.0 → argus_server-2.8.1}/tests/dev/test_create_source.py +0 -0
  676. {argus_server-2.7.0 → argus_server-2.8.1}/tests/dev/test_gen_secret_key.py +0 -0
  677. {argus_server-2.7.0 → argus_server-2.8.1}/tests/dev/test_initial_setup.py +0 -0
  678. {argus_server-2.7.0 → argus_server-2.8.1}/tests/dev/test_list_filters.py +0 -0
  679. {argus_server-2.7.0 → argus_server-2.8.1}/tests/dev/test_toggle_profile_activation.py +0 -0
  680. {argus_server-2.7.0 → argus_server-2.8.1}/tests/dev/test_utils.py +0 -0
  681. {argus_server-2.7.0/tests/htmx/notificationprofile → argus_server-2.8.1/tests/filter}/__init__.py +0 -0
  682. {argus_server-2.7.0 → argus_server-2.8.1}/tests/filter/dummyplugin.py +0 -0
  683. {argus_server-2.7.0 → argus_server-2.8.1}/tests/filter/test_filter_model.py +0 -0
  684. {argus_server-2.7.0 → argus_server-2.8.1}/tests/filter/test_filterplugin.py +0 -0
  685. {argus_server-2.7.0 → argus_server-2.8.1}/tests/filter/test_filterwrapper.py +0 -0
  686. {argus_server-2.7.0 → argus_server-2.8.1}/tests/filter/test_queryset_filters.py +0 -0
  687. {argus_server-2.7.0 → argus_server-2.8.1}/tests/helpers.py +0 -0
  688. {argus_server-2.7.0/tests/htmx/plannedmaintenance → argus_server-2.8.1/tests/htmx}/__init__.py +0 -0
  689. {argus_server-2.7.0/tests/htmx/timeslot → argus_server-2.8.1/tests/htmx/destination}/__init__.py +0 -0
  690. {argus_server-2.7.0/tests/htmx/user → argus_server-2.8.1/tests/htmx/incident}/__init__.py +0 -0
  691. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/incident/test_customization.py +0 -0
  692. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/incident/test_forms_incident_filters.py +0 -0
  693. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/incident/test_utils.py +0 -0
  694. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/incident/test_views.py +0 -0
  695. {argus_server-2.7.0/tests/incident/fixtures → argus_server-2.8.1/tests/htmx/management}/__init__.py +0 -0
  696. {argus_server-2.7.0/tests/incident/ticket_plugins → argus_server-2.8.1/tests/htmx/notificationprofile}/__init__.py +0 -0
  697. {argus_server-2.7.0/tests/incident/unit → argus_server-2.8.1/tests/htmx/plannedmaintenance}/__init__.py +0 -0
  698. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/test_context_processors.py +0 -0
  699. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/test_incident_columns_rendering.py +0 -0
  700. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/test_middleware.py +0 -0
  701. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/test_templatetags.py +0 -0
  702. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/test_utils.py +0 -0
  703. {argus_server-2.7.0/tests/notificationprofile/destinations → argus_server-2.8.1/tests/htmx/themes}/__init__.py +0 -0
  704. {argus_server-2.7.0/tests/notificationprofile/migrations → argus_server-2.8.1/tests/htmx/timeslot}/__init__.py +0 -0
  705. {argus_server-2.7.0/tests/plannedmaintenance → argus_server-2.8.1/tests/htmx/user}/__init__.py +0 -0
  706. {argus_server-2.7.0 → argus_server-2.8.1}/tests/htmx/user/test_views.py +0 -0
  707. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/__init__.py +0 -0
  708. {argus_server-2.7.0/tests/site → argus_server-2.8.1/tests/incident/fixtures}/__init__.py +0 -0
  709. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/test_change_event.py +0 -0
  710. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/test_create_fake_incident.py +0 -0
  711. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/test_event.py +0 -0
  712. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/test_filters.py +0 -0
  713. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/test_incident_fields.py +0 -0
  714. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/test_queryset.py +0 -0
  715. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/test_serializers.py +0 -0
  716. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/test_source_system.py +0 -0
  717. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/test_source_system_type.py +0 -0
  718. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/test_views.py +0 -0
  719. {argus_server-2.7.0/tests/util → argus_server-2.8.1/tests/incident/ticket_plugins}/__init__.py +0 -0
  720. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/ticket_plugins/test_base.py +0 -0
  721. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/ticket_plugins/test_dummy.py +0 -0
  722. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/ticket_plugins/test_utils.py +0 -0
  723. {argus_server-2.7.0 → argus_server-2.8.1}/tests/incident/unit/test_incident_details_url.py +0 -0
  724. {argus_server-2.7.0 → argus_server-2.8.1}/tests/migration_example.py +0 -0
  725. {argus_server-2.7.0 → argus_server-2.8.1}/tests/notificationprofile/__init__.py +0 -0
  726. {argus_server-2.7.0 → argus_server-2.8.1}/tests/notificationprofile/test_filterwrapper.py +0 -0
  727. {argus_server-2.7.0 → argus_server-2.8.1}/tests/notificationprofile/test_github236.py +0 -0
  728. {argus_server-2.7.0 → argus_server-2.8.1}/tests/notificationprofile/test_media.py +0 -0
  729. {argus_server-2.7.0 → argus_server-2.8.1}/tests/plannedmaintenance/test_models.py +0 -0
  730. {argus_server-2.7.0 → argus_server-2.8.1}/tests/plannedmaintenance/test_utils.py +0 -0
  731. {argus_server-2.7.0 → argus_server-2.8.1}/tests/site/test_misc.py +0 -0
  732. {argus_server-2.7.0 → argus_server-2.8.1}/tests/site/test_settings_helpers.py +0 -0
  733. {argus_server-2.7.0 → argus_server-2.8.1}/tests/site/test_settings_validators.py +0 -0
  734. {argus_server-2.7.0 → argus_server-2.8.1}/tests/site/test_views.py +0 -0
  735. {argus_server-2.7.0 → argus_server-2.8.1}/tests/util/test_utils.py +0 -0
@@ -0,0 +1,30 @@
1
+ #!/bin/bash
2
+ # PostToolUse hook: check test naming conventions after Edit/Write on test files.
3
+ # Gives Claude feedback (exit 2) so it can fix the names before committing.
4
+
5
+ INPUT=$(cat)
6
+ FILE_PATH=$(echo "$INPUT" | jq -r '.tool_input.file_path // empty')
7
+
8
+ # Only check test files under tests/
9
+ if [[ ! "$FILE_PATH" =~ ^.*/tests/.*\.py$ ]] && [[ ! "$FILE_PATH" =~ ^tests/.*\.py$ ]]; then
10
+ exit 0
11
+ fi
12
+
13
+ # Find the project root (where checks/ lives)
14
+ PROJECT_DIR="${CLAUDE_PROJECT_DIR:-$(git rev-parse --show-toplevel 2>/dev/null)}"
15
+ CHECKER="$PROJECT_DIR/checks/check_test_names.py"
16
+
17
+ if [[ ! -f "$CHECKER" ]]; then
18
+ exit 0
19
+ fi
20
+
21
+ # Make file_path relative to project root for the checker
22
+ REL_PATH="${FILE_PATH#"$PROJECT_DIR"/}"
23
+
24
+ output=$(python3 "$CHECKER" --files "$REL_PATH" 2>&1)
25
+ exit_code=$?
26
+
27
+ if [[ $exit_code -ne 0 ]]; then
28
+ echo "$output" >&2
29
+ exit 2
30
+ fi
@@ -0,0 +1,16 @@
1
+ {
2
+ "hooks": {
3
+ "PostToolUse": [
4
+ {
5
+ "matcher": "Edit|Write",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/check-test-names.sh",
10
+ "timeout": 10
11
+ }
12
+ ]
13
+ }
14
+ ]
15
+ }
16
+ }
@@ -8,6 +8,10 @@
8
8
  !.pre-commit-config.yaml
9
9
  !.readthedocs.yaml
10
10
  !.sonarcloud.properties
11
+ !.claude/
12
+ .claude/*
13
+ !.claude/settings.json
14
+ !.claude/hooks/
11
15
  !.mailmap
12
16
 
13
17
  # local config files
@@ -43,9 +47,12 @@ spasettings.py
43
47
  *$py.class
44
48
 
45
49
  # Tailwind CSS
46
- # src/argus/htmx/static/styles.css
47
- # Autogenerated via management command
48
- # src/argus/htmx/tailwindtheme/tailwind.config.js
50
+ src/argus/htmx/static/styles.css
51
+ src/argus/htmx/tailwindtheme/styles.css
52
+ src/argus/htmx/tailwindtheme/tailwind.css
53
+ src/argus/htmx/tailwindtheme/custom-themes/*
54
+ !src/argus/htmx/tailwindtheme/custom-themes/README.md
55
+
49
56
  # OS specific
50
57
  src/argus/htmx/tailwindtheme/tailwindcss
51
58
 
@@ -8,6 +8,117 @@ This project uses [*towncrier*](https://towncrier.readthedocs.io/) and the chang
8
8
 
9
9
  <!-- towncrier release notes start -->
10
10
 
11
+ ## [2.8.1] - 2026-04-28
12
+
13
+ Mini-release to help something depending on the production docker image.
14
+
15
+ ### Fixed
16
+
17
+ - Use `django-admin` to call `initial_setup` instead of `python3 manage.py` in
18
+ production image
19
+
20
+
21
+ ## [2.8.0] - 2026-03-06
22
+
23
+ The most important change in this release is that we have finally added the
24
+ long awaited task queue, to handle background tasks. The task queue uses the
25
+ database for storage by default so running migrations is necessary. As part of
26
+ using the queue to send notifications we fixed several bugs that caused a lower
27
+ amount of notifications to be sent than expected. Another big change is we have
28
+ upgraded tailwind, which affects theme customization and building packages.
29
+
30
+ You *must* see the NOTES before updating if you or your deployment do any of
31
+ the following:
32
+
33
+ - Send notifications (`SEND_NOTIFICATIONS = True`). Affected both by the new
34
+ queue and the bug-fixes.
35
+ - Alter any templates or CSS, due to the upgrade of tailwind.
36
+ - Replace or rework the incident list filter box.
37
+ - Write your own media plugins.
38
+ - Build your own package (useful for bundling themes and tweaks). The release
39
+ checklist has changed.
40
+
41
+ ### Added
42
+
43
+ - Added support for a task queue. We're using `django-tasks`, which is in the
44
+ process of being merged into Django proper, with the backend
45
+ `django-tasks-db`. This stores the tasks in the same database as everything
46
+ else. We're currently only using the queue to send notifications, so if you
47
+ are not using argus for that (`SEND_NOTIFICATIONS` is off), nothing changes.
48
+ ([#1608](https://github.com/Uninett/Argus/issues/1608))
49
+ - Add "Create copy" action for planned maintenance tasks
50
+ ([#1613](https://github.com/Uninett/Argus/issues/1613))
51
+ - Show name of owner for public filters
52
+ ([#1748](https://github.com/Uninett/Argus/issues/1748))
53
+ - Add preview of incidents covered by selected filters in planned maintenance
54
+ task form ([#1765](https://github.com/Uninett/Argus/issues/1765))
55
+ - Create admin user from env variables in docker entrypoint
56
+ ([#1776](https://github.com/Uninett/Argus/issues/1776))
57
+ - Validate `DAISYUI_THEMES` entries, skipping invalid ones with warnings
58
+ ([#1819](https://github.com/Uninett/Argus/issues/1819))
59
+ - Add Sikt light and dark DaisyUI themes based on Sikt Design System color
60
+ tokens ([#1822](https://github.com/Uninett/Argus/issues/1822))
61
+
62
+ ### Changed
63
+
64
+ - Upgrade to Tailwind CSS v4 and DaisyUI v5. See NOTES for theme customization.
65
+ ([#1262](https://github.com/Uninett/Argus/issues/1262))
66
+ - We are now using a task queue to send notifications instead of forking off
67
+ a process. This is to increase robustness and hopefully to increase
68
+ throughput. If argus is being used to send notifications, you MUST change
69
+ your deployment as there now is an additional service that needs to run in
70
+ order to handle the notifications on the queue. See the NOTES!
71
+ ([#1608](https://github.com/Uninett/Argus/issues/1608))
72
+ - Refactor incident list filter UI with collapsible filterbox and dynamic bulk
73
+ actions bar. ([#1693](https://github.com/Uninett/Argus/issues/1693))
74
+ - Improve maintenance column by adding a dropdown with tasks that affect the
75
+ incident ([#1745](https://github.com/Uninett/Argus/issues/1745))
76
+ - Support searching for filters by first and last name of user
77
+ ([#1764](https://github.com/Uninett/Argus/issues/1764))
78
+ - Added under maintenance column to maintenance column preset
79
+ ([#1775](https://github.com/Uninett/Argus/issues/1775))
80
+ - Improve timeslot form with compact table layout for time recurrences
81
+ ([#1794](https://github.com/Uninett/Argus/issues/1794))
82
+ - Consolidate notification routes under /notifications/ with tab navigation
83
+ ([#1795](https://github.com/Uninett/Argus/issues/1795))
84
+ - Improve notification profile form with collapsible cards and inline actions
85
+ ([#1796](https://github.com/Uninett/Argus/issues/1796))
86
+ - Moved some functionality from the email media plugin to the base class of all
87
+ media plugins. Basically, any destination can now be marked as being
88
+ "managed", which means that it is created and managed by a system outside of
89
+ an end-users control. This can be for instance email addresses or phone
90
+ numbers fetched from an account-database or address book.
91
+ ([#1802](https://github.com/Uninett/Argus/issues/1802))
92
+ - Redesign destination page as flat table with inline editing
93
+ ([#1806](https://github.com/Uninett/Argus/issues/1806))
94
+ - Tailwind CSS intermediate files (theme CSS, config snippets) are no longer
95
+ tracked in git. See NOTES.
96
+ ([#1826](https://github.com/Uninett/Argus/issues/1826))
97
+ - Redesign filter toolbar with compact icon buttons and direct filter actions
98
+ ([#1831](https://github.com/Uninett/Argus/issues/1831))
99
+
100
+ ### Fixed
101
+
102
+ - Notifications are now also sent on bulk changes to incidents. Note that for
103
+ filters used for sending notifications, it will be necessary to control event
104
+ types to maintain the current expected amount of notifications sent. See
105
+ NOTES. ([#1763](https://github.com/Uninett/Argus/issues/1763))
106
+ - Limit choices of incidents field in PM admin to open incidents
107
+ ([#1789](https://github.com/Uninett/Argus/issues/1789))
108
+ - Make it possible to use public filters in notification profiles
109
+ ([#1805](https://github.com/Uninett/Argus/issues/1805))
110
+ - Fixed a bug where the setting that controls whether notifications will be
111
+ sent was ignored when sending notifications in the background. The
112
+ notifications were sent regardless.
113
+ ([#1808](https://github.com/Uninett/Argus/issues/1808))
114
+ - Allow for multiple notification profiles with no name
115
+ ([#1828](https://github.com/Uninett/Argus/issues/1828))
116
+ - Fix showing age for stateless incidents
117
+ ([#1833](https://github.com/Uninett/Argus/issues/1833))
118
+ - Fix theme preview showing wrong foreground text color on color swatches
119
+ ([#1834](https://github.com/Uninett/Argus/issues/1834))
120
+
121
+
11
122
  ## [2.7.0] - 2026-01-23
12
123
 
13
124
  This release improves the UX for creating planned maintenance tasks, by having
@@ -1,4 +1,4 @@
1
- .PHONY: clean testclean distclean coverageclean cacheclean nuke tailwind docclean upgrade-tailwind tailwind-watch
1
+ .PHONY: clean testclean distclean coverageclean cacheclean nuke setup-tailwind tailwind-config tailwind-build-config tailwind docclean upgrade-tailwind tailwind-watch check-test-names
2
2
 
3
3
  TAILWINDDIR=src/argus/htmx/tailwindtheme
4
4
  STATICDIR=src/argus/htmx/static
@@ -31,11 +31,22 @@ testclean: coverageclean clean
31
31
 
32
32
  nuke: clean docclean distclean testclean cacheclean
33
33
 
34
+ setup-tailwind: upgrade-tailwind tailwind-config tailwind
35
+
36
+ tailwind-config:
37
+ PYTHONPATH=$(PYTHONPATH) python3 manage.py tailwind_config
38
+
39
+ tailwind-build-config:
40
+ PYTHONPATH=$(PYTHONPATH) python3 src/argus/htmx/tailwindtheme/generate_css_config.py
41
+
34
42
  tailwind:
35
- $(TAILWINDDIR)/tailwindcss -c $(TAILWINDDIR)/tailwind.config.js -i $(TAILWINDDIR)/styles.css -o $(STATICDIR)/styles.css
43
+ $(TAILWINDDIR)/tailwindcss -i $(TAILWINDDIR)/styles.css -o $(STATICDIR)/styles.css
36
44
 
37
45
  tailwind-watch:
38
- $(TAILWINDDIR)/tailwindcss -c $(TAILWINDDIR)/tailwind.config.js -i $(TAILWINDDIR)/styles.css -o $(STATICDIR)/styles.css --watch
46
+ $(TAILWINDDIR)/tailwindcss -i $(TAILWINDDIR)/styles.css -o $(STATICDIR)/styles.css --watch
39
47
 
40
48
  upgrade-tailwind:
41
49
  PYTHONPATH=$(PYTHONPATH) python3 src/argus/htmx/tailwindtheme/get_tailwind.py
50
+
51
+ check-test-names:
52
+ python3 checks/check_test_names.py --base main
@@ -3,6 +3,133 @@
3
3
  This file documents changes to Argus that are relevant for operations,
4
4
  customizers and end-users.
5
5
 
6
+ ## [2.8.0] - 2026-03-06
7
+
8
+ This release adds an important new dependency, django-tasks-db, which brings
9
+ with it a new table. Remember to freshen installed dependencies, then migrate.
10
+
11
+ ### Sending notifications via a task queue
12
+
13
+ We are now using a task queue to send notifications instead of forking off
14
+ a process. This is to increase robustness and hopefully to increase throughput.
15
+ If argus is being used to send notifications, you MUST change your deployment
16
+ as there now is an additional service that needs to run in order to handle the
17
+ notifications on the queue.
18
+
19
+ There is a new management command `db_worker` used to proceess the queue. In
20
+ order to send out notifications, this command needs to run supervised by
21
+ something. The included docker-compose for development already does this, but
22
+ if using for instance Kubernetes it should run in its own pod, and if running
23
+ on hardware it needs to be handled by for instance systemd, supervisor, nosh,
24
+ s6 or daemontools. See the new production section of the documentation.
25
+
26
+ If your argus sends no or very few notifications, it might be relevant to
27
+ override the settings file to use
28
+ `django_tasks.backends.immediate.ImmediateBackend`, see the site settings
29
+ docs.
30
+
31
+ ### Themes and looks
32
+
33
+ Tailwind has been upgraded to v4 and DaisyUI to v5. Check out the
34
+ [DaisyUi 5 theme-generator](https://daisyui.com/theme-generator/)!
35
+
36
+ - Custom themes defined in `DAISYUI_THEMES` must now use CSS variable syntax
37
+ with explicit `--color-` prefixes (e.g., `"--color-primary": "#006d91"`).
38
+ - The `TAILWIND_THEME_OVERRIDE` setting has been removed. Use CSS `@theme`
39
+ blocks in a `themes/override.css` file instead.
40
+
41
+ The Makefile has grown several new commands and the release checklist has been
42
+ updated to take them into account.
43
+
44
+ See the updated documentation for full details on theme customization.
45
+
46
+ Tailwind CSS intermediate files (theme CSS, config snippets) are no longer
47
+ tracked in git.
48
+
49
+ - Local theme customizations via `DAISYUI_THEMES` will no longer dirty the
50
+ working tree.
51
+ - Use `make tailwind-config tailwind` (needs virtualenv) after changing themes
52
+ or settings.
53
+ - Use `make setup-tailwind` (needs virtualenv) to bootstrap CSS from scratch
54
+ (fresh clone or CI).
55
+
56
+ ### Frontend, incident list filter box: templates refactored, looks updated
57
+
58
+ The work that started in 2.7 continues. The filter box in its hidden state now
59
+ takes up even less space than it used to, and when open it now takes up less
60
+ height. The bulk action bar has been made more dynamic; it is easier to see
61
+ which filter has been selected, and the Delete and Update buttons work on thge
62
+ currently selected fiilter.
63
+
64
+ If you do not use the filterbox but you do support bulk actions you might have
65
+ to update your templates again.
66
+
67
+ A reminder:
68
+
69
+ The template `_incident_list_menubar.html` is deprecated; override
70
+ `_incident_toolbar.html` or `_filter_controls.html` instead.
71
+
72
+ ### All notification plugins now supports "managed" mode
73
+
74
+ A "managed" destination is not managed by an end-user but fetched/generated
75
+ from somewhere else. Such a destination cannot be deleted.
76
+
77
+ It used to be only the bundled email media plugin had this functionality, we've
78
+ moved it to the base class and renamed it from "synced" to "managed". This is
79
+ most useful for phone numbers and email addresses.
80
+
81
+ Media plugins will need to be updated if they override any of the methods
82
+ `validate`, `raise_if_not_deletable` or `update`. Media plugins are now
83
+ instantiated with what API version of the settings-field they should return,
84
+ and for that reason `validate` has become an instance method as opposed to
85
+ a classmethod. `raise_if_not_deletable` and `update` has grown in size on the
86
+ base class and might not need to be overidden anymore.
87
+
88
+ ### More notifications will be generated and sent
89
+
90
+ Notifications are now also sent on bulk changes to incidents. This means that
91
+ by default there will be notifications if the API alters incidents in bulk, or
92
+ an end user alters incidents in the frontend. This means more notifications,
93
+ and it may mean *a lot more* notifications. One per changed incident.
94
+
95
+ If you want the full fire hose of notifications site-wide you need do
96
+ nothing.
97
+
98
+ To maintain a lower amount of notifications it is necessary to alter the "Event
99
+ types" filter to care only about source-initiated changes to the incident
100
+ status.
101
+
102
+ Note: It might not lower the amount all the way back to the levels before
103
+ this bugfix, as it depends on whether any glue-services used the bulk API to
104
+ alter multiple incidents at once. Previously, notifications for those changes
105
+ would be suppressed.
106
+
107
+ The easiest and fastest way to get back to lower levels of notifications is by
108
+ changing the Django setting `ARGUS_FALLBACK_FILTER` to:
109
+
110
+ ```
111
+ ARGUS_FALLBACK_FILTER = {"event_types": ["STA", "END"]}
112
+ ```
113
+
114
+ This affects all existing and future notification filters, and can be
115
+ overridden by end-users themselves.
116
+
117
+ End-users themselves can get back the old, low amount of notifications via the
118
+ frontend by creating a filter with "Event Types" set to both:
119
+
120
+ - Incident start
121
+ - Incident end
122
+
123
+ … and adding that to their existing notification profiles. This will override
124
+ what's set in `ARGUS_FALLBACK_FILTER`.
125
+
126
+ A third option is adding a public filter "Source-initiated status changes" via
127
+ admin and using the admin to add that filter to all notification profiles that
128
+ don't explicitly set event types.
129
+
130
+ `ARGUS_FALLBACK_FILTER` will not affect what's shown on the dashboard or
131
+ filters used for planned maintenance.
132
+
6
133
  ## [2.7.0] - 2026-01-23
7
134
 
8
135
  ### Planned maintenance
@@ -50,6 +177,26 @@ of events that happened if the start of the incident was not covered by
50
177
  a notification timeslot. This might mean more notifications! Please set the
51
178
  `event types` filter to only the types of events desired.
52
179
 
180
+ ### Incident list filter UI refactoring
181
+
182
+ The incident list filter UI has been refactored. The tabbed interface with
183
+ "Filter Incidents" and "Update Incidents" tabs has been replaced with:
184
+
185
+ - A collapsible filterbox (hidden by default, toggled with "Show/Hide filters")
186
+ - A dynamic bulk actions bar that appears when rows are selected
187
+
188
+ **Template changes for customizers:**
189
+
190
+ The template `_incident_list_menubar.html` is now **deprecated** and will be
191
+ removed in a future version. It currently acts as a shim that includes the new
192
+ `_incident_toolbar.html` template.
193
+
194
+ If you have overridden `_incident_list_menubar.html`, your override will still
195
+ be loaded, but you should migrate to the new templates:
196
+
197
+ - `_incident_toolbar.html`: Contains the full toolbar (filter controls + bulk actions)
198
+ - `_filter_controls.html`: Contains the filter select dropdown, CRUD buttons, and show/hide toggle
199
+
53
200
  ## [2.6.0] - 2026-01-06
54
201
 
55
202
  This is a tiny release to finish up what was started at the end of 2025.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: argus-server
3
- Version: 2.7.0
3
+ Version: 2.8.1
4
4
  Summary: Argus is an alert aggregator for monitoring systems
5
5
  Project-URL: Homepage, https://github.com/Uninett/Argus
6
6
  Author-email: Uninett Opensource <opensource@uninett.no>
@@ -25,6 +25,7 @@ Requires-Dist: django-filter
25
25
  Requires-Dist: django-htmx
26
26
  Requires-Dist: django-phonenumber-field[phonenumberslite]
27
27
  Requires-Dist: django-rest-knox
28
+ Requires-Dist: django-tasks-db
28
29
  Requires-Dist: django-widget-tweaks==1.5.0
29
30
  Requires-Dist: django<6.1,>=5.2.8
30
31
  Requires-Dist: djangorestframework>=3.14
@@ -192,7 +193,7 @@ $ docker compose up
192
193
  Run the initial Argus setup, and make note of the admin password that is generated:
193
194
 
194
195
  ```console
195
- $ docker compose exec api django-admin initial_setup
196
+ $ docker compose exec argus django-admin initial_setup
196
197
  ******************************************************************************
197
198
 
198
199
  Created Argus superuser "admin" with password "ns6bfoKquW12koIP".
@@ -132,7 +132,7 @@ $ docker compose up
132
132
  Run the initial Argus setup, and make note of the admin password that is generated:
133
133
 
134
134
  ```console
135
- $ docker compose exec api django-admin initial_setup
135
+ $ docker compose exec argus django-admin initial_setup
136
136
  ******************************************************************************
137
137
 
138
138
  Created Argus superuser "admin" with password "ns6bfoKquW12koIP".
@@ -0,0 +1,200 @@
1
+ #!/usr/bin/env python3
2
+ """Check that new test method names follow the given/when/then/it_should convention.
3
+
4
+ Scans git diff for newly added test methods and warns if they lack
5
+ convention keywords (given, when, then, should).
6
+
7
+ Usage:
8
+ # Check staged changes (pre-commit)
9
+ python checks/check_test_names.py
10
+
11
+ # Check branch diff against main
12
+ python checks/check_test_names.py --base main
13
+
14
+ # Check specific files
15
+ python checks/check_test_names.py --files tests/test_foo.py tests/test_bar.py
16
+ """
17
+
18
+ import argparse
19
+ import re
20
+ import subprocess
21
+ import sys
22
+
23
+ KEYWORDS = {"given", "when", "then"}
24
+ PHRASE_KEYWORDS = {"it_should"}
25
+ TEST_DEF_RE = re.compile(r"^\+\s*def (test_\w+)\(")
26
+ TEST_FILE_RE = re.compile(r"^tests/.*\.py$")
27
+
28
+ # Matches: +++ b/tests/some/path.py
29
+ DIFF_FILE_RE = re.compile(r"^\+\+\+ b/(.+)$")
30
+
31
+
32
+ def get_new_test_names_from_diff(diff: str) -> list[tuple[str, str]]:
33
+ """Extract (filename, test_name) pairs from added lines in a diff."""
34
+ results = []
35
+ current_file = None
36
+
37
+ for line in diff.splitlines():
38
+ file_match = DIFF_FILE_RE.match(line)
39
+ if file_match:
40
+ path = file_match.group(1)
41
+ current_file = path if TEST_FILE_RE.match(path) else None
42
+ continue
43
+
44
+ if current_file is None:
45
+ continue
46
+
47
+ test_match = TEST_DEF_RE.match(line)
48
+ if test_match:
49
+ results.append((current_file, test_match.group(1)))
50
+
51
+ return results
52
+
53
+
54
+ def check_name(name: str) -> bool:
55
+ """Return True if the test name contains at least one convention keyword."""
56
+ lower = name.lower()
57
+ parts = set(lower.split("_"))
58
+ if parts & KEYWORDS:
59
+ return True
60
+ return any(phrase in lower for phrase in PHRASE_KEYWORDS)
61
+
62
+
63
+ def get_diff_staged() -> str:
64
+ result = subprocess.run(
65
+ ["git", "diff", "--cached", "--unified=0"],
66
+ capture_output=True,
67
+ text=True,
68
+ )
69
+ return result.stdout
70
+
71
+
72
+ def get_diff_base(base: str) -> str:
73
+ merge_base = subprocess.run(
74
+ ["git", "merge-base", base, "HEAD"],
75
+ capture_output=True,
76
+ text=True,
77
+ )
78
+ base_ref = merge_base.stdout.strip()
79
+ if not base_ref:
80
+ print(f"Could not find merge base with {base}", file=sys.stderr)
81
+ sys.exit(2)
82
+
83
+ result = subprocess.run(
84
+ ["git", "diff", base_ref, "HEAD", "--unified=0"],
85
+ capture_output=True,
86
+ text=True,
87
+ )
88
+ return result.stdout
89
+
90
+
91
+ def get_diff_files(files: list[str]) -> str:
92
+ """Read files and pretend all test defs are new (for checking specific files)."""
93
+ lines = []
94
+ for path in files:
95
+ if not TEST_FILE_RE.match(path):
96
+ continue
97
+ lines.append(f"+++ b/{path}")
98
+ try:
99
+ with open(path) as f:
100
+ for line in f:
101
+ stripped = line.rstrip()
102
+ if re.match(r"\s*def test_\w+\(", stripped):
103
+ lines.append(f"+{stripped}")
104
+ except FileNotFoundError:
105
+ print(f"File not found: {path}", file=sys.stderr)
106
+ return "\n".join(lines)
107
+
108
+
109
+ def format_plain(violations, total):
110
+ lines = [
111
+ f"{len(violations)} of {total} new test name(s) missing convention keywords (given/when/then/it_should):\n"
112
+ ]
113
+ for filepath, name in violations:
114
+ lines.append(f" {filepath}: {name}")
115
+ lines.append(
116
+ "\nConsider rephrasing with given/when/then/it_should, e.g.:"
117
+ "\n test_when_no_incidents_then_returns_empty_list"
118
+ "\n test_it_should_create_incident_with_set_description"
119
+ "\n test_given_expired_token_when_refreshing_then_raises_error"
120
+ )
121
+ return "\n".join(lines)
122
+
123
+
124
+ def format_markdown(violations, total):
125
+ lines = [
126
+ "> [!WARNING]",
127
+ f"> **{len(violations)}** of **{total}** new test names are missing"
128
+ " convention keywords (`given`/`when`/`then`/`it_should`)",
129
+ "",
130
+ "| File | Test name |",
131
+ "|------|-----------|",
132
+ ]
133
+ for filepath, name in violations:
134
+ lines.append(f"| `{filepath}` | `{name}` |")
135
+ lines.extend(
136
+ [
137
+ "",
138
+ "<details>",
139
+ "<summary>Why am I seeing this?</summary>",
140
+ "",
141
+ "Test names should follow a loose **given/when/then** pattern with"
142
+ " keywords like `given`, `when`, `then`, or `it_should`."
143
+ " This is a suggestion, not a blocker."
144
+ " The check runs on new test methods added in this PR.",
145
+ "",
146
+ "Examples:",
147
+ "- `test_when_no_incidents_then_returns_empty_list`",
148
+ "- `test_it_should_create_incident_with_set_description`",
149
+ "- `test_given_expired_token_when_refreshing_then_raises_error`",
150
+ "</details>",
151
+ ]
152
+ )
153
+ return "\n".join(lines)
154
+
155
+
156
+ def main():
157
+ parser = argparse.ArgumentParser(description=__doc__)
158
+ parser.add_argument(
159
+ "--base",
160
+ help="Base branch to diff against (e.g. main). If omitted, checks staged changes.",
161
+ )
162
+ parser.add_argument(
163
+ "--files",
164
+ nargs="+",
165
+ help="Check all test names in specific files (ignores git diff).",
166
+ )
167
+ parser.add_argument(
168
+ "--format",
169
+ choices=["plain", "markdown"],
170
+ default="plain",
171
+ dest="output_format",
172
+ help="Output format (default: plain).",
173
+ )
174
+ args = parser.parse_args()
175
+
176
+ if args.files:
177
+ diff = get_diff_files(args.files)
178
+ elif args.base:
179
+ diff = get_diff_base(args.base)
180
+ else:
181
+ diff = get_diff_staged()
182
+
183
+ new_tests = get_new_test_names_from_diff(diff)
184
+
185
+ if not new_tests:
186
+ return
187
+
188
+ violations = [(f, name) for f, name in new_tests if not check_name(name)]
189
+
190
+ if not violations:
191
+ print(f"All {len(new_tests)} new test name(s) follow the naming convention.")
192
+ return
193
+
194
+ formatter = format_markdown if args.output_format == "markdown" else format_plain
195
+ print(formatter(violations, len(new_tests)))
196
+ sys.exit(1)
197
+
198
+
199
+ if __name__ == "__main__":
200
+ main()
@@ -13,6 +13,7 @@ ignore:
13
13
  - "tests/**"
14
14
  - "src/argus/site/settings/**"
15
15
  - "src/argus/spa/dataporten/social.py"
16
+ - "src/argus/htmx/tailwindtheme/*.py"
16
17
  - "**/apps.py"
17
18
  - "**/wsgi.py"
18
19
  - "**/test*.py"
@@ -36,6 +36,8 @@ ENV DJANGO_SETTINGS_MODULE=dockersettings
36
36
 
37
37
  ENV PORT=8000
38
38
  EXPOSE 8000
39
- COPY docker/docker-entrypoint.sh /api-entrypoint.sh
39
+ COPY docker/cmd-argus.sh /cmd-argus.sh
40
+ COPY docker/cmd-dbqueue.sh /cmd-dbqueue.sh
40
41
  USER argus
41
- ENTRYPOINT ["/usr/bin/tini", "-v", "--", "/api-entrypoint.sh"]
42
+ ENTRYPOINT ["/usr/bin/tini", "-v", "--"]
43
+ CMD ["/cmd-argus.sh"]
@@ -18,6 +18,17 @@ Or, from the top level directory:
18
18
  docker build -t argus -f docker/Dockerfile .
19
19
  ```
20
20
 
21
+ ## Services
22
+
23
+ While this image provides the necessary environment for the backend processes,
24
+ it defaults to running only the argus server itself (via `cmd-argus.sh`). In
25
+ addition to an argus container, a second container is needed to process
26
+ notifications asynchronously. The second container needs to run from this same
27
+ image, but with the command overridden to `cmd-dbqueue.sh`
28
+
29
+ The "db_worker" command used in that script comes from django-tasks, and is
30
+ used to process a message queue of tasks to complete in the background.
31
+
21
32
  ## Configuration of the running container
22
33
 
23
34
  This image runs with default production settings, with a few tweaks from