From a58ba34b4b6df4cdcc729ab0d0568ff179932856 Mon Sep 17 00:00:00 2001 From: david-cc Date: Wed, 7 Dec 2022 18:31:35 +0100 Subject: [PATCH 1/9] chore: #WB-1380, extract infrafront --- gulpfile.js | 27 ++++---------------------- package.json | 6 ++---- src/main/resources/view-src/stats.html | 7 +++---- 3 files changed, 9 insertions(+), 31 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index f3a9846..bc7ea25 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,10 +1,8 @@ var gulp = require('gulp'); var webpack = require('webpack-stream'); var merge = require('merge2'); -var rev = require('gulp-rev'); -var revReplace = require("gulp-rev-replace"); +const replace = require('gulp-replace'); var clean = require('gulp-clean'); -var sourcemaps = require('gulp-sourcemaps'); var argv = require('yargs').argv; var fs = require('fs'); @@ -13,16 +11,7 @@ gulp.task('drop-cache', function(){ .pipe(clean()); }); -gulp.task('copy-files', ['drop-cache'], () => { - var html = gulp.src('./node_modules/entcore/src/template/**/*.html') - .pipe(gulp.dest('./src/main/resources/public/template/entcore')); - var bundle = gulp.src('./node_modules/entcore/bundle/*') - .pipe(gulp.dest('./src/main/resources/public/dist/entcore')); - - return merge(html, bundle); -}) - -gulp.task('webpack', ['copy-files'], () => { +gulp.task('webpack', ['drop-cache'], () => { return gulp.src('./src/main/resources/public') .pipe(webpack(require('./webpack.config.js'))) .on('error', function handleError() { @@ -31,17 +20,9 @@ gulp.task('webpack', ['copy-files'], () => { .pipe(gulp.dest('./src/main/resources/public/dist')); }); -gulp.task('rev', ['webpack'], () => { - return gulp.src('./src/main/resources/public/dist/**/*.js') - .pipe(rev()) - .pipe(gulp.dest('./src/main/resources/public/dist')) - .pipe(rev.manifest()) - .pipe(gulp.dest('./')); -}); - -gulp.task('build', ['rev'], () => { +gulp.task('build', ['webpack'], () => { var refs = gulp.src("./src/main/resources/view-src/**/*.+(html|json|csv)") - .pipe(revReplace({manifest: gulp.src("./rev-manifest.json") })) + .pipe(replace('@@VERSION', Date.now())) .pipe(gulp.dest("./src/main/resources/view")); var copyBehaviours = gulp.src('./src/main/resources/public/dist/behaviours.js') diff --git a/package.json b/package.json index 1d94892..d5ec6cf 100644 --- a/package.json +++ b/package.json @@ -11,9 +11,6 @@ "entcore-toolkit": "^1.0.1", "gulp": "3.9.1", "gulp-clean": "^0.3.2", - "gulp-rev": "^7.1.2", - "gulp-rev-replace": "^0.4.3", - "gulp-sourcemaps": "^2.6.0", "merge2": "^1.1.0", "ts-loader": "^3.2.0", "typescript": "3.9.5", @@ -22,7 +19,8 @@ "yargs": "^8.0.2" }, "devDependencies": { - "@types/jquery": "^2.0.34" + "@types/jquery": "^2.0.34", + "gulp-replace": "1.0.0" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" diff --git a/src/main/resources/view-src/stats.html b/src/main/resources/view-src/stats.html index cc67128..fab500d 100644 --- a/src/main/resources/view-src/stats.html +++ b/src/main/resources/view-src/stats.html @@ -5,11 +5,10 @@ {{#i18n}}stats.title{{/i18n}} - - - - + + + From 3e9af92b9a6d5ac70aee81e8c66e2b5c38de5117 Mon Sep 17 00:00:00 2001 From: Benjamin Perez Date: Thu, 24 Nov 2022 18:29:17 +0100 Subject: [PATCH 2/9] release: 1.12.11 --- deployment/stats/conf.json.template | 2 +- gradle.properties | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deployment/stats/conf.json.template b/deployment/stats/conf.json.template index d12a423..ae2ccd1 100644 --- a/deployment/stats/conf.json.template +++ b/deployment/stats/conf.json.template @@ -1,5 +1,5 @@ { - "name": "fr.wseduc~stats~1.12-SNAPSHOT", + "name": "fr.wseduc~stats~1.12.11", "config": { "main" : "fr.wseduc.stats.Stats", "port" : 8225, diff --git a/gradle.properties b/gradle.properties index ca3c3c2..597bcff 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ modowner=fr.wseduc modname=stats # Your module version -version=1.12-SNAPSHOT +version=1.12.11 # The test timeout in seconds testtimeout=300 @@ -29,6 +29,6 @@ vertxVersion=3.9.5 toolsVersion=2.0.0-final junitVersion=4.10 -entCoreVersion=4.6-SNAPSHOT +entCoreVersion=4.6.0 vertxCronTimer=2.0.0 jodaTimeVersion=2.9.4 diff --git a/package.json b/package.json index d5ec6cf..0d62de2 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "@types/core-js": "0.9.42", "axios": "0.16.2", "core-js": "2.4.1", - "entcore": "~4.6.0-dev", + "entcore": "4.6.0", "entcore-toolkit": "^1.0.1", "gulp": "3.9.1", "gulp-clean": "^0.3.2", From 56bc234a7bd49d7ff6f53a22e7531931c7db7a7d Mon Sep 17 00:00:00 2001 From: Benjamin Perez Date: Fri, 13 Jan 2023 17:52:19 +0100 Subject: [PATCH 3/9] release: 1.12.12 --- deployment/stats/conf.json.template | 2 +- gradle.properties | 4 ++-- package.json | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/deployment/stats/conf.json.template b/deployment/stats/conf.json.template index ae2ccd1..9960bcd 100644 --- a/deployment/stats/conf.json.template +++ b/deployment/stats/conf.json.template @@ -1,5 +1,5 @@ { - "name": "fr.wseduc~stats~1.12.11", + "name": "fr.wseduc~stats~1.12.12", "config": { "main" : "fr.wseduc.stats.Stats", "port" : 8225, diff --git a/gradle.properties b/gradle.properties index 597bcff..44cbedb 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ modowner=fr.wseduc modname=stats # Your module version -version=1.12.11 +version=1.12.12 # The test timeout in seconds testtimeout=300 @@ -29,6 +29,6 @@ vertxVersion=3.9.5 toolsVersion=2.0.0-final junitVersion=4.10 -entCoreVersion=4.6.0 +entCoreVersion=4.7.0 vertxCronTimer=2.0.0 jodaTimeVersion=2.9.4 diff --git a/package.json b/package.json index 0d62de2..4ed099d 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "@types/core-js": "0.9.42", "axios": "0.16.2", "core-js": "2.4.1", - "entcore": "4.6.0", + "entcore": "4.7.0", "entcore-toolkit": "^1.0.1", "gulp": "3.9.1", "gulp-clean": "^0.3.2", From be08c90cde7818690c41c01aca57e4c64b4037bc Mon Sep 17 00:00:00 2001 From: Benjamin Perez Date: Fri, 27 Jan 2023 11:33:54 +0100 Subject: [PATCH 4/9] chore: prepare next development iteration --- gradle.properties | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 44cbedb..0c4f29a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -29,6 +29,6 @@ vertxVersion=3.9.5 toolsVersion=2.0.0-final junitVersion=4.10 -entCoreVersion=4.7.0 +entCoreVersion=4.8-SNAPSHOT vertxCronTimer=2.0.0 jodaTimeVersion=2.9.4 diff --git a/package.json b/package.json index 4ed099d..027abaa 100644 --- a/package.json +++ b/package.json @@ -7,7 +7,7 @@ "@types/core-js": "0.9.42", "axios": "0.16.2", "core-js": "2.4.1", - "entcore": "4.7.0", + "entcore": "~4.8.0-dev", "entcore-toolkit": "^1.0.1", "gulp": "3.9.1", "gulp-clean": "^0.3.2", From 11b9e6293814943e489e8978fcc6516cf7359445 Mon Sep 17 00:00:00 2001 From: Samuel JOLLOIS Date: Tue, 28 Feb 2023 17:23:39 +0100 Subject: [PATCH 5/9] fix(modules): #STAT-70 fix modules name and add translation in statistics --- src/main/resources/api-allowed-values.json | 10 +++++----- src/main/resources/i18n/en.json | 21 ++++++++++++++++++++- src/main/resources/i18n/fr.json | 21 ++++++++++++++++++++- 3 files changed, 45 insertions(+), 7 deletions(-) diff --git a/src/main/resources/api-allowed-values.json b/src/main/resources/api-allowed-values.json index ae3a4b0..0c14e78 100644 --- a/src/main/resources/api-allowed-values.json +++ b/src/main/resources/api-allowed-values.json @@ -8,13 +8,13 @@ "AideAuDevoirs","Alise","artips","Balado","BiblioCollege","Brne","Capytale","CerisePrim","CerisePro","Cesame","Chamilo", "CIDJ","CNS","corelycee","DeltaExpert","Educagri","Educ-Arte","Edulib","Edulib2","Edulib-Belin","Edulib-Magnard","EduMalin","EduMaxicours","EduMedia", "edumoov","Elea","Eliot","ElyceeHDF","English-Attack","Esidoc","EulerRessources","EulerRessources-pp","ExplorateurDeMetiers","FoliosOnisep", - "Formulaire","Formulaire-public","Diary","Edt","Competences","Viescolaire","Geogebra","GRR", - "HiSQOOL","Homework-assistance","HumanRoads","Interforum","InterForum","JuniorUniversalis","KiosqueEDU","KiosqueEDU-aca","KNE-Annabac","KNE-CNS","Kwyk","Labomep","LaboMEP", + "Formulaire","Formulaire-public","Diary","Edt","Competences","Viescolaire","Geogebra","GRR", "Jupyter", + "HiSQOOL","HomeworkAssistance","HumanRoads","Interforum","InterForum","JuniorUniversalis","KiosqueEDU","KiosqueEDU-aca","KNE-Annabac","KNE-CNS","Kwyk","Labomep","LaboMEP", "LDE","LeLivreScolaire","LeSite-tv","library","Lool","Lstl","madmagz","madmagz-77","madmagz-aisne","madmagz-draaf","madmagz-ent04","madmagz-idf","madmagz-na", "madmagz-nord","madmagz-oise","madmagz-paris","madmagz-regionhdf","madmagz-somme1d","madmagz-somme2d","milliweb-oAuth","MindViewOnline","Moodle","MSEL", - "numericours","numeritab","OGIL","OGIL-Region","Onisep","Onisep-Services","Passerelle","PasserellePise","Pearltrees","Peertube NA","PMB-lyceeconnecte","ProEPS", - "projet-voltaire","Pronote","Riot Region","Sacoche","Salvum","Scratch","Speakshake","Tactileo","TurboSelf","Universalis","Universalis-Junior", - "Webclasseur","Wekan Region","Wims-Auto","Wims-Euler","Wims-Math" + "numericours","numeritab","OGIL","OGIL-Region","Onisep","Onisep-Services","Passerelle","PasserellePise","Pearltrees","Peertube","PMB-lyceeconnecte","PMB-Gestion-lyceeconnecte", + "ProEPS","projet-voltaire","Pronote","Riot","Sacoche","Salvum","Scratch","Speakshake","Tactileo","TurboSelf","Universalis","Universalis-Junior", + "Webclasseur","Wekan","Wims-Auto","Wims-Euler","Wims-Math" ], "devices-mapping" : { "select-devices" : ["desktop", "mobile_app", "tablet"], diff --git a/src/main/resources/i18n/en.json b/src/main/resources/i18n/en.json index c34c44e..c17f791 100644 --- a/src/main/resources/i18n/en.json +++ b/src/main/resources/i18n/en.json @@ -57,5 +57,24 @@ "myaccount": "My Account", "classparam": "Class settings", "zimbra" : "Messaging", - "presences" : "Attendance" + "presences" : "Attendance", + "webconference": "Access to a virtual room", + "moodle": "Moodle", + "pmb-lyceeconnecte": "PMB", + "pmb-gestion-lyceeconnecte" : "PMB Gestion", + "capytale": "Capytale", + "cerisepro": "Cerise Pro", + "edumedia": "Edumedia", + "esidoc": "Esidoc", + "foliosonisep": "Folios Onisep", + "library": "Library", + "onisep": "Onisep", + "pronote": "Pronote", + "scratch": "Scratch", + "geogebra": "GeoGebra", + "lool": "Lool", + "riot": "Riot", + "wekan": "Wekan", + "peertube": "Peertube", + "jupyter": "Jupyter" } diff --git a/src/main/resources/i18n/fr.json b/src/main/resources/i18n/fr.json index a1475be..7574145 100644 --- a/src/main/resources/i18n/fr.json +++ b/src/main/resources/i18n/fr.json @@ -100,5 +100,24 @@ "stats.error.nonadmlofstructure": "Vous n'avez pas accès aux statistiques de l'établissement, merci de sélectionner une classe", "stats.error.nodata":"Données indisponibles", "stats.support": "Support", - "webconference": "Accès à une salle virtuelle" + "webconference": "Accès à une salle virtuelle", + "homeworkassistance": "Homework-Assistance", + "moodle": "Moodle", + "pmb-lyceeconnecte": "PMB", + "pmb-gestion-lyceeconnecte" : "PMB Gestion", + "capytale": "Capytale", + "cerisepro": "Cerise Pro", + "edumedia": "Edumedia", + "esidoc": "Esidoc", + "foliosonisep": "Folios Onisep", + "library": "Bibliothèque", + "onisep": "Onisep", + "pronote": "Pronote", + "scratch": "Scratch", + "geogebra": "GeoGebra", + "lool": "Lool", + "riot": "Messagerie Riot", + "wekan": "Wekan", + "peertube": "Peertube", + "jupyter": "Jupyter" } From d27609a147eb9664eac4b0290d6d541192c04d66 Mon Sep 17 00:00:00 2001 From: Benjamin Perez Date: Tue, 21 Mar 2023 10:24:27 +0100 Subject: [PATCH 6/9] chore: prepare next development iteration --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index 0c4f29a..e7d4d17 100644 --- a/gradle.properties +++ b/gradle.properties @@ -29,6 +29,6 @@ vertxVersion=3.9.5 toolsVersion=2.0.0-final junitVersion=4.10 -entCoreVersion=4.8-SNAPSHOT +entCoreVersion=4.9-SNAPSHOT vertxCronTimer=2.0.0 jodaTimeVersion=2.9.4 From c23a1c6bd0c6ecedd6966fb0dea6ce92e48bd629 Mon Sep 17 00:00:00 2001 From: Benjamin Perez Date: Tue, 21 Mar 2023 11:27:09 +0100 Subject: [PATCH 7/9] chore: prepare next iteration --- gradle.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle.properties b/gradle.properties index e7d4d17..26ea445 100644 --- a/gradle.properties +++ b/gradle.properties @@ -5,7 +5,7 @@ modowner=fr.wseduc modname=stats # Your module version -version=1.12.12 +version=1.12-SNAPSHOT # The test timeout in seconds testtimeout=300 From a13aed0634056cfc6ea2d56f614b29778108771a Mon Sep 17 00:00:00 2001 From: Nabil Mansouri Date: Tue, 21 Mar 2023 11:30:48 +0100 Subject: [PATCH 8/9] fix: upgrade pg driver --- src/main/java/fr/wseduc/stats/Stats.java | 31 ++++++++++++------- .../wseduc/stats/services/PGStatsService.java | 14 ++++----- 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/src/main/java/fr/wseduc/stats/Stats.java b/src/main/java/fr/wseduc/stats/Stats.java index fab93ef..aef4fa8 100644 --- a/src/main/java/fr/wseduc/stats/Stats.java +++ b/src/main/java/fr/wseduc/stats/Stats.java @@ -24,6 +24,10 @@ import java.text.ParseException; +import io.vertx.pgclient.PgConnectOptions; +import io.vertx.pgclient.PgPool; +import io.vertx.pgclient.SslMode; +import io.vertx.sqlclient.PoolOptions; import org.entcore.common.aggregation.MongoConstants.COLLECTIONS; import org.entcore.common.events.EventHelper; import org.entcore.common.events.EventStore; @@ -31,9 +35,6 @@ import org.entcore.common.http.BaseServer; import org.entcore.common.mongodb.MongoDbConf; -import io.reactiverse.pgclient.PgClient; -import io.reactiverse.pgclient.PgPool; -import io.reactiverse.pgclient.PgPoolOptions; import io.vertx.core.json.JsonObject; import io.vertx.core.logging.Logger; import io.vertx.core.logging.LoggerFactory; @@ -85,23 +86,31 @@ public void start() throws Exception { final JsonObject readPGConfig = config.getJsonObject("read-pg-config"); final boolean oldStats = config.getBoolean("mongo-stats-service", false); if (readPGConfig != null && !readPGConfig.isEmpty() && !oldStats) { - final PgPoolOptions options = new PgPoolOptions().setPort(readPGConfig.getInteger("port", 5432)) + final PgConnectOptions connectOptions = new PgConnectOptions().setPort(readPGConfig.getInteger("port", 5432)) .setHost(readPGConfig.getString("host")).setDatabase(readPGConfig.getString("database")) - .setUser(readPGConfig.getString("user")).setPassword(readPGConfig.getString("password")) - .setMaxSize(readPGConfig.getInteger("pool-size", 5)); - PgPool pgPool = PgClient.pool(vertx, options); + .setUser(readPGConfig.getString("user")).setPassword(readPGConfig.getString("password")); + final SslMode sslMode = SslMode.valueOf(readPGConfig.getString("ssl-mode", "DISABLE")); + if (!SslMode.DISABLE.equals(sslMode)) { + connectOptions.setSslMode(sslMode).setTrustAll(SslMode.ALLOW.equals(sslMode) || SslMode.PREFER.equals(sslMode) || SslMode.REQUIRE.equals(sslMode)); + } + PoolOptions poolOptions = new PoolOptions().setMaxSize(readPGConfig.getInteger("pool-size", 5)); + PgPool pgPool = PgPool.pool(vertx, connectOptions, poolOptions); statsService = new PGStatsService(platformId, config.getJsonObject("api-allowed-values")); ((PGStatsService) statsService).setReadPgPool(pgPool); } else if (eventStoreConfig != null && eventStoreConfig.getJsonObject("postgresql-slave") != null && !oldStats) { final JsonObject eventStorePGConfig = eventStoreConfig.getJsonObject("postgresql-slave"); - final PgPoolOptions options = new PgPoolOptions() + final PgConnectOptions connectOptions = new PgConnectOptions() .setPort(eventStorePGConfig.getInteger("port", 5432)) .setHost(eventStorePGConfig.getString("host")) .setDatabase(eventStorePGConfig.getString("database")) .setUser(eventStorePGConfig.getString("user")) - .setPassword(eventStorePGConfig.getString("password")) - .setMaxSize(eventStorePGConfig.getInteger("pool-size", 5)); - PgPool pgPool = PgClient.pool(vertx, options); + .setPassword(eventStorePGConfig.getString("password")); + final SslMode sslMode = SslMode.valueOf(eventStorePGConfig.getString("ssl-mode", "DISABLE")); + if (!SslMode.DISABLE.equals(sslMode)) { + connectOptions.setSslMode(sslMode).setTrustAll(SslMode.ALLOW.equals(sslMode) || SslMode.PREFER.equals(sslMode) || SslMode.REQUIRE.equals(sslMode)); + } + PoolOptions poolOptions = new PoolOptions().setMaxSize(eventStorePGConfig.getInteger("pool-size", 5)); + PgPool pgPool = PgPool.pool(vertx, connectOptions, poolOptions); statsService = new PGStatsService(platformId, config.getJsonObject("api-allowed-values")); ((PGStatsService) statsService).setReadPgPool(pgPool); } else { diff --git a/src/main/java/fr/wseduc/stats/services/PGStatsService.java b/src/main/java/fr/wseduc/stats/services/PGStatsService.java index 74821bc..d8164a0 100644 --- a/src/main/java/fr/wseduc/stats/services/PGStatsService.java +++ b/src/main/java/fr/wseduc/stats/services/PGStatsService.java @@ -5,15 +5,15 @@ import java.util.stream.IntStream; import java.time.LocalDateTime; +import io.vertx.pgclient.PgPool; +import io.vertx.sqlclient.Row; +import io.vertx.sqlclient.RowSet; +import io.vertx.sqlclient.Tuple; import org.entcore.common.utils.StringUtils; import org.entcore.common.validation.ValidationException; import fr.wseduc.webutils.Either; import fr.wseduc.webutils.Utils; -import io.reactiverse.pgclient.PgPool; -import io.reactiverse.pgclient.PgRowSet; -import io.reactiverse.pgclient.Row; -import io.reactiverse.pgclient.Tuple; import io.vertx.core.AsyncResult; import io.vertx.core.Handler; import io.vertx.core.MultiMap; @@ -87,7 +87,7 @@ private void listStats(MultiMap params, boolean export, String language, Handler } log.info("query : " + query); log.info("tuple : " + deepToString(t)); - readPgPool.preparedQuery(query, t, pgRowsToEither(handler)); + readPgPool.preparedQuery(query).execute(t, pgRowsToEither(handler)); } catch (Exception e) { handler.handle(new Either.Left<>(e.getMessage())); } @@ -193,10 +193,10 @@ private String genDeviceQuery(MultiMap params, final List entityIds, fin return query; } - private Handler> pgRowsToEither(Handler> handler) { + private Handler>> pgRowsToEither(Handler> handler) { return ar -> { if (ar.succeeded()) { - final PgRowSet rows = ar.result(); + final RowSet rows = ar.result(); final List columns = rows.columnsNames(); final JsonArray res = new JsonArray(); for (Row row: rows) { From bc0264c3a9c9f8dfda5ee169d4f4b69fefa7dfe5 Mon Sep 17 00:00:00 2001 From: rseuret Date: Thu, 23 Mar 2023 10:50:50 +0100 Subject: [PATCH 9/9] feat(Lystore): #MLYSTOR-703 :add Lystore to statistics --- src/main/resources/api-allowed-values.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/api-allowed-values.json b/src/main/resources/api-allowed-values.json index 0c14e78..1ed4f1f 100644 --- a/src/main/resources/api-allowed-values.json +++ b/src/main/resources/api-allowed-values.json @@ -10,7 +10,7 @@ "edumoov","Elea","Eliot","ElyceeHDF","English-Attack","Esidoc","EulerRessources","EulerRessources-pp","ExplorateurDeMetiers","FoliosOnisep", "Formulaire","Formulaire-public","Diary","Edt","Competences","Viescolaire","Geogebra","GRR", "Jupyter", "HiSQOOL","HomeworkAssistance","HumanRoads","Interforum","InterForum","JuniorUniversalis","KiosqueEDU","KiosqueEDU-aca","KNE-Annabac","KNE-CNS","Kwyk","Labomep","LaboMEP", - "LDE","LeLivreScolaire","LeSite-tv","library","Lool","Lstl","madmagz","madmagz-77","madmagz-aisne","madmagz-draaf","madmagz-ent04","madmagz-idf","madmagz-na", + "LDE","LeLivreScolaire","LeSite-tv","library","Lool","Lstl","Lystore","madmagz","madmagz-77","madmagz-aisne","madmagz-draaf","madmagz-ent04","madmagz-idf","madmagz-na", "madmagz-nord","madmagz-oise","madmagz-paris","madmagz-regionhdf","madmagz-somme1d","madmagz-somme2d","milliweb-oAuth","MindViewOnline","Moodle","MSEL", "numericours","numeritab","OGIL","OGIL-Region","Onisep","Onisep-Services","Passerelle","PasserellePise","Pearltrees","Peertube","PMB-lyceeconnecte","PMB-Gestion-lyceeconnecte", "ProEPS","projet-voltaire","Pronote","Riot","Sacoche","Salvum","Scratch","Speakshake","Tactileo","TurboSelf","Universalis","Universalis-Junior",