argus-server 2.3.0__tar.gz → 2.4.0__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 (558) hide show
  1. {argus_server-2.3.0 → argus_server-2.4.0}/CHANGELOG.md +38 -1
  2. {argus_server-2.3.0 → argus_server-2.4.0}/NOTES.md +17 -0
  3. {argus_server-2.3.0 → argus_server-2.4.0}/PKG-INFO +1 -1
  4. argus_server-2.4.0/docs/development/howtos/trigger-test-error-pages.rst +14 -0
  5. {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/api/v2.rst +9 -0
  6. {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/htmx-frontend.rst +47 -2
  7. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/filterwrapper.py +9 -1
  8. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/swappable/serializers.py +5 -0
  9. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/context_processors.py +1 -0
  10. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/defaults.py +1 -0
  11. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/columns.py +36 -0
  12. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/filter.py +89 -22
  13. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/urls.py +1 -0
  14. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/views.py +24 -2
  15. argus_server-2.4.0/src/argus/htmx/static/choices-11.1.0.min.js +2 -0
  16. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/static/styles.css +910 -109
  17. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/snippets/20-loading-box.css +5 -5
  18. argus_server-2.4.0/src/argus/htmx/tailwindtheme/snippets/25-choices.css +80 -0
  19. argus_server-2.4.0/src/argus/htmx/tailwindtheme/snippets/30-incident-table.css +21 -0
  20. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/styles.css +2 -0
  21. argus_server-2.4.0/src/argus/htmx/templates/400.html +7 -0
  22. argus_server-2.4.0/src/argus/htmx/templates/401.html +7 -0
  23. argus_server-2.4.0/src/argus/htmx/templates/403.html +7 -0
  24. argus_server-2.4.0/src/argus/htmx/templates/404.html +7 -0
  25. argus_server-2.4.0/src/argus/htmx/templates/410.html +7 -0
  26. argus_server-2.4.0/src/argus/htmx/templates/500.html +7 -0
  27. argus_server-2.4.0/src/argus/htmx/templates/htmx/forms/search_select_multiple.html +66 -0
  28. argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/_base_incident_table.html +32 -0
  29. argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/_incident_table.html +10 -0
  30. argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/_incident_table_autorefresh.html +12 -0
  31. argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/_incident_table_footer.html +30 -0
  32. argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/_unpaged_incident_table.html +4 -0
  33. argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/_incident_ack_icon.html +10 -0
  34. argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/_incident_age.html +4 -0
  35. argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/_incident_combined_status_icons.html +5 -0
  36. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_filterable_column_header_content.html +12 -5
  37. argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/_incident_source_type.html +2 -0
  38. argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/_incident_start_time_and_age.html +5 -0
  39. argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/_incident_status_icon.html +10 -0
  40. argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/search_fields/input_search.html +16 -0
  41. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/incident_list.html +2 -2
  42. argus_server-2.4.0/src/argus/htmx/templates/htmx/user/_preference_choice_nopreview.html +1 -0
  43. argus_server-2.4.0/src/argus/htmx/templates/htmx/user/_preference_choice_preview_datetime.html +2 -0
  44. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx_base.html +3 -2
  45. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templatetags/argus_htmx.py +22 -7
  46. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/preferences/forms.py +82 -11
  47. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/widgets.py +4 -0
  48. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/models.py +17 -0
  49. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/urls.py +2 -2
  50. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/views.py +24 -48
  51. argus_server-2.4.0/src/argus/version.py +1 -0
  52. {argus_server-2.3.0 → argus_server-2.4.0}/tests/filter/test_filterwrapper.py +38 -0
  53. {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/incident/test_filter.py +92 -3
  54. argus_server-2.4.0/tests/site/test_views.py +66 -0
  55. argus_server-2.3.0/src/argus/htmx/templates/htmx/incident/_incident_table.html +0 -51
  56. argus_server-2.3.0/src/argus/htmx/templates/htmx/incident/cells/search_fields/input_search.html +0 -7
  57. argus_server-2.3.0/src/argus/version.py +0 -1
  58. argus_server-2.3.0/tests/site/test_views.py +0 -10
  59. {argus_server-2.3.0 → argus_server-2.4.0}/.git-blame-ignore-revs +0 -0
  60. {argus_server-2.3.0 → argus_server-2.4.0}/.gitattributes +0 -0
  61. {argus_server-2.3.0 → argus_server-2.4.0}/.gitignore +0 -0
  62. {argus_server-2.3.0 → argus_server-2.4.0}/.mailmap +0 -0
  63. {argus_server-2.3.0 → argus_server-2.4.0}/.pre-commit-config.yaml +0 -0
  64. {argus_server-2.3.0 → argus_server-2.4.0}/.readthedocs.yaml +0 -0
  65. {argus_server-2.3.0 → argus_server-2.4.0}/.sonarcloud.properties +0 -0
  66. {argus_server-2.3.0 → argus_server-2.4.0}/CONTRIBUTING.rst +0 -0
  67. {argus_server-2.3.0 → argus_server-2.4.0}/CONTRIBUTORS.md +0 -0
  68. {argus_server-2.3.0 → argus_server-2.4.0}/Dockerfile +0 -0
  69. {argus_server-2.3.0 → argus_server-2.4.0}/LICENSE +0 -0
  70. {argus_server-2.3.0 → argus_server-2.4.0}/MAINTAINING.rst +0 -0
  71. {argus_server-2.3.0 → argus_server-2.4.0}/Makefile +0 -0
  72. {argus_server-2.3.0 → argus_server-2.4.0}/README.md +0 -0
  73. {argus_server-2.3.0 → argus_server-2.4.0}/UPGRADING.md +0 -0
  74. {argus_server-2.3.0 → argus_server-2.4.0}/changelog.d/.gitkeep +0 -0
  75. {argus_server-2.3.0 → argus_server-2.4.0}/cmd.sh-template +0 -0
  76. {argus_server-2.3.0 → argus_server-2.4.0}/codecov.yml +0 -0
  77. {argus_server-2.3.0 → argus_server-2.4.0}/constraints.txt +0 -0
  78. {argus_server-2.3.0 → argus_server-2.4.0}/docker/Dockerfile +0 -0
  79. {argus_server-2.3.0 → argus_server-2.4.0}/docker/README.md +0 -0
  80. {argus_server-2.3.0 → argus_server-2.4.0}/docker/docker-entrypoint.sh +0 -0
  81. {argus_server-2.3.0 → argus_server-2.4.0}/docker/dockersettings.py +0 -0
  82. {argus_server-2.3.0 → argus_server-2.4.0}/docker-compose.yml +0 -0
  83. {argus_server-2.3.0 → argus_server-2.4.0}/docs/Makefile +0 -0
  84. {argus_server-2.3.0 → argus_server-2.4.0}/docs/_exts/djangodocs.py +0 -0
  85. {argus_server-2.3.0 → argus_server-2.4.0}/docs/_static/.gitkeep +0 -0
  86. {argus_server-2.3.0 → argus_server-2.4.0}/docs/_templates/.gitkeep +0 -0
  87. {argus_server-2.3.0 → argus_server-2.4.0}/docs/about-argus.rst +0 -0
  88. {argus_server-2.3.0 → argus_server-2.4.0}/docs/conf.py +0 -0
  89. {argus_server-2.3.0 → argus_server-2.4.0}/docs/customization/htmx-frontend.rst +0 -0
  90. {argus_server-2.3.0 → argus_server-2.4.0}/docs/customization.rst +0 -0
  91. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/add-more-preferences.rst +0 -0
  92. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/change-settings.rst +0 -0
  93. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/changelog-entry.rst +0 -0
  94. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/commit-messages.rst +0 -0
  95. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/customizing-filtering.rst +0 -0
  96. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/federated-logins.rst +0 -0
  97. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/howtos-for-git.rst +0 -0
  98. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/howtos-for-github.rst +0 -0
  99. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/column_for_specific_ack_group.rst +0 -0
  100. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/column_for_specific_tag.rst +0 -0
  101. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/custom-incident-actions.rst +0 -0
  102. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/customize-filtering.rst +0 -0
  103. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/dependencies.rst +0 -0
  104. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/font_awesome.rst +0 -0
  105. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/override_templates.rst +0 -0
  106. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend.rst +0 -0
  107. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/notification-system-testing.rst +0 -0
  108. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/recover-from-migration-trouble.rst +0 -0
  109. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/regenerate-the-ER-diagram.rst +0 -0
  110. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/release-checklist.rst +0 -0
  111. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/sonarqube.rst +0 -0
  112. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/toggle-django-debug-toolbar.rst +0 -0
  113. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/update-contributors.rst +0 -0
  114. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/vendor-a-repo.rst +0 -0
  115. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos.rst +0 -0
  116. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/makefile-rules.rst +0 -0
  117. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/management-commands.rst +0 -0
  118. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/notes.rst +0 -0
  119. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/styleguide.rst +0 -0
  120. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/troubleshooting.rst +0 -0
  121. {argus_server-2.3.0 → argus_server-2.4.0}/docs/development.rst +0 -0
  122. {argus_server-2.3.0 → argus_server-2.4.0}/docs/django_settings.py +0 -0
  123. {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/default_timeslot.png +0 -0
  124. {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/destinations_view.png +0 -0
  125. {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/example_timeslot.png +0 -0
  126. {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/filter_selector.png +0 -0
  127. {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/incident_details_view.png +0 -0
  128. {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/incidents_filter.png +0 -0
  129. {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/incidents_page.png +0 -0
  130. {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/new_notification_profile.png +0 -0
  131. {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/notification_profiles.png +0 -0
  132. {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/synced_destination_delete_error.png +0 -0
  133. {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/timeslots_view.png +0 -0
  134. {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/unsaved_recurrence.png +0 -0
  135. {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/user_menu.png +0 -0
  136. {argus_server-2.3.0 → argus_server-2.4.0}/docs/index.rst +0 -0
  137. {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/_note.rst +0 -0
  138. {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/glue-services/index.rst +0 -0
  139. {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/glue-services/writing-glueservices.rst +0 -0
  140. {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/index.rst +0 -0
  141. {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/notifications/email-plugin.rst +0 -0
  142. {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/notifications/index.rst +0 -0
  143. {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/notifications/sms-plugin.rst +0 -0
  144. {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/notifications/writing-notification-plugins.rst +0 -0
  145. {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/ticket-systems/index.rst +0 -0
  146. {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/ticket-systems/writing-ticket-system-plugins.rst +0 -0
  147. {argus_server-2.3.0 → argus_server-2.4.0}/docs/make.bat +0 -0
  148. {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/admin.rst +0 -0
  149. {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/api.rst +0 -0
  150. {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/authentication.rst +0 -0
  151. {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/glossary.rst +0 -0
  152. {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/img/ER_model.png +0 -0
  153. {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/models.rst +0 -0
  154. {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/site-specific-settings.rst +0 -0
  155. {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference.rst +0 -0
  156. {argus_server-2.3.0 → argus_server-2.4.0}/docs/user-manual.rst +0 -0
  157. {argus_server-2.3.0 → argus_server-2.4.0}/pyproject.toml +0 -0
  158. {argus_server-2.3.0 → argus_server-2.4.0}/requirements/dev.txt +0 -0
  159. {argus_server-2.3.0 → argus_server-2.4.0}/requirements/django52.txt +0 -0
  160. {argus_server-2.3.0 → argus_server-2.4.0}/requirements/please-pip-sync.txt +0 -0
  161. {argus_server-2.3.0 → argus_server-2.4.0}/requirements/test.txt +0 -0
  162. {argus_server-2.3.0 → argus_server-2.4.0}/requirements-django52.txt +0 -0
  163. {argus_server-2.3.0 → argus_server-2.4.0}/requirements.txt +0 -0
  164. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/__init__.py +0 -0
  165. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/__init__.py +0 -0
  166. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/admin.py +0 -0
  167. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/apps.py +0 -0
  168. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/authentication.py +0 -0
  169. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/context_processors.py +0 -0
  170. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/drftoken/__init__.py +0 -0
  171. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/drftoken/serializers.py +0 -0
  172. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/drftoken/urls.py +0 -0
  173. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/drftoken/views.py +0 -0
  174. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/factories.py +0 -0
  175. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/knox/__init__.py +0 -0
  176. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/knox/serializers.py +0 -0
  177. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/knox/urls.py +0 -0
  178. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/knox/views.py +0 -0
  179. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/__init__.py +0 -0
  180. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/commands/__init__.py +0 -0
  181. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/commands/changeuser.py +0 -0
  182. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/commands/createuser.py +0 -0
  183. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/commands/grantsuperuser.py +0 -0
  184. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/commands/revokesuperuser.py +0 -0
  185. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/commands/setpassword.py +0 -0
  186. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/migrations/0001_initial.py +0 -0
  187. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/migrations/0002_alter_user_first_name.py +0 -0
  188. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/migrations/0002_squashed_auth_20250512_add_preferences_model.py +0 -0
  189. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/migrations/0003_delete_phonenumber.py +0 -0
  190. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/migrations/0004_add_preferences_model.py +0 -0
  191. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/migrations/__init__.py +0 -0
  192. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/models.py +0 -0
  193. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/serializers.py +0 -0
  194. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/urls.py +0 -0
  195. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/utils.py +0 -0
  196. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/views.py +0 -0
  197. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/base/__init__.py +0 -0
  198. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/base/apps.py +0 -0
  199. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/base/static/favicon.svg +0 -0
  200. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/base/templates/base.html +0 -0
  201. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/base/templates/index.html +0 -0
  202. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/compat.py +0 -0
  203. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/__init__.py +0 -0
  204. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/apps.py +0 -0
  205. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/__init__.py +0 -0
  206. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/__init__.py +0 -0
  207. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/bulk_incidents.py +0 -0
  208. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/check_token_expiry.py +0 -0
  209. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/close_incident.py +0 -0
  210. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/create_fake_incident.py +0 -0
  211. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/create_source.py +0 -0
  212. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/gen_secret_key.py +0 -0
  213. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/initial_setup.py +0 -0
  214. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/list_filters.py +0 -0
  215. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/stresstest.py +0 -0
  216. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/toggle_profile_activation.py +0 -0
  217. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/utils.py +0 -0
  218. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/drf/__init__.py +0 -0
  219. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/drf/permissions.py +0 -0
  220. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/__init__.py +0 -0
  221. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/apps.py +0 -0
  222. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/checks.py +0 -0
  223. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/default.py +0 -0
  224. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/factories.py +0 -0
  225. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/filters.py +0 -0
  226. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/primitive_serializers.py +0 -0
  227. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/queryset_filters.py +0 -0
  228. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/serializers.py +0 -0
  229. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/swappable/__init__.py +0 -0
  230. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/validators.py +0 -0
  231. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/__init__.py +0 -0
  232. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/appconfig.py +0 -0
  233. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/apps.py +0 -0
  234. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/auth/__init__.py +0 -0
  235. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/auth/views.py +0 -0
  236. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/checks.py +0 -0
  237. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/constants.py +0 -0
  238. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/dateformat/__init__.py +0 -0
  239. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/dateformat/constants.py +0 -0
  240. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/destination/__init__.py +0 -0
  241. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/destination/forms.py +0 -0
  242. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/destination/urls.py +0 -0
  243. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/destination/views.py +0 -0
  244. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/forms.py +0 -0
  245. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/htmx_urls.py +0 -0
  246. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/__init__.py +0 -0
  247. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/constants.py +0 -0
  248. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/forms/__init__.py +0 -0
  249. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/forms/base.py +0 -0
  250. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/forms/incident_actions.py +0 -0
  251. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/forms/incident_filters.py +0 -0
  252. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/utils.py +0 -0
  253. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/management/__init__.py +0 -0
  254. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/management/commands/__init__.py +0 -0
  255. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/management/commands/tailwind_config.py +0 -0
  256. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/middleware.py +0 -0
  257. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/migrations/0001_initial.py +0 -0
  258. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/migrations/__init__.py +0 -0
  259. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/modals.py +0 -0
  260. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/models.py +0 -0
  261. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/notificationprofile/__init__.py +0 -0
  262. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/notificationprofile/urls.py +0 -0
  263. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/notificationprofile/views.py +0 -0
  264. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/request.py +0 -0
  265. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/root_urls.py +0 -0
  266. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/settings.py +0 -0
  267. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/static/htmx-2.0.2.min.js +0 -0
  268. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/static/hyperscript-0.9.13.min.js +0 -0
  269. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/static/logo_white.svg +0 -0
  270. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/README.md +0 -0
  271. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/__init__.py +0 -0
  272. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/config.py +0 -0
  273. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/get_tailwind.py +0 -0
  274. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/snippets/10-tailwind.css +0 -0
  275. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/snippets/15-alert-message.css +0 -0
  276. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/tailwind.config.js +0 -0
  277. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/utils.py +0 -0
  278. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/errors/dict/ul.html +0 -0
  279. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/errors/list/ul.html +0 -0
  280. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/field.html +0 -0
  281. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/label.html +0 -0
  282. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/attrs.html +0 -0
  283. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/checkbox.html +0 -0
  284. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/checkbox_option.html +0 -0
  285. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/classless_attrs.html +0 -0
  286. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/date.html +0 -0
  287. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/datetime.html +0 -0
  288. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/input.html +0 -0
  289. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/radio_option.html +0 -0
  290. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/range.html +0 -0
  291. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/select.html +0 -0
  292. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/time.html +0 -0
  293. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/_base_confirm_dialog.html +0 -0
  294. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/_base_form_modal.html +0 -0
  295. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/_base_form_modal_button.html +0 -0
  296. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/_base_form_modal_experimental.html +0 -0
  297. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/base.html +0 -0
  298. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/components/_page_title.html +0 -0
  299. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/components/incident_list_refresh_info_select.html +0 -0
  300. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/_collapse_with_forms.html +0 -0
  301. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/_content.html +0 -0
  302. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/_create_form.html +0 -0
  303. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/_delete_form.html +0 -0
  304. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/_edit_form.html +0 -0
  305. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/_form_list.html +0 -0
  306. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/destination_list.html +0 -0
  307. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/forms/badge_dropdown_select_multiple.html +0 -0
  308. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/forms/checkbox_select_multiple.html +0 -0
  309. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/forms/dropdown_select_multiple.html +0 -0
  310. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/forms/input_field.html +0 -0
  311. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_base.html +0 -0
  312. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_base_incident_update_modal.html +0 -0
  313. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_delete_filter_confirm_dialog.html +0 -0
  314. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_existing_filters.html +0 -0
  315. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_filter_controls.html +0 -0
  316. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_filter_create_modal.html +0 -0
  317. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_filter_delete_dropdown.html +0 -0
  318. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_filter_select.html +0 -0
  319. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_filter_update_dropdown.html +0 -0
  320. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_acknowledge_modal.html +0 -0
  321. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_close_modal.html +0 -0
  322. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_filterbox.html +0 -0
  323. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_list_menubar.html +0 -0
  324. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_list_refresh_info.html +0 -0
  325. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_list_update_menu.html +0 -0
  326. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_reopen_modal.html +0 -0
  327. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_table_cell_wrapper_default.html +0 -0
  328. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_table_cell_wrapper_link_to_details.html +0 -0
  329. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_table_paginator.html +0 -0
  330. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_table_paginator_pageitem.html +0 -0
  331. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_table_row.html +0 -0
  332. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_table_rows.html +0 -0
  333. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_ticket_autocreate_modal.html +0 -0
  334. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_ticket_edit_modal.html +0 -0
  335. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_ticket_manual_create_modal.html +0 -0
  336. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_update_filter_confirm_dialog.html +0 -0
  337. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_ack.html +0 -0
  338. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_actions.html +0 -0
  339. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_checkbox.html +0 -0
  340. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_color_status.html +0 -0
  341. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_combined_status.html +0 -0
  342. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_description.html +0 -0
  343. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_filterable_column_header.html +0 -0
  344. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_level.html +0 -0
  345. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_list_select_all_checkbox_header.html +0 -0
  346. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_pk.html +0 -0
  347. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_source.html +0 -0
  348. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_start_time.html +0 -0
  349. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_start_time_header.html +0 -0
  350. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_status.html +0 -0
  351. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_tag.html +0 -0
  352. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_ticket.html +0 -0
  353. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/filter_list.html +0 -0
  354. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/incident_detail.html +0 -0
  355. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/responses/_incident_list_refresh.html +0 -0
  356. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/responses/empty_list_item.html +0 -0
  357. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/notificationprofile/_notificationprofile_form.html +0 -0
  358. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/notificationprofile/_notificationprofile_form_div.html +0 -0
  359. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/notificationprofile/base.html +0 -0
  360. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/notificationprofile/notificationprofile_confirm_delete.html +0 -0
  361. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/notificationprofile/notificationprofile_form.html +0 -0
  362. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/notificationprofile/notificationprofile_list.html +0 -0
  363. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/styleguide.html +0 -0
  364. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/_delete_timeslot_confirm_dialog.html +0 -0
  365. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/_timeslot_detail.html +0 -0
  366. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/_timeslot_form.html +0 -0
  367. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/base.html +0 -0
  368. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/checkbox_option.html +0 -0
  369. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/timerecurrence_div.html +0 -0
  370. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/timeslot_confirm_delete.html +0 -0
  371. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/timeslot_form.html +0 -0
  372. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/timeslot_list.html +0 -0
  373. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_current_theme.html +0 -0
  374. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_dateformat_dropdown.html +0 -0
  375. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_incidents_table_columns_dropdown.html +0 -0
  376. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_incidents_table_layout_dropdown.html +0 -0
  377. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_page_size_dropdown.html +0 -0
  378. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_theme_dropdown.html +0 -0
  379. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_update_interval_dropdown.html +0 -0
  380. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_user_menu.html +0 -0
  381. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_user_menu_logout.html +0 -0
  382. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_user_menu_notification_config.html +0 -0
  383. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/preference_field_form.html +0 -0
  384. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/preferences_list.html +0 -0
  385. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/radio_option.html +0 -0
  386. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/messages/_notification_message.html +0 -0
  387. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/messages/_notification_messages.html +0 -0
  388. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/messages/_notification_messages_htmx_append.html +0 -0
  389. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/registration/login.html +0 -0
  390. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/tailwind/styles.css +0 -0
  391. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/tailwind/tailwind.config.js +0 -0
  392. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/tailwind_whitelist.html +0 -0
  393. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templatetags/__init__.py +0 -0
  394. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/themes/__init__.py +0 -0
  395. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/themes/utils.py +0 -0
  396. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/timeslot/__init__.py +0 -0
  397. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/timeslot/urls.py +0 -0
  398. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/timeslot/views.py +0 -0
  399. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/urls.py +0 -0
  400. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/__init__.py +0 -0
  401. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/factories.py +0 -0
  402. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/preferences/__init__.py +0 -0
  403. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/preferences/models.py +0 -0
  404. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/preferences/utils.py +0 -0
  405. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/urls.py +0 -0
  406. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/views.py +0 -0
  407. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/utils.py +0 -0
  408. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/views.py +0 -0
  409. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/__init__.py +0 -0
  410. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/admin.py +0 -0
  411. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/apps.py +0 -0
  412. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/constants.py +0 -0
  413. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/factories.py +0 -0
  414. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/fields.py +0 -0
  415. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/forms.py +0 -0
  416. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0001_initial.py +0 -0
  417. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0001_squashed_incident_20250514.py +0 -0
  418. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0002_empty_source_incident_id.py +0 -0
  419. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0003_incident_level.py +0 -0
  420. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0004_add_ChangeEvent_proxy.py +0 -0
  421. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0005_alter_event_type.py +0 -0
  422. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0006_incident_search_text.py +0 -0
  423. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0007_alter_event_type.py +0 -0
  424. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0008_incident_metadata.py +0 -0
  425. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0009_use_bigautofield_on_quickly_growing_tables.py +0 -0
  426. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/__init__.py +0 -0
  427. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/serializers.py +0 -0
  428. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/signals.py +0 -0
  429. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/templates/incident/admin/fake_incident_add_form.html +0 -0
  430. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/templates/incident/admin/incident_change_list.html +0 -0
  431. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/templates/incident/admin/widgets/split_datetime_infinity.html +0 -0
  432. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/templates/incident/ticket/default_ticket_body.html +0 -0
  433. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/ticket/__init__.py +0 -0
  434. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/ticket/base.py +0 -0
  435. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/ticket/dummy.py +0 -0
  436. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/ticket/utils.py +0 -0
  437. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/urls.py +0 -0
  438. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/validators.py +0 -0
  439. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/views.py +0 -0
  440. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/widgets.py +0 -0
  441. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/__init__.py +0 -0
  442. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/admin.py +0 -0
  443. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/apps.py +0 -0
  444. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/checks.py +0 -0
  445. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/factories.py +0 -0
  446. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/media/__init__.py +0 -0
  447. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/media/base.py +0 -0
  448. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/media/email.py +0 -0
  449. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/media/sms_as_email.py +0 -0
  450. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/migrations/0001_squashed_0015_remove_days_alter_days_array.py +0 -0
  451. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/migrations/0001_squashed_notificationprofile_20250512.py +0 -0
  452. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/migrations/0016_noop.py +0 -0
  453. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/migrations/0017_change_event_type_to_event_types.py +0 -0
  454. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/migrations/0018_remove_closed_and_unacked_from_filterblob.py +0 -0
  455. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/migrations/__init__.py +0 -0
  456. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/models.py +0 -0
  457. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/serializers.py +0 -0
  458. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/signals.py +0 -0
  459. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/templates/notificationprofile/email.html +0 -0
  460. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/templates/notificationprofile/email.txt +0 -0
  461. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/templates/schemawrapper.html +0 -0
  462. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/urls.py +0 -0
  463. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/views.py +0 -0
  464. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/__init__.py +0 -0
  465. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/api_v2_urls.py +0 -0
  466. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/logging.py +0 -0
  467. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/serializers.py +0 -0
  468. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/__init__.py +0 -0
  469. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/_serializers.py +0 -0
  470. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/backend.py +0 -0
  471. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/base.py +0 -0
  472. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/dev.py +0 -0
  473. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/dockerdev.py +0 -0
  474. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/prod.py +0 -0
  475. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/test_CI.py +0 -0
  476. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/utils.py +0 -0
  477. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/wsgi.py +0 -0
  478. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/util/__init__.py +0 -0
  479. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/util/admin_utils.py +0 -0
  480. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/util/datetime_utils.py +0 -0
  481. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/util/testing.py +0 -0
  482. {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/util/utils.py +0 -0
  483. {argus_server-2.3.0 → argus_server-2.4.0}/tests/__init__.py +0 -0
  484. {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/__init__.py +0 -0
  485. {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/management_commands/__init__.py +0 -0
  486. {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/management_commands/test_changeuser.py +0 -0
  487. {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/management_commands/test_createuser.py +0 -0
  488. {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/models.py +0 -0
  489. {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/test_auth.py +0 -0
  490. {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/test_knox_views.py +0 -0
  491. {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/test_models.py +0 -0
  492. {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/test_utils.py +0 -0
  493. {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/test_views.py +0 -0
  494. {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/__init__.py +0 -0
  495. {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_bulk_incidents.py +0 -0
  496. {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_check_token_expiry.py +0 -0
  497. {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_close_incident.py +0 -0
  498. {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_create_fake_incident.py +0 -0
  499. {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_create_source.py +0 -0
  500. {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_gen_secret_key.py +0 -0
  501. {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_initial_setup.py +0 -0
  502. {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_list_filters.py +0 -0
  503. {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_toggle_profile_activation.py +0 -0
  504. {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_utils.py +0 -0
  505. {argus_server-2.3.0 → argus_server-2.4.0}/tests/filter/__init__.py +0 -0
  506. {argus_server-2.3.0 → argus_server-2.4.0}/tests/filter/dummyplugin.py +0 -0
  507. {argus_server-2.3.0 → argus_server-2.4.0}/tests/filter/test_filterplugin.py +0 -0
  508. {argus_server-2.3.0 → argus_server-2.4.0}/tests/filter/test_queryset_filters.py +0 -0
  509. {argus_server-2.3.0 → argus_server-2.4.0}/tests/helpers.py +0 -0
  510. {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/__init__.py +0 -0
  511. {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/incident/__init__.py +0 -0
  512. {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/incident/test_customization.py +0 -0
  513. {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/incident/test_forms_incident_filters.py +0 -0
  514. {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/incident/test_utils.py +0 -0
  515. {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/incident/test_views.py +0 -0
  516. {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/notificationprofile/__init__.py +0 -0
  517. {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/notificationprofile/test_forms.py +0 -0
  518. {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/test_incident_columns_rendering.py +0 -0
  519. {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/test_middleware.py +0 -0
  520. {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/test_templatetags.py +0 -0
  521. {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/test_utils.py +0 -0
  522. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/__init__.py +0 -0
  523. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/fixtures/__init__.py +0 -0
  524. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_change_event.py +0 -0
  525. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_create_fake_incident.py +0 -0
  526. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_event.py +0 -0
  527. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_filters.py +0 -0
  528. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_incident.py +0 -0
  529. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_incident_fields.py +0 -0
  530. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_queryset.py +0 -0
  531. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_serializers.py +0 -0
  532. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_source_system.py +0 -0
  533. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_source_system_type.py +0 -0
  534. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_views.py +0 -0
  535. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/ticket_plugins/__init__.py +0 -0
  536. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/ticket_plugins/test_base.py +0 -0
  537. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/ticket_plugins/test_dummy.py +0 -0
  538. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/ticket_plugins/test_utils.py +0 -0
  539. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/unit/__init__.py +0 -0
  540. {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/unit/test_incident_details_url.py +0 -0
  541. {argus_server-2.3.0 → argus_server-2.4.0}/tests/migration_example.py +0 -0
  542. {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/__init__.py +0 -0
  543. {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/destinations/__init__.py +0 -0
  544. {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/destinations/test_email.py +0 -0
  545. {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/destinations/test_sms.py +0 -0
  546. {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/migrations/__init__.py +0 -0
  547. {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/test_github236.py +0 -0
  548. {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/test_media.py +0 -0
  549. {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/test_models.py +0 -0
  550. {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/test_serializers.py +0 -0
  551. {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/test_views.py +0 -0
  552. {argus_server-2.3.0 → argus_server-2.4.0}/tests/site/__init__.py +0 -0
  553. {argus_server-2.3.0 → argus_server-2.4.0}/tests/site/test_misc.py +0 -0
  554. {argus_server-2.3.0 → argus_server-2.4.0}/tests/site/test_settings_helpers.py +0 -0
  555. {argus_server-2.3.0 → argus_server-2.4.0}/tests/site/test_settings_validators.py +0 -0
  556. {argus_server-2.3.0 → argus_server-2.4.0}/tests/util/__init__.py +0 -0
  557. {argus_server-2.3.0 → argus_server-2.4.0}/tests/util/test_utils.py +0 -0
  558. {argus_server-2.3.0 → argus_server-2.4.0}/tox.ini +0 -0
@@ -8,6 +8,44 @@ This project uses [*towncrier*](https://towncrier.readthedocs.io/) and the chang
8
8
 
9
9
  <!-- towncrier release notes start -->
10
10
 
11
+ ## [2.4.0] - 2025-11-28
12
+
13
+ The most important feature this release is being able to filter on source
14
+ system type. If you have multiple source systems in a filter, all of them of
15
+ the same type, it might pay off to switch over to using the source system type
16
+ instead.
17
+
18
+ The rest is frontend improvements: The tags filter now has typeahead find. The
19
+ header and footer of the incident list never scroll off screen. The status
20
+ columns have variants with icons instead of text, and there's new columns
21
+ showing an incident's age (time since it happened).
22
+
23
+ See NOTES.md for further detail.
24
+
25
+ ### Added
26
+
27
+ - Added test error page ([#1024](https://github.com/Uninett/Argus/issues/1024))
28
+ - Add age columns to incident table
29
+ ([#1552](https://github.com/Uninett/Argus/issues/1552))
30
+ - Made it possible to filter on a source's type in the incident list, API, and
31
+ for sending notifications. Also added a new built-in column "source type" for
32
+ the incident list. When there are very many sources of the same type, the
33
+ filter and column become useful.
34
+ ([#1556](https://github.com/Uninett/Argus/issues/1556))
35
+ - Add status columns that use icons instead of text
36
+ ([#1635](https://github.com/Uninett/Argus/issues/1635))
37
+ - Made a system for rendering previews of preference choices.
38
+
39
+ ### Changed
40
+
41
+ - Change incident table header and footer to always be visible
42
+ ([#1548](https://github.com/Uninett/Argus/issues/1548))
43
+ - Add clear button to search column header
44
+ ([#1573](https://github.com/Uninett/Argus/issues/1573))
45
+ - Change tags input to use searchable multiselect
46
+ ([#1604](https://github.com/Uninett/Argus/issues/1604))
47
+
48
+
11
49
  ## [2.3.0] - 2025-11-20
12
50
 
13
51
  This release has numerous improvements to the frontend. The various
@@ -35,7 +73,6 @@ See NOTES.md for how to convert an existing column layout to the new format.
35
73
  ([#1553](https://github.com/Uninett/Argus/issues/1553))
36
74
  - Sort list of sources in filter dropdown alphabetically
37
75
  ([#1554](https://github.com/Uninett/Argus/issues/1554))
38
- - [#1576](https://github.com/Uninett/Argus/issues/1576)
39
76
  - Added and documented more searchable columns for the incident list:
40
77
  `search_description`, `select_levels`, `has_ticket_url`,
41
78
  `search_ticket_url`, and a way to mass-produce single-field forms to
@@ -3,6 +3,23 @@
3
3
  This file documents changes to Argus that are relevant for operations,
4
4
  customizers and end-users.
5
5
 
6
+ ## [2.4.0] - 2025-11-28
7
+
8
+ The most important feature this release is being able to filter on source
9
+ system type. If you have multiple source systems in a filter, all of them of
10
+ the same type, it might pay off to switch over to using the source system type
11
+ instead.
12
+
13
+ The rest is frontend improvements: The tags filter now has typeahead find. The
14
+ header and footer of the incident list never scroll off screen. The status
15
+ columns have variants with icons instead of text, and there's new columns
16
+ showing an incident's age (time since it happened).
17
+
18
+ The new columns are called `age`, `start_time_and_age`, `status_icon`,
19
+ `ack_icon` and `combined_status_icons`. The last takes up the least horizontal
20
+ space in the table.
21
+
22
+
6
23
  ## [2.3.0] - 2025-11-20
7
24
 
8
25
  This release has numerous improvements to the frontend. The various
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: argus-server
3
- Version: 2.3.0
3
+ Version: 2.4.0
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>
@@ -0,0 +1,14 @@
1
+ ===============================
2
+ How to trigger test error pages
3
+ ===============================
4
+
5
+ To test Django's error views in Argus, the following endpoint can be used:
6
+
7
+ ``/.error/?status-code=<error_code>``
8
+
9
+ Replace ``<error_code>`` with one of the supported HTML error codes: 400, 401, 403, 404, 410, or 500.
10
+
11
+ Notes
12
+ ~~~~~
13
+ - DEBUG must be set to False in the Django settings to view the standard error pages.
14
+ - Status codes ``404`` and ``500`` will trigger relevant exceptions, which in turn send messages to the user in the main view.
@@ -607,6 +607,9 @@ Notification profile endpoints
607
607
  "sourceSystemIds": [
608
608
  2
609
609
  ],
610
+ "source_types": [
611
+ "argus"
612
+ ],
610
613
  "open": null,
611
614
  "acked": null,
612
615
  "stateful": null,
@@ -931,6 +934,9 @@ Notification profile endpoints
931
934
  "sourceSystemIds": [
932
935
  1
933
936
  ],
937
+ "source_types": [
938
+ "argus"
939
+ ],
934
940
  "tags": [
935
941
  "key1=value1"
936
942
  ],
@@ -955,6 +961,9 @@ Notification profile endpoints
955
961
  "sourceSystemIds": [
956
962
  1
957
963
  ],
964
+ "source_types": [
965
+ "argus"
966
+ ],
958
967
  "tags": [
959
968
  "key1=value1"
960
969
  ],
@@ -210,7 +210,13 @@ ack
210
210
  :From: ack
211
211
  :Name: ack
212
212
  :Description: Show whether the incident is acked or not.
213
- :Redundant with: combined_status
213
+ :Redundant with: combined_status, combined_status_icons
214
+
215
+ ack_icon
216
+ :From: ack
217
+ :Name: ack_icon
218
+ :Description: Show whether the incident is acked or not, using an icon instead of text.
219
+ :Redundant with: combined_status, combined_status_icons
214
220
 
215
221
  color_status
216
222
  :From: ack + status
@@ -222,6 +228,11 @@ combined_status
222
228
  :Name: combined_status
223
229
  :Description: Merges the "open" column and the "ack" column into one.
224
230
 
231
+ combined_status_icons
232
+ :From: ack + status
233
+ :Name: combined_status_icons
234
+ :Description: Merges the "open" column and the "ack" column into one, using icons instead of text.
235
+
225
236
  description
226
237
  :From: description
227
238
  :Name: description
@@ -259,7 +270,13 @@ status
259
270
  :From: open
260
271
  :Name: status
261
272
  :Description: Whether the incident is still ongoing or has been closed.
262
- :Redundant with: combined_status
273
+ :Redundant with: combined_status, combined_status_icons
274
+
275
+ status_icon
276
+ :From: open
277
+ :Name: status_icon
278
+ :Description: Whether the incident is still ongoing or has been closed, using an icon instead of text.
279
+ :Redundant with: combined_status, combined_status_icons
263
280
 
264
281
  row_select
265
282
  :From: depends on incident id
@@ -275,11 +292,25 @@ start_time
275
292
  :From: start_time
276
293
  :Name: start_time
277
294
  :Description: When the incident started, fixed width.
295
+ :Redundant with: narrow_start_time
278
296
 
279
297
  narrow_start_time
280
298
  :From: start_time
281
299
  :Name: start_time
282
300
  :Description: When the incident started, width depends on date format.
301
+ :Redundant with: start_time
302
+
303
+ start_time_and_age
304
+ :From: start_time + age
305
+ :Name: start_time_and_age
306
+ :Description: When the incident started, and how long it has been ongoing.
307
+ :Redundant with: start_time
308
+
309
+ age
310
+ :From: age
311
+ :Name: age
312
+ :Description: How long the incident has been ongoing.
313
+ :Redundant with: start_time_and_age
283
314
 
284
315
  ticket
285
316
  :From: ticket_url
@@ -310,6 +341,20 @@ If you wish to change the available themes, first make sure the support for
310
341
  Tailwind CSS and daisyUI has been installed, then see
311
342
  :ref:`customize-htmx-frontend`.
312
343
 
344
+ Usage of Javascript
345
+ ===================
346
+
347
+ The amount of javascript libraries is deliberately being kept to a minimum. The
348
+ ones in use are vendored to avoid a build step and stored locally to not depend
349
+ on DNS.
350
+
351
+ The following are in use:
352
+
353
+ * `htmx <https://htmx.org/>`_ for updating parts of a page smoothly
354
+ * `hyperscript <https://hyperscript.org/>`_ for adding client-side interactivity, used for cases where htmx alone is not sufficient
355
+ * `choices.js <https://choices-js.github.io/Choices/>`_ for typeahead search,
356
+ multi select
357
+
313
358
  Customization
314
359
  =============
315
360
 
@@ -32,6 +32,7 @@ class FilterKey(StrEnum):
32
32
  ACKED = "acked"
33
33
  STATEFUL = "stateful"
34
34
  SOURCE_SYSTEM_IDS = "sourceSystemIds"
35
+ SOURCE_SYSTEM_TYPES = "source_types"
35
36
  TAGS = "tags"
36
37
  EVENT_TYPES = "event_types"
37
38
  MAXLEVEL = "maxlevel"
@@ -39,7 +40,7 @@ class FilterKey(StrEnum):
39
40
 
40
41
  class FilterWrapper:
41
42
  TRINARY_FILTERS = (FilterKey.OPEN, FilterKey.ACKED, FilterKey.STATEFUL)
42
- LIST_FILTERS = (FilterKey.SOURCE_SYSTEM_IDS, FilterKey.TAGS, FilterKey.EVENT_TYPES)
43
+ LIST_FILTERS = (FilterKey.SOURCE_SYSTEM_IDS, FilterKey.SOURCE_SYSTEM_TYPES, FilterKey.TAGS, FilterKey.EVENT_TYPES)
43
44
  INT_FILTERS = (FilterKey.MAXLEVEL,)
44
45
  FILTER_KEYS = TRINARY_FILTERS + LIST_FILTERS + INT_FILTERS
45
46
 
@@ -71,6 +72,12 @@ class FilterWrapper:
71
72
  return None
72
73
  return incident.source.id in filter_
73
74
 
75
+ def _incident_fits_source_system_type(self, incident: Incident) -> TriState:
76
+ filter_, ignored = self._get_filter_value_and_ignored_status(FilterKey.SOURCE_SYSTEM_TYPES)
77
+ if ignored:
78
+ return None
79
+ return incident.source.type.name in filter_
80
+
74
81
  def _incident_fits_tags(self, incident: Incident) -> TriState:
75
82
  filter_, ignored = self._get_filter_value_and_ignored_status(FilterKey.TAGS)
76
83
  if ignored:
@@ -100,6 +107,7 @@ class FilterWrapper:
100
107
  return False # Filter is empty!
101
108
  checks = {}
102
109
  checks["source"] = self._incident_fits_source_system(incident)
110
+ checks["source_type"] = self._incident_fits_source_system_type(incident)
103
111
  checks["tags"] = self._incident_fits_tags(incident)
104
112
  checks["max_level"] = self._incident_fits_maxlevel(incident)
105
113
  for tristate in self.TRINARY_FILTERS:
@@ -16,6 +16,11 @@ class FilterBlobSerializer(serializers.Serializer):
16
16
  allow_empty=True,
17
17
  required=False,
18
18
  )
19
+ source_types = serializers.ListField(
20
+ child=serializers.CharField(),
21
+ allow_empty=True,
22
+ required=False,
23
+ )
19
24
  tags = serializers.ListField(
20
25
  child=serializers.CharField(min_length=3),
21
26
  allow_empty=True,
@@ -17,6 +17,7 @@ def static_paths(request):
17
17
  "stylesheet_path": getattr(settings, "STYLESHEET_PATH", defaults.STYLESHEET_PATH),
18
18
  "htmx_path": getattr(settings, "HTMX_PATH", defaults.HTMX_PATH),
19
19
  "hyperscript_path": getattr(settings, "HYPERSCRIPT_PATH", defaults.HYPERSCRIPT_PATH),
20
+ "choices_path": getattr(settings, "CHOICES_PATH", defaults.CHOICES_PATH),
20
21
  }
21
22
 
22
23
 
@@ -67,6 +67,7 @@ TAILWIND_THEME_OVERRIDE = get_json_env("TAILWIND_THEME_OVERRIDE", DEFAULT_THEME_
67
67
  STYLESHEET_PATH = get_str_env("ARGUS_STYLESHEET_PATH", STYLESHEET_PATH_DEFAULT)
68
68
  HTMX_PATH = get_str_env("ARGUS_HTMX_PATH", HTMX_PATH_DEFAULT)
69
69
  HYPERSCRIPT_PATH = get_str_env("ARGUS_HYPERSCRIPT_PATH", HYPERSCRIPT_PATH_DEFAULT)
70
+ CHOICES_PATH = "choices-11.1.0.min.js"
70
71
 
71
72
  NOTIFICATION_TOAST_AUTOCLOSE_SECONDS = {
72
73
  "success": 10,
@@ -76,6 +76,18 @@ _BUILTIN_COLUMN_LIST = [
76
76
  header_template="htmx/incident/cells/_incident_start_time_header.html",
77
77
  detail_link=True,
78
78
  ),
79
+ IncidentTableColumn(
80
+ "age",
81
+ "Age",
82
+ "htmx/incident/cells/_incident_age.html",
83
+ detail_link=True,
84
+ ),
85
+ IncidentTableColumn(
86
+ "start_time_and_age",
87
+ "Timestamp",
88
+ "htmx/incident/cells/_incident_start_time_and_age.html",
89
+ detail_link=True,
90
+ ),
79
91
  IncidentTableColumn(
80
92
  "narrow_start_time",
81
93
  "Timestamp",
@@ -88,6 +100,12 @@ _BUILTIN_COLUMN_LIST = [
88
100
  "htmx/incident/cells/_incident_status.html",
89
101
  detail_link=True,
90
102
  ),
103
+ IncidentTableColumn(
104
+ "status_icon",
105
+ "Status",
106
+ "htmx/incident/cells/_incident_status_icon.html",
107
+ detail_link=True,
108
+ ),
91
109
  IncidentTableColumn(
92
110
  "level",
93
111
  "Severity level",
@@ -107,6 +125,12 @@ _BUILTIN_COLUMN_LIST = [
107
125
  "htmx/incident/cells/_incident_source.html",
108
126
  detail_link=True,
109
127
  ),
128
+ IncidentTableColumn(
129
+ "source_type",
130
+ "Source Type",
131
+ "htmx/incident/cells/_incident_source_type.html",
132
+ detail_link=True,
133
+ ),
110
134
  IncidentTableColumn(
111
135
  "description",
112
136
  "Description",
@@ -126,12 +150,24 @@ _BUILTIN_COLUMN_LIST = [
126
150
  "htmx/incident/cells/_incident_ack.html",
127
151
  detail_link=True,
128
152
  ),
153
+ IncidentTableColumn(
154
+ "ack_icon",
155
+ "Ack",
156
+ "htmx/incident/cells/_incident_ack_icon.html",
157
+ detail_link=True,
158
+ ),
129
159
  IncidentTableColumn(
130
160
  "combined_status",
131
161
  "Status",
132
162
  "htmx/incident/cells/_incident_combined_status.html",
133
163
  detail_link=True,
134
164
  ),
165
+ IncidentTableColumn(
166
+ "combined_status_icons",
167
+ "Status",
168
+ "htmx/incident/cells/_incident_combined_status_icons.html",
169
+ detail_link=True,
170
+ ),
135
171
  IncidentTableColumn(
136
172
  "ticket",
137
173
  "Ticket",
@@ -6,9 +6,9 @@ from django.urls import reverse
6
6
  from django.views.generic import ListView
7
7
 
8
8
  from argus.filter import get_filter_backend
9
- from argus.htmx.widgets import BadgeDropdownMultiSelect
9
+ from argus.htmx.widgets import BadgeDropdownMultiSelect, SearchDropdownMultiSelect
10
10
  from argus.incident.constants import AckedStatus, Level, OpenStatus
11
- from argus.incident.models import SourceSystem, Tag
11
+ from argus.incident.models import SourceSystem, SourceSystemType, Tag
12
12
  from argus.notificationprofile.models import Filter
13
13
 
14
14
  filter_backend = get_filter_backend()
@@ -20,7 +20,24 @@ class RangeInput(forms.NumberInput):
20
20
  template_name = "django/forms/widgets/range.html"
21
21
 
22
22
 
23
- class IncidentFilterForm(forms.Form):
23
+ class TagFieldMixin:
24
+ def _init_tag_field(self, *args, **kwargs):
25
+ """
26
+ Initializes the 'tags' field widget and choices as key=value strings, and dynamically adds submitted tags.
27
+ """
28
+ self.fields["tags"].widget.partial_get = reverse("htmx:search-tags")
29
+ query_dict = args[0] if args else None
30
+ if not query_dict:
31
+ self.fields["tags"].choices = []
32
+ return
33
+
34
+ tags = query_dict.get("tags", [])
35
+
36
+ choices = [(tag, tag) for tag in tags]
37
+ self.fields["tags"].choices = choices
38
+
39
+
40
+ class IncidentFilterForm(TagFieldMixin, forms.Form):
24
41
  open = forms.IntegerField(
25
42
  widget=RangeInput(attrs={"step": "1", "min": min(OpenStatus).value, "max": max(OpenStatus).value}),
26
43
  label="Open State",
@@ -33,6 +50,14 @@ class IncidentFilterForm(forms.Form):
33
50
  initial=AckedStatus.BOTH.value,
34
51
  required=False,
35
52
  )
53
+ source_types = forms.MultipleChoiceField(
54
+ widget=BadgeDropdownMultiSelect(
55
+ attrs={"placeholder": "select source types..."},
56
+ partial_get=None,
57
+ ),
58
+ required=False,
59
+ label="Source Types",
60
+ )
36
61
  sourceSystemIds = forms.MultipleChoiceField(
37
62
  widget=BadgeDropdownMultiSelect(
38
63
  attrs={"placeholder": "select sources..."},
@@ -41,12 +66,12 @@ class IncidentFilterForm(forms.Form):
41
66
  required=False,
42
67
  label="Sources",
43
68
  )
44
- tags = forms.CharField(
45
- widget=forms.TextInput(
69
+ tags = forms.MultipleChoiceField(
70
+ widget=SearchDropdownMultiSelect(
46
71
  attrs={
47
- "placeholder": "key=value, ...",
48
- "class": "input-primary input-sm overflow-y-auto min-h-8 h-auto max-h-16 max-w-xs leading-tight",
49
- }
72
+ "placeholder": "search tags...",
73
+ },
74
+ partial_get=None,
50
75
  ),
51
76
  required=False,
52
77
  label="Tags",
@@ -63,7 +88,8 @@ class IncidentFilterForm(forms.Form):
63
88
  "open": None,
64
89
  "acked": None,
65
90
  "sourceSystemIds": [],
66
- "tags": "",
91
+ "source_types": [],
92
+ "tags": [],
67
93
  "maxlevel": max(Level).value,
68
94
  }
69
95
 
@@ -73,18 +99,23 @@ class IncidentFilterForm(forms.Form):
73
99
  self.fields["sourceSystemIds"].widget.partial_get = reverse("htmx:incident-filter")
74
100
  source_choices = SourceSystem.objects.order_by("name").values_list("id", "name")
75
101
  self.fields["sourceSystemIds"].choices = tuple(source_choices)
102
+ self._init_tag_field(*args, **kwargs)
103
+
104
+ self.fields["source_types"].widget.partial_get = reverse("htmx:incident-filter")
105
+ source_type_choices = SourceSystemType.objects.order_by("name").values_list("name", "name")
106
+ self.fields["source_types"].choices = tuple(source_type_choices)
76
107
 
77
108
  def clean_tags(self):
78
109
  tags = self.cleaned_data["tags"]
79
110
  if not tags:
80
- return None
111
+ return []
81
112
 
82
113
  try:
83
- for tag in tags.split(","):
84
- Tag.split(tag.strip())
114
+ for tag in tags:
115
+ tag = tag.strip()
116
+ Tag.split(tag)
85
117
  except ValueError:
86
118
  raise forms.ValidationError("Tags need to have the format key=value, key2=value2")
87
-
88
119
  return tags
89
120
 
90
121
  def _open_tristate(self):
@@ -118,16 +149,19 @@ class IncidentFilterForm(forms.Form):
118
149
  filterblob = {}
119
150
 
120
151
  filterblob["open"] = self._open_tristate()
121
-
122
152
  filterblob["acked"] = self._acked_tristate()
123
153
 
124
154
  sourceSystemIds = self.cleaned_data.get("sourceSystemIds", [])
125
155
  if sourceSystemIds:
126
156
  filterblob["sourceSystemIds"] = sourceSystemIds
127
157
 
158
+ source_types = self.cleaned_data.get("source_types", [])
159
+ if source_types:
160
+ filterblob["source_types"] = source_types
161
+
128
162
  tags = self.cleaned_data.get("tags", [])
129
163
  if tags:
130
- filterblob["tags"] = [tag.strip() for tag in tags.split(",")]
164
+ filterblob["tags"] = tags
131
165
 
132
166
  maxlevel = self.cleaned_data.get("maxlevel", 0)
133
167
  if maxlevel:
@@ -165,18 +199,18 @@ def incident_list_filter(request, qs, use_empty_filter=False):
165
199
  form = IncidentFilterForm(_convert_filterblob(filter_obj.filter))
166
200
  LOG.debug("using stored filter: %s", filter_obj.filter)
167
201
  else:
202
+ form_data = _normalize_form_data(request)
168
203
  if request.method == "POST":
169
- form = IncidentFilterForm(request.POST)
170
- LOG.debug("using POST: %s", request.POST)
204
+ form = IncidentFilterForm(form_data)
205
+ LOG.debug("using POST: %s", form_data)
171
206
  else:
172
207
  if use_empty_filter:
173
208
  filterblob = IncidentFilterForm.EMPTY_FILTERBLOB
174
209
  form = IncidentFilterForm(filterblob)
175
210
  LOG.debug("using empty filter: %s", filterblob)
176
211
  else:
177
- form = IncidentFilterForm(request.GET or None)
178
- LOG.debug("using GET: %s", request.GET)
179
-
212
+ form = IncidentFilterForm(form_data or None)
213
+ LOG.debug("using GET: %s", form_data)
180
214
  if form.is_valid():
181
215
  LOG.debug("Cleaned data: %s", form.cleaned_data)
182
216
  filterblob = form.to_filterblob()
@@ -193,8 +227,6 @@ def incident_list_filter(request, qs, use_empty_filter=False):
193
227
 
194
228
  def _convert_filterblob(filterblob):
195
229
  """Converts values in filterblob so it can be used as valid input for IncidentFilterForm"""
196
- if "tags" in filterblob.keys():
197
- filterblob["tags"] = ", ".join(filterblob["tags"])
198
230
 
199
231
  if "open" in filterblob.keys():
200
232
  open_state = filterblob["open"]
@@ -217,6 +249,41 @@ def _convert_filterblob(filterblob):
217
249
  return filterblob
218
250
 
219
251
 
252
+ def _normalize_form_data(request):
253
+ """Normalizes form data from request, especially the 'tags' parameter."""
254
+
255
+ raw_data = request.POST if request.method == "POST" else request.GET
256
+ data = dict(raw_data.items())
257
+ for key in raw_data:
258
+ value = raw_data.getlist(key, [])
259
+ if key == "tags":
260
+ value = _normalize_tags_param(value)
261
+ elif key not in ["source_types", "sourceSystemIds"]:
262
+ value = value[0]
263
+ data[key] = value
264
+ return data
265
+
266
+
267
+ def _normalize_tags_param(tags_param):
268
+ """Normalizes the 'tags' parameter from the form data."""
269
+
270
+ if isinstance(tags_param, str):
271
+ return _split_tag(tags_param)
272
+ elif isinstance(tags_param, (list, tuple)):
273
+ tags = []
274
+ for entry in tags_param:
275
+ if isinstance(entry, str):
276
+ entry = _split_tag(entry)
277
+ tags.extend(entry)
278
+ return tags
279
+ return []
280
+
281
+
282
+ def _split_tag(tag: str) -> list[str]:
283
+ """Splits a single tag string by commas and trims whitespace."""
284
+ return [t.strip() for t in tag.split(",") if t.strip()]
285
+
286
+
220
287
  def create_named_filter(request, filter_name: str, filterblob: dict):
221
288
  form = NamedFilterForm({"name": filter_name, "filter": filterblob})
222
289
  filter_obj = None
@@ -15,4 +15,5 @@ urlpatterns = [
15
15
  path("filter/delete/<int:pk>/", views.delete_filter, name="filter-delete"),
16
16
  path("filter/update/<int:pk>/", views.update_filter, name="filter-update"),
17
17
  path("filter/existing/", views.get_existing_filters, name="existing-filters"),
18
+ path("search-tags/", views.search_tags, name="search-tags"),
18
19
  ]
@@ -13,10 +13,10 @@ from django.utils.timezone import now as tznow
13
13
  from django.shortcuts import render, get_object_or_404
14
14
  from django.views.decorators.http import require_POST, require_GET
15
15
  from django.core.paginator import Paginator
16
- from django.http import HttpResponse, HttpResponseBadRequest, QueryDict
16
+ from django.http import HttpResponse, HttpResponseBadRequest, JsonResponse, QueryDict
17
17
  from django_htmx.http import HttpResponseClientRefresh, retarget
18
18
 
19
- from argus.incident.models import Incident
19
+ from argus.incident.models import Incident, Tag
20
20
  from argus.incident.ticket.utils import get_ticket_plugin_path
21
21
  from argus.incident.ticket.base import TicketPluginException
22
22
  from argus.notificationprofile.models import Filter
@@ -238,6 +238,28 @@ def add_param_to_querydict(querydict: QueryDict, key: str, value: Any):
238
238
  return querydict
239
239
 
240
240
 
241
+ class SearchForm(forms.Form):
242
+ search = forms.CharField(required=False)
243
+
244
+
245
+ @require_GET
246
+ def search_tags(request):
247
+ query = request.GET.get("q")
248
+
249
+ if not query:
250
+ return JsonResponse({"results": []})
251
+
252
+ if Tag.TAG_DELIMITER in query:
253
+ key, value = Tag.split(query)
254
+ tags = Tag.objects.filter(key=key, value__icontains=value)[:20]
255
+ else:
256
+ tags = Tag.objects.filter(key__icontains=query)[:20]
257
+
258
+ options = [{"id": str(tag), "text": str(tag)} for tag in tags]
259
+
260
+ return JsonResponse({"results": options})
261
+
262
+
241
263
  @require_GET
242
264
  def incident_list(request: HtmxHttpRequest) -> HttpResponse:
243
265
  LOG = logging.getLogger(__name__ + ".incident_list")