Skip to content

Commit

Permalink
Add the possibility to draft a risk acceptance (#1285)
Browse files Browse the repository at this point in the history
* feat: begin to add possibility to draft risk acceptances

This is not finished yet, some little things remain to be done.

* dynamic translations

* fix: better ui + possibility to switch draft and submitted states

* fix: removed backend translations

* fix: add possibility to remove the defined approver

* fix(api): prevent non-approvers to reject/revoke/accept

* fix(UI): tooltip instead of text for approver missing

* fix: coderabbits reviews

---------

Co-authored-by: Mohamed-Hacene <[email protected]>
  • Loading branch information
Axxiar and Mohamed-Hacene authored Feb 3, 2025
1 parent ecfcc44 commit b83fa07
Show file tree
Hide file tree
Showing 20 changed files with 179 additions and 43 deletions.
10 changes: 5 additions & 5 deletions backend/core/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3464,11 +3464,11 @@ def save(self, *args, **kwargs) -> None:

class RiskAcceptance(NameDescriptionMixin, FolderMixin, PublishInRootFolderMixin):
ACCEPTANCE_STATE = [
("created", _("Created")),
("submitted", _("Submitted")),
("accepted", _("Accepted")),
("rejected", _("Rejected")),
("revoked", _("Revoked")),
("created", "Created"),
("submitted", "Submitted"),
("accepted", "Accepted"),
("rejected", "Rejected"),
("revoked", "Revoked"),
]

risk_scenarios = models.ManyToManyField(
Expand Down
41 changes: 27 additions & 14 deletions backend/core/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -1712,6 +1712,22 @@ def to_review(self, request):

return Response({"results": acceptances})

@action(detail=True, methods=["post"], name="Submit risk acceptance")
def submit(self, request, pk):
if self.get_object().approver:
self.get_object().set_state("submitted")
return Response({"results": "state updated to submitted"})
else:
return Response(
{"error": "Missing 'approver' field"}, status=status.HTTP_403_FORBIDDEN
)

# This set back risk acceptance to "Created"
@action(detail=True, methods=["post"], name="Draft risk acceptance")
def draft(self, request, pk):
self.get_object().set_state("created")
return Response({"results": "state updated back to created"})

@action(detail=True, methods=["post"], name="Accept risk acceptance")
def accept(self, request, pk):
if request.user != self.get_object().approver:
Expand Down Expand Up @@ -1761,23 +1777,20 @@ def waiting(self, request):
).count()
return Response({"count": acceptance_count})

def perform_create(self, serializer):
def perform_update(self, serializer):
risk_acceptance = serializer.validated_data
submitted = False

if risk_acceptance.get("approver"):
submitted = True
for scenario in risk_acceptance.get("risk_scenarios"):
if not RoleAssignment.is_access_allowed(
risk_acceptance.get("approver"),
Permission.objects.get(codename="approve_riskacceptance"),
scenario.risk_assessment.project.folder,
):
raise ValidationError(
"The approver is not allowed to approve this risk acceptance"
)
for scenario in risk_acceptance.get("risk_scenarios"):
if not RoleAssignment.is_access_allowed(
risk_acceptance.get("approver"),
Permission.objects.get(codename="approve_riskacceptance"),
scenario.risk_assessment.project.folder,
):
raise ValidationError(
"The approver is not allowed to approve this risk acceptance"
)
risk_acceptance = serializer.save()
if submitted:
risk_acceptance.set_state("submitted")


class UserFilter(df.FilterSet):
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/ar.json
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,7 @@
"enterYourEmail": "أدخل عنوان بريدك الإلكتروني أدناه، وسنرسل لك تعليمات لتعيين كلمة مرور جديدة",
"send": "إرسال",
"goBackToLogin": "العودة إلى تسجيل الدخول",
"riskAcceptanceReviewMessage": "هذا القبول للمخاطر بانتظار المعالجة. تذكر مراجعته قبل الموافقة أو الرفض، لن تتمكن من العودة.",
"riskAcceptanceValidatingReviewMessage": "هذا القبول للمخاطر بانتظار المعالجة. تذكر مراجعته قبل الموافقة أو الرفض، لن تتمكن من العودة.",
"validate": "تحقق",
"reject": "رفض",
"revoke": "إلغاء",
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/cs.json
Original file line number Diff line number Diff line change
Expand Up @@ -451,7 +451,7 @@
"enterYourEmail": "Zadejte svou e-mailovou adresu níže a zašleme vám instrukce pro nastavení nového hesla",
"send": "Odeslat",
"goBackToLogin": "Vrátit se k přihlášení",
"riskAcceptanceReviewMessage": "Toto přijetí rizika čeká na zpracování. Nezapomeňte jej před schválením nebo odmítnutím zkontrolovat, později už to nebudete moci změnit.",
"riskAcceptanceValidatingReviewMessage": "Toto přijetí rizika čeká na zpracování. Nezapomeňte jej před schválením nebo odmítnutím zkontrolovat, později už to nebudete moci změnit.",
"validate": "Ověřit",
"reject": "Odmítnout",
"revoke": "Odebrat",
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/de.json
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@
"enterYourEmail": "Geben Sie unten Ihre E-Mail-Adresse ein, und wir senden Ihnen Anweisungen zum Festlegen eines neuen Passworts",
"send": "Senden",
"goBackToLogin": "Zurück zur Anmeldung",
"riskAcceptanceReviewMessage": "Diese Risikoakzeptanz wartet auf die Bearbeitung. Denken Sie daran, sie zu überprüfen, bevor Sie sie validieren oder ablehnen, Sie können nicht zurückgehen.",
"riskAcceptanceValidatingReviewMessage": "Diese Risikoakzeptanz wartet auf die Bearbeitung. Denken Sie daran, sie zu überprüfen, bevor Sie sie validieren oder ablehnen, Sie können nicht zurückgehen.",
"validate": "Validieren",
"reject": "Ablehnen",
"revoke": "Widerrufen",
Expand Down
6 changes: 5 additions & 1 deletion frontend/messages/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@
"acceptedAt": "Accepted at",
"rejectedAt": "Rejected at",
"revokedAt": "Revoked at",
"created": "Created",
"submitted": "Submitted",
"rejected": "Rejected",
"revoked": "Revoked",
Expand Down Expand Up @@ -456,14 +457,17 @@
"enterYourEmail": "Enter your email address below, and we'll send instructions for setting a new one",
"send": "Send",
"goBackToLogin": "Go back to login",
"riskAcceptanceReviewMessage": "This risk acceptance is awaiting processing. Remember to review it before validating or rejecting it, you will not be able to go back.",
"riskAcceptanceSubmittingReviewMessage": "This will be sent to the approver for validation.",
"riskAcceptanceValidatingReviewMessage": "This risk acceptance is awaiting processing. Remember to review it before validating or rejecting it, you will not be able to go back.",
"riskAcceptanceMissingApproverMessage": "Approver required before submitting.",
"validate": "Validate",
"reject": "Reject",
"revoke": "Revoke",
"riskAcceptanceValidatedMessage": "This risk acceptance is currently validated. It can be revoked at any time, but this will be irrevocable. You will need to duplicate it with a different version if necessary.",
"confirmModalTitle": "Confirm",
"confirmModalMessage": "Are you sure? This action will permanently affect the following object",
"submit": "Submit",
"draft": "Draft",
"requirementAssessment": "Requirement assessment",
"requirementAssessments": "Requirement assessments",
"deleteModalTitle": "Delete",
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/es.json
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@
"enterYourEmail": "Ingrese su dirección de correo electrónico a continuación y le enviaremos instrucciones para establecer una nueva",
"send": "Enviar",
"goBackToLogin": "Volver al inicio de sesión",
"riskAcceptanceReviewMessage": "Esta aceptación de riesgo está pendiente de procesamiento. Recuerde revisarla antes de validarla o rechazarla, no podrá volver atrás.",
"riskAcceptanceValidatingReviewMessage": "Esta aceptación de riesgo está pendiente de procesamiento. Recuerde revisarla antes de validarla o rechazarla, no podrá volver atrás.",
"validate": "Validar",
"reject": "Rechazar",
"revoke": "Revocar",
Expand Down
4 changes: 2 additions & 2 deletions frontend/messages/fr.json
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,7 @@
"acceptedAt": "Accepté le",
"rejectedAt": "Rejeté le",
"revokedAt": "Révoqué le",
"created": "Créé",
"submitted": "Soumis",
"rejected": "Rejeté",
"revoked": "Révoqué",
Expand Down Expand Up @@ -456,7 +457,7 @@
"enterYourEmail": "Entrez votre adresse e-mail ci-dessous et nous vous enverrons des instructions pour en définir un nouveau",
"send": "Envoyer",
"goBackToLogin": "Revenir à la page de connexion",
"riskAcceptanceReviewMessage": "Cette acceptation de risque est en attente de traitement. Pensez à la consulter avant de la valider ou de la rejeter, vous ne pourrez pas revenir en arrière.",
"riskAcceptanceValidatingReviewMessage": "Cette acceptation de risque est en attente de traitement. Pensez à la consulter avant de la valider ou de la rejeter, vous ne pourrez pas revenir en arrière.",
"validate": "Valider",
"reject": "Rejeter",
"revoke": "Révoquer",
Expand All @@ -473,7 +474,6 @@
"loading": "Chargement",
"open": "Ouvert",
"mitigate": "Atténué",
"accept": "Accepté",
"avoid": "Refusé",
"transfer": "Partagé",
"primary": "Primaire",
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/hi.json
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@
"enterYourEmail": "नीचे अपना ईमेल पता दर्ज करें, और हम आपको नया पासवर्ड सेट करने के निर्देश भेजेंगे",
"send": "भेजें",
"goBackToLogin": "लॉगिन पर वापस जाएं",
"riskAcceptanceReviewMessage": "यह जोखिम स्वीकृति प्रसंस्करण के लिए प्रतीक्षारत है। इसे मान्य करने या अस्वीकार करने से पहले इसकी समीक्षा करना याद रखें, आप वापस नहीं जा सकेंगे।",
"riskAcceptanceValidatingReviewMessage": "यह जोखिम स्वीकृति प्रसंस्करण के लिए प्रतीक्षारत है। इसे मान्य करने या अस्वीकार करने से पहले इसकी समीक्षा करना याद रखें, आप वापस नहीं जा सकेंगे।",
"validate": "मान्य करें",
"reject": "अस्वीकार करें",
"revoke": "रद्द करें",
Expand Down
4 changes: 2 additions & 2 deletions frontend/messages/it.json
Original file line number Diff line number Diff line change
Expand Up @@ -453,11 +453,11 @@
"enterYourEmail": "Inserisci il tuo indirizzo email per ricevere le istruzioni per impostare una nuova password",
"send": "Invia",
"goBackToLogin": "Torna al login",
"riskAcceptanceReviewMessage": "L'accettazione di questo rischio è in valutazione. Ricordati di revisionarla con attenzione prima di convalidarla o/o rifiutarla. Dopo l'accettazione o il rigiuto non sarà possibile tornare indietro.",
"riskAcceptanceValidatingReviewMessage": "L'accettazione di questo rischio è in valutazione. Ricordati di revisionarla con attenzione prima di convalidarla o/o rifiutarla. Dopo l'accettazione o il rigiuto non sarà possibile tornare indietro.",
"validate": "Convalida",
"reject": "Rifiuta",
"revoke": "Revoca",
"riskAcceptanceValidatedMessage": "L'accettazione di questo rischio è attualmente confermata. Puoi revocarla in qualsiasi momento, ma non puoi rotnare indietro. Si consiglia di duplicarla con una versione diversa se necessario.",
"riskAcceptanceValidatedMessage": "L'accettazione di questo rischio è attualmente confermata. Puoi revocarla in qualsiasi momento, ma non puoi tornare indietro. Si consiglia di duplicarla con una versione diversa se necessario.",
"confirmModalTitle": "Conferma",
"confirmModalMessage": "Sei sicuro? Questa azione modificherà in maniera permanente il seguente oggetto",
"submit": "Invia",
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/nl.json
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@
"enterYourEmail": "Voer hieronder je e-mailadres in, en we sturen instructies om een nieuw wachtwoord in te stellen",
"send": "Versturen",
"goBackToLogin": "Ga terug naar inloggen",
"riskAcceptanceReviewMessage": "Deze risicoacceptatie wacht op verwerking. Vergeet niet deze te beoordelen voordat je deze valideert of afwijst, je kunt niet meer terug.",
"riskAcceptanceValidatingReviewMessage": "Deze risicoacceptatie wacht op verwerking. Vergeet niet deze te beoordelen voordat je deze valideert of afwijst, je kunt niet meer terug.",
"validate": "Valideren",
"reject": "Afwijzen",
"revoke": "Intrekken",
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/pl.json
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@
"enterYourEmail": "Wpisz swój adres e-mail poniżej, a wyślemy instrukcje dotyczące ustawienia nowego hasła",
"send": "Wyślij",
"goBackToLogin": "Wróć do logowania",
"riskAcceptanceReviewMessage": "Ta akceptacja ryzyka oczekuje na przetworzenie. Pamiętaj, aby ją przejrzeć przed zatwierdzeniem lub odrzuceniem, nie będzie można wrócić.",
"riskAcceptanceValidatingReviewMessage": "Ta akceptacja ryzyka oczekuje na przetworzenie. Pamiętaj, aby ją przejrzeć przed zatwierdzeniem lub odrzuceniem, nie będzie można wrócić.",
"validate": "Zatwierdź",
"reject": "Odrzuć",
"revoke": "Cofnij",
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/pt.json
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@
"enterYourEmail": "Digite seu endereço de e-mail abaixo e enviaremos instruções para definir uma nova senha",
"send": "Enviar",
"goBackToLogin": "Voltar para o login",
"riskAcceptanceReviewMessage": "Esta aceitação de risco está aguardando processamento. Lembre-se de revisá-la antes de validá-la ou rejeitá-la, pois você não poderá voltar atrás.",
"riskAcceptanceValidatingReviewMessage": "Esta aceitação de risco está aguardando processamento. Lembre-se de revisá-la antes de validá-la ou rejeitá-la, pois você não poderá voltar atrás.",
"validate": "Validar",
"reject": "Rejeitar",
"revoke": "Revogar",
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/ro.json
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@
"enterYourEmail": "Introduceți adresa dvs. de e-mail mai jos și vă vom trimite instrucțiuni pentru a seta una nouă",
"send": "Trimite",
"goBackToLogin": "Înapoi la autentificare",
"riskAcceptanceReviewMessage": "Această acceptare a riscului așteaptă procesarea. Amintiți-vă să o revizuiți înainte de a o valida sau respinge, nu veți putea reveni.",
"riskAcceptanceValidatingReviewMessage": "Această acceptare a riscului așteaptă procesarea. Amintiți-vă să o revizuiți înainte de a o valida sau respinge, nu veți putea reveni.",
"validate": "Validați",
"reject": "Respingeți",
"revoke": "Revocați",
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/sv.json
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@
"enterYourEmail": "Ange din e-postadress nedan, så skickar vi instruktioner för att ställa in ett nytt",
"send": "Skicka",
"goBackToLogin": "Gå tillbaka till inloggning",
"riskAcceptanceReviewMessage": "Denna riskacceptans väntar på bearbetning. Kom ihåg att granska den innan du validerar eller avvisar den; du kommer inte att kunna ångra dig.",
"riskAcceptanceValidatingReviewMessage": "Denna riskacceptans väntar på bearbetning. Kom ihåg att granska den innan du validerar eller avvisar den; du kommer inte att kunna ångra dig.",
"validate": "Validera",
"reject": "Avvisa",
"revoke": "Återkalla",
Expand Down
2 changes: 1 addition & 1 deletion frontend/messages/ur.json
Original file line number Diff line number Diff line change
Expand Up @@ -453,7 +453,7 @@
"enterYourEmail": "نیچے اپنا ای میل پتہ درج کریں، اور ہم آپ کو نیا پاس ورڈ سیٹ کرنے کے لیے ہدایات بھیجیں گے",
"send": "بھیجیں",
"goBackToLogin": "لاگ ان پر واپس جائیں",
"riskAcceptanceReviewMessage": "یہ خطرے کی منظوری کارروائی کے لیے زیر التواء ہے۔ اسے درست کرنے یا مسترد کرنے سے پہلے اس کا جائزہ لینا یاد رکھیں، آپ واپس نہیں جا سکیں گے۔",
"riskAcceptanceValidatingReviewMessage": "یہ خطرے کی منظوری کارروائی کے لیے زیر التواء ہے۔ اسے درست کرنے یا مسترد کرنے سے پہلے اس کا جائزہ لینا یاد رکھیں، آپ واپس نہیں جا سکیں گے۔",
"validate": "درست کریں",
"reject": "مسترد کریں",
"revoke": "منسوخ کریں",
Expand Down
63 changes: 56 additions & 7 deletions frontend/src/lib/components/DetailView/DetailView.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,13 @@
import { toCamelCase } from '$lib/utils/locales.js';
import * as m from '$paraglide/messages.js';
import { languageTag } from '$paraglide/runtime.js';
import type { ModalComponent, ModalSettings, ModalStore } from '@skeletonlabs/skeleton';
import { Tab, TabGroup, getModalStore } from '@skeletonlabs/skeleton';
import type {
PopupSettings,
ModalComponent,
ModalSettings,
ModalStore
} from '@skeletonlabs/skeleton';
import { popup, Tab, TabGroup, getModalStore } from '@skeletonlabs/skeleton';
import { onMount } from 'svelte';
Expand All @@ -25,6 +30,12 @@
const defaultExcludes = ['id', 'is_published', 'localization_dict'];
const popupHover: PopupSettings = {
event: 'hover',
target: 'popupHover',
placement: 'left'
};
export let data;
export let mailing = false;
export let fields: string[] = [];
Expand Down Expand Up @@ -169,7 +180,7 @@
$: displayEditButton = function () {
return (
canEditObject &&
!['Accepted', 'Rejected', 'Revoked'].includes(data.data.state) &&
!['Submitted', 'Accepted', 'Rejected', 'Revoked'].includes(data.data.state) &&
!data.data.urn &&
!data.data.builtin
);
Expand All @@ -188,12 +199,12 @@
</script>

<div class="flex flex-col space-y-2">
{#if data.data.state === m.submitted() && $page.data.user.id === data.data.approver.id}
{#if data.data.state === 'Submitted' && $page.data.user.id === data.data.approver.id}
<div
class="flex flex-row space-x-4 items-center bg-yellow-100 rounded-container-token shadow px-6 py-2 mb-2 justify-between"
class="flex flex-row space-x-4 items-center bg-yellow-100 rounded-container-token shadow px-6 py-2 justify-between"
>
<div class="text-yellow-900">
{m.riskAcceptanceReviewMessage()}
{m.riskAcceptanceValidatingReviewMessage()}
</div>
<div class="flex space-x-2">
<button
Expand All @@ -216,7 +227,7 @@
>
</div>
</div>
{:else if data.data.state === m.accept()}
{:else if data.data.state === 'Accepted'}
<div
class="flex flex-row items-center space-x-4 bg-green-100 rounded-container-token shadow-lg px-6 py-2 mt-2 justify-between"
>
Expand Down Expand Up @@ -367,7 +378,45 @@
{m.sendQuestionnaire()}
</button>
{/if}

{#if data.data.state === 'Submitted' && canEditObject}
<div class="flex flex-col space-y-2 ml-4">
<button
on:click={(_) => {
modalConfirm(data.data.id, data.data.name, '?/draft');
}}
on:keydown={(_) => modalConfirm(data.data.id, data.data.name, '?/draft')}
class="btn variant-filled-primary"
disabled={!data.data.approver}
>
<i class="fas fa-arrow-alt-circle-left mr-2" /> {m.draft()}</button
>
</div>
{/if}

{#if displayEditButton()}
{#if data.data.state === 'Created'}
<div class="flex flex-col space-y-2 ml-4">
<button
on:click={(_) => {
modalConfirm(data.data.id, data.data.name, '?/submit');
}}
on:keydown={(_) => modalConfirm(data.data.id, data.data.name, '?/submit')}
class="btn variant-filled-primary [&>*]:pointer-events-none"
disabled={!data.data.approver}
use:popup={popupHover}
>
<i class="fas fa-paper-plane mr-2" />
{m.submit()}
</button>
{#if !data.data.approver}
<div class="card variant-ghost-surface p-4 z-20" data-popup="popupHover">
<p class="font-normal">{m.riskAcceptanceMissingApproverMessage()}</p>
<div class="arrow variant-filled-surface" />
</div>
{/if}
</div>
{/if}
<div class="flex flex-col space-y-2 ml-4">
<Anchor
breadcrumbAction="push"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@
field="approver"
cacheLock={cacheLocks['approver']}
bind:cachedValue={formDataCache['approver']}
nullable={true}
label={m.approver()}
helpText={m.approverHelpText()}
/>
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/utils/schemas.ts
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@ export const RiskAcceptanceSchema = z.object({
folder: z.string(),
expiry_date: z.union([z.literal('').transform(() => null), z.string().date()]).nullish(),
justification: z.string().optional().nullable(),
approver: z.string(),
approver: z.string().optional().nullable(),
risk_scenarios: z.array(z.string())
});

Expand Down
Loading

0 comments on commit b83fa07

Please sign in to comment.