diff --git a/src/main/java/fr/inra/oresing/domain/data/deposit/DataImporter.java b/src/main/java/fr/inra/oresing/domain/data/deposit/DataImporter.java index 4af2f760eedc7ad8230db7dda87c068f6e7aca53..848297c08912013b97f980c6b1d6b531f2c1b986 100644 --- a/src/main/java/fr/inra/oresing/domain/data/deposit/DataImporter.java +++ b/src/main/java/fr/inra/oresing/domain/data/deposit/DataImporter.java @@ -459,7 +459,7 @@ public class DataImporter { builder.put("to", DISPLAY_DATE_FORMATTER_DDMMYYYY.format(to)); } if (!dateTimeRange.getRange().encloses(timeScope.getRange())) { - errors.add(new CsvRowValidationCheckResult(DefaultValidationCheckResult.error("timerangeoutofinterval", builder.build(), null), rowNumber)); + errors.add(new CsvRowValidationCheckResult(DefaultValidationCheckResult.error("timeRangeOutOfInterval", builder.build(), null), rowNumber)); } } @@ -470,7 +470,7 @@ public class DataImporter { } binaryFileDataset.getRequiredAuthorizations().entrySet().forEach(entry -> { if (!requiredAuthorizations.get(entry.getKey()).equals(entry.getValue())) { - errors.add(new CsvRowValidationCheckResult(DefaultValidationCheckResult.error("badauthorizationscopeforrepository", ImmutableMap.of("authorization", entry.getKey(), "expectedValue", entry.getValue(), "givenValue", requiredAuthorizations.get(entry.getKey())), null), rowNumber)); + errors.add(new CsvRowValidationCheckResult(DefaultValidationCheckResult.error("badAuthorizationScopeForRepository", ImmutableMap.of("authorization", entry.getKey(), "expectedValue", entry.getValue(), "givenValue", requiredAuthorizations.get(entry.getKey())), null), rowNumber)); } }); diff --git a/src/main/java/fr/inra/oresing/domain/data/deposit/context/DataImporterContext.java b/src/main/java/fr/inra/oresing/domain/data/deposit/context/DataImporterContext.java index 26ff6b70705f4582ba95ebcbece736fb6c878828..907bb635ea7e41aa444e069e4e10e917ea1e1326 100644 --- a/src/main/java/fr/inra/oresing/domain/data/deposit/context/DataImporterContext.java +++ b/src/main/java/fr/inra/oresing/domain/data/deposit/context/DataImporterContext.java @@ -222,7 +222,6 @@ public class DataImporterContext { public ImmutableSet<String> getMandatoryHeaders() { return getExpectedColumnsPerHeaders().values().stream() - .filter(Column::isMandatory) .map(Column::getExpectedHeader) .collect(ImmutableSet.toImmutableSet()); } diff --git a/src/main/java/fr/inra/oresing/domain/exceptions/configuration/ConfigurationException.java b/src/main/java/fr/inra/oresing/domain/exceptions/configuration/ConfigurationException.java index de15187c32ef23e58eca51568edf63d78ea5d54c..c5f6b4ef3a0acd6f2d1841854c233f861ae3c169 100644 --- a/src/main/java/fr/inra/oresing/domain/exceptions/configuration/ConfigurationException.java +++ b/src/main/java/fr/inra/oresing/domain/exceptions/configuration/ConfigurationException.java @@ -16,7 +16,7 @@ public enum ConfigurationException { authorizationScopeComponentWrongChecker, //Le composant <code>{component}</code> de la variable <code>{variable}</code> ne peut pas être utilisé comme portant l’information temporelle car ce n’est pas une donnée déclarée comme <code>{expectedChecker}</code>, authorizationComponentKeyMissingComponent, //Il faut indiquer le composant de la variable <code>{variable}</code> dans laquelle on recueille les informations spatiales à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataName}</code> pour l'autorisation <code>{authorizationName}</code>. Les valeurs possibles sont : <code>{knownComponents}</code>, authorizationComponentKeyunknownComponent, //<code>{component}</code> ne fait pas partie des composants connus pour la variable <code>{variable}</code>. Les composants connus sont : <code>{knownComponents}</code>, - badauthorizationscopeforrepository, //L'autorisation <code>{submissionScope}</code>) doit être <code>{expectedValue}/code> et non <code>{givenValue}</code>, + badAuthorizationScopeForRepository, //L'autorisation <code>{submissionScope}</code>) doit être <code>{expectedValue}/code> et non <code>{givenValue}</code>, characterNotAcceptInName, //Il y a des caractère non accepté dans le nom de l'application : <code>{name}</code>, checkerExpressionReturnedFalse, //La contrainte suivante n'est pas respectée : <code>{expression}</code>, csvBoundToUnknownVariable, //Dans le format CSV, l’en-tête <code>{header}</code> est lié à la variable <code>{variable}</code> qui n’est pas connue. Les variables connues sont : <code>{variables}</code>, @@ -115,7 +115,7 @@ public enum ConfigurationException { timeScopeComponentWrongChecker, //Le composant <code>{component}</code> de la variable <code>{variable}</code> ne peut pas être utilisé comme portant l’information temporelle car ce n’est pas une donnée déclarée comme <code>{expectedChecker}</code>, timeComponentKeyMissingComponent, //Il faut indiquer le composant de la variable <code>{variable}</code> dans laquelle on recueille la période de temps à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataName}</code>. Valeurs possibles <code>{knownComponents}</code>, timeComponentKeyunknownComponent, //<code>{component}</code> ne fait pas partie des composants connus pour la variable <code>{variable}</code>. Composants connus : <code>{knownComponents}</code>, - timerangeoutofinterval, //La date <code>{value}</code> est incompatible avec l'intervale de dates du dépôt. Elle doit être comprise entre <code>{from}</code> et <code>{to}</code>., + timeRangeOutOfInterval, //La date <code>{value}</code> est incompatible avec l'intervale de dates du dépôt. Elle doit être comprise entre <code>{from}</code> et <code>{to}</code>., tooBigRowLineForConstantDescription, //Dans la section format->constant du dataName {dataName} le numéro de ligne doit être inférieur à celui de la ligne de données., tooLittleRowLineForConstantDescription, //Dans la section format->constant du dataName {dataName} le numéro de ligne doit être positif., unDeclaredValueForChart, //Pour visualiser correctement le graphe de la variable <code> {variable} </code> du type de données <code> {dataName} </code>, il est nécessaire de déclarer la valeur.<br /> La valeur doit être parmi : <code>{components}</code>, diff --git a/src/main/java/fr/inra/oresing/rest/OreSiService.java b/src/main/java/fr/inra/oresing/rest/OreSiService.java index 208973b4fc700c7c0315f2ef102dc67849e9a53c..973d6f80a3c26f8edfab98dad37b515e827870bd 100644 --- a/src/main/java/fr/inra/oresing/rest/OreSiService.java +++ b/src/main/java/fr/inra/oresing/rest/OreSiService.java @@ -128,7 +128,7 @@ public class OreSiService { final LocalDateTime to = LocalDate.from(LocalDateTimeRange.DATE_TIME_FORMATTER.parse(binaryFileDataset.getTo())).plusDays(1).atStartOfDay(); if (!LocalDateTimeRange.between(from, to).getRange().encloses(timeScope.getRange())) { errors.add(new CsvRowValidationCheckResult(DefaultValidationCheckResult.error( - "timerangeoutofinterval", + "timeRangeOutOfInterval", ImmutableMap.of("from", LocalDateTimeRange.DATE_FORMATTER_DDMMYYYY.format(from), "to", LocalDateTimeRange.DATE_FORMATTER_DDMMYYYY.format(to), "value", LocalDateTimeRange.DATE_FORMATTER_DDMMYYYY.format(timeScope.getRange().lowerEndpoint())) , null ), rowNumber) @@ -144,7 +144,7 @@ public class OreSiService { binaryFileDataset.getRequiredAuthorizations().entrySet().forEach(entry -> { if (!requiredAuthorizations.get(entry.getKey()).equals(entry.getValue())) { errors.add(new CsvRowValidationCheckResult(DefaultValidationCheckResult.error( - "badauthorizationscopeforrepository", + "badAuthorizationScopeForRepository", ImmutableMap.of("submissionScope", entry.getKey(), "expectedValue", entry.getValue(), "givenValue", requiredAuthorizations.get(entry.getKey())) , null ), rowNumber) @@ -383,8 +383,12 @@ public class OreSiService { //TODO test à faire entre version ancienne et nouvelle final Version oldVersion = oldConfiguration.applicationDescription().version(); final Version newVersion = newConfiguration.applicationDescription().version(); - Preconditions.checkArgument(newVersion.compareTo(oldVersion) > 0, "l'application " + applicationName + " est déjà dans la version " + oldVersion); - progression1.pushMessage("start", Map.of("application", applicationName, "oldVersion", oldVersion.version(), "newVersion", newVersion.version())); + try { + Preconditions.checkArgument(newVersion.compareTo(oldVersion) > 0, "l'application " + applicationName + " est déjà dans la version " + oldVersion); + } catch (final IllegalArgumentException e) { + progression1.pushError(e); + progression1.pushMessage("start", Map.of("application", applicationName, "oldVersion", oldVersion.version(), "newVersion", newVersion.version())); + } if (log.isInfoEnabled()) { log.info("va migrer les données de {} de la version actuelle {} à la nouvelle version {}", applicationName, oldVersion, newVersion); } diff --git a/src/test/resources/data/recursivite/recusivite.yaml b/src/test/resources/data/recursivite/recusivite.yaml index 5227420764f80fb96c5b6f717ca743e91589c73b..b87a080a60660ed7670c9a2760befbeb9b90b619 100644 --- a/src/test/resources/data/recursivite/recusivite.yaml +++ b/src/test/resources/data/recursivite/recusivite.yaml @@ -148,7 +148,6 @@ OA_data: OA_importHeader: code sandre du taxon sandre_superieur: OA_importHeader: code sandre du taxon supérieur - incertitude: OA_dynamicComponents: proprietesDeTaxon: OA_exportHeader: diff --git a/ui/src/locales/en.json b/ui/src/locales/en.json index ba1f5f665bccfeab8228a53abda54f0d21a4aa2e..1cbbd2b548e14de0e25bb3bc46dea77de4eb27b9 100644 --- a/ui/src/locales/en.json +++ b/ui/src/locales/en.json @@ -301,7 +301,7 @@ "authorizationScopeComponentWrongChecker": "The <code> {component} </code> component of the <code> {variable} </code> variable cannot be used as carrying time information because it is not declared data like <code> {expectedChecker} </code> ", "authorizationComponentKeyMissingComponent": "You must indicate the component of the variable <code> {variable} </code> in which we collect the spatial information to which to attach the data for the management of rights dataset <code> {dataType} < / code> for authorization <code> {authorizationName} </code>. Possible values ​​<code> {knownComponents} </code> ", "authorizationComponentKeyunknownComponent": "<code> {component} </code> is not one of the known components for the variable <code> {variable} </code>. Known components: <code> {knownComponents} </code>", - "badauthorizationscopeforrepository": "Authorization <code> {authorization} </code>) must be <code> {expectedValue} / code> and not <code> {givenValue} </code>", + "badAuthorizationScopeForRepository": "Authorization <code> {authorization} </code>) must be <code> {expectedValue} / code> and not <code> {givenValue} </code>", "characterNotAcceptInName": "There are characters not accepted in the name of the application: <code>{name}</code>", "checkerExpressionReturnedFalse": "The following constraint is not respected: <code> {expression} </code>", "csvBoundToUnknownVariable": "In the CSV format, header <code>{header}</code> is bound to unknown variable <code>{variable}</code>. Known variables: <code>{variables}</code>", @@ -401,7 +401,7 @@ "timeScopeComponentWrongChecker": "The component <code>{component}</code> of variable <code>{variable}</code> can't be used for carrying time information because it's not declared as : <code>{expectedChecker}</code>", "timeComponentKeyMissingComponent": "Mandatory indication of the component of : <code>{variable}</code> in which we collect the time period for which we need to attach the data for rights management of data type : <code>{dataType}</code>. <br>Accepted values : <code>{knownComponents}</code>", "timeComponentKeyunknownComponent": "<code>{component}</code> doesn't belong to any of known variables : <code>{variable}</code>. <br>Known components : <code>{knownComponents}</code>", - "timerangeoutofinterval": "The date <code> {value} </code> is incompatible with the date range of the deposit. It must be between <code> {from} </code> and <code> {to} </code>. ", + "timeRangeOutOfInterval": "The date <code> {value} </code> is incompatible with the date range of the deposit. It must be between <code> {from} </code> and <code> {to} </code>. ", "tooBigRowLineForConstantDescription": "In the format->constant section of dataType <code>{dataType}</code> the row number must be less than the data row.", "tooLittleRowLineForConstantDescription": "In the format->constant section of dataType <code>{dataType}</code> the row number must be positive.", "unDeclaredValueForChart": "In the chart description of variable <code> {variable} </code> of data type <code> {dataType} </code>, the value is not declared.<br />Expected values ​​<code>{components}</code>", @@ -433,6 +433,9 @@ "exception": "The translation string for the following error is missing. Please verify that this is not an indentation problem before contacting the administrators. " }, "errors-csv": { + "badAuthorizationScopeForRepository" : { + "message": "Authorization <code> {authorization} </code>) must be <code> {expectedValue} / code> and not <code> {givenValue} </code>" + }, "badMaxIntervalFloatWithComponent": { "message": "For column: <code> {target} </code> the value <code> {value} </code> must be a decimal number and <code>{type}</code> for <code>{bound}</code>." }, @@ -469,6 +472,9 @@ "invalidReferenceWithComponent": { "message": "For column: <code> {target} </code> the value <code> {value} </code> does not exist in the reference <code> {refType} </code>. Values expected <code> {referenceValues} </code>. " }, + "timeRangeOutOfInterval": { + "message": "The date value: <code>{value}</code> must be between <code>{from}</code> and <code>{to}</code>." + }, "unexpectedHeaderColumn": { "message": "" }, diff --git a/ui/src/locales/fr.json b/ui/src/locales/fr.json index 0c4d64095dd74d9887eb04e2a2794ddaa8227d35..b0e090dc7357169aafa306243dd7d335cb062e63 100644 --- a/ui/src/locales/fr.json +++ b/ui/src/locales/fr.json @@ -301,7 +301,7 @@ "authorizationScopeComponentWrongChecker": "Le composant <code>{component}</code> de la variable <code>{variable}</code> ne peut pas être utilisé comme portant l’information temporelle car ce n’est pas une donnée déclarée comme <code>{expectedChecker}</code>", "authorizationComponentKeyMissingComponent": "Il faut indiquer le composant de la variable <code>{variable}</code> dans laquelle on recueille les informations spatiales à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code> pour l'autorisation <code>{authorizationName}</code>. Les valeurs possibles sont : <code>{knownComponents}</code>", "authorizationComponentKeyunknownComponent": "<code>{component}</code> ne fait pas partie des composants connus pour la variable <code>{variable}</code>. Les composants connus sont : <code>{knownComponents}</code>", - "badauthorizationscopeforrepository": "L'autorisation <code>{authorization}</code>) doit être <code>{expectedValue}/code> et non <code>{givenValue}</code>", + "badAuthorizationScopeForRepository": "L'autorisation <code>{authorization}</code>) doit être <code>{expectedValue}/code> et non <code>{givenValue}</code>", "characterNotAcceptInName": "Il y a des caractère non accepté dans le nom de l'application : <code>{name}</code>", "checkerExpressionReturnedFalse": "La contrainte suivante n'est pas respectée : <code>{expression}</code>", "csvBoundToUnknownVariable": "Dans le format CSV, l’en-tête <code>{header}</code> est lié à la variable <code>{variable}</code> qui n’est pas connue. Les variables connues sont : <code>{variables}</code>", @@ -401,7 +401,7 @@ "timeScopeComponentWrongChecker": "Le composant <code>{component}</code> de la variable <code>{variable}</code> ne peut pas être utilisé comme portant l’information temporelle car ce n’est pas une donnée déclarée comme <code>{expectedChecker}</code>", "timeComponentKeyMissingComponent": "Il faut indiquer le composant de la variable <code>{variable}</code> dans laquelle on recueille la période de temps à laquelle rattacher la donnée pour le gestion des droits jeu de données <code>{dataType}</code>. Valeurs possibles <code>{knownComponents}</code>", "timeComponentKeyunknownComponent": "<code>{component}</code> ne fait pas partie des composants connus pour la variable <code>{variable}</code>. Composants connus : <code>{knownComponents}</code>", - "timerangeoutofinterval": "La date <code>{value}</code> est incompatible avec l'intervalle de dates du dépôt. Elle doit être comprise entre <code>{from}</code> et <code>{to}</code>.", + "timeRangeOutOfInterval": "La date <code>{value}</code> est incompatible avec l'intervalle de dates du dépôt. Elle doit être comprise entre <code>{from}</code> et <code>{to}</code>.", "tooBigRowLineForConstantDescription": "Dans la section format->constant du dataType {dataType} le numéro de ligne doit être inférieur à celui de la ligne de données.", "tooLittleRowLineForConstantDescription": "Dans la section format->constant du dataType {dataType} le numéro de ligne doit être positif.", "unDeclaredValueForChart": "Pour visualiser correctement le graphe de la variable <code> {variable} </code> du type de données <code> {dataType} </code>, il est nécessaire de déclarer la valeur.<br /> La valeur doit être parmi : <code>{components}</code>", @@ -429,9 +429,12 @@ "variableInMultipleDataGroup": "La variable <code>{variable}</code> du dataType <code>{dataType}</code> est déclarée dans plusieurs groupes de données, elle ne doit être présente que dans un seul groupe" }, "errors": { - "exception": "Il manque la chaine de traduction pour l'erreur suivante. Merci de vérifier que ce n'est pas un problème d'indentation avant de contacter les administrateurs. " + "exception": "Il manque la chaine de traduction pour l'erreur suivante. Merci de vérifier que ce n'est pas un problème d'indentation ou de fichier avant de contacter les administrateurs. " }, "errors-csv": { + "badAuthorizationScopeForRepository" : { + "message": "L'autorisation <code>{authorization}</code>) doit être <code>{expectedValue}/code> et non <code>{givenValue}</code>" + }, "badMaxIntervalFloatWithComponent": { "message": "Pour la colonne : <code>{component}</code> la valeur <code>{value}</code> doit être un nombre décimal et inférieur à la valeur limite qui est de <code>{bound}</code>." }, @@ -468,6 +471,9 @@ "invalidReferenceWithComponent": { "message": "Pour la colonne : <code>{target}</code> la valeur <code>{value}</code> n'existe pas dans la référence <code>{refType}</code>. Valeurs attendues <code>{referenceValues}</code>." }, + "timeRangeOutOfInterval": { + "message": "La valeur de la date : <code>{value}</code> doit être comprise entre <code>{from}</code> et <code>{to}</code>." + }, "unexpectedHeaderColumn": { "message": "En-tête de colonne inattendu. En-tête attendu : <code>{expectedHeaderColumn}</code> <br />En-tête actuel : <code>{actualHeaderColumn}</code>" }, diff --git a/ui/src/services/ErrorsService.js b/ui/src/services/ErrorsService.js index 19299f77d53bd866ea96e4938b531fc8856ccaec..c74845f8198e0e38d2df96d9033a24a6352d1a5d 100644 --- a/ui/src/services/ErrorsService.js +++ b/ui/src/services/ErrorsService.js @@ -52,6 +52,7 @@ const ERRORS = { invalidConfigurationFile:(params) => i18n.t("errors-yaml.invalidConfigurationFile.message", params), //erreur csv + badAuthorizationScopeForRepository:(params) => i18n.t("errors-csv.badAuthorizationScopeForRepository.message", params), badMaxIntervalFloatWithComponent:(params) => i18n.t("errors-csv.badMaxIntervalFloatWithComponent.message", params), badMinIntervalFloatWithComponent:(params) => i18n.t("errors-csv.badMinIntervalFloatWithComponent.message", params), duplicatedHeaders:(params) => i18n.t("errors-csv.duplicatedHeaders.message", params), @@ -62,6 +63,7 @@ const ERRORS = { headerColumnPatternNotMatching:(params) => i18n.t("errors-csv.headerColumnPatternNotMatching.message", params), invalidHeaders:(params) => i18n.t("errors-csv.invalidHeaders.message", params), invalidReferenceWithComponent:(params) => i18n.t("errors-csv.invalidReferenceWithComponent.message", params), + timeRangeOutOfInterval:(params) => i18n.t("errors-csv.timeRangeOutOfInterval.message", params), unexpectedHeaderColumn:(params) => i18n.t("errors-csv.unexpectedHeaderColumn.message", params), unexpectedHeaderColumnsInList:(params) => i18n.t("errors-csv.unexpectedHeaderColumnsInList.message", params), unexpectedTokenCount:(params) => i18n.t("errors-csv.unexpectedTokenCount.message", params), diff --git a/ui/src/views/data/DataVersioningView.vue b/ui/src/views/data/DataVersioningView.vue index ce8c80d9365cc6fc62328a770920d62944ee6c52..5c57fe0a2da9169498862e60e60c670511f6aa06 100644 --- a/ui/src/views/data/DataVersioningView.vue +++ b/ui/src/views/data/DataVersioningView.vue @@ -223,18 +223,12 @@ {{ currentDataset[0].periode }} - <div v-if="errorsMessages.length" style="margin: 10px"> - <div v-for="msg in errorsMessages" v-bind:key="msg"> - <b-message - :aria-close-label="$t('message.close')" - :title="$t('message.data-type-config-error')" - class="mt-4 DataTypesManagementView-message" - has-icon - type="is-danger" - > - <span v-html="msg"/> - </b-message> - </div> + <div v-if="errorsMessages.length !== 0" style="margin: 10px"> + <ShowErrors + :errors-messages="errorsMessages" + :errors-messages-length="errorsMessages.length" + :title="$t('message.data-type-config-error')" + ></ShowErrors> </div> </caption> @@ -347,6 +341,7 @@ import moment from "moment"; import {BinaryFile} from "@/model/file/BinaryFile"; import {Dataset} from "@/model/file/Dataset"; import InputDate from "@/components/common/InputDate.vue"; +import ShowErrors from "@/components/application/ShowErrors.vue"; export default { name: "DataVersioningView", @@ -357,6 +352,7 @@ export default { }, }, components: { + ShowErrors, InputDate, CollapseMenu, LoadingAnimate,