From 301a0cb83d38d3e4b89aad9fe044059324dc03c0 Mon Sep 17 00:00:00 2001 From: Kevin Heyer Date: Fri, 19 Sep 2025 11:05:21 +0200 Subject: [PATCH] Add Risks by Status to Dashboard --- locale/de/LC_MESSAGES/django.mo | Bin 11920 -> 11760 bytes locale/de/LC_MESSAGES/django.po | 134 ++++++++++++++++-------------- locale/en/LC_MESSAGES/django.po | 114 +++++++++++++------------ risks/templatetags/risk_extras.py | 4 + risks/views.py | 4 +- templates/risks/dashboard.html | 130 ++++++++++++++++++----------- 6 files changed, 216 insertions(+), 170 deletions(-) diff --git a/locale/de/LC_MESSAGES/django.mo b/locale/de/LC_MESSAGES/django.mo index 543bf48fa340a7a99d81ef7d3b58ebb327fe7295..830a62216cfa664d2cc1851e5ac09446e80d3dba 100644 GIT binary patch delta 4282 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 diff --git a/locale/de/LC_MESSAGES/django.po b/locale/de/LC_MESSAGES/django.po index bc0ede0..7f1d4d4 100644 --- a/locale/de/LC_MESSAGES/django.po +++ b/locale/de/LC_MESSAGES/django.po @@ -2,7 +2,7 @@ msgid "" msgstr "" "Project-Id-Version: wira-risk-management\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-09-16 14:08+0200\n" +"POT-Creation-Date: 2025-09-19 11:02+0200\n" "PO-Revision-Date: 2025-09-09 13:45+0200\n" "Last-Translator: Kevin Heyer \n" "Language-Team: German\n" @@ -49,7 +49,7 @@ msgid "Users" msgstr "Benutzer" #: risks/admin.py:166 risks/models.py:370 templates/risks/item_control.html:96 -#: templates/risks/item_incident.html:88 templates/risks/item_risk.html:245 +#: templates/risks/item_incident.html:88 templates/risks/item_risk.html:260 msgid "User" msgstr "Benutzer" @@ -114,10 +114,11 @@ msgid "Risk Management" msgstr "Risikomanagement" #: risks/forms.py:13 risks/models.py:87 templates/risks/dashboard.html:83 -#: templates/risks/dashboard.html:108 templates/risks/item_control.html:35 -#: templates/risks/item_incident.html:36 templates/risks/item_risk.html:51 -#: templates/risks/item_risk.html:189 templates/risks/item_risk.html:219 -#: templates/risks/list_controls.html:48 templates/risks/list_controls.html:100 +#: templates/risks/dashboard.html:108 templates/risks/dashboard.html:133 +#: templates/risks/item_control.html:35 templates/risks/item_incident.html:36 +#: templates/risks/item_risk.html:54 templates/risks/item_risk.html:204 +#: templates/risks/item_risk.html:234 templates/risks/list_controls.html:48 +#: templates/risks/list_controls.html:100 #: templates/risks/list_incidents.html:48 #: templates/risks/list_incidents.html:99 templates/risks/list_risks.html:128 msgid "Status" @@ -197,7 +198,7 @@ msgid "Availability" msgstr "Verfügbarkeit" #: risks/models.py:78 risks/models.py:201 risks/models.py:270 -#: templates/risks/item_risk.html:188 +#: templates/risks/item_risk.html:203 msgid "Title" msgstr "Titel" @@ -207,34 +208,34 @@ msgid "Description" msgstr "Beschreibung" #: risks/models.py:80 templates/risks/item_control.html:68 -#: templates/risks/item_incident.html:60 templates/risks/item_risk.html:40 +#: templates/risks/item_incident.html:60 templates/risks/item_risk.html:42 #: templates/risks/list_risks.html:119 msgid "Asset" msgstr "Asset" #: risks/models.py:81 templates/risks/item_control.html:69 -#: templates/risks/item_incident.html:61 templates/risks/item_risk.html:41 +#: templates/risks/item_incident.html:61 templates/risks/item_risk.html:43 #: templates/risks/list_risks.html:125 msgid "Process" msgstr "Prozess" #: risks/models.py:82 templates/risks/item_control.html:67 -#: templates/risks/item_incident.html:59 templates/risks/item_risk.html:42 +#: templates/risks/item_incident.html:59 templates/risks/item_risk.html:44 #: templates/risks/list_risks.html:122 msgid "Category" msgstr "Kategorie" #: risks/models.py:83 templates/risks/item_control.html:46 -#: templates/risks/item_incident.html:39 templates/risks/item_risk.html:55 +#: templates/risks/item_incident.html:39 templates/risks/item_risk.html:70 msgid "Created at" msgstr "Erstellt am" #: risks/models.py:84 templates/risks/item_control.html:47 -#: templates/risks/item_incident.html:40 templates/risks/item_risk.html:56 +#: templates/risks/item_incident.html:40 templates/risks/item_risk.html:71 msgid "Updated at" msgstr "Aktualisiert am" -#: risks/models.py:85 templates/risks/item_risk.html:63 +#: risks/models.py:85 templates/risks/item_risk.html:78 msgid "Effects" msgstr "Auswirkungen" @@ -280,7 +281,7 @@ msgid "Auditlogs" msgstr "Audit-Logs" #: risks/models.py:261 templates/risks/item_incident.html:33 -#: templates/risks/item_risk.html:218 templates/risks/list_incidents.html:97 +#: templates/risks/item_risk.html:233 templates/risks/list_incidents.html:97 msgid "Incident" msgstr "Vorfall" @@ -374,7 +375,7 @@ msgstr "Benutzer gelöscht" msgid "Notification" msgstr "Nachricht" -#: risks/models.py:322 templates/base.html:96 +#: risks/models.py:322 templates/base.html:98 #: templates/risks/notifications.html:4 msgid "Notifications" msgstr "Nachrichten" @@ -409,7 +410,8 @@ msgstr "Sende an alle App-Mitarbeiter" #: risks/models.py:438 msgid "Extra recipients (emails, comma or newline separated)" -msgstr "Zusätzliche Empfänger (E-Mails, durch Komma oder Zeilenumbruch getrennt)" +msgstr "" +"Zusätzliche Empfänger (E-Mails, durch Komma oder Zeilenumbruch getrennt)" #: risks/signals.py:71 #, python-brace-format @@ -457,7 +459,8 @@ msgstr "Maßnahme gelöscht: {t}" #: risks/signals.py:218 #, python-brace-format msgid "Residual review required for risk '{t}' due to control change" -msgstr "Restrisikoprüfung nötig für das Risiko: '{t}', da Maßnahmen geändert wurden" +msgstr "" +"Restrisikoprüfung nötig für das Risiko: '{t}', da Maßnahmen geändert wurden" #: risks/signals.py:245 #, python-brace-format @@ -505,29 +508,23 @@ msgstr "Das Risiko wurde geprüft und als geschlossen markiert" #: risks/views.py:220 msgid "Not all controls are completed. Risk cannot be closed yet." -msgstr "Nicht alle Maßnhamen sind abgeschlossen, das Risiko kann nicht geschlossen werden." +msgstr "" +"Nicht alle Maßnhamen sind abgeschlossen, das Risiko kann nicht geschlossen " +"werden." -#: risks/views.py:378 -msgid "Notification marked as read." -msgstr "Nachricht als gelesen markiert" - -#: risks/views.py:388 -msgid "All notifications marked as read." -msgstr "Alle Benachrichtigungen wurden als gelesen Markiert" - -#: risks/views.py:407 +#: risks/views.py:409 msgid "Risk status updated." msgstr "Risikostatus Aktualisiert" -#: risks/views.py:423 +#: risks/views.py:425 msgid "Control status updated." msgstr "Maßnahmenstatus Aktualisiert" -#: risks/views.py:439 +#: risks/views.py:441 msgid "Incident status updated." msgstr "Vorfallstatus Aktualisiert" -#: risks/views.py:456 +#: risks/views.py:458 msgid "Residual review flag updated." msgstr "Restrisiko geprüft" @@ -549,27 +546,27 @@ msgstr "Risikomatrix" msgid "Risk analysis" msgstr "Risikoanalyse" -#: templates/base.html:91 +#: templates/base.html:93 msgid "AdminCP" msgstr "Adminbereich" -#: templates/base.html:104 +#: templates/base.html:106 msgid "Derk Mode" msgstr "Dark Mode" -#: templates/base.html:110 +#: templates/base.html:112 msgid "Logout" msgstr "Logout" -#: templates/base.html:125 +#: templates/base.html:127 msgid "Login" msgstr "Login" -#: templates/base.html:160 templates/base.html:167 +#: templates/base.html:162 templates/base.html:169 msgid "Light Mode" msgstr "Light Mode" -#: templates/base.html:170 +#: templates/base.html:172 msgid "Dark Mode" msgstr "Dark Mode" @@ -583,7 +580,7 @@ msgstr "Risiken" #: templates/risks/dashboard.html:36 msgid "Residual Risks Needing Review" -msgstr "Restrisiken ohne Verifizierung" +msgstr "Fehlende Restrisiken" #: templates/risks/dashboard.html:44 msgid "Unread Notifications" @@ -594,23 +591,28 @@ msgid "Risks by CIA" msgstr "CIA Risiken" #: templates/risks/dashboard.html:78 -msgid "Controls by Status" -msgstr "Maßnahmen nach Status" +msgid "Risks by Status" +msgstr "Risiken nach Status" #: templates/risks/dashboard.html:84 templates/risks/dashboard.html:109 +#: templates/risks/dashboard.html:134 msgid "Count" msgstr "Anzahl" #: templates/risks/dashboard.html:94 templates/risks/dashboard.html:119 -#: templates/risks/list_risks.html:185 +#: templates/risks/dashboard.html:144 templates/risks/list_risks.html:185 msgid "No data" msgstr "Keine Daten" #: templates/risks/dashboard.html:103 +msgid "Controls by Status" +msgstr "Maßnahmen nach Status" + +#: templates/risks/dashboard.html:128 msgid "Incidents by Status" msgstr "Vorfälle nach Status" -#: templates/risks/dashboard.html:127 +#: templates/risks/dashboard.html:152 msgid "Risk Trend (per Month)" msgstr "Risikotrend (pro Monat)" @@ -637,17 +639,17 @@ msgstr "Maßnahme bearbeiten" msgid "Delete Control" msgstr "Maßnahme löschen" -#: templates/risks/item_control.html:34 templates/risks/item_risk.html:191 +#: templates/risks/item_control.html:34 templates/risks/item_risk.html:206 #: templates/risks/list_controls.html:63 templates/risks/list_controls.html:99 msgid "Responsible" msgstr "Verantwortliche/r" -#: templates/risks/item_control.html:37 templates/risks/item_risk.html:192 +#: templates/risks/item_control.html:37 templates/risks/item_risk.html:207 #: templates/risks/list_controls.html:102 msgid "Link" msgstr "Link" -#: templates/risks/item_control.html:48 templates/risks/item_risk.html:190 +#: templates/risks/item_control.html:48 templates/risks/item_risk.html:205 #: templates/risks/list_controls.html:101 msgid "Deadline" msgstr "Frist" @@ -661,17 +663,17 @@ msgid "No linked risks." msgstr "Keine zugehörigen Risiken" #: templates/risks/item_control.html:95 templates/risks/item_incident.html:87 -#: templates/risks/item_risk.html:244 +#: templates/risks/item_risk.html:259 msgid "Time" msgstr "Zeitpunkt" #: templates/risks/item_control.html:97 templates/risks/item_incident.html:89 -#: templates/risks/item_risk.html:246 +#: templates/risks/item_risk.html:261 msgid "Action" msgstr "Aktion" #: templates/risks/item_control.html:108 templates/risks/item_incident.html:100 -#: templates/risks/item_risk.html:257 +#: templates/risks/item_risk.html:272 msgid "No history found." msgstr "Keine Historie vorhanden" @@ -683,7 +685,7 @@ msgstr "Vorfall bearbeiten" msgid "Delete Incident" msgstr "Vorfall löschen" -#: templates/risks/item_incident.html:35 templates/risks/item_risk.html:220 +#: templates/risks/item_incident.html:35 templates/risks/item_risk.html:235 #: templates/risks/list_incidents.html:100 msgid "Reported on" msgstr "Gemeldet am" @@ -700,67 +702,67 @@ msgstr "Risiko bearbeiten" msgid "Delete Risk" msgstr "Risiko löschen" -#: templates/risks/item_risk.html:26 templates/risks/item_risk.html:27 +#: templates/risks/item_risk.html:27 templates/risks/item_risk.html:28 msgid "Mark Risk as reviewed" msgstr "Risiko als geprüft markieren" -#: templates/risks/item_risk.html:44 +#: templates/risks/item_risk.html:46 msgid "Protection goals" msgstr "Schutzziele" -#: templates/risks/item_risk.html:48 +#: templates/risks/item_risk.html:50 msgid "Not yet assigned" msgstr "Keine Zugewiesenen Ziele" -#: templates/risks/item_risk.html:54 +#: templates/risks/item_risk.html:69 msgid "Risk owner" msgstr "Risikoeigner" -#: templates/risks/item_risk.html:57 +#: templates/risks/item_risk.html:72 msgid "Resubmission" msgstr "Wiedervorlagedatum" -#: templates/risks/item_risk.html:70 +#: templates/risks/item_risk.html:85 msgid "Risk assessment" msgstr "Risikomanagement" -#: templates/risks/item_risk.html:79 +#: templates/risks/item_risk.html:94 msgid "Gross (before measures)" msgstr "Brutto (vor Maßnahmen)" -#: templates/risks/item_risk.html:85 templates/risks/item_risk.html:131 +#: templates/risks/item_risk.html:100 templates/risks/item_risk.html:146 #: templates/risks/risk_matrix.html:21 templates/risks/risk_matrix.html:79 #: templates/risks/risk_matrix.html:121 msgid "Likelihood" msgstr "Eintritt" -#: templates/risks/item_risk.html:94 templates/risks/item_risk.html:140 +#: templates/risks/item_risk.html:109 templates/risks/item_risk.html:155 #: templates/risks/risk_matrix.html:21 templates/risks/risk_matrix.html:79 #: templates/risks/risk_matrix.html:121 msgid "Impact" msgstr "Schaden" -#: templates/risks/item_risk.html:103 templates/risks/item_risk.html:149 +#: templates/risks/item_risk.html:118 templates/risks/item_risk.html:164 msgid "Level" msgstr "Stufe" -#: templates/risks/item_risk.html:112 templates/risks/item_risk.html:158 +#: templates/risks/item_risk.html:127 templates/risks/item_risk.html:173 msgid "Score" msgstr "Score" -#: templates/risks/item_risk.html:125 +#: templates/risks/item_risk.html:140 msgid "Net (after measures)" msgstr "Netto (nach Maßnahmen)" -#: templates/risks/item_risk.html:169 +#: templates/risks/item_risk.html:184 msgid "Add net Risk" msgstr "Restrisiko hinzufügen" -#: templates/risks/item_risk.html:205 +#: templates/risks/item_risk.html:220 msgid "No measures recorded." msgstr "Keine Maßnahmen gefunden." -#: templates/risks/item_risk.html:231 +#: templates/risks/item_risk.html:246 msgid "No incidents recorded." msgstr "Keine Vorfälle gefunden." @@ -862,6 +864,12 @@ msgstr "Brutto" msgid "Net" msgstr "Netto" +#~ msgid "Notification marked as read." +#~ msgstr "Nachricht als gelesen markiert" + +#~ msgid "All notifications marked as read." +#~ msgstr "Alle Benachrichtigungen wurden als gelesen Markiert" + #~ msgid "No net risk recorded yet." #~ msgstr "Kein Restrisiko vergeben" diff --git a/locale/en/LC_MESSAGES/django.po b/locale/en/LC_MESSAGES/django.po index 35fb559..0cc6167 100644 --- a/locale/en/LC_MESSAGES/django.po +++ b/locale/en/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2025-09-16 14:08+0200\n" +"POT-Creation-Date: 2025-09-19 11:02+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -55,7 +55,7 @@ msgid "Users" msgstr "" #: risks/admin.py:166 risks/models.py:370 templates/risks/item_control.html:96 -#: templates/risks/item_incident.html:88 templates/risks/item_risk.html:245 +#: templates/risks/item_incident.html:88 templates/risks/item_risk.html:260 msgid "User" msgstr "" @@ -120,10 +120,11 @@ msgid "Risk Management" msgstr "" #: risks/forms.py:13 risks/models.py:87 templates/risks/dashboard.html:83 -#: templates/risks/dashboard.html:108 templates/risks/item_control.html:35 -#: templates/risks/item_incident.html:36 templates/risks/item_risk.html:51 -#: templates/risks/item_risk.html:189 templates/risks/item_risk.html:219 -#: templates/risks/list_controls.html:48 templates/risks/list_controls.html:100 +#: templates/risks/dashboard.html:108 templates/risks/dashboard.html:133 +#: templates/risks/item_control.html:35 templates/risks/item_incident.html:36 +#: templates/risks/item_risk.html:54 templates/risks/item_risk.html:204 +#: templates/risks/item_risk.html:234 templates/risks/list_controls.html:48 +#: templates/risks/list_controls.html:100 #: templates/risks/list_incidents.html:48 #: templates/risks/list_incidents.html:99 templates/risks/list_risks.html:128 msgid "Status" @@ -203,7 +204,7 @@ msgid "Availability" msgstr "" #: risks/models.py:78 risks/models.py:201 risks/models.py:270 -#: templates/risks/item_risk.html:188 +#: templates/risks/item_risk.html:203 msgid "Title" msgstr "" @@ -213,34 +214,34 @@ msgid "Description" msgstr "" #: risks/models.py:80 templates/risks/item_control.html:68 -#: templates/risks/item_incident.html:60 templates/risks/item_risk.html:40 +#: templates/risks/item_incident.html:60 templates/risks/item_risk.html:42 #: templates/risks/list_risks.html:119 msgid "Asset" msgstr "" #: risks/models.py:81 templates/risks/item_control.html:69 -#: templates/risks/item_incident.html:61 templates/risks/item_risk.html:41 +#: templates/risks/item_incident.html:61 templates/risks/item_risk.html:43 #: templates/risks/list_risks.html:125 msgid "Process" msgstr "" #: risks/models.py:82 templates/risks/item_control.html:67 -#: templates/risks/item_incident.html:59 templates/risks/item_risk.html:42 +#: templates/risks/item_incident.html:59 templates/risks/item_risk.html:44 #: templates/risks/list_risks.html:122 msgid "Category" msgstr "" #: risks/models.py:83 templates/risks/item_control.html:46 -#: templates/risks/item_incident.html:39 templates/risks/item_risk.html:55 +#: templates/risks/item_incident.html:39 templates/risks/item_risk.html:70 msgid "Created at" msgstr "" #: risks/models.py:84 templates/risks/item_control.html:47 -#: templates/risks/item_incident.html:40 templates/risks/item_risk.html:56 +#: templates/risks/item_incident.html:40 templates/risks/item_risk.html:71 msgid "Updated at" msgstr "" -#: risks/models.py:85 templates/risks/item_risk.html:63 +#: risks/models.py:85 templates/risks/item_risk.html:78 msgid "Effects" msgstr "" @@ -286,7 +287,7 @@ msgid "Auditlogs" msgstr "" #: risks/models.py:261 templates/risks/item_incident.html:33 -#: templates/risks/item_risk.html:218 templates/risks/list_incidents.html:97 +#: templates/risks/item_risk.html:233 templates/risks/list_incidents.html:97 msgid "Incident" msgstr "" @@ -380,7 +381,7 @@ msgstr "" msgid "Notification" msgstr "" -#: risks/models.py:322 templates/base.html:96 +#: risks/models.py:322 templates/base.html:98 #: templates/risks/notifications.html:4 msgid "Notifications" msgstr "" @@ -513,27 +514,19 @@ msgstr "" msgid "Not all controls are completed. Risk cannot be closed yet." msgstr "" -#: risks/views.py:378 -msgid "Notification marked as read." -msgstr "" - -#: risks/views.py:388 -msgid "All notifications marked as read." -msgstr "" - -#: risks/views.py:407 +#: risks/views.py:409 msgid "Risk status updated." msgstr "" -#: risks/views.py:423 +#: risks/views.py:425 msgid "Control status updated." msgstr "" -#: risks/views.py:439 +#: risks/views.py:441 msgid "Incident status updated." msgstr "" -#: risks/views.py:456 +#: risks/views.py:458 msgid "Residual review flag updated." msgstr "" @@ -555,27 +548,27 @@ msgstr "" msgid "Risk analysis" msgstr "" -#: templates/base.html:91 +#: templates/base.html:93 msgid "AdminCP" msgstr "" -#: templates/base.html:104 +#: templates/base.html:106 msgid "Derk Mode" msgstr "" -#: templates/base.html:110 +#: templates/base.html:112 msgid "Logout" msgstr "" -#: templates/base.html:125 +#: templates/base.html:127 msgid "Login" msgstr "" -#: templates/base.html:160 templates/base.html:167 +#: templates/base.html:162 templates/base.html:169 msgid "Light Mode" msgstr "" -#: templates/base.html:170 +#: templates/base.html:172 msgid "Dark Mode" msgstr "" @@ -600,23 +593,28 @@ msgid "Risks by CIA" msgstr "" #: templates/risks/dashboard.html:78 -msgid "Controls by Status" +msgid "Risks by Status" msgstr "" #: templates/risks/dashboard.html:84 templates/risks/dashboard.html:109 +#: templates/risks/dashboard.html:134 msgid "Count" msgstr "" #: templates/risks/dashboard.html:94 templates/risks/dashboard.html:119 -#: templates/risks/list_risks.html:185 +#: templates/risks/dashboard.html:144 templates/risks/list_risks.html:185 msgid "No data" msgstr "" #: templates/risks/dashboard.html:103 +msgid "Controls by Status" +msgstr "" + +#: templates/risks/dashboard.html:128 msgid "Incidents by Status" msgstr "" -#: templates/risks/dashboard.html:127 +#: templates/risks/dashboard.html:152 msgid "Risk Trend (per Month)" msgstr "" @@ -643,17 +641,17 @@ msgstr "" msgid "Delete Control" msgstr "" -#: templates/risks/item_control.html:34 templates/risks/item_risk.html:191 +#: templates/risks/item_control.html:34 templates/risks/item_risk.html:206 #: templates/risks/list_controls.html:63 templates/risks/list_controls.html:99 msgid "Responsible" msgstr "" -#: templates/risks/item_control.html:37 templates/risks/item_risk.html:192 +#: templates/risks/item_control.html:37 templates/risks/item_risk.html:207 #: templates/risks/list_controls.html:102 msgid "Link" msgstr "" -#: templates/risks/item_control.html:48 templates/risks/item_risk.html:190 +#: templates/risks/item_control.html:48 templates/risks/item_risk.html:205 #: templates/risks/list_controls.html:101 msgid "Deadline" msgstr "" @@ -667,17 +665,17 @@ msgid "No linked risks." msgstr "" #: templates/risks/item_control.html:95 templates/risks/item_incident.html:87 -#: templates/risks/item_risk.html:244 +#: templates/risks/item_risk.html:259 msgid "Time" msgstr "" #: templates/risks/item_control.html:97 templates/risks/item_incident.html:89 -#: templates/risks/item_risk.html:246 +#: templates/risks/item_risk.html:261 msgid "Action" msgstr "" #: templates/risks/item_control.html:108 templates/risks/item_incident.html:100 -#: templates/risks/item_risk.html:257 +#: templates/risks/item_risk.html:272 msgid "No history found." msgstr "" @@ -689,7 +687,7 @@ msgstr "" msgid "Delete Incident" msgstr "" -#: templates/risks/item_incident.html:35 templates/risks/item_risk.html:220 +#: templates/risks/item_incident.html:35 templates/risks/item_risk.html:235 #: templates/risks/list_incidents.html:100 msgid "Reported on" msgstr "" @@ -706,67 +704,67 @@ msgstr "" msgid "Delete Risk" msgstr "" -#: templates/risks/item_risk.html:26 templates/risks/item_risk.html:27 +#: templates/risks/item_risk.html:27 templates/risks/item_risk.html:28 msgid "Mark Risk as reviewed" msgstr "" -#: templates/risks/item_risk.html:44 +#: templates/risks/item_risk.html:46 msgid "Protection goals" msgstr "" -#: templates/risks/item_risk.html:48 +#: templates/risks/item_risk.html:50 msgid "Not yet assigned" msgstr "" -#: templates/risks/item_risk.html:54 +#: templates/risks/item_risk.html:69 msgid "Risk owner" msgstr "" -#: templates/risks/item_risk.html:57 +#: templates/risks/item_risk.html:72 msgid "Resubmission" msgstr "" -#: templates/risks/item_risk.html:70 +#: templates/risks/item_risk.html:85 msgid "Risk assessment" msgstr "" -#: templates/risks/item_risk.html:79 +#: templates/risks/item_risk.html:94 msgid "Gross (before measures)" msgstr "" -#: templates/risks/item_risk.html:85 templates/risks/item_risk.html:131 +#: templates/risks/item_risk.html:100 templates/risks/item_risk.html:146 #: templates/risks/risk_matrix.html:21 templates/risks/risk_matrix.html:79 #: templates/risks/risk_matrix.html:121 msgid "Likelihood" msgstr "" -#: templates/risks/item_risk.html:94 templates/risks/item_risk.html:140 +#: templates/risks/item_risk.html:109 templates/risks/item_risk.html:155 #: templates/risks/risk_matrix.html:21 templates/risks/risk_matrix.html:79 #: templates/risks/risk_matrix.html:121 msgid "Impact" msgstr "" -#: templates/risks/item_risk.html:103 templates/risks/item_risk.html:149 +#: templates/risks/item_risk.html:118 templates/risks/item_risk.html:164 msgid "Level" msgstr "" -#: templates/risks/item_risk.html:112 templates/risks/item_risk.html:158 +#: templates/risks/item_risk.html:127 templates/risks/item_risk.html:173 msgid "Score" msgstr "" -#: templates/risks/item_risk.html:125 +#: templates/risks/item_risk.html:140 msgid "Net (after measures)" msgstr "" -#: templates/risks/item_risk.html:169 +#: templates/risks/item_risk.html:184 msgid "Add net Risk" msgstr "" -#: templates/risks/item_risk.html:205 +#: templates/risks/item_risk.html:220 msgid "No measures recorded." msgstr "" -#: templates/risks/item_risk.html:231 +#: templates/risks/item_risk.html:246 msgid "No incidents recorded." msgstr "" diff --git a/risks/templatetags/risk_extras.py b/risks/templatetags/risk_extras.py index 79dc5ec..872ce70 100644 --- a/risks/templatetags/risk_extras.py +++ b/risks/templatetags/risk_extras.py @@ -4,6 +4,7 @@ from ..models import Control, Incident, Risk register = template.Library() +_RISK_STATUS_MAP = dict(Risk.STATUS_CHOICES) _CONTROL_STATUS_MAP = dict(Control.STATUS_CHOICES) _INCIDENT_STATUS_MAP = dict(Incident.STATUS_CHOICES) _LIKELIHOOD_LABELS = dict(Risk.LIKELIHOOD_CHOICES) @@ -75,6 +76,9 @@ def impact_id_label(val): short = _short(str(label)) if label else "" return format_html("{} ({})", i, short) if label else format_html("{}", i) +@register.filter +def risk_status_label(code): + return _RISK_STATUS_MAP.get(code, code) @register.filter def control_status_label(code): diff --git a/risks/views.py b/risks/views.py index 60e615f..1c1b862 100644 --- a/risks/views.py +++ b/risks/views.py @@ -314,7 +314,8 @@ def dashboard(request): # Residual Risks residual_review_required = ResidualRisk.objects.filter(review_required=True).count() - # Controls & Incidents + # Risks, Controls & Incidents + risks_by_status = Risk.objects.values("status").annotate(count=Count("id")) controls_by_status = Control.objects.values("status").annotate(count=Count("id")) incidents_status = Incident.objects.values("status").annotate(count=Count("id")) @@ -344,6 +345,7 @@ def dashboard(request): "risks_by_level": risks_by_level, "risks_by_cia": dict(cia_counter), "residual_review_required": residual_review_required, + "risks_by_status": risks_by_status, "controls_by_status": controls_by_status, "incidents_status": incidents_status, "notifications_unread": notifications_unread, diff --git a/templates/risks/dashboard.html b/templates/risks/dashboard.html index d9bd70f..6220700 100644 --- a/templates/risks/dashboard.html +++ b/templates/risks/dashboard.html @@ -73,55 +73,89 @@ - -
-

{% trans "Controls by Status" %}

-
- - - - - - - - - {% for row in controls_by_status %} - - - - - {% empty %} - - {% endfor %} - -
{% trans "Status" %}{% trans "Count" %}
{{ row.status|control_status_label }}{{ row.count }}
{% trans "No data" %}
-
-
+
+ +
+
+

{% trans "Risks by Status" %}

+
+ + + + + + + + + {% for row in risks_by_status %} + + + + + {% empty %} + + {% endfor %} + +
{% trans "Status" %}{% trans "Count" %}
{{ row.status|risk_status_label }}{{ row.count }}
{% trans "No data" %}
+
+
+
- -
-

{% trans "Incidents by Status" %}

-
- - - - - - - - - {% for row in incidents_status %} - - - - - {% empty %} - - {% endfor %} - -
{% trans "Status" %}{% trans "Count" %}
{{ row.status|incident_status_label }}{{ row.count }}
{% trans "No data" %}
-
-
+ +
+
+

{% trans "Controls by Status" %}

+
+ + + + + + + + + {% for row in controls_by_status %} + + + + + {% empty %} + + {% endfor %} + +
{% trans "Status" %}{% trans "Count" %}
{{ row.status|control_status_label }}{{ row.count }}
{% trans "No data" %}
+
+
+
+ + +
+
+

{% trans "Incidents by Status" %}

+
+ + + + + + + + + {% for row in incidents_status %} + + + + + {% empty %} + + {% endfor %} + +
{% trans "Status" %}{% trans "Count" %}
{{ row.status|incident_status_label }}{{ row.count }}
{% trans "No data" %}
+
+
+
+ +

{% trans "Risk Trend (per Month)" %}