From ab9fbaecc014cab64d98b6f61c70847cb83344cf Mon Sep 17 00:00:00 2001 From: eric-intuitem <71850047+eric-intuitem@users.noreply.github.com> Date: Sat, 21 Dec 2024 18:55:23 +0100 Subject: [PATCH] small fixes error in the matrix name translation remove default matrix value for ebios-rm This was a false good idea, as it bypasses the selection of matrices by governance body. --- .../0010_alter_ebiosrmstudy_risk_matrix.py | 26 ++++++++++++++++++ backend/ebios_rm/models.py | 4 +-- backend/ebios_rm/serializers.py | 22 --------------- .../libraries/risk-matrix-4x4-ebios-rm.yaml | 3 +- .../Forms/ModelForm/EbiosRmForm.svelte | 2 +- frontend/messages/en.json | 3 +- frontend/messages/fr.json | 2 +- .../Forms/ModelForm/EbiosRmForm.svelte | 1 - frontend/src/lib/utils/schemas.ts | 2 +- tools/matrix/risk-matrix-4x4-ebios-rm.xlsx | Bin 14059 -> 14035 bytes 10 files changed, 33 insertions(+), 32 deletions(-) create mode 100644 backend/ebios_rm/migrations/0010_alter_ebiosrmstudy_risk_matrix.py diff --git a/backend/ebios_rm/migrations/0010_alter_ebiosrmstudy_risk_matrix.py b/backend/ebios_rm/migrations/0010_alter_ebiosrmstudy_risk_matrix.py new file mode 100644 index 000000000..a7085b5af --- /dev/null +++ b/backend/ebios_rm/migrations/0010_alter_ebiosrmstudy_risk_matrix.py @@ -0,0 +1,26 @@ +# Generated by Django 5.1.4 on 2024-12-21 18:37 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("core", "0046_riskassessment_ebios_rm_study"), + ("ebios_rm", "0009_alter_roto_activity"), + ] + + operations = [ + migrations.AlterField( + model_name="ebiosrmstudy", + name="risk_matrix", + field=models.ForeignKey( + blank=True, + help_text="Risk matrix used as a reference for the study", + on_delete=django.db.models.deletion.PROTECT, + related_name="ebios_rm_studies", + to="core.riskmatrix", + verbose_name="Risk matrix", + ), + ), + ] diff --git a/backend/ebios_rm/models.py b/backend/ebios_rm/models.py index 5b35766fc..6f5e32283 100644 --- a/backend/ebios_rm/models.py +++ b/backend/ebios_rm/models.py @@ -97,9 +97,7 @@ class Status(models.TextChoices): on_delete=models.PROTECT, verbose_name=_("Risk matrix"), related_name="ebios_rm_studies", - help_text=_( - "Risk matrix used as a reference for the study. Defaults to `urn:intuitem:risk:library:risk-matrix-4x4-ebios-rm`" - ), + help_text=_("Risk matrix used as a reference for the study"), blank=True, ) assets = models.ManyToManyField( diff --git a/backend/ebios_rm/serializers.py b/backend/ebios_rm/serializers.py index 6a9457242..2c0f15c33 100644 --- a/backend/ebios_rm/serializers.py +++ b/backend/ebios_rm/serializers.py @@ -21,28 +21,6 @@ class EbiosRMStudyWriteSerializer(BaseModelSerializer): queryset=RiskMatrix.objects.all(), required=False ) - def create(self, validated_data): - if not validated_data.get("risk_matrix"): - try: - ebios_matrix = RiskMatrix.objects.filter( - urn="urn:intuitem:risk:matrix:risk-matrix-4x4-ebios-rm" - ).first() - if not ebios_matrix: - ebios_matrix_library = StoredLibrary.objects.get( - urn="urn:intuitem:risk:library:risk-matrix-4x4-ebios-rm" - ) - ebios_matrix_library.load() - ebios_matrix = RiskMatrix.objects.get( - urn="urn:intuitem:risk:matrix:risk-matrix-4x4-ebios-rm" - ) - validated_data["risk_matrix"] = ebios_matrix - except (StoredLibrary.DoesNotExist, RiskMatrix.DoesNotExist) as e: - logging.error(f"Error loading risk matrix: {str(e)}") - raise serializers.ValidationError( - "An error occurred while loading the risk matrix." - ) - return super().create(validated_data) - class Meta: model = EbiosRMStudy exclude = ["created_at", "updated_at"] diff --git a/backend/library/libraries/risk-matrix-4x4-ebios-rm.yaml b/backend/library/libraries/risk-matrix-4x4-ebios-rm.yaml index 51ff10780..3febfb182 100644 --- a/backend/library/libraries/risk-matrix-4x4-ebios-rm.yaml +++ b/backend/library/libraries/risk-matrix-4x4-ebios-rm.yaml @@ -4,7 +4,7 @@ ref_id: risk-matrix-4x4-ebios-rm name: 4x4 risk matrix from EBIOS-RM description: based on the official guide of the EBIOS RM approach copyright: public domain -version: 2 +version: 3 provider: intuitem packager: intuitem translations: @@ -171,4 +171,5 @@ objects: - 2 translations: fr: + name: Matrice 4x4 EBIOS-RM description: "Bas\xE9e sur le guide officiel de la m\xE9thode EBIOS RM" diff --git a/enterprise/frontend/src/lib/components/Forms/ModelForm/EbiosRmForm.svelte b/enterprise/frontend/src/lib/components/Forms/ModelForm/EbiosRmForm.svelte index 17f64f811..20c712ef9 100644 --- a/enterprise/frontend/src/lib/components/Forms/ModelForm/EbiosRmForm.svelte +++ b/enterprise/frontend/src/lib/components/Forms/ModelForm/EbiosRmForm.svelte @@ -76,7 +76,7 @@ cacheLock={cacheLocks['risk_matrix']} bind:cachedValue={formDataCache['risk_matrix']} label={m.riskMatrix()} - placeholder={m.ebiosRmRiskMatrix()} + placeholder={m.riskAssessmentMatrixHelpText()} helpText={m.ebiosRmMatrixHelpText()} /> {:else if context === 'ebiosRmStudy'} diff --git a/frontend/messages/en.json b/frontend/messages/en.json index a57cf46b6..9c83871ce 100644 --- a/frontend/messages/en.json +++ b/frontend/messages/en.json @@ -924,7 +924,7 @@ "ebiosWs5_4": "Assess and document residual risks", "ebiosWs5_5": "Establish risk monitoring framework", "activity": "Step", - "ebiosRmMatrixHelpText": "Risk matrix used as a reference for the study. Defaults to `urn:intuitem:risk:library:risk-matrix-4x4-ebios-rm`", + "ebiosRmMatrixHelpText": "Risk matrix used as a reference for the study", "activityOne": "Step 1", "activityTwo": "Step 2", "activityThree": "Step 3", @@ -1014,7 +1014,6 @@ "addStrategicScenario": "Add strategic scenario", "markAsDone": "Mark as done", "markAsInProgress": "Mark as in progress", - "ebiosRmRiskMatrix": "4x4 risk matrix from EBIOS-RM", "riskAnalyses": "Risk analyses", "client": "Client", "partner": "Partner", diff --git a/frontend/messages/fr.json b/frontend/messages/fr.json index e09091651..6e8aa2a18 100644 --- a/frontend/messages/fr.json +++ b/frontend/messages/fr.json @@ -924,7 +924,7 @@ "ebiosWs5_4": "Évaluer et documenter les risques résiduels", "ebiosWs5_5": "Mettre en place le cadre de suivi des risques", "activity": "Activité", - "ebiosRmMatrixHelpText": "Matrice de risque utilisée pour l'étude. La valeur par défaut est `urn:intuitem:risk:library:risk-matrix-4x4-ebios-rm`", + "ebiosRmMatrixHelpText": "Matrice de risque utilisée pour l'étude.", "activityOne": "Activité 1", "activityTwo": "Activité 2", "activityThree": "Activité 3", diff --git a/frontend/src/lib/components/Forms/ModelForm/EbiosRmForm.svelte b/frontend/src/lib/components/Forms/ModelForm/EbiosRmForm.svelte index 82e9d11e7..d85c44fc0 100644 --- a/frontend/src/lib/components/Forms/ModelForm/EbiosRmForm.svelte +++ b/frontend/src/lib/components/Forms/ModelForm/EbiosRmForm.svelte @@ -67,7 +67,6 @@ cacheLock={cacheLocks['risk_matrix']} bind:cachedValue={formDataCache['risk_matrix']} label={m.riskMatrix()} - placeholder={m.ebiosRmRiskMatrix()} helpText={m.ebiosRmMatrixHelpText()} /> {:else if context === 'ebiosRmStudy'} diff --git a/frontend/src/lib/utils/schemas.ts b/frontend/src/lib/utils/schemas.ts index ded5499a4..2553a40cd 100644 --- a/frontend/src/lib/utils/schemas.ts +++ b/frontend/src/lib/utils/schemas.ts @@ -396,7 +396,7 @@ export const ebiosRMSchema = z.object({ ...NameDescriptionMixin, version: z.string().optional().default('0.1'), ref_id: z.string().optional().default(''), - risk_matrix: z.string().optional(), + risk_matrix: z.string(), authors: z.array(z.string().optional()).optional(), reviewers: z.array(z.string().optional()).optional(), observation: z.string().optional().nullable(), diff --git a/tools/matrix/risk-matrix-4x4-ebios-rm.xlsx b/tools/matrix/risk-matrix-4x4-ebios-rm.xlsx index cf8eddf15eb86a7d1ec59f3920f45987236abde2..169654dd85deb5cf2cdf3ccf81cb0834f76a3b4b 100644 GIT binary patch delta 4417 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 Yt5^TVgqKS)VD-QUB)Rb0#s6LNFYo12xBvhE delta 4425 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