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.
- {argus_server-2.3.0 → argus_server-2.4.0}/CHANGELOG.md +38 -1
- {argus_server-2.3.0 → argus_server-2.4.0}/NOTES.md +17 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/PKG-INFO +1 -1
- argus_server-2.4.0/docs/development/howtos/trigger-test-error-pages.rst +14 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/api/v2.rst +9 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/htmx-frontend.rst +47 -2
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/filterwrapper.py +9 -1
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/swappable/serializers.py +5 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/context_processors.py +1 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/defaults.py +1 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/columns.py +36 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/filter.py +89 -22
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/urls.py +1 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/views.py +24 -2
- argus_server-2.4.0/src/argus/htmx/static/choices-11.1.0.min.js +2 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/static/styles.css +910 -109
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/snippets/20-loading-box.css +5 -5
- argus_server-2.4.0/src/argus/htmx/tailwindtheme/snippets/25-choices.css +80 -0
- argus_server-2.4.0/src/argus/htmx/tailwindtheme/snippets/30-incident-table.css +21 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/styles.css +2 -0
- argus_server-2.4.0/src/argus/htmx/templates/400.html +7 -0
- argus_server-2.4.0/src/argus/htmx/templates/401.html +7 -0
- argus_server-2.4.0/src/argus/htmx/templates/403.html +7 -0
- argus_server-2.4.0/src/argus/htmx/templates/404.html +7 -0
- argus_server-2.4.0/src/argus/htmx/templates/410.html +7 -0
- argus_server-2.4.0/src/argus/htmx/templates/500.html +7 -0
- argus_server-2.4.0/src/argus/htmx/templates/htmx/forms/search_select_multiple.html +66 -0
- argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/_base_incident_table.html +32 -0
- argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/_incident_table.html +10 -0
- argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/_incident_table_autorefresh.html +12 -0
- argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/_incident_table_footer.html +30 -0
- argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/_unpaged_incident_table.html +4 -0
- argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/_incident_ack_icon.html +10 -0
- argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/_incident_age.html +4 -0
- argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/_incident_combined_status_icons.html +5 -0
- {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
- argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/_incident_source_type.html +2 -0
- argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/_incident_start_time_and_age.html +5 -0
- argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/_incident_status_icon.html +10 -0
- argus_server-2.4.0/src/argus/htmx/templates/htmx/incident/cells/search_fields/input_search.html +16 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/incident_list.html +2 -2
- argus_server-2.4.0/src/argus/htmx/templates/htmx/user/_preference_choice_nopreview.html +1 -0
- argus_server-2.4.0/src/argus/htmx/templates/htmx/user/_preference_choice_preview_datetime.html +2 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx_base.html +3 -2
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templatetags/argus_htmx.py +22 -7
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/preferences/forms.py +82 -11
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/widgets.py +4 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/models.py +17 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/urls.py +2 -2
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/views.py +24 -48
- argus_server-2.4.0/src/argus/version.py +1 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/filter/test_filterwrapper.py +38 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/incident/test_filter.py +92 -3
- argus_server-2.4.0/tests/site/test_views.py +66 -0
- argus_server-2.3.0/src/argus/htmx/templates/htmx/incident/_incident_table.html +0 -51
- argus_server-2.3.0/src/argus/htmx/templates/htmx/incident/cells/search_fields/input_search.html +0 -7
- argus_server-2.3.0/src/argus/version.py +0 -1
- argus_server-2.3.0/tests/site/test_views.py +0 -10
- {argus_server-2.3.0 → argus_server-2.4.0}/.git-blame-ignore-revs +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/.gitattributes +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/.gitignore +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/.mailmap +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/.pre-commit-config.yaml +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/.readthedocs.yaml +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/.sonarcloud.properties +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/CONTRIBUTING.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/CONTRIBUTORS.md +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/Dockerfile +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/LICENSE +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/MAINTAINING.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/Makefile +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/README.md +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/UPGRADING.md +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/changelog.d/.gitkeep +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/cmd.sh-template +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/codecov.yml +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/constraints.txt +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docker/Dockerfile +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docker/README.md +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docker/docker-entrypoint.sh +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docker/dockersettings.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docker-compose.yml +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/Makefile +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/_exts/djangodocs.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/_static/.gitkeep +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/_templates/.gitkeep +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/about-argus.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/conf.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/customization/htmx-frontend.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/customization.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/add-more-preferences.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/change-settings.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/changelog-entry.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/commit-messages.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/customizing-filtering.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/federated-logins.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/howtos-for-git.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/howtos-for-github.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/column_for_specific_ack_group.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/column_for_specific_tag.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/custom-incident-actions.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/customize-filtering.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/dependencies.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/font_awesome.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend/override_templates.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/htmx-frontend.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/notification-system-testing.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/recover-from-migration-trouble.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/regenerate-the-ER-diagram.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/release-checklist.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/sonarqube.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/toggle-django-debug-toolbar.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/update-contributors.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos/vendor-a-repo.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/howtos.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/makefile-rules.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/management-commands.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/notes.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/styleguide.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development/troubleshooting.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/development.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/django_settings.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/default_timeslot.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/destinations_view.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/example_timeslot.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/filter_selector.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/incident_details_view.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/incidents_filter.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/incidents_page.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/new_notification_profile.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/notification_profiles.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/synced_destination_delete_error.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/timeslots_view.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/unsaved_recurrence.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/img/user_menu.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/index.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/_note.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/glue-services/index.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/glue-services/writing-glueservices.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/index.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/notifications/email-plugin.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/notifications/index.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/notifications/sms-plugin.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/notifications/writing-notification-plugins.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/ticket-systems/index.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/integrations/ticket-systems/writing-ticket-system-plugins.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/make.bat +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/admin.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/api.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/authentication.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/glossary.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/img/ER_model.png +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/models.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference/site-specific-settings.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/reference.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/docs/user-manual.rst +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/pyproject.toml +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/requirements/dev.txt +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/requirements/django52.txt +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/requirements/please-pip-sync.txt +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/requirements/test.txt +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/requirements-django52.txt +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/requirements.txt +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/admin.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/apps.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/authentication.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/context_processors.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/drftoken/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/drftoken/serializers.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/drftoken/urls.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/drftoken/views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/factories.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/knox/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/knox/serializers.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/knox/urls.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/knox/views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/commands/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/commands/changeuser.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/commands/createuser.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/commands/grantsuperuser.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/commands/revokesuperuser.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/management/commands/setpassword.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/migrations/0001_initial.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/migrations/0002_alter_user_first_name.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/migrations/0002_squashed_auth_20250512_add_preferences_model.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/migrations/0003_delete_phonenumber.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/migrations/0004_add_preferences_model.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/migrations/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/models.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/serializers.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/urls.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/auth/views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/base/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/base/apps.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/base/static/favicon.svg +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/base/templates/base.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/base/templates/index.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/compat.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/apps.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/bulk_incidents.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/check_token_expiry.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/close_incident.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/create_fake_incident.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/create_source.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/gen_secret_key.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/initial_setup.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/list_filters.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/stresstest.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/management/commands/toggle_profile_activation.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/dev/utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/drf/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/drf/permissions.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/apps.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/checks.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/default.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/factories.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/filters.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/primitive_serializers.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/queryset_filters.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/serializers.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/swappable/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/filter/validators.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/appconfig.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/apps.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/auth/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/auth/views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/checks.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/constants.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/dateformat/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/dateformat/constants.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/destination/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/destination/forms.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/destination/urls.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/destination/views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/forms.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/htmx_urls.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/constants.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/forms/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/forms/base.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/forms/incident_actions.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/forms/incident_filters.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/incident/utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/management/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/management/commands/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/management/commands/tailwind_config.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/middleware.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/migrations/0001_initial.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/migrations/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/modals.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/models.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/notificationprofile/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/notificationprofile/urls.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/notificationprofile/views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/request.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/root_urls.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/settings.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/static/htmx-2.0.2.min.js +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/static/hyperscript-0.9.13.min.js +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/static/logo_white.svg +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/README.md +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/config.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/get_tailwind.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/snippets/10-tailwind.css +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/snippets/15-alert-message.css +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/tailwind.config.js +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/tailwindtheme/utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/errors/dict/ul.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/errors/list/ul.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/field.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/label.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/attrs.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/checkbox.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/checkbox_option.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/classless_attrs.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/date.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/datetime.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/input.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/radio_option.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/range.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/select.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/django/forms/widgets/time.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/_base_confirm_dialog.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/_base_form_modal.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/_base_form_modal_button.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/_base_form_modal_experimental.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/base.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/components/_page_title.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/components/incident_list_refresh_info_select.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/_collapse_with_forms.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/_content.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/_create_form.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/_delete_form.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/_edit_form.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/_form_list.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/destination/destination_list.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/forms/badge_dropdown_select_multiple.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/forms/checkbox_select_multiple.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/forms/dropdown_select_multiple.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/forms/input_field.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_base.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_base_incident_update_modal.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_delete_filter_confirm_dialog.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_existing_filters.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_filter_controls.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_filter_create_modal.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_filter_delete_dropdown.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_filter_select.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_filter_update_dropdown.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_acknowledge_modal.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_close_modal.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_filterbox.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_list_menubar.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_list_refresh_info.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_list_update_menu.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_reopen_modal.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_table_cell_wrapper_default.html +0 -0
- {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
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_table_paginator.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_table_paginator_pageitem.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_table_row.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_table_rows.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_ticket_autocreate_modal.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_ticket_edit_modal.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_incident_ticket_manual_create_modal.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/_update_filter_confirm_dialog.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_ack.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_actions.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_checkbox.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_color_status.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_combined_status.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_description.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_filterable_column_header.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_level.html +0 -0
- {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
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_pk.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_source.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_start_time.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_start_time_header.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_status.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_tag.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/cells/_incident_ticket.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/filter_list.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/incident_detail.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/responses/_incident_list_refresh.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/incident/responses/empty_list_item.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/notificationprofile/_notificationprofile_form.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/notificationprofile/_notificationprofile_form_div.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/notificationprofile/base.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/notificationprofile/notificationprofile_confirm_delete.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/notificationprofile/notificationprofile_form.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/notificationprofile/notificationprofile_list.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/styleguide.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/_delete_timeslot_confirm_dialog.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/_timeslot_detail.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/_timeslot_form.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/base.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/checkbox_option.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/timerecurrence_div.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/timeslot_confirm_delete.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/timeslot_form.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/timeslot/timeslot_list.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_current_theme.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_dateformat_dropdown.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_incidents_table_columns_dropdown.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_incidents_table_layout_dropdown.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_page_size_dropdown.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_theme_dropdown.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_update_interval_dropdown.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_user_menu.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_user_menu_logout.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/_user_menu_notification_config.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/preference_field_form.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/preferences_list.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/htmx/user/radio_option.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/messages/_notification_message.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/messages/_notification_messages.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/messages/_notification_messages_htmx_append.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/registration/login.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/tailwind/styles.css +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/tailwind/tailwind.config.js +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templates/tailwind_whitelist.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/templatetags/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/themes/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/themes/utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/timeslot/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/timeslot/urls.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/timeslot/views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/urls.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/factories.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/preferences/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/preferences/models.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/preferences/utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/urls.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/user/views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/htmx/views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/admin.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/apps.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/constants.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/factories.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/fields.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/forms.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0001_initial.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0001_squashed_incident_20250514.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0002_empty_source_incident_id.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0003_incident_level.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0004_add_ChangeEvent_proxy.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0005_alter_event_type.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0006_incident_search_text.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0007_alter_event_type.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0008_incident_metadata.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/0009_use_bigautofield_on_quickly_growing_tables.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/migrations/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/serializers.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/signals.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/templates/incident/admin/fake_incident_add_form.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/templates/incident/admin/incident_change_list.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/templates/incident/admin/widgets/split_datetime_infinity.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/templates/incident/ticket/default_ticket_body.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/ticket/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/ticket/base.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/ticket/dummy.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/ticket/utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/urls.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/validators.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/incident/widgets.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/admin.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/apps.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/checks.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/factories.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/media/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/media/base.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/media/email.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/media/sms_as_email.py +0 -0
- {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
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/migrations/0001_squashed_notificationprofile_20250512.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/migrations/0016_noop.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/migrations/0017_change_event_type_to_event_types.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/migrations/0018_remove_closed_and_unacked_from_filterblob.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/migrations/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/models.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/serializers.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/signals.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/templates/notificationprofile/email.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/templates/notificationprofile/email.txt +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/templates/schemawrapper.html +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/urls.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/notificationprofile/views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/api_v2_urls.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/logging.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/serializers.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/_serializers.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/backend.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/base.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/dev.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/dockerdev.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/prod.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/settings/test_CI.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/site/wsgi.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/util/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/util/admin_utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/util/datetime_utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/util/testing.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/src/argus/util/utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/management_commands/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/management_commands/test_changeuser.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/management_commands/test_createuser.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/models.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/test_auth.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/test_knox_views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/test_models.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/test_utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/auth/test_views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_bulk_incidents.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_check_token_expiry.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_close_incident.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_create_fake_incident.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_create_source.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_gen_secret_key.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_initial_setup.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_list_filters.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_toggle_profile_activation.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/dev/test_utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/filter/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/filter/dummyplugin.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/filter/test_filterplugin.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/filter/test_queryset_filters.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/helpers.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/incident/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/incident/test_customization.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/incident/test_forms_incident_filters.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/incident/test_utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/incident/test_views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/notificationprofile/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/notificationprofile/test_forms.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/test_incident_columns_rendering.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/test_middleware.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/test_templatetags.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/htmx/test_utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/fixtures/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_change_event.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_create_fake_incident.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_event.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_filters.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_incident.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_incident_fields.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_queryset.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_serializers.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_source_system.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_source_system_type.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/test_views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/ticket_plugins/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/ticket_plugins/test_base.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/ticket_plugins/test_dummy.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/ticket_plugins/test_utils.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/unit/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/incident/unit/test_incident_details_url.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/migration_example.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/destinations/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/destinations/test_email.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/destinations/test_sms.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/migrations/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/test_github236.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/test_media.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/test_models.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/test_serializers.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/notificationprofile/test_views.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/site/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/site/test_misc.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/site/test_settings_helpers.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/site/test_settings_validators.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/util/__init__.py +0 -0
- {argus_server-2.3.0 → argus_server-2.4.0}/tests/util/test_utils.py +0 -0
- {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
|
|
@@ -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
|
|
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.
|
|
45
|
-
widget=
|
|
69
|
+
tags = forms.MultipleChoiceField(
|
|
70
|
+
widget=SearchDropdownMultiSelect(
|
|
46
71
|
attrs={
|
|
47
|
-
"placeholder": "
|
|
48
|
-
|
|
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
|
-
"
|
|
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
|
|
111
|
+
return []
|
|
81
112
|
|
|
82
113
|
try:
|
|
83
|
-
for tag in tags
|
|
84
|
-
|
|
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"] =
|
|
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(
|
|
170
|
-
LOG.debug("using POST: %s",
|
|
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(
|
|
178
|
-
LOG.debug("using GET: %s",
|
|
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")
|