Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe Commits: d329bdb7 by Tony Chemit at 2022-10-25T14:33:48+02:00 Add ps_logbook Well new model (fix persistence migration (using IdFactoryBulk again) and rename drop scripts) - - - - - 04a707fe by Tony Chemit at 2022-10-25T18:46:05+02:00 Ajout une contrainte de non nullité sur PS_OBS_Catch.speciesFate - Closes #2492 - - - - - 60aabbe9 by Tony Chemit at 2022-10-25T18:46:05+02:00 Le schooltype devrait être obligatoire en cas d'activité PS logbook de type 6 - Pêche - Update public API Doc (See #2484) - - - - - 18 changed files: - core/persistence/java/src/main/resources/META-INF/persistence/Observe/TopiaEntitySqlUsageModel.json - core/persistence/java/src/main/resources/fr/ird/observe/entities/data/ps/observation/CatchImpl.hbm.xml - core/persistence/resources/src/main/java/fr/ird/observe/spi/migration/v9/DataSourceMigrationForVersion_9_1.java - core/persistence/resources/src/main/resources/db/migration/v9/9.1/03_drop-table-wellPlan-H2.sql → core/persistence/resources/src/main/resources/db/migration/v9/9.1/02_drop-table-wellPlan-H2.sql - core/persistence/resources/src/main/resources/db/migration/v9/9.1/03_drop-table-wellPlan-PG.sql → core/persistence/resources/src/main/resources/db/migration/v9/9.1/02_drop-table-wellPlan-PG.sql - + core/persistence/resources/src/main/resources/db/migration/v9/9.1/03_adapt-table-ps_observation_catch_speciesFate_notnull-H2.sql - + core/persistence/resources/src/main/resources/db/migration/v9/9.1/03_adapt-table-ps_observation_catch_speciesFate_notnull-PG.sql - core/persistence/resources/src/main/resources/db/migration/v9/9.1/empty-schema-H2.sql - core/persistence/resources/src/main/resources/db/migration/v9/9.1/empty-schema-PG.sql - model/src/main/models/Observe/persistence/attribute/notNull.properties - server/runner/src/main/webResources/doc/api/public/data/ps/logbook/Activity/validation-create-error.xml - server/runner/src/main/webResources/doc/api/public/data/ps/logbook/Activity/validation-create.json - server/runner/src/main/webResources/doc/api/public/data/ps/logbook/Activity/validation-update-error.xml - server/runner/src/main/webResources/doc/api/public/data/ps/logbook/Activity/validation-update.json - server/runner/src/main/webResources/doc/api/public/data/ps/observation/Catch/validation-create-error.xml - server/runner/src/main/webResources/doc/api/public/data/ps/observation/Catch/validation-create.json - server/runner/src/main/webResources/doc/api/public/data/ps/observation/Catch/validation-update-error.xml - server/runner/src/main/webResources/doc/api/public/data/ps/observation/Catch/validation-update.json Changes: ===================================== core/persistence/java/src/main/resources/META-INF/persistence/Observe/TopiaEntitySqlUsageModel.json ===================================== @@ -846,10 +846,10 @@ }, "fr.ird.observe.entities.referential.ps.common.SpeciesFate": { "reverseCompositions": [ - "fr.ird.observe.entities.data.ps.observation.Catch~speciesFate", "fr.ird.observe.entities.data.ps.observation.SampleMeasure~speciesFate" ], "reverseMandatoryCompositions": [ + "fr.ird.observe.entities.data.ps.observation.Catch~speciesFate", "fr.ird.observe.entities.data.ps.logbook.Catch~speciesFate" ] }, ===================================== core/persistence/java/src/main/resources/fr/ird/observe/entities/data/ps/observation/CatchImpl.hbm.xml ===================================== @@ -72,7 +72,7 @@ <many-to-one name="species" class="fr.ird.observe.entities.referential.common.SpeciesImpl" column="species" foreign-key="fk_ps_observation_catch_species" not-null="true" /> <many-to-one name="weightMeasureMethod" class="fr.ird.observe.entities.referential.common.WeightMeasureMethodImpl" column="weightMeasureMethod" foreign-key="fk_ps_observation_catch_weightmeasuremethod" /> <many-to-one name="lengthMeasureMethod" class="fr.ird.observe.entities.referential.common.LengthMeasureMethodImpl" column="lengthMeasureMethod" foreign-key="fk_ps_observation_catch_lengthmeasuremethod" /> - <many-to-one name="speciesFate" class="fr.ird.observe.entities.referential.ps.common.SpeciesFateImpl" column="speciesFate" foreign-key="fk_ps_observation_catch_speciesfate" /> + <many-to-one name="speciesFate" class="fr.ird.observe.entities.referential.ps.common.SpeciesFateImpl" column="speciesFate" foreign-key="fk_ps_observation_catch_speciesfate" not-null="true" /> </class> <query name="fr.ird.observe.entities.data.ps.observation.Catch::id::all" read-only="true"><![CDATA[ select new fr.ird.observe.dto.ToolkitIdBean(id, lastUpdateDate) ===================================== core/persistence/resources/src/main/java/fr/ird/observe/spi/migration/v9/DataSourceMigrationForVersion_9_1.java ===================================== @@ -23,15 +23,17 @@ package fr.ird.observe.spi.migration.v9; */ import com.google.auto.service.AutoService; -import fr.ird.observe.entities.ObserveIdFactory; import fr.ird.observe.spi.migration.ByMajorMigrationVersionResource; import io.ultreia.java4all.util.Version; import io.ultreia.java4all.util.sql.SqlQuery; import org.nuiton.topia.persistence.TopiaIdFactory; +import org.nuiton.topia.persistence.TopiaIdFactoryForBulkSupport; import org.nuiton.topia.service.migration.resources.MigrationVersionResource; import org.nuiton.topia.service.migration.resources.MigrationVersionResourceExecutor; import java.sql.Timestamp; +import java.time.LocalDateTime; +import java.time.ZoneOffset; import java.util.Date; import java.util.LinkedHashMap; import java.util.LinkedList; @@ -84,7 +86,7 @@ public class DataSourceMigrationForVersion_9_1 extends ByMajorMigrationVersionRe public DataSourceMigrationForVersion_9_1() { super(Version.valueOf("9.1"), true); ByMajorMigrationVersionResource.createResourceScriptVariables(this, "2022-09-14", "2022-09-14 00:00:00.000000"); - idFactory = new ObserveIdFactory(); + idFactory = new TopiaIdFactoryForBulkSupport(LocalDateTime.of(2022, 9, 14,0,0).toInstant(ZoneOffset.UTC).toEpochMilli()); } static class WellPlanStructure { @@ -264,7 +266,10 @@ public class DataSourceMigrationForVersion_9_1 extends ByMajorMigrationVersionRe flushWell(executor, wellStructure); } } - executor.addScript("03", "drop-table-wellPlan"); + executor.addScript("02", "drop-table-wellPlan"); + + // See https://gitlab.com/ultreiaio/ird-observe/-/issues/2492 + executor.addScript("03", "adapt-table-ps_observation_catch_speciesFate_notnull"); } private Map<String, List<WellPlanStructure>> splitByTrip(List<WellPlanStructure> existingWellPlan) { ===================================== core/persistence/resources/src/main/resources/db/migration/v9/9.1/03_drop-table-wellPlan-H2.sql → core/persistence/resources/src/main/resources/db/migration/v9/9.1/02_drop-table-wellPlan-H2.sql ===================================== ===================================== core/persistence/resources/src/main/resources/db/migration/v9/9.1/03_drop-table-wellPlan-PG.sql → core/persistence/resources/src/main/resources/db/migration/v9/9.1/02_drop-table-wellPlan-PG.sql ===================================== ===================================== core/persistence/resources/src/main/resources/db/migration/v9/9.1/03_adapt-table-ps_observation_catch_speciesFate_notnull-H2.sql ===================================== @@ -0,0 +1,24 @@ +--- +-- #%L +-- ObServe Core :: Persistence :: Resources +-- %% +-- Copyright (C) 2008 - 2022 IRD, Ultreia.io +-- %% +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as +-- published by the Free Software Foundation, either version 3 of the +-- License, or (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public +-- License along with this program. If not, see +-- <http://www.gnu.org/licenses/gpl-3.0.html>. +-- #L% +--- +UPDATE ps_observation.Catch SET speciesFate = 'fr.ird.referential.ps.common.SpeciesFate#1239832683621#0.9099804284263154', comment = 'Devenir passé de null à ''Autres'' par la migration 9.1' WHERE speciesFate IS NULL AND comment IS NULL; +UPDATE ps_observation.Catch SET speciesFate = 'fr.ird.referential.ps.common.SpeciesFate#1239832683621#0.9099804284263154', comment = CONCAT(comment, STRINGDECODE('\nDevenir passé de null à ''Autres'' par la migration 9.1')) WHERE speciesFate IS NULL; +ALTER TABLE ps_observation.Catch ALTER COLUMN speciesFate SET NOT NULL; ===================================== core/persistence/resources/src/main/resources/db/migration/v9/9.1/03_adapt-table-ps_observation_catch_speciesFate_notnull-PG.sql ===================================== @@ -0,0 +1,24 @@ +--- +-- #%L +-- ObServe Core :: Persistence :: Resources +-- %% +-- Copyright (C) 2008 - 2022 IRD, Ultreia.io +-- %% +-- This program is free software: you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as +-- published by the Free Software Foundation, either version 3 of the +-- License, or (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- +-- You should have received a copy of the GNU General Public +-- License along with this program. If not, see +-- <http://www.gnu.org/licenses/gpl-3.0.html>. +-- #L% +--- +UPDATE ps_observation.Catch SET speciesFate = 'fr.ird.referential.ps.common.SpeciesFate#1239832683621#0.9099804284263154', comment = 'Devenir passé de null à ''Autres'' par la migration 9.1' WHERE speciesFate IS NULL AND comment IS NULL; +UPDATE ps_observation.Catch SET speciesFate = 'fr.ird.referential.ps.common.SpeciesFate#1239832683621#0.9099804284263154', comment = CONCAT(comment, E'\nDevenir passé de null à ''Autres'' par la migration 9.1') WHERE speciesFate IS NULL; +ALTER TABLE ps_observation.Catch ALTER COLUMN speciesFate SET NOT NULL; ===================================== core/persistence/resources/src/main/resources/db/migration/v9/9.1/empty-schema-H2.sql ===================================== @@ -180,7 +180,7 @@ create table ps_logbook.wellSamplingConformity (topiaId varchar(255) not null, t create table ps_logbook.wellSamplingStatus (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, code varchar(255) not null, uri varchar(255), homeId varchar(255), needComment boolean default false not null, status integer not null, label1 varchar(255) not null, label2 varchar(255) not null, label3 varchar(255) not null, label4 varchar(255), label5 varchar(255), label6 varchar(255), label7 varchar(255), label8 varchar(255), primary key (topiaId)); create table ps_observation.activity (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, homeId varchar(255), comment varchar(8192), time time not null, latitude numeric, longitude numeric, vesselSpeed numeric, seaSurfaceTemperature numeric, observedSystemDistance numeric, ersId varchar(255), vesselActivity varchar(255) not null, surroundingActivity varchar(255), wind varchar(255), detectionMode varchar(255), reasonForNoFishing varchar(255), currentFpaZone varchar(255), previousFpaZone varchar(255), nextFpaZone varchar(255), dataQuality varchar(255), route varchar(255) not null, primary key (topiaId)); create table ps_observation.activity_observedSystem (activity varchar(255) not null, observedSystem varchar(255) not null, primary key (activity, observedSystem)); -create table ps_observation.catch (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, homeId varchar(255), comment varchar(8192), catchWeight numeric, catchWeightComputedSource integer, meanWeight numeric, meanWeightComputedSource integer, meanLength numeric, meanLengthComputedSource integer, totalCount integer, totalCountComputedSource integer, well varchar(255), reasonForDiscard varchar(255), informationSource varchar(255) not null, species varchar(255) not null, weightMeasureMethod varchar(255), lengthMeasureMethod varchar(255), speciesFate varchar(255), set varchar(255) not null, set_idx integer, primary key (topiaId)); +create table ps_observation.catch (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, homeId varchar(255), comment varchar(8192), catchWeight numeric, catchWeightComputedSource integer, meanWeight numeric, meanWeightComputedSource integer, meanLength numeric, meanLengthComputedSource integer, totalCount integer, totalCountComputedSource integer, well varchar(255), reasonForDiscard varchar(255), informationSource varchar(255) not null, species varchar(255) not null, weightMeasureMethod varchar(255), lengthMeasureMethod varchar(255), speciesFate varchar(255) not null, set varchar(255) not null, set_idx integer, primary key (topiaId)); create table ps_observation.detectionMode (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, code varchar(255) not null, uri varchar(255), homeId varchar(255), needComment boolean default false not null, status integer not null, label1 varchar(255) not null, label2 varchar(255) not null, label3 varchar(255) not null, label4 varchar(255), label5 varchar(255), label6 varchar(255), label7 varchar(255), label8 varchar(255), primary key (topiaId)); create table ps_observation.floatingObject (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, homeId varchar(255), comment varchar(8192), objectOperation varchar(255), supportVesselName varchar(32), computedWhenArrivingBiodegradable varchar(255), computedWhenArrivingNonEntangling varchar(255), computedWhenArrivingSimplifiedObjectType varchar(255), computedWhenLeavingBiodegradable varchar(255), computedWhenLeavingNonEntangling varchar(255), computedWhenLeavingSimplifiedObjectType varchar(255), activity varchar(255) not null, primary key (topiaId)); create table ps_observation.floatingObjectPart (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, homeId varchar(255), whenArriving varchar(255), whenLeaving varchar(255), objectMaterial varchar(255) not null, floatingObject varchar(255) not null, primary key (topiaId)); ===================================== core/persistence/resources/src/main/resources/db/migration/v9/9.1/empty-schema-PG.sql ===================================== @@ -180,7 +180,7 @@ create table ps_logbook.wellSamplingConformity (topiaId varchar(255) not null, t create table ps_logbook.wellSamplingStatus (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, code varchar(255) not null, uri varchar(255), homeId varchar(255), needComment boolean default false not null, status integer not null, label1 varchar(255) not null, label2 varchar(255) not null, label3 varchar(255) not null, label4 varchar(255), label5 varchar(255), label6 varchar(255), label7 varchar(255), label8 varchar(255), primary key (topiaId)); create table ps_observation.activity (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, homeId varchar(255), comment varchar(8192), time time not null, latitude numeric, longitude numeric, vesselSpeed numeric, seaSurfaceTemperature numeric, observedSystemDistance numeric, ersId varchar(255), vesselActivity varchar(255) not null, surroundingActivity varchar(255), wind varchar(255), detectionMode varchar(255), reasonForNoFishing varchar(255), currentFpaZone varchar(255), previousFpaZone varchar(255), nextFpaZone varchar(255), dataQuality varchar(255), route varchar(255) not null, primary key (topiaId)); create table ps_observation.activity_observedSystem (activity varchar(255) not null, observedSystem varchar(255) not null, primary key (activity, observedSystem)); -create table ps_observation.catch (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, homeId varchar(255), comment varchar(8192), catchWeight numeric, catchWeightComputedSource integer, meanWeight numeric, meanWeightComputedSource integer, meanLength numeric, meanLengthComputedSource integer, totalCount integer, totalCountComputedSource integer, well varchar(255), reasonForDiscard varchar(255), informationSource varchar(255) not null, species varchar(255) not null, weightMeasureMethod varchar(255), lengthMeasureMethod varchar(255), speciesFate varchar(255), set varchar(255) not null, set_idx integer, primary key (topiaId)); +create table ps_observation.catch (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, homeId varchar(255), comment varchar(8192), catchWeight numeric, catchWeightComputedSource integer, meanWeight numeric, meanWeightComputedSource integer, meanLength numeric, meanLengthComputedSource integer, totalCount integer, totalCountComputedSource integer, well varchar(255), reasonForDiscard varchar(255), informationSource varchar(255) not null, species varchar(255) not null, weightMeasureMethod varchar(255), lengthMeasureMethod varchar(255), speciesFate varchar(255) not null, set varchar(255) not null, set_idx integer, primary key (topiaId)); create table ps_observation.detectionMode (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, code varchar(255) not null, uri varchar(255), homeId varchar(255), needComment boolean default false not null, status integer not null, label1 varchar(255) not null, label2 varchar(255) not null, label3 varchar(255) not null, label4 varchar(255), label5 varchar(255), label6 varchar(255), label7 varchar(255), label8 varchar(255), primary key (topiaId)); create table ps_observation.floatingObject (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, homeId varchar(255), comment varchar(8192), objectOperation varchar(255), supportVesselName varchar(32), computedWhenArrivingBiodegradable varchar(255), computedWhenArrivingNonEntangling varchar(255), computedWhenArrivingSimplifiedObjectType varchar(255), computedWhenLeavingBiodegradable varchar(255), computedWhenLeavingNonEntangling varchar(255), computedWhenLeavingSimplifiedObjectType varchar(255), activity varchar(255) not null, primary key (topiaId)); create table ps_observation.floatingObjectPart (topiaId varchar(255) not null, topiaVersion bigint not null, topiaCreateDate timestamp not null, lastUpdateDate timestamp default CURRENT_TIMESTAMP not null, homeId varchar(255), whenArriving varchar(255), whenLeaving varchar(255), objectMaterial varchar(255) not null, floatingObject varchar(255) not null, primary key (topiaId)); ===================================== model/src/main/models/Observe/persistence/attribute/notNull.properties ===================================== @@ -169,6 +169,7 @@ data.ps.observation.Activity.attribute.time=true data.ps.observation.Activity.attribute.vesselActivity=true data.ps.observation.Catch.attribute.informationSource=true data.ps.observation.Catch.attribute.species=true +data.ps.observation.Catch.attribute.speciesFate=true data.ps.observation.FloatingObjectPart.attribute.objectMaterial=true data.ps.observation.NonTargetCatchRelease.attribute.count=true data.ps.observation.NonTargetCatchRelease.attribute.sex=true ===================================== server/runner/src/main/webResources/doc/api/public/data/ps/logbook/Activity/validation-create-error.xml ===================================== @@ -231,6 +231,12 @@ </field> <field name="schoolType"> + <!-- schoolType is mandatory except if !setEnabled --> + <field-validator type="mandatory" short-circuit="true"> + <param name="skip"><![CDATA[ !setEnabled ]]></param> + <message>observe.data.ps.logbook.Activity.schoolType.validation.required</message> + </field-validator> + <!-- check if referential schoolType is disabled (only if validation is strong) --> <field-validator type="checkDisabledReferentialOnErrorScope"> <message/> ===================================== server/runner/src/main/webResources/doc/api/public/data/ps/logbook/Activity/validation-create.json ===================================== @@ -122,7 +122,8 @@ }, "schoolType": { "errors": [ - "check if referential schoolType is disabled (only if validation is strong)" + "check if referential schoolType is disabled (only if validation is strong)", + "schoolType is mandatory except if !setEnabled" ], "warnings": [ "check if referential schoolType is disabled (only if validation is not strong)" ===================================== server/runner/src/main/webResources/doc/api/public/data/ps/logbook/Activity/validation-update-error.xml ===================================== @@ -231,6 +231,12 @@ </field> <field name="schoolType"> + <!-- schoolType is mandatory except if !setEnabled --> + <field-validator type="mandatory" short-circuit="true"> + <param name="skip"><![CDATA[ !setEnabled ]]></param> + <message>observe.data.ps.logbook.Activity.schoolType.validation.required</message> + </field-validator> + <!-- check if referential schoolType is disabled (only if validation is strong) --> <field-validator type="checkDisabledReferentialOnErrorScope"> <message/> ===================================== server/runner/src/main/webResources/doc/api/public/data/ps/logbook/Activity/validation-update.json ===================================== @@ -122,7 +122,8 @@ }, "schoolType": { "errors": [ - "check if referential schoolType is disabled (only if validation is strong)" + "check if referential schoolType is disabled (only if validation is strong)", + "schoolType is mandatory except if !setEnabled" ], "warnings": [ "check if referential schoolType is disabled (only if validation is not strong)" ===================================== server/runner/src/main/webResources/doc/api/public/data/ps/observation/Catch/validation-create-error.xml ===================================== @@ -118,6 +118,11 @@ </field> <field name="speciesFate"> + <!-- speciesFate is mandatory --> + <field-validator type="mandatory" short-circuit="true"> + <message/> + </field-validator> + <!-- check if referential speciesFate is disabled (only if validation is strong) --> <field-validator type="checkDisabledReferentialOnErrorScope"> <message/> ===================================== server/runner/src/main/webResources/doc/api/public/data/ps/observation/Catch/validation-create.json ===================================== @@ -68,7 +68,8 @@ }, "speciesFate": { "errors": [ - "check if referential speciesFate is disabled (only if validation is strong)" + "check if referential speciesFate is disabled (only if validation is strong)", + "speciesFate is mandatory" ], "warnings": [ "check if referential speciesFate is disabled (only if validation is not strong)" ===================================== server/runner/src/main/webResources/doc/api/public/data/ps/observation/Catch/validation-update-error.xml ===================================== @@ -123,6 +123,11 @@ </field> <field name="speciesFate"> + <!-- speciesFate is mandatory --> + <field-validator type="mandatory" short-circuit="true"> + <message/> + </field-validator> + <!-- check if referential speciesFate is disabled (only if validation is strong) --> <field-validator type="checkDisabledReferentialOnErrorScope"> <message/> ===================================== server/runner/src/main/webResources/doc/api/public/data/ps/observation/Catch/validation-update.json ===================================== @@ -68,7 +68,8 @@ }, "speciesFate": { "errors": [ - "check if referential speciesFate is disabled (only if validation is strong)" + "check if referential speciesFate is disabled (only if validation is strong)", + "speciesFate is mandatory" ], "warnings": [ "check if referential speciesFate is disabled (only if validation is not strong)" View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/ddda2036ede355ce9c9c47d6e... -- View it on GitLab: https://gitlab.com/ultreiaio/ird-observe/-/compare/ddda2036ede355ce9c9c47d6e... You're receiving this email because of your account on gitlab.com.
participants (1)
-
Tony CHEMIT (@tchemit)