branch develop updated (e72c6d7 -> 270aa57)
This is an automated email from the git hooks/post-receive script. New change to branch develop in repository observe. See http://git.codelutin.com/observe.git from e72c6d7 ajout de la constant label pour le label traduit (refs #7698) new 028920c migration de l'écran de calcul des données (refs #7679) new 8564b8f maj fichier de traduction (refs #7679) new 270aa57 Merge branch 'feature/7679' into develop The 3 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 270aa576037041815b506fad53e8b6fdfae806c5 Merge: e72c6d7 8564b8f Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri Nov 6 15:24:14 2015 +0100 Merge branch 'feature/7679' into develop commit 8564b8f7a0a5f51661c0419af62e440307bb99b7 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri Nov 6 15:22:19 2015 +0100 maj fichier de traduction (refs #7679) commit 028920cbed3e19cc92159676616305152aa7fa0f Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri Nov 6 14:59:24 2015 +0100 migration de l'écran de calcul des données (refs #7679) Summary of changes: .../java/fr/ird/observe/ui/admin/AdminStep.java | 3 +- .../ui/admin/consolidate/ConsolidateModel.java | 45 ------ .../ui/admin/consolidate/ConsolidateUIHandler.java | 159 +++++++++------------ .../observe-application-swing_en_GB.properties | 3 + .../observe-application-swing_es_ES.properties | 3 + .../observe-application-swing_fr_FR.properties | 3 + .../consolidate/ConsolidateDataService.java | 2 + .../java/fr/ird/observe/services/dto/IdDtos.java | 20 +++ .../services/ObserveServiceFactoryRest.java | 7 + .../service/seine/NonTargetCatchServiceTopia.java | 4 +- 10 files changed, 109 insertions(+), 140 deletions(-) -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See http://git.codelutin.com/observe.git commit 028920cbed3e19cc92159676616305152aa7fa0f Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri Nov 6 14:59:24 2015 +0100 migration de l'écran de calcul des données (refs #7679) --- .../java/fr/ird/observe/ui/admin/AdminStep.java | 3 +- .../ui/admin/consolidate/ConsolidateModel.java | 45 ------ .../ui/admin/consolidate/ConsolidateUIHandler.java | 159 +++++++++------------ .../observe-application-swing_fr_FR.properties | 3 + .../consolidate/ConsolidateDataService.java | 2 + .../java/fr/ird/observe/services/dto/IdDtos.java | 20 +++ .../services/ObserveServiceFactoryRest.java | 7 + .../service/seine/NonTargetCatchServiceTopia.java | 4 +- 8 files changed, 103 insertions(+), 140 deletions(-) diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminStep.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminStep.java index 4d514ab..6317db5 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminStep.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/AdminStep.java @@ -137,7 +137,8 @@ public enum AdminStep implements WizardExtStep { false, false, DbMode.USE_LOCAL, - DbMode.USE_REMOTE + DbMode.USE_REMOTE, + DbMode.USE_SERVER ), /** pour lancer la generation des rapports */ diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/consolidate/ConsolidateModel.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/consolidate/ConsolidateModel.java index d98f842..8629c23 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/consolidate/ConsolidateModel.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/consolidate/ConsolidateModel.java @@ -22,13 +22,8 @@ package fr.ird.observe.ui.admin.consolidate; import fr.ird.observe.db.ObserveSwingDataSource; -import fr.ird.observe.services.dto.referential.ProgramDto; -import fr.ird.observe.services.dto.seine.ActivitySeineDto; -import fr.ird.observe.services.dto.seine.SetSeineDto; -import fr.ird.observe.services.dto.seine.TripSeineDto; import fr.ird.observe.ui.admin.AdminActionModel; import fr.ird.observe.ui.admin.AdminStep; -import org.nuiton.decorator.Decorator; /** * Modele pour preparer une validation de donnees d'une base. @@ -41,14 +36,6 @@ public class ConsolidateModel extends AdminActionModel { /** la source de données où effectuer la consolidation des données */ private ObserveSwingDataSource source; - private Decorator<ProgramDto> programDecorator; - - private Decorator<TripSeineDto> tripDecorator; - - private Decorator<SetSeineDto> setDecorator; - - private Decorator<ActivitySeineDto> activityDecorator; - public ConsolidateModel() { super(AdminStep.CONSOLIDATE); } @@ -61,38 +48,6 @@ public class ConsolidateModel extends AdminActionModel { this.source = source; } - public Decorator<ProgramDto> getProgramDecorator() { - return programDecorator; - } - - public void setProgramDecorator(Decorator<ProgramDto> programDecorator) { - this.programDecorator = programDecorator; - } - - public Decorator<TripSeineDto> getTripDecorator() { - return tripDecorator; - } - - public void setTripDecorator(Decorator<TripSeineDto> tripDecorator) { - this.tripDecorator = tripDecorator; - } - - public Decorator<SetSeineDto> getSetDecorator() { - return setDecorator; - } - - public void setSetDecorator(Decorator<SetSeineDto> setDecorator) { - this.setDecorator = setDecorator; - } - - public Decorator<ActivitySeineDto> getActivityDecorator() { - return activityDecorator; - } - - public void setActivityDecorator(Decorator<ActivitySeineDto> activityDecorator) { - this.activityDecorator = activityDecorator; - } - @Override public void destroy() { super.destroy(); diff --git a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/consolidate/ConsolidateUIHandler.java b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/consolidate/ConsolidateUIHandler.java index b523e9b..31e1e31 100644 --- a/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/consolidate/ConsolidateUIHandler.java +++ b/observe-application-swing/src/main/java/fr/ird/observe/ui/admin/consolidate/ConsolidateUIHandler.java @@ -21,28 +21,31 @@ */ package fr.ird.observe.ui.admin.consolidate; -import fr.ird.observe.ui.DecoratorService; +import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; import fr.ird.observe.db.ObserveSwingDataSource; -import fr.ird.observe.services.dto.referential.ProgramDto; -import fr.ird.observe.services.dto.seine.ActivitySeineDto; -import fr.ird.observe.services.dto.seine.SetSeineDto; -import fr.ird.observe.services.dto.seine.TripSeineDto; +import fr.ird.observe.services.dto.IdDtos; +import fr.ird.observe.services.dto.ReferenceDto; +import fr.ird.observe.services.dto.ReferenceDtos; +import fr.ird.observe.services.service.actions.consolidate.ConsolidateActivitySeineDataResult; +import fr.ird.observe.services.service.actions.consolidate.ConsolidateDataService; +import fr.ird.observe.services.service.actions.consolidate.ConsolidateTripSeineDataRequest; +import fr.ird.observe.services.service.actions.consolidate.ConsolidateTripSeineDataResult; import fr.ird.observe.ui.admin.AdminStep; import fr.ird.observe.ui.admin.AdminTabUI; import fr.ird.observe.ui.admin.AdminTabUIHandler; import fr.ird.observe.ui.admin.AdminUI; import fr.ird.observe.ui.admin.AdminUIModel; import fr.ird.observe.ui.admin.config.SelectDataUI; +import fr.ird.observe.ui.storage.tabs.DataSelectionModel; import jaxx.runtime.swing.wizard.ext.WizardState; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.decorator.Decorator; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; -import java.util.ArrayList; import java.util.Date; -import java.util.List; +import java.util.Set; import java.util.concurrent.Callable; import static org.nuiton.i18n.I18n.t; @@ -91,11 +94,10 @@ public class ConsolidateUIHandler extends AdminTabUIHandler { // avoid multi-cast return; } - //FIXME -// DataSelectionModel value = (DataSelectionModel) evt.getNewValue(); -// if (log.isDebugEnabled()) { -// log.debug("selection model changed to " + value); -// } + DataSelectionModel value = (DataSelectionModel) evt.getNewValue(); + if (log.isDebugEnabled()) { + log.debug("selection model changed to " + value); + } updateSelectionModel(selectTabUI); } }; @@ -130,73 +132,58 @@ public class ConsolidateUIHandler extends AdminTabUIHandler { // une erreur ou une annulation return init; } - //FIXME -// java.util.Set<String> tripIds = model.getSelectionDataModel().getSelectedData(); -// List<TripSeineDto> toUpdate = new ArrayList<TripSeineDto>(tripIds.size()); - -// ConsolidateDataService service = -// ObserveServiceHelper.getConsolidateDataService(); - - ObserveSwingDataSource source = getStepModel().getSource(); - String txName = "consolidateData"; - - //FIXME -// TopiaContext tx = source.beginTransaction(txName); -// try { -// TopiaDAO<TripSeine> dao = source.getDAO(tx, TripSeine.class); -// for (String mareeId : tripIds) { -// -// if (Entities.isSeineId(mareeId)) { -// -// TripSeine trip = (TripSeine) tx.findByTopiaId(mareeId); -// -// boolean needUpdate = service.consolidateTrip(this, tx, trip); -// if (needUpdate) { -// -// // on met a jour la maree en base -// dao.update(trip); -// -// // on conserve une reference sur la maree mise à jour -// toUpdate.add(trip); -// } -// -// } -// -// } -// -// // on commite si quelque chose a ete mise a jour -// boolean needCommit = !toUpdate.isEmpty(); -// -// if (needCommit) { -// -// sendMessage(t("observe.message.consolidate.save.changes", -// toUpdate.size())); -// source.commitTransaction(tx, txName); -// } -// -// } catch (Exception eee) { -// try { -// source.rollbackTransaction(tx, txName); -// } catch (DataSourceException e1) { -// -// // une autre erreur lors du rollback, qui ne doit pas empecher -// // de continuer le traitement -// if (log.isErrorEnabled()) { -// log.error(e1); -// } -// } -// throw eee; -// } finally { -// -// // clean service -// service.clear(); -// -// // toujours fermer la transaction -// source.closeTransaction(tx, txName); -// } - - sendMessage(t("observe.message.consolidate.operation.done", - new Date())); + Set<ReferenceDto> trips = model.getSelectionDataModel().getSelectedData(); + ImmutableSet<String> tripIds = ImmutableSet.copyOf( + Iterables.transform( + Iterables.filter(trips, IdDtos.<ReferenceDto>newTripSeinePredicate()), + ReferenceDtos.getIdFunction())); + + + ObserveSwingDataSource dataSource = getStepModel().getSource(); + + try { + + ConsolidateDataService consolidateDataService = dataSource.newService(ConsolidateDataService.class); + + ConsolidateTripSeineDataRequest request = new ConsolidateTripSeineDataRequest(); + request.setTripSeineIds(tripIds); + request.setFailIfLenghtWeightParameterNotFound(false); + + ImmutableSet<ConsolidateTripSeineDataResult> results = consolidateDataService.consolidateTripSeines(request); + + if (results.isEmpty()) { + + sendMessage(t("observe.message.consolidate.noChanges")); + + } else { + + for (ConsolidateTripSeineDataResult tripSeineDataResult : results) { + + String tripSeineLabel = tripSeineDataResult.getTripSeineLabel(); + + sendMessage(t("observe.message.consolidate.trip", tripSeineLabel)); + + for (ConsolidateActivitySeineDataResult activitySeineDataResult : tripSeineDataResult.getConsolidateActivitySeineDataResults()) { + + sendMessage(t("observe.message.consolidate.activity", activitySeineDataResult.getActivitySeineLabel())); + + } + + } + + sendMessage(t("observe.message.consolidate.save.changes", results.size())); + } + + sendMessage(t("observe.message.consolidate.operation.done", + new Date())); + + } finally { + + dataSource.close(); + + } + + return WizardState.SUCCESSED; } @@ -209,18 +196,6 @@ public class ConsolidateUIHandler extends AdminTabUIHandler { openSource(source); - DecoratorService dProvider = getDecoratorService(); - ConsolidateModel stepModel = getStepModel(); - - Decorator<ProgramDto> p = dProvider.getDecoratorByType(ProgramDto.class); - Decorator<TripSeineDto> m = dProvider.getDecoratorByType(TripSeineDto.class); - Decorator<ActivitySeineDto> a = dProvider.getDecoratorByType(ActivitySeineDto.class); - Decorator<SetSeineDto> c = dProvider.getDecoratorByType(SetSeineDto.class); - stepModel.setProgramDecorator(p); - stepModel.setTripDecorator(m); - stepModel.setActivityDecorator(a); - stepModel.setSetDecorator(c); - return null; } diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties index ff24e33..4a76daf 100644 --- a/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties +++ b/observe-application-swing/src/main/resources/i18n/observe-application-swing_fr_FR.properties @@ -1443,8 +1443,11 @@ observe.message.can.not.write.data=Vous n'êtes pas autorisé à écrire des don observe.message.cant.add.echantillonRejetThon=<html><body><strong>Impossible d'ajouter des échantillons de rejet thons</strong>(pas de rejet thon monté sur le pont)</body></html> observe.message.cant.add.echantillonTargetCatch=<html><body><strong>Impossible d'ajouter des échantillons thons</strong> (pas de capture thon)</body></html> observe.message.cant.add.nonTargetSample=<html><body><strong>Impossible d'ajouter des échantillons</strong>(pas de rejet faune)</body></html> +observe.message.consolidate.activity=Données calculées pour l'activité %1$s +observe.message.consolidate.noChanges=Aucune donnée nodifiée. observe.message.consolidate.operation.done=Opération de calcul des données terminée à %1$s. observe.message.consolidate.save.changes=Sauvegarde des modifications sur la(es) %1$s marée(s) modifiée(s). +observe.message.consolidate.trip=Données calculées pour la marée %1$s observe.message.creating.referentiel=L'objet est en cours de création. observe.message.db.closed=%1$s a été fermé observe.message.db.loaded=%1$s chargé diff --git a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/consolidate/ConsolidateDataService.java b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/consolidate/ConsolidateDataService.java index bc05d4b..c406a7e 100644 --- a/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/consolidate/ConsolidateDataService.java +++ b/observe-services-api/src/main/java/fr/ird/observe/services/service/actions/consolidate/ConsolidateDataService.java @@ -26,6 +26,7 @@ import com.google.common.collect.ImmutableSet; import fr.ird.observe.services.ObserveService; import fr.ird.observe.services.spi.PostRequest; import fr.ird.observe.services.spi.ReadDataPermission; +import fr.ird.observe.services.spi.Write; import fr.ird.observe.services.spi.WriteDataPermission; /** @@ -48,6 +49,7 @@ public interface ConsolidateDataService extends ObserveService{ @ReadDataPermission @WriteDataPermission @PostRequest + @Write ImmutableSet<ConsolidateTripSeineDataResult> consolidateTripSeines(ConsolidateTripSeineDataRequest consolidateTripSeineDataRequest); } diff --git a/observe-services-model/src/main/java/fr/ird/observe/services/dto/IdDtos.java b/observe-services-model/src/main/java/fr/ird/observe/services/dto/IdDtos.java index 5a3dc17..625bfeb 100644 --- a/observe-services-model/src/main/java/fr/ird/observe/services/dto/IdDtos.java +++ b/observe-services-model/src/main/java/fr/ird/observe/services/dto/IdDtos.java @@ -33,6 +33,26 @@ public class IdDtos extends AbstractIdDtos { return Iterables.find(source, newIdPredicate(id)); } + public static <BeanType extends IdDto> Predicate<BeanType> newTripSeinePredicate() { + return new Predicate<BeanType>() { + + @Override + public boolean apply(BeanType input) { + return isTripSeine(input) ; + } + }; + } + + public static <BeanType extends IdDto> Predicate<BeanType> newTripLonglinePredicate() { + return new Predicate<BeanType>() { + + @Override + public boolean apply(BeanType input) { + return isTripLongline(input) ; + } + }; + } + public static boolean isTrip(IdDto dto) { return isTripSeine(dto) || isTripLongline(dto); } diff --git a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java index 918a6c3..b3034ed 100644 --- a/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java +++ b/observe-services-rest/src/main/java/fr/ird/observe/services/ObserveServiceFactoryRest.java @@ -23,9 +23,12 @@ package fr.ird.observe.services; */ import com.google.common.base.Preconditions; +import com.google.common.base.Predicate; import com.google.common.base.Strings; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Iterables; +import com.google.common.collect.Lists; import com.google.common.reflect.Reflection; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -51,7 +54,11 @@ import org.apache.commons.logging.LogFactory; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.lang.reflect.TypeVariable; import java.util.Collection; +import java.util.List; /** * Created on 16/08/15. diff --git a/observe-services-topia/src/main/java/fr/ird/observe/services/service/seine/NonTargetCatchServiceTopia.java b/observe-services-topia/src/main/java/fr/ird/observe/services/service/seine/NonTargetCatchServiceTopia.java index fc9a0d1..932f94c 100644 --- a/observe-services-topia/src/main/java/fr/ird/observe/services/service/seine/NonTargetCatchServiceTopia.java +++ b/observe-services-topia/src/main/java/fr/ird/observe/services/service/seine/NonTargetCatchServiceTopia.java @@ -85,7 +85,7 @@ public class NonTargetCatchServiceTopia extends ObserveServiceTopia implements N SetSeineNonTargetCatchDto setSeineNonTargetCatchDto = form.getForm(); // on cherche si il y a des échantillons sur les captures - if (setSeine.sizeNonTargetCatch() > 0) { + if (setSeine.sizeNonTargetSample() > 0) { NonTargetSample nonTargetSample = Iterables.get(setSeine.getNonTargetSample(), 0); if (nonTargetSample != null) { @@ -129,7 +129,7 @@ public class NonTargetCatchServiceTopia extends ObserveServiceTopia implements N // on supprime les échantillons qui ne correspondent plus a des capture - if (setSeine.sizeNonTargetCatch() > 0) { + if (setSeine.sizeNonTargetSample() > 0) { NonTargetSample nonTargetSample = Iterables.get(setSeine.getNonTargetSample(), 0); Set<Species> speciesCatchs = Sets.newHashSet(Iterables.transform( -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See http://git.codelutin.com/observe.git commit 8564b8f7a0a5f51661c0419af62e440307bb99b7 Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri Nov 6 15:22:19 2015 +0100 maj fichier de traduction (refs #7679) --- .../src/main/resources/i18n/observe-application-swing_en_GB.properties | 3 +++ .../src/main/resources/i18n/observe-application-swing_es_ES.properties | 3 +++ 2 files changed, 6 insertions(+) diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties index 7f292b5..9817a9b 100644 --- a/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties +++ b/observe-application-swing/src/main/resources/i18n/observe-application-swing_en_GB.properties @@ -1448,8 +1448,11 @@ observe.message.can.not.write.data= observe.message.cant.add.echantillonRejetThon= observe.message.cant.add.echantillonTargetCatch= observe.message.cant.add.nonTargetSample= +observe.message.consolidate.activity= +observe.message.consolidate.noChanges= observe.message.consolidate.operation.done= observe.message.consolidate.save.changes= +observe.message.consolidate.trip= observe.message.creating.referentiel= observe.message.db.closed=%1$s was closed observe.message.db.loaded=%1$s was loaded diff --git a/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties b/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties index ec40c79..a66e9dd 100644 --- a/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties +++ b/observe-application-swing/src/main/resources/i18n/observe-application-swing_es_ES.properties @@ -1450,8 +1450,11 @@ observe.message.can.not.write.data=No tiene autorización para escribir los dato observe.message.cant.add.echantillonRejetThon=Imposible añadir los muestreos de descartes de atunes (no hay descartes de atunes izados a bordo). observe.message.cant.add.echantillonTargetCatch=Imposible añadir los muestreos de atunes (no hay captura de atunes) observe.message.cant.add.nonTargetSample=Imposible añadir los muestreos (no hay descartes de fauna +observe.message.consolidate.activity= +observe.message.consolidate.noChanges= observe.message.consolidate.operation.done=Operación de calculo de datos terminada en %1$s. observe.message.consolidate.save.changes=Guardar las modificaciones de la(s) %1$s marea(s) modificada(s). +observe.message.consolidate.trip= observe.message.creating.referentiel=Objeto en proceso de creación. observe.message.db.closed=%1$s ha sido cerrado observe.message.db.loaded=%1$s cargado -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository observe. See http://git.codelutin.com/observe.git commit 270aa576037041815b506fad53e8b6fdfae806c5 Merge: e72c6d7 8564b8f Author: Sylvain Bavencoff <bavencoff@codelutin.com> Date: Fri Nov 6 15:24:14 2015 +0100 Merge branch 'feature/7679' into develop .../java/fr/ird/observe/ui/admin/AdminStep.java | 3 +- .../ui/admin/consolidate/ConsolidateModel.java | 45 ------ .../ui/admin/consolidate/ConsolidateUIHandler.java | 159 +++++++++------------ .../observe-application-swing_en_GB.properties | 3 + .../observe-application-swing_es_ES.properties | 3 + .../observe-application-swing_fr_FR.properties | 3 + .../consolidate/ConsolidateDataService.java | 2 + .../java/fr/ird/observe/services/dto/IdDtos.java | 20 +++ .../services/ObserveServiceFactoryRest.java | 7 + .../service/seine/NonTargetCatchServiceTopia.java | 4 +- 10 files changed, 109 insertions(+), 140 deletions(-) -- To stop receiving notification emails like this one, please contact codelutin.com SCM administrator <admin+scm@list.forge.codelutin.com>.
participants (1)
-
codelutin.com scm