This file documents all changes to Argus. This file is primarily meant to be read by developers.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
This project uses towncrier and the changes for the upcoming release can be found in https://github.com/Uninett/Argus/tree/main/changelog.d/.
The most important change in this release is that we have finally added the long awaited task queue, to handle background tasks. The task queue uses the database for storage by default so running migrations is necessary. As part of using the queue to send notifications we fixed several bugs that caused a lower amount of notifications to be sent than expected. Another big change is we have upgraded tailwind, which affects theme customization and building packages.
You must see the NOTES before updating if you or your deployment do any of the following:
- Send notifications (
SEND_NOTIFICATIONS = True). Affected both by the new queue and the bug-fixes. - Alter any templates or CSS, due to the upgrade of tailwind.
- Replace or rework the incident list filter box.
- Write your own media plugins.
- Build your own package (useful for bundling themes and tweaks). The release checklist has changed.
- Added support for a task queue. We're using
django-tasks, which is in the process of being merged into Django proper, with the backenddjango-tasks-db. This stores the tasks in the same database as everything else. We're currently only using the queue to send notifications, so if you are not using argus for that (SEND_NOTIFICATIONSis off), nothing changes. (#1608) - Add "Create copy" action for planned maintenance tasks (#1613)
- Show name of owner for public filters (#1748)
- Add preview of incidents covered by selected filters in planned maintenance task form (#1765)
- Create admin user from env variables in docker entrypoint (#1776)
- Validate
DAISYUI_THEMESentries, skipping invalid ones with warnings (#1819) - Add Sikt light and dark DaisyUI themes based on Sikt Design System color tokens (#1822)
- Upgrade to Tailwind CSS v4 and DaisyUI v5. See NOTES for theme customization. (#1262)
- We are now using a task queue to send notifications instead of forking off a process. This is to increase robustness and hopefully to increase throughput. If argus is being used to send notifications, you MUST change your deployment as there now is an additional service that needs to run in order to handle the notifications on the queue. See the NOTES! (#1608)
- Refactor incident list filter UI with collapsible filterbox and dynamic bulk actions bar. (#1693)
- Improve maintenance column by adding a dropdown with tasks that affect the incident (#1745)
- Support searching for filters by first and last name of user (#1764)
- Added under maintenance column to maintenance column preset (#1775)
- Improve timeslot form with compact table layout for time recurrences (#1794)
- Consolidate notification routes under /notifications/ with tab navigation (#1795)
- Improve notification profile form with collapsible cards and inline actions (#1796)
- Moved some functionality from the email media plugin to the base class of all media plugins. Basically, any destination can now be marked as being "managed", which means that it is created and managed by a system outside of an end-users control. This can be for instance email addresses or phone numbers fetched from an account-database or address book. (#1802)
- Redesign destination page as flat table with inline editing (#1806)
- Tailwind CSS intermediate files (theme CSS, config snippets) are no longer tracked in git. See NOTES. (#1826)
- Redesign filter toolbar with compact icon buttons and direct filter actions (#1831)
- Notifications are now also sent on bulk changes to incidents. Note that for filters used for sending notifications, it will be necessary to control event types to maintain the current expected amount of notifications sent. See NOTES. (#1763)
- Limit choices of incidents field in PM admin to open incidents (#1789)
- Make it possible to use public filters in notification profiles (#1805)
- Fixed a bug where the setting that controls whether notifications will be sent was ignored when sending notifications in the background. The notifications were sent regardless. (#1808)
- Allow for multiple notification profiles with no name (#1828)
- Fix showing age for stateless incidents (#1833)
- Fix theme preview showing wrong foreground text color on color swatches (#1834)
This release improves the UX for creating planned maintenance tasks, by having dedicated pages for it and allowing all logged in users to see the list of future, ongoing and past planned maintenance periods. To take full advantage of thisi column, see NOTES.md.
Furthermore, admins can create filters that can be used (but not edited) by everyone.
The sorting of the incident list can now be controlled via relevant columns, but only one column at a time.
There are lots and lots of new columns! See NOTES.md
There are two new column presets, one for making notification filters and another for making planned maintenance tasks.
A long-standing bug has been fixed that prevented the sending of notifications, see NOTES.md.
-
Added searchable
idcolumn (#1288) -
Made it possible to filter on event types (#1455)
-
Added column for marking incidents as under maintenance (#1589)
-
Prohibited editing planned maintenance task closed for longer than 12 hours (#1648)
-
Added pictures of each column type to docs (#1653)
-
Save current incident filters as a user preference and restore on page load (#1682)
-
Added a new column showing all tags of an incident. (#1698)
-
Add new
end_timeandnarrow_end_timecolumns to display theend_timeof an incident (#1715) -
Add compact severity columns with filtering and sorting (#1717)
-
Added management command to connect incidents to new planned maintenance tasks (#1734)
-
Added first version of pages for CRUD-ing planned maintenance tasks. Everyone can see them but only admins can alter anything (#1735)
-
Added management command to remove incidents from ended planned maintenance tasks (#1736)
-
Made it possible to mark a filter as "public". This means that anyone can use it in the incident list, for notification profiles or for making planned maintenance tasks. The flag can currently only be set via the admin interface, and is thus limited to administrators. (#1742)
-
Add sortable columns to incident table (#1980)
-
Added a very rough and ready column to show an incident's events.
-
Added two new column presets:
- "notifications" with columns useful for making notification profiles
- "on maintenance" with columns useful for finding things that will be on planned maintenance
-
Argus now supports Django 6.0
- Implemented a Contributor License Agreement for Argus, based on the Free Software Foundation's Fiduciary License Agreement (#956)
- Replace column filter button with debounced auto-submit (#1575)
- Improve toast notification accessibility with ARIA attributes and screen reader support (#1711)
- Changed label of start time column to 'Start time' (#1718)
- Renamed column
start_time_and_agetonarrow_start_time_and_ageand added wider column namedstart_time_and_age(#1719) - The buttons in the column layout preview were disabled.
- The theme chooser on the user preferences page now shows the text color for each color palette in addition to the background color.
- Added key requirements to error message in tag validation (#511)
- Fixed dropdown multi-select fields (e.g. Source Types) selecting first item when clicked (#1697)
- Show meaningful error messages in UI and log full tracebacks for HTMX errors instead of generic "500 Internal Server Error" and HTML content (#1702)
- Fixed page size preference being reset to default when visiting the incidents
page without a
page_sizeURL parameter (#1704) - Fix bug where multiselect is not cleared when de-selecting all options (#1751)
- Fixed longstanding bug that led to fewer notifications than expected. Instead of checking when an event happened in order to decide whether to send a notification, we only checked when the incident started. So, no notifications could be sent for long-lasting incidents if they started outside of all active timeslots.
- Missing filters are now handled better. If a filter was deleted while it was in use by the incident list page, the page would get stuck with a "500 Server Error" until the filter was manually removed from the session.
This is a tiny release to finish up what was started at the end of 2025.
- Add preview for incident table preferences (#1658)
- Filter on source type in dashboard. The previous release made it work for notifications but not in the incident list in the frontend.
- Fix bug where the incident table overlaps filter dropdowns (#1669)
The big new thing this time around is a way to prevent notifications from certain incidents by masking them via a planned maintenance filter stored in a planned maintenance task. This task works just like a notification profile: more filters add precision. The only way to set up a filter right now is via the admin. Users with admin-access can click on the admin link, see the section "ARGUS_PLANNEDMAINTENANCE".
We want some feedback on the feature before we add support for setting up planned maintenance tasks via the API and the frontend.
Otherwise: work on increasing consistency in the frontend continues, and the version number of argus should now always be available.
Customizers, please see the NOTES.md, the preferences page has more changes.
Remember to migrate if upgrading.
- Add preview for theme and date format preferences (#1557)
- Add model for planned maintenance tasks (#1586)
- Added functionality to add/edit planned maintenance tasks to Django admin (#1587)
- Filter out events covered by ongoing planned maintenance tasks from being sent (#1588)
- Added Argus version number to user menu dropdown and login page (#1650)
- Split user preferences into multiple sections (#1557)
- Increase accessibility of cards by using borders instead of shadow (#1641)
The most important feature this release is being able to filter on source system type. If you have multiple source systems in a filter, all of them of the same type, it might pay off to switch over to using the source system type instead.
The rest is frontend improvements: The tags filter now has typeahead find. The header and footer of the incident list never scroll off screen. The status columns have variants with icons instead of text, and there's new columns showing an incident's age (time since it happened).
See NOTES.md for further detail.
- Added test error page (#1024)
- Add age columns to incident table (#1552)
- Made it possible to filter on a source's type in the incident list, API, and for sending notifications. Also added a new built-in column "source type" for the incident list. When there are very many sources of the same type, the filter and column become useful. (#1556)
- Add status columns that use icons instead of text (#1635)
- Made a system for rendering previews of preference choices.
- Change incident table header and footer to always be visible (#1548)
- Add clear button to search column header (#1573)
- Change tags input to use searchable multiselect (#1604)
This release has numerous improvements to the frontend. The various widgets on the incident list page now work better together, and where there are more than one to choose from the choices are now sorted alphabetically. No user preferences are left in the user menu. The preference page has had a slight rework though more is planned.
The big new thing is the possibility to select more than one column layout. You can now choose a preferred layout on the user preferences page if any have been configured in addition to the standard one. A nice looking preview of each configured layout is planned for the next release.
Due to the possibility of choosing between multiple column layouts, several new types of columns have been added. There's also a new section in the reference documentation explaining and naming all the built-in column types.
See NOTES.md for how to convert an existing column layout to the new format.
- Sort list of filters in filter dropdown alphabetically (#1553)
- Sort list of sources in filter dropdown alphabetically (#1554)
- Added and documented more searchable columns for the incident list:
search_description,select_levels,has_ticket_url,search_ticket_url, and a way to mass-produce single-field forms to add even more searchable columns and eventually systematize the incident filter forms in the topmost box. - Make it possible to define more than one column layout, and make it possible to switch between them via a user preference. Fixes #1581, #1582.
- Added the column
narrow_start_time.
- Remove user preferences from global header dropdown (#1567)
- Use DaisyUI dropdowns in searchable columns (#1574)
- Sort filter dropdowns for update / delete filter alphabetically (#1592)
- Add consistent title to notification config pages (#1606)
- Auto-align filterable column dropdown if it extends beyond the screen (#1607)
- Fixed several problems with filtering the incident list in the frontend: the various widgets were stepping on each others toes. Made much easier by turning all GET-abble filters into Django forms.
- Improved documentation of how notificationprofiles with multiple filters work, with changes to the user manual, new tests, and a help text added to the field in question in the frontend.
- Preferences are all now properly backed by forms, inheriting from
SimplePreferenceFormwhich is a perfect fit for preferences where you choose one of several options. UsingPreferenceFielddirectly will still work, but the form used now receives the request on__init__. It is therefore necessary to upgrade the old forms by either mixing in theClassicPreferenceFormMixin, which will discard the passed-inrequest, or writing your own__init__that will prevent passing in therequestviasuper().__init__(*args, **kwargs). - User preferences were refactored. This is to increase consistency, cut down on copypasta, and eventually use Django forms on the user preference page, but more importantly: Django settings are no longer read on import. Turns out, preferences that depend on Django settings sometimes read the settings too soon, before the settings-file was complete, and therefore getting the wrong or no setting.
- Added the beginnings of a style guide at /styleguide/. The look of the form inputs that were not manually laid out have in some cases also changed, for greater consistency. (#1558)
- Added
zino-argus-glueto documented list of known glue services
- Increased logging verbosity when finding destinations for notifications and actually sending the notifications, to aid in debugging production systems. Now also logs which destination id's are found and used. (#1563)
- The development docker compose had stopped working due to changes outside of our control (pip, git, the very distro) and has been updated.
- The incident list layout preference selector is no longer buggy
- Some problems with the dockerfile for production was fixed (see /docker), and the README and the comments in the Dockerfile have been improved
- Updated the installation instructions in the README, should have ben part of 2.2.0
The most important bit of this release is the new (old) way to install and set up argus-server, including the frontend. Please see the NOTES.
- Added option 'Last 3 days' to the Timeframe selector. (#1440)
- Added rule to Makefile that downloads standalone tailwind CLI client as per
the version configured in
src/argus/htmx/tailwindtheme/config.py. (#1531) - Add a fledgling CONTRIBUTING.rst for onboarding new developers.
- Added documentation for the rules in the
Makefile. - Two new development howtos have been added, with tips for using git and GitHub.
- Make example production Docker image work properly for Argus 2
- The settings files have changed, since the HTMx frontend app is now included
by default. The frontend settings has been merged in and no longer need the
settings overriding machinery. It is no longer necessary to install the
frontend with
pip install argus-server[htmx], justpip install argus-serverwill do. - Updated contributors file with contributors that joined after 2019, and added a howto for how to keep the list updated.
- Added new sections to the user manual: How to select from existing themes, How to add your own theme, How to choose what columns are shown in the incidents table, and How to change the date and time format. (#1491)
- Added info about more glue services. (#1508)
- Updated the README with a link and info about the publicly accessible demo-site. (#1510)
- Updated the content of the user manual (outdated text, screenshots and broken external links). (#1490)
- Fixed automatic ticket creation, which was broken by #1497 (#1516)
- Made
docker compose upfor development work with Argus 2.1+ (#1513) - Fixed broken links in the user manual. (#1492)
- Add a preference to change the incidents table layout to compact or standard (#1399)
- Add CLI command to close incidents (#1450)
- Add option to
create_fake_incidentto generate incidents from json files (#1451)
- Use DRF's DEFAULT_PERMISSION_CLASSES setting for API endpoints' permission checking (#1476)
- Request is now passed to incident update actions to allow for sending messages (#1497)
- Ensure SourceSystemTypeFactory is called with lowercase name (#1499)
- Avoid trying to create incident with same source and source incident id (#1500)
This release fixes a problem in the migrations shipped with 2.0.0. Only affects development.
- Fix fields incorrectly marked as autocreated in squashed migration (#1506)
This release completely removes version 1 of the API. If you have not done so, please update your glue services and other integrations using API v1 to use version 2!
We also archived the old frontend and dropped all support for it.
Please make sure to first migrate to the last release (1.37.0) before upgrading to 2.0.0.
If you have used the HTMX frontend already and are using a local settings file you should remove/comment out the lines
update_settings(globals(), APP_SETTINGS)
and
ROOT_URLCONF = "argus.htmx.root_urls"
and corresponding imports if you are getting the error
django.core.exceptions.ImproperlyConfigured: Application labels aren't unique, duplicates: django_htmx.
- Deleted API v1, its tests and mentions in the documentation. As well as all support for the old frontend. Any endpoint starting with "/api/v1" replies with "410 Gone". (#1446, #1445, #1428, #1427, #1423, #1422, #1417, #1415)
- Added an optional banner below the navbar that can be filled with text controlled via environment variable/Django setting. (#1164)
- Added two new management commands:
createuserandchangeuser. (#1449) - Added support for creating a source when calling
create_fake_incidentif the source does not exist. (#1424) - Added option to set source type in
create_fake_incidentmanagement command. (#1486)
- Squashed existing migrations for the benefit of future changes in Argus v2. (#1407)
- Upgraded a lot of dependencies. (#1485)
There's a very important change to the database schema in this release. Depending on the amount of incidents in your database you might not be able to migrate the normal way. Please see the NOTES.
This is the first release to not support any Django older than 5.2.
- Add source argument to
create_fake_incidentCLI command
- Drop support for all Django versions older than 5.2.
- The primary keys of the models Incident, Tag, IncidentTagRelation and Event (and indirectly Acknowledgment) were changed from a 32-bit signed integer to a 64-bit signed integer since these may grow for all eternity.
- Show better messages when handling errors when autocreating tickets.
The fallback setting of EMAIL_USE_TLS changed from a hardcoded True to
reading from an environment variable with a fallback to False in 1.36.0.
This broke at least one site that used the settings file
argus.site.settings.base directly and did not set EMAIL_USE_TLS explicitly.
This prevented the sending of emails.
We recommend setting EMAIL_USE_TLS explicitly in your own settings, either as
an environment variable ("1" for True, "0" for False) or directly in
a production settings file.
- The example production settings file (
argus.site.settings.prod) now runs the new frontend and no longer supports the old frontend. In this settings-file,EMAIL_USE_TLSfalls back toTrueif not set as an environment variable. - Added "level"-filter for incidents in admin
- Fixed autocreation of tickets
The new frontend is feature complete.
No development or support will be done on the old frontend from now on, please switch to the new one ASAP.
- Update email settings to use port 25 by default, override defaults in prod.py (#1395)
- Add font-awesome icon pack (#1389)
- Convert filterable column unicode search icon to fontawesome (#1390)
- Added new incident page filter parameter "timeframe" to be on par with the old frontend. This allows hiding older incidents by age. The chosen "ages" are hard-coded, as it was in the old frontend.
- Made styling of the elements in the footer more blended in. (#1363)
- Made select dropdowns in incident list table footer more consistent with rest of footer (#1393)
- Dropped the "id"-column from the default incident columns config since most other colmns now are links to the details-page.
- Make incident duration on details page more human readable (#1196)
- Center header text on incident details page (#1298)
Remember to migrate the database, unwanted crud might have snuck into the stored filters.
- Dropped support for testing and running on Python 3.9 and Django 5.0.
- Fix broken Docker images to still work with SPA front-end (#1310)
The new frontend is now just about on par feature-wise with the old frontend, though we do not aim for bug compatibility =)
- Admins now see an admin link in the user menu dropdown (#1261)
- A new parameter
use_empty_filterto theincident_list_filterfunction.use_empty_filterdefaults toFalse. (#1360) - Allow testing on Django 5.2 in anticipation of dropping Django 4.2.
- Change tristate selection from checkboxes to slider. More changes to come. (#1048)
- Made the incidents page more compact. (#1246)
- Grouped user preferences in user menu dropdown (#1256)
- Fixed styling of input fields in modals. Made all basic inputs (text, date, email etc) on the incidents, timeslots and destinations pages have the same universal design. (#1311)
- Improved the UX for forms on the profiles page. (#1312)
- Made styling of the tag badges on the details page more subtle. (#1314)
- Polished styling and alignment of the inputs in filterbox. (#1316)
- Incident tags that contain URL are now clickable on the incident detail page. (#1329)
- Switched to setting italic font using HTML instead of CSS for better accessibility. (#1343)
- Give the sections in the details page a drop shadow. This stranded the close/reopen button at the bottom, so it was moved to just above the list of events.
- In the details page: Make free text look better by breaking long lines and preserving newlines. Also make event types and ack/event author and timestamp stand out better.
- Made sure all non-button form inputs have
autocomplete="off"set which fixes some annoying behavior in Firefox when filling in forms. This is documented in the troubleshooting guide. - Make an abstraction for modals deleting things, as part of the modal cleanup.
- Modularized the incident pagination and improved it as per user feedback.
- Replaced the fancy days selector in the timeslots page with checkboxes.
- Support testing/running on Python 3.13. We need to stay on psycopg2 a while
longer since we use PostgreSQL "infinity" for incident
end_time. - Upgraded all dependencies that could be upgraded and removes pytz as it is now unused.
- When showing the details url in the details page, use the generated absolute
url from the
Incident.details_urland theSource.base_url. Validates that the combination is valid and falls back to using the raw details url if not.
- Bug with very long text in badges on the details page overflowing and becoming unreadable. (#1244)
- Made the height of the feeds on details page always conform to the max height of the details section. Any vertical overflow in the feed will now be scrollable. (#1327)
- Programmatically connected labels to corresponding inputs. (#1332)
- Removes "unacked" and "closed" from filterblobs. (#1342)
- Made filter selector more robust in general and fixed bugs: #1344, #1353, #1355. (#1360)
- Fixed color contrast for incident tags badges and table separators (temporary fix) (#1375, #1378)
- No longer erases a ticket url if attempting to save an invalid one when editing. There's an error message in a popup. Made ticket url always optional. (#1371)
- Updated README to highlight the deprecation of API v1, that the old frontend will soon not be supported and that Django will soon not support PostGRESQL older than 14.
- Updated the release checklist.
- Changed docker entrypoint script files that used the wrong path for
asgi.py.
This release marks the beginning of the process towards argus-server 2.0!
API V2 is hereby declared stable, and V1 is hereby deprecated.
Version 2 will drop support for API V1 and the old frontend. Please try the new frontend and send us some feedback!
The next Django LTS, 5.2, will not support any PostgreSQL older than version 14, so please upgrade ASAP.
The incident list in the new frontend is now feature complete. The timeslots page has been prettified but also has some bugs. There's lots of remaining UX things to do.
- There's now a troubleshooting guide in the docs, for storing debugging tips.
- Made it possible to filter and search on
ticket_urlanddetails_urlin admin.
- We now have a unique color per severity level. (#996)
- Added button on the incident details page for autocreating a ticket. (#1202)
- Saved filters can now be both updated and deleted. (#1207, #1231)
- Added documentation on how to customize incident actions. (#1212)
- Added borders between table rows. (#1253)
- Added column to show combined status (openness+ackedness) as a color, for feature parity with the old frontend incident list.
- Made it possible to delete one or more timerecurrences from a timeslot.
NOTE! Version v1 of the API is hereby deprecated! It will be removed one day. Update your glue services, please. Version v2 is the new stable API.
- Selecting '---' from existing filters now resets the filter parameters. (#1144)
- Simplified the filter select and filter create logic by refreshing the whole view on those operations. (#1251)
- The color of the status badges was changed to better represent either error or success state. The colors are universal across the themes. (#1294)
- Show empty list instead of error if tags do not match any incidents. (#1302)
- Otherwise uncaught exceptions are caught and logged. A less chatty version is shown to end users via messages.error.
- Improved the looks and UX of the timeslots page greatly. There are still remaining issues.
- In the status-badges use the same color for 'open' and 'unacked' and the same for 'closed' and 'acked'.
- It is now possible to add a link to the details page from any cell in the incident list, by using a different wrapper template. See the improved docs for customizing incident list columns.
- Moved notification links into the user menu, and removed the now sole remaining link that redundantly points to the incident list.
- Set default opacity of loading overlay to 50%.
- Several of our easily accessible users didn't like the frequent use of the reddish color as an accent in the "argus" theme, they prefer reserving reddish hues for extra important things. We've cut down on the use of "accent"-color everywhere: in the incidents page we now use the primary color instead, everywhere else we will fall back to the default for the tailwind/daisy class.
- Users are now prohibited user from creating profile with same name as existing one. (#1139)
- Fixed a bug where the update filter modal was shown when trying to delete a given filter. (#1266)
- Moved channels app from base settings to spa settings, where it belongs. The dependency had already been moved, so this avoids an ImportError on new installs. The spa frontend also needs CORS, but due to the complexity of when the middleware needs to be called, the cors app and middleware have not been moved, only the spa-specific setting.
- Add text field to filter incident list by tags (#1044)
- Improved formatting of incident datetimes on the details page by using
<time>-tags, showing duration and end time only for stateful incidents, and showing duration for closed and still open incidents differently.
- There's a new how to for customzing templates.
- Added MAINTAINING.rst so that maintenance tasks do not reside in only a single head.
- The commit messages howto has been updated.
- Move the websockets stuff into the argus.spa directory and turn
argus.spainto an app instead ofargus.ws. This will make it easier to remove spa support.
- Implemented functionality that allows users to create new incident filters, and to select from existing ones via HTMX UI. (#1045)
- Add incident update interval as a preference (#1174)
- Add
HTMX_PATHandHYPERSCRIPT_PATHsetting (#1183)
- Update only the related media list when updating a destination. (#1136)
- Visiting the root page will now lead to be redirected to the /incidents/-page, triggering a login if necessary.
- Django's own templates for form widgets are now overridable
- Profiles page was updated and hopefullt improved thereby.
- There are lots of visual improvements
- More templates can be more easily customized
- Show relevant error message on destination delete by passing the original exception message to the UI. (#1147)
- Do not run database query when importing IncidentFormFilter (#1176)
Mostly changes to the new frontend this time around.
Two development-relevant changes:
- Refactor of incident-specific frontend pages, many files have new names
- How to define a preference has changed
There are visible changes to the destinations-page and profiles page as well.
- Added howto for how to easily toggle the use of django-debug-toolbar with the help of the extra/overriding-apps machinery and an environment variable.
- Centre destination page content. (#1079)
- Add vertical gap between collapse element and create form on HTMX destinations page. (#1080)
-
Streamline definition and usage of preferences (#1072)
-
Only update the related media list when deleting a destination. (#1128)
-
Customizers beware: Major refactor in src/argus/htmx/incident(s) and src/argus/htmx/templates/htmx/incident(s).
- All directories named "incidents" was changed to "incident".
- The templates that defines columns in the incident list was moved to
htmx/incident/cells/. - The template for selecting sources in the filterbox was moved to
htmx/incident/widgets/. - Whenever there were plural view-names or url-names for incident-related views they were made singular.
There will be empty directories left behind,
gitcannot do anything with these. Runmake cleanto delete cached files then find empty directories withfind . -type d -empty. Delete them manually. -
Polished the looks of the profiles page. More to come!
- Fix create destination form generating extra div when submitting. (#1129)
Mostly changes to the alpha frontend
- Added docs for how to vendor a repo (copy one repo into another, preserving history).
- Add HTMX version of the destinations page (#1001)
- Show user an error message in case a htmx partial request fails (#1023)
- Allow extending preferences page (#1070)
- Keep django messages in queue on htmx redirects or refreshes (#1071)
- Replaced the placeholder notification profile page with a very ugly but functional one.
- Replaced the placeholder time-slots page with a very ugly but functional one.
- Added loading indicator to bulk action buttons
- Performance: Reduced the number of queries to preferences db table (#1082)
- Declared argus-theme as one with the light color scheme in order to always have reasonable fallbacks. (#1088)
- Generalized the multiselect dropdown widget used for the source field in the filterbox so that we can use it for other dropdowns on other pages.
- Renamed some directories and templates to give them better, more consistent names.
- Fixed background color in input fields for argus-theme globally. (#1088)
Mostly changes to the alpha frontend
- Add support for multple API tokens per user via django-rest-knox. For that reason, the old API endpoints for dealing with token authentication has been deprecated, and new endpoints have been added to v2 of the API.
- We've copied the linting rules from argus-htmx, so anything that have not been merged yet might have to be updated to keep the linters happy.
- All v1 API endpoints for dealing with phone numbers have been deprecated. Please see the v2 endpoints dealing with destinations instead.
ARGUS_HTMX_FILTER_FUNCTIONcan take a callable or a dotted function path (#1029)- Support incident filtering from incident list table columns
- Return user to login page on unauthenticated HTMx request
- Automatically close certain notification toasts
- Keep column filters when autoreloading incident list (#1033)
- Fix incorrect width specifier in column filter input (#1065)
This version marks the inclusion of our new, alpha web frontend. It does not do everything the existing standalone frontend does yet, hence alpha. See docs for how to test.
- We are now linting html with djLint
- Add new (unfinished) app: argus.htmx. Thiis is a new frontend written quite old-style, with HTML enhanced with HTMx. This used to live in its own app (PyPI: argus-htmx-frontend) and repo (https://github.com/Uninett/argus-htmx-frontend/) and is in the process of being completely merged with argus-server. All new issues and PR's should be made towards the argus-server repo. Unfinished branches and issues should be moved over here. PR's merged after the move will be moved by us.
- Added a short howto on how to try to fix a broken migration. Remember, it is always less stress to restore a backup!
- We're switching from black to ruff, and will both lint and format code going forward.
- Use tox version 4 to run test suite
- Added a database model to store user preferences. Remember to migrate!
- Added a new testenv to tox to easily regenerate the ER model. It needs regenerating thanks to the new model.
- Allow deletion in admin of "dormant" users, that is: users that have never created an event or incident. These frequently occur when testing new login methods.
- Logout via the React SPA frontend works again, the url has been corrected.
This release is mainly to wrangle dependencies to the in-progress new frontend.
- There's more detail on how to set up federated logins in the docs.
- Make
AUTHENTICATION_BACKENDSsetting mutable by making it a list, not a tuple.
- Do not run processes as
rootin Docker production container (#921)
- Make it easier to use the new HTMx-based frontend, with docs. The new frontend cannot be run simultaneously with the REACT SPA frontend as some settings conflict.
- There's a new courtesy method on the User-model:
is_member_of_group().
-
Switched to running docker image on python 3.10 and postgres v14. (#908)
-
Make it possible to change any setting via the (EXTRA|OVERRIDING)_APPS-machinery.
-
Split out all the hard coded support for the REACT SPA frontend into a library.
In the process, the following renames were done:
ARGUS_COOKIE_DOMAIN->ARGUS_SPA_COOKIE_DOMAIN(environment variable)COOKIE_DOMAIN->SPA_COOKIE_DOMAIN(setting)ARGUS_TOKEN_COOKIE_NAME->ARGUS_SPA_TOKEN_COOKIE_NAME(hidden setting)
How to deploy with support for this frontend has also changed, see the new documentation section "REACT Frontend". In short, it is necessary to change which settings-file to base the deployment on.
This is the first version of Argus to be able to run on Django 5.1.
Support for Python 3.8 has been dropped.
The most visible changes are in the documentation.
- As part of refactoring some authentication utility functions the function
get_psa_authentication_names()has been removed as it wasn't used anywhere in Argus proper.
- Added a new section "Customization" to the docs, for customizations that go beyond integrations.
- Documented how to use (EXTRA|OVERRIDING)_APPS to add app-specific middleware.
- There's a new howto, for how to regenerate the ER diagram in the docs.
- So. Many. Refactors.
- There should be fewer warnings/log messages when visiting the autogenerated OpenAPI. There is one commit per change to help with future wrangling. There are still some warnings left; getting rid of those is left as an exercise to the reader.
- The favicon and template for the simple page generated on "/" are now replacable by adding an app at the start of INSTALLED_APPS that has the new files.
- Plenty of dependencies and sub-dependencies were upgraded
- Django ValidationErrors are converted to DRF ValidationErrors. This makes it possible to move some validation from API model serializers to the actual model, which means validating only once and the API and future Django frontend seeing the same errors.
- Moved reference docs into their own section (as per Diátaxis), improved the looks and contents of the explanation and terms, and added a very brief explanation of each model.
- Moved site TEMPLATES and STATIC to a mini-app to make them replaceable via an app added before it in INSTALLED_APPS.
- Removed
FilterSerializerandvalidate_jsonfilterfrom the filter plugin mechanism since they just wrapFilterBlobSerializer. (This also meansFilterBlobSerializercan no longer be in the same file asFilterSerializer.)
- Fix OpenAPI parameters for
incidents/andincidents/mine/
- Add method to get associated names of Incident levels (#875)
- Refactored ticket creation code so the actual changing of the incident happens only in one place. Also moved the actual autocreation magic to utility functions (sans error-handling since that is response-type dependent). Made bulk changes of tickets actually create the ChangeEvents so that it behaves like other bulk actions and make it possible to get notified of changed ticket urls.
- Replace the setting
STATICFILES_STORAGEwithSTORAGESto prepare for running on newer Djangos. See NOTES for details.
- Hopefully there will be fewer spurious test-failures thanks to explicitly creating the user connected to a sourcesystem. UniqueError, you won't be missd.
- Fixed broken link to dataporten authentication docs in README (#broken-dataporten-link)
- Renamed 'docker-compose' to 'Docker Compose' in README (#update-readme-command-naming)
- Make description editable (#811)
INCIDENT_LEVEL_CHOICESwas behaving oddly when debugging so it has been made a proper immutable constant.
- Added method to check whether incident is acknowledged by a specific user group. (#838)
- Made it possible to replace how Argus does filtering (for sending notifications and showing a list of incidents). See the howto "How to customize filtering".
OVERRIDING_APPSandEXTRA_APPSnow supports changing the MIDDLEWARE-setting. The key is "middleware" and the value is a dictionary of the dotted path of the middleware as the key, and an action as the value. Currently only the actions "start" and "end" is supported, putting the middleware at either the start of the list or the end, depending.
BIG filter refactor/cleanup. All filter-stuff except the Filter-model has been moved to a new app, argus.filter
- Move
Filter.filtered_incidentstoargus.filter.queryset_filters.QuerySetFilter- Change the signature so that it works on a filterblob, not a Filter model instance
- Ensure that the fallback filter, which is only relevant when sending notifications, is ignored everywhere else. First step in getting rid of this misfeature of a setting.
- Get rid of
NotificationProfile.filtered_incidents, instead useargus.filter.queryset_filters.QuerySetFilter.incidents_by_notificationprofile - Move Filter-dependent methods out of incident/models.py
- Move filter settings check to argus.filter
- Keep OpenAPI queryparam descriptions with their filters in argus.filter.filters
- Update and improve tests
- Move Filter
*_fitsmethods to argus.filter.filterwrapper.FilterWrapper - Move NotificationProfile
*_fitsmethods to ComplexFilterWrapper - Add docstring to argus.filter.filter
- Simplify/DRY existing filterwrapper methods, including tristate
- Removed one cause for spurious failures of tests
- Show infinite
end_timeas 'Still open' instead of datetime representation in email (#793) - Temporarily hide DestinationConfig from User admin in order to allow updating Users again. Undo if Django starts allowing JSONFields in UniqueConstraints. (#822)
- Improve
/incidentendpoint response time by roughly 36% by pre-fetching incident tag data (#837)
- There is now a commented line in
argus.site.urls.urlpatternsthat if uncommented will allow logging into the API with username/password. This allows the use of the DRF HTML api to change records. This partially works with django-debug-toolbar and should ease some debugging sessions.
- Optimized PUT/PATCH of incidents in API v2. Mainly by no longer replacing
Incident.search_texton every Incident save, thereby avoiding looking up all events for that incident. The old behavior was fine when there was only a handful of events per incident but we can no longer assume that.
- Fixed bug preventing naive printing of TimeRecurrences, triggering a traceback
Backwards-incompatible change: Because it is now possible to filter on multiple event types instead of just one, both API V1 and API V2 has changed its schema for Filter.filter. See NOTES.md for details.
- Removed
"event_type"from the V1 Filter API, it should only have been available in V2 (since it was new) and it has never been in use by the frontend. (#699)
- Add filtering of events by a list of event types (#699)
- Add howto about how to set up and test federated login, using GitHub as an example. (#803)
- Extend the usefulness of
OVERRIDE_APPSandEXTRA_APPSby adding support for Django template engine context processors. Any context processors are added to the end of the list. (#810)
- Change how the description of a change event is formatted so that it is always consistent (not to mention DRY). (#809)
- New in the API: Allow sources to delete their own incidents, as well as allow superusers to delete any incident. (#804)
- Allow replacing Incident.metadata with another json blob via API, no questions asked, nothing to see here. (#807)
- Add a possibility to filter incidents by start time in incident admin list (#739)
- Added an optional JSONField "metadata" to incident. This can be used for any additional info the glue-service would like to store on the incident that needs more structure than tags. The field has been added to the V2 IncidentSerializer but we do not plan to expose it in the frontend.
- Added documentation on how to safely test notifications.
- Added simple support for pluggable django-apps. The setting
OVERRIDING_APPSis loaded first inINSTALLED_APPSandurls.py, and can override templates and views. The settingEXTRA_APPSis safer, it is loaded last inINSTALLED_APPSandurls.pyand can therefore only add additional templates and views.
- When editing a notification profile in the admin UI, only the profile owner's own filters are now listed as available for selection. (#735)
- Linked up the second column in the admin incident list to the details view in addition to the default first column because the first column is currently an optional field. If the field has no value there can also not be a link.
- Update the release checklist in
docs/to current practices and turn it into a howto.
- Show fully qualified details URL in emails (#744)
- Fix internal server error in timeslot admin due to removed method (#797)
- Added development dependency on django-debug-toolbar to make it easy to use.
- Adds more capability to the stresstest command, including incident creation verification, bulk ACKing and timeout configuration. (#641)
- Add possibility to set fields when creating fake incidents in Django admin (#669)
- Show user and filter by user in notification profile admin (#734)
- Add cli command to toggle notification profile activation (#747)
- Add admin action to change activation of profiles (#748)
- Add API documentation for GET responses (#752)
- Added an informational page on /, with favicon, in order to cut down on some common 404 log messages and set up the static files system properly.
- Switched official Docker image to serve using gunicorn+uvicorn (#766)
- Changed how tristates (open, acked, stateful) are logged in order to improve debuggability.
- Return False and log if sms-to-email has trouble with the email server.
- To improve debugability: Change how sending notifications are logged so that there's a log both when sending succeds and when it fails.
- Changed references to docs for Django 4.2 (#746)
- Do not allow used destinations to be deleted (#753)
- Fix typo in admin that prevented sorting on incident id
Due to the removal of the django-multiselectfield dependency it is vitally important to upgrade to this version after correctly having upgraded to 1.14.3 (the previous version).
Be sure to migrate the database:
$ python manage.py migrateThis version supports Django 4.2 and newer.
- Drop all support for Django 3.2. No version-specific requirements for 3.2 are included anymore, and we no longer test on 3.2.
- Remove django-multiselectfield dependency (#707)
This release changes the database in order to get rid of a dead dependency, make sure to run migrations.
This version can run on Django 5.0 if necessary. Install the dependencies in
requirements-django50.txt if so.
This is the last version that supports Django 3.2.
-
Add filtering of incident list by notificationprofile
This returns all incidents that are included in filters that are connected to that notificationprofile
-
Added support for running and testing on Django 5.0
- Change TimeRecurrence.days from MultiSelectField to ArrayField (#707)
- Updated lots of depenendcies in order to run on Django 5.0
This version can run on Django 4.2. In production, ensure that the list of
entries in CSRF_TRUSTED_ORIGINS are absolute urls, all starting with
https://.
-
Add filtering of incident list by filter
This returns all incidents that are included in the filter (#244)
-
Allow running and testing on Python 3.12
-
Added towncrier to automatically produce changelog
-
Add two development dependencies
While
toxdoesn't need to be in the venv, it DOES currently need to be less than version 4.buildis useful for debugging pip errors and pip-compile trouble. Whenever pip-compile (viatox -e upgrade-depsfor instance) fails withBackend subprocess exited when trying to invoke get_requires_for_build_wheel Failed to parse /PATH/pyproject.tomlrun
python -m build -wto see whatbuildis actually complaining about.See also pypa/build#553
-
Add the "admin_url" field to the user serializer. This is so that the frontend can show a link to the Django admin.
-
Added the possibility to filter incident by a given list of ids
- Fixed posting/updating notification profiles without name
- Updated a lot of (sub)dependencies to allow running on newer pythons and newer Djangos, and to quiet dependency bots
- Restructured documentation about integrations
Incomplete changelog.
Due to a change in the signature of NotificationPlugin.send(), 3rd party
plugins will need to mark better which versions of argus-server they work with
in their dependencies-list. The old-style plugins work on 1.9-1.13.
- Add the "installed" field to the media serializer. This is so that the frontend can detect media used that is no longer installed on the backend.
- Ensure the right notifications go to the right destinations when sending many of each.
- Change the signature of the notification-plugin
send-method to avoid passing in the database - Log profile owners name when checking profiles
- Constrain subdependencies in a better way
- Send one email per email-address so as to not leak who else gets that email.
- Remove the
Filter.filter_string-field from the database. We're not using it anymore and shouldn't ever use it by accident either.
Works with argus-frontend 1.11 and newer.
- Lint for critical problems before testing in Github CI, to speed things up
- Added config-file for building docs at readthedocs
- Add inline destinations to user edit page in admin
- Add management command for listing filters
- Add management command for bulk acting on incidents matching a given filter
- Raise validation error on posting incident with tags without tag key
-
Update Django patch versions and various dependencies
-
Drop support for Python 3.7. Github's CI/CD was sufficiently different from testing on local (different setuptools-version used maybe?) that we had a "fun" goose chase finding and upgrading the sub-dependency that broke the build.
-
Remove all remaining uses of
Filter.filter_string, replace with Filter.filter, in preparation of removing the actualfilter_stringfield from the database.The API v1 still accepts
filter_stringbut it is optional. It will prefer the data infilter. v2 ignores the presence or absence offilter_stringentirely.
- Ensure that the start event is created after the incident has its tags so that notification filters with tags trigger correctly. The signal that creates the first event is gone, but the signal that triggers on creation of the first event is not, that will have to wait until we utilize a queue.
- Change what is logged on notification sending in order to ease solving problems in production
- When sending a notification in production a typo lead to an exception that prevented sending the notification but was otherwise hidden from the end user.
- Typo in code (that could have been found by flake8) lead to acks not working when notifications are turned on
- More tests. Lots.
- Add docs for how to write a notification plugin
- Add a new command "stresstest", for stress-testing the API
- Start a process for revealing to the frontend which media plugins are actually installed
- Log a warning if a medium in the Media-table does not have a plugin installed
- Mention cookiecutter-template for tickets in the ticket docs
- Support running on Django 4.2
- Documented how to use email to send notifications to Slack
- Make the auth-method endpoint also show that username/password is supported
- In ticket-automation, show which fields were configured but not found in the generated ticket
- Lots of formatting-bugaboos in the docs
- Allow updating of a timeslot with an empty time recurrence list, which results in all time recurrences to be removed from the timeslot
- Optimize and refactor bulk api operations
- Change how media plugins are accessed in order to avoid/control some exceptions
- Start the process of getting rid of
Filter.filter_stringby ensuring the info infilter_stringis also inFilter.filter - Correct some api examples in docs
- Only fork a new process to send notifications if there are any notifications to send
- Upgrade lots of dependencies
- Support explicit timestamp in
Incident.set_open/set_closed - Change how parameter names to SerializerMethodFields are set up
- Improved ticket docs
- Fixed typos
- Simplify generation of frozen dependency list: trust pyproject.toml
- Coverage of the notificationprofile app was improved with several new tests
- CORS-headers do not want explicit port numbers if the ports are the default
for their type, that is: 80 for http or 443 for https. This lead to CORS not
working if there was an explicit port in the
ARGUS_FRONTEND_URLsetting, which used to generate a CORS entry for the frontend. Such port numbers are now stripped when generating the CORS header.
With this version, the API for bulk changes of incidents and sending of notifications to new and interesting destinations via destination plugins has been frozen, and should be ready for use, completing what was started in 1.10.
- Add default HTML template for autocreated tickets
- Also include frontend-url to incident in incident-serializer
- Output XML test-reports and set up github actions for it
- Show installed plugins in the metadata view
- Fix API for adding events in bulk, with tests
- Fix API for bulk acking, with tests
- Improved OpenAPI by adding some more docstrings
- Updated version of github-actions actions
- Use better exceptions for ticket plugins
- Change how/where change-events are created
- Move tests for included destinations to individual files
- Renamed the ticket creation endpoint via plugin from
/ticket/to/automatic-ticket/ - Refactored the view tests for NotificationProfile
- Explicitly set language in sphinx conf, silencing a warning
- Added support for testing on Python 3.11 and Django 4.0, 4.1
- Plugin system for ticket system integrations, documented in the new "Ticket system settings" sections.
- Add a production-oriented Dockerfile and use Github to build and store images
- New API endpoint to create a new ticket in an external ticket system
- Add docs about notification plugins
- Added the possibility to filter notifications by event-type
- Added a management command that will create incidents if a source token is close to expiring
- Added an endpoint to set
ticket_urlof incidents in bulk - Added an endpoint to create events for incidents in bulk
- Changed when the Media-table is synced with settings
MEDIA_PLUGINSto avoid dev/prod-settings leaking into the tests
- Flatten the json structure for posting acknowledgements.
- Improve Sonar Cloud settings, like just testing for Python 3
- Add test for updating phone number in V1
- Add test for posting tag with invalid key
- Added an endpoint to acknowledge incidents in bulk
- Added an endpoint to get a refreshed auth token.
- Add a filter to find incidents with a duration longer than a given amount of minutes.
- Added tests for previously untested incident endpoints
- A Makefile that cleans away generated files
- Validate that user doesn't have destination with same settings before creating/updating destination
- Properly catch tag validtion errors
- The FilterFactory no longer leads to random UniqueViolations on testing
- Fix typo that prevented SMS messages from being sent.
- A notification profile can now have a name.
- Docstrings and type hints to functions of media plugins.
- Added tests for the email and sms destination serializer in case of invalid input for updating.
- Added tests for the incident, event and tag serializer
- Added endpoint that returns True if another user has a destination with the same medium and settings as the destination with the given primary key
- Add tests for filtering on stateful/statelss and open/closed incients.
- Add SMSNotification plugin to MEDIA_PLUGINS in development settings.
- Fix a notification profile test to include the phone number changes.
- Broken links and formatting in documentation.
- Fix notification profile serializer test to actually change phone number when updating.
- Make code snippets visible in release checklist in documentation.
- Validate tags before adding them to an incident
- Disallow the use of
argusas username when creating admin user via theinitial_setupscript.
- One timeslot can now be used by multiple notification profiles.
- Replaced wildcard imports with specific imports.
- Moved the notification profile Github test to parent folder and added regression tag.
- Renamed notification profile serializer tests to be more descriptive and added integration test tags.
- Improve query in notification profile signal test and add clarifying comment.
- Ran black again on whole code base.
- In media plugins rename the function
is_deletabletoraise_if_not_deletableand make it raise an error if a destination is not deletable. - Split up and rename notification profile model tests
- Upgrade from pyjwt 2.0.1 to 2.4.0
- Upgrade from django 3.2.13 to 3.2.15
- Upgrade from black 20.8b1 to 22.3.0 in pre-commit
- Clean away database tables rendered unnecessary due to changes in 1.6.0
- Modernize packaging. Package-building is all in pyproject.toml, tools are
- Clean away database tables rendered unnecessary due to changes in 1.6.0
- Modernize packaging. Package-building is all in pyproject.toml, tools are configured either there or in tox.ini.
- Add endpoint for getting all events.
- Add support for multiple emails and phone numbers per user.
- Allow source systems to post acknowledgements.
- Added clearer directions to the Argus documentation in the README.
- Rename the
media_v1key in the notificationprofile endpoint back tomedia, as changing it tomedia_v1broke the frontend. - Fix a notification profile test running duplicate asserts against one filter instead of actually testing the other defined filters.
- Use more factories for notificationprofile tests.
- Acknowledging incidents works again, thanks to a workaround.
- Github actions: Add support for SonarQube (for Géant) and prevent CodeCov on 3rd party forks
- Add feature for searching through incident and event descriptions.
- Support external authentication via REMOTE_USER environment variable.
- Replace references to Uninett with Sikt.
- Upgrade from django 3.2.12 to 3.2.13
- Add new API endpoint for listing all login endpoints.
- Add new event type "LES" for stateless events.
- Add debugging endpoint to incident API for counting results of a filter.
- Allow changing level via incident endpoint
- Make initial events for stateless incidents be of type "LES" instead of "STA".
- Update README documentation for using create_fake_incident.
- Allow any length for event type keys instead of limiting it to a lenght of 3.
- Ensure unique source for incidents in incident queryset tests.
- Remove unsupported authentication backend.
- Add support for python 3.10.
- Upgrade from django 3.2.11 to 3.2.12.
- Stop NotificationProfileViewV1 from appearing in API v2.
- Fix signatures for ListFields.
- Force djangorestframework dependency to be older than 3.13.