Ajouter une version anglaise de la notice d’information

#11
.gitattributes CHANGED
@@ -42,4 +42,3 @@ application_neo4j/static/notice/notice_html/media/image4.png filter=lfs diff=lfs
42
  application_neo4j/static/notice/notice.docx filter=lfs diff=lfs merge=lfs -text
43
  application_neo4j/static/notice/notice.pdf filter=lfs diff=lfs merge=lfs -text
44
  opengds/*.jar filter=lfs diff=lfs merge=lfs -text
45
- application_neo4j/static/notice/notice_en.pdf filter=lfs diff=lfs merge=lfs -text
 
42
  application_neo4j/static/notice/notice.docx filter=lfs diff=lfs merge=lfs -text
43
  application_neo4j/static/notice/notice.pdf filter=lfs diff=lfs merge=lfs -text
44
  opengds/*.jar filter=lfs diff=lfs merge=lfs -text
 
application_neo4j/download_dumps.py DELETED
@@ -1,67 +0,0 @@
1
- """Download the Neo4j dump files from the Hub dataset into /backups.
2
-
3
- The weekly refresh Job publishes ``neo4j.dump``, ``system.dump`` and
4
- ``database_metadata.json`` into the dataset ``cnil/genmod-dump-neo4j``. The
5
- dumps are large files stored with Git LFS / XET, so resolving them follows a
6
- chain of Hugging Face signed redirects that ends on an S3 presigned URL.
7
- ``huggingface_hub`` handles that redirect chain, authentication for the private
8
- dataset, and retries; a plain ``wget`` does not (it aborts with a ``400`` on
9
- the S3 presigned URL).
10
- """
11
-
12
- from __future__ import annotations
13
-
14
- import os
15
- import sys
16
- import time
17
-
18
- from huggingface_hub import hf_hub_download
19
-
20
- REPO_ID = os.getenv("GENMOD_DUMP_REPO", "cnil/genmod-dump-neo4j")
21
- REVISION = os.getenv("GENMOD_DUMP_REVISION", "main")
22
- TOKEN = os.getenv("HF_TOKEN") or None
23
- DEST_DIR = "/backups"
24
- MAX_ATTEMPTS = 3
25
-
26
-
27
- def log(message: str) -> None:
28
- print(f"[genmod-download] {message}", flush=True)
29
-
30
-
31
- def fetch(filename: str, required: bool = True) -> bool:
32
- for attempt in range(1, MAX_ATTEMPTS + 1):
33
- try:
34
- path = hf_hub_download(
35
- repo_id=REPO_ID,
36
- repo_type="dataset",
37
- revision=REVISION,
38
- filename=filename,
39
- token=TOKEN,
40
- local_dir=DEST_DIR,
41
- )
42
- log(f"{filename} -> {path} (attempt {attempt})")
43
- return True
44
- except Exception as error:
45
- log(f"{filename} attempt {attempt}/{MAX_ATTEMPTS} failed: {error}")
46
- if attempt < MAX_ATTEMPTS:
47
- time.sleep(2 * attempt)
48
- if required:
49
- return False
50
- log(f"{filename} is optional; continuing without it")
51
- return True
52
-
53
-
54
- def main() -> int:
55
- os.makedirs(DEST_DIR, exist_ok=True)
56
- log(f"Downloading dumps from {REPO_ID}@{REVISION}")
57
- for filename in ("system.dump", "neo4j.dump"):
58
- if not fetch(filename, required=True):
59
- log(f"FATAL: could not download {filename}")
60
- return 1
61
- fetch("database_metadata.json", required=False)
62
- log("All dump files are ready")
63
- return 0
64
-
65
-
66
- if __name__ == "__main__":
67
- sys.exit(main())
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
application_neo4j/requirements.txt CHANGED
@@ -3,7 +3,3 @@ neo4j==5.28.1
3
  graphdatascience==1.15.1
4
  pandas==2.2.3
5
  Jinja2 ==3.1.6
6
- # Bootstrap only: fetch the Neo4j dump from the Hub dataset at container start.
7
- # Pinned to the latest release that still supports Python 3.9 (the neo4j image);
8
- # huggingface_hub >= 1.9 requires Python >= 3.10.
9
- huggingface_hub==1.8.0
 
3
  graphdatascience==1.15.1
4
  pandas==2.2.3
5
  Jinja2 ==3.1.6
 
 
 
 
application_neo4j/static/css/style.css CHANGED
@@ -2,79 +2,13 @@
2
  * STYLE GLOBAL & GRAPHIQUE SIGMA
3
  * =================================================================== */
4
 
5
- /* Explicit sizing and minimum widths avoid engine-specific flexbox
6
- * expansion differences (notably between Blink and Gecko). */
7
- html {
8
- -webkit-text-size-adjust: 100%;
9
- text-size-adjust: 100%;
10
- }
11
-
12
- body {
13
- min-width: 320px;
14
- }
15
-
16
- .legacy-browser-warning {
17
- display: none;
18
- margin: 0;
19
- padding: 0.75rem 1rem;
20
- color: #664d03;
21
- background: #fff3cd;
22
- border-bottom: 1px solid #ffecb5;
23
- font-weight: 600;
24
- text-align: center;
25
- }
26
-
27
- img,
28
- svg {
29
- max-width: 100%;
30
- height: auto;
31
- }
32
-
33
- .row > *,
34
- .card,
35
- .card-body,
36
- .flex-grow-1 {
37
- min-width: 0;
38
- }
39
-
40
- .navbar .container {
41
- column-gap: 1rem;
42
- row-gap: 0.75rem;
43
- }
44
-
45
- .navbar-brand {
46
- min-width: 0;
47
- max-width: 100%;
48
- white-space: normal;
49
- }
50
-
51
- .navbar-brand small,
52
- #suggestions-list li {
53
- overflow-wrap: anywhere;
54
- word-break: break-word;
55
- }
56
-
57
- .navbar-actions {
58
- min-width: 0;
59
- margin-left: auto;
60
- }
61
-
62
  #sigma-container {
63
  width: 100%;
64
  height: 600px; /* Un peu plus de hauteur pour un meilleur confort */
65
- position: relative;
66
- overflow: hidden;
67
- border: 1px solid #dee2e6;
68
- border: 1px solid var(--bs-border-color, #dee2e6); /* Variable Bootstrap */
69
  margin-top: 1rem;
70
- border-radius: 0.375rem;
71
- border-radius: var(--bs-border-radius, 0.375rem); /* Variable Bootstrap */
72
- background-color: #f8f9fa;
73
- background-color: var(--bs-light-bg-subtle, #f8f9fa); /* Fond légèrement teinté */
74
- }
75
-
76
- #floating-legend {
77
- max-width: calc(100% - 1rem);
78
  }
79
 
80
  /* ===================================================================
@@ -98,62 +32,35 @@ svg {
98
  /* ===================================================================
99
  * STYLE DES TABLES (DATATABLES)
100
  * =================================================================== */
101
- /* A single, deterministic wrapping policy replaces the previous contradictory
102
- * normal/nowrap declarations. */
103
  #descendance-table th, #descendance-table td,
104
- #ascendance-table th, #ascendance-table td,
105
- #train-table th, #train-table td,
106
- #graph-models-table th, #graph-models-table td {
107
- white-space: nowrap;
108
- vertical-align: middle;
109
  }
110
 
111
- #descendance-table th,
112
- #ascendance-table th,
113
- #train-table th {
114
- min-width: 120px;
115
  }
116
 
117
- #descendance-table th:first-child, #descendance-table td:first-child,
118
- #ascendance-table th:first-child, #ascendance-table td:first-child,
119
- #train-table th:first-child, #train-table td:first-child,
120
- #graph-models-table th:first-child, #graph-models-table td:first-child {
121
  min-width: 200px;
122
- white-space: normal;
123
- overflow-wrap: anywhere;
124
- word-break: break-word;
125
  }
126
 
127
- .table-responsive,
128
- div.dataTables_wrapper,
129
- div.dataTables_wrapper div.dataTables_scroll {
130
- width: 100%;
131
- max-width: 100%;
132
- }
133
-
134
- .table-responsive,
135
- div.dataTables_wrapper div.dataTables_scrollBody {
136
- overflow-x: auto !important;
137
- -webkit-overflow-scrolling: touch;
138
- }
139
-
140
- div.dataTables_wrapper div.dataTables_scrollHeadInner {
141
- min-width: 100%;
142
- }
143
-
144
- div.dataTables_wrapper table.dataTable {
145
- margin-left: 0 !important;
146
- margin-right: 0 !important;
147
- table-layout: auto;
148
  }
149
 
150
  /* Personnalisation de l'input de recherche de DataTables pour qu'il ressemble à un champ Bootstrap */
151
  div.dataTables_wrapper div.dataTables_filter input {
152
- max-width: 100%;
153
- border: 1px solid #dee2e6;
154
- border: 1px solid var(--bs-border-color, #dee2e6);
155
- border-radius: 0.375rem;
156
- border-radius: var(--bs-border-radius, 0.375rem);
157
  padding: 0.375rem 0.75rem;
158
  margin-left: 0.5em;
159
  }
@@ -193,12 +100,8 @@ div.dataTables_wrapper .table thead th.sorting_desc::after {
193
  /* Ce style est pour si vous utilisez une <ul> simple.
194
  Si vous avez bien une <ul class="list-group">, vous pouvez supprimer ce bloc. */
195
  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
196
- max-width: 100%;
197
- overflow-x: hidden;
198
- border-radius: 0.375rem;
199
- border-radius: var(--bs-border-radius, 0.375rem);
200
- background-color: #f8f9fa;
201
- background-color: var(--bs-light, #f8f9fa);
202
  }
203
  #suggestions-list li:hover {
204
  background-color: #94bfeb; ;
@@ -295,22 +198,11 @@ div.dataTables_wrapper .table thead th.sorting_desc::after {
295
  }
296
 
297
  /* Change la couleur de fond des cases à cocher lorsqu'elles sont cochées */
298
- .btn-primary {
299
  background-color: #6a11cb;
300
  border-color:#6a11cb;
301
  }
302
 
303
- .btn-outline-primary {
304
- color: #6a11cb;
305
- border-color: #6a11cb;
306
- }
307
-
308
- .btn-outline-primary:hover {
309
- color: #fff;
310
- background-color: #6a11cb;
311
- border-color: #6a11cb;
312
- }
313
-
314
  .stretched-link{
315
  color: #6a11cb;
316
  }
@@ -376,31 +268,4 @@ main {
376
  .btn-modern:hover {
377
  background: linear-gradient(135deg, #5a0fbf, #1d63e1);
378
  transform: translateY(-3px);
379
- }
380
-
381
- @media (max-width: 575.98px) {
382
- .navbar-brand,
383
- .navbar-actions {
384
- flex: 1 1 100%;
385
- margin-right: 0;
386
- }
387
-
388
- .navbar-actions {
389
- justify-content: flex-start !important;
390
- }
391
-
392
- #sigma-container {
393
- height: 70vh;
394
- min-height: 420px;
395
- }
396
-
397
- div.dataTables_wrapper div.dataTables_filter label {
398
- display: block;
399
- width: 100%;
400
- }
401
-
402
- div.dataTables_wrapper div.dataTables_filter input {
403
- width: 100%;
404
- margin: 0.375rem 0 0;
405
- }
406
- }
 
2
  * STYLE GLOBAL & GRAPHIQUE SIGMA
3
  * =================================================================== */
4
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  #sigma-container {
6
  width: 100%;
7
  height: 600px; /* Un peu plus de hauteur pour un meilleur confort */
8
+ border: 1px solid var(--bs-border-color); /* Variable Bootstrap */
 
 
 
9
  margin-top: 1rem;
10
+ border-radius: var(--bs-border-radius); /* Variable Bootstrap */
11
+ background-color: var(--bs-light-bg-subtle); /* Fond légèrement teinté */
 
 
 
 
 
 
12
  }
13
 
14
  /* ===================================================================
 
32
  /* ===================================================================
33
  * STYLE DES TABLES (DATATABLES)
34
  * =================================================================== */
35
+ /* Permet au texte de revenir à la ligne naturellement */
 
36
  #descendance-table th, #descendance-table td,
37
+ #ascendance-table th, #ascendance-table td {
38
+ white-space: normal; /* <-- La correction clé ! */
39
+ word-wrap: break-word; /* Force le retour à la ligne des mots longs */
40
+ vertical-align: middle; /* Garde le centrage vertical */
 
41
  }
42
 
43
+ /* On peut donner une largeur minimale aux colonnes pour garder une bonne structure */
44
+ #descendance-table th, #ascendance-table th {
45
+ min-width: 120px; /* Ajustez cette valeur selon vos besoins */
 
46
  }
47
 
48
+ /* Cas spécifique pour les colonnes potentiellement longues comme le nom du modèle */
49
+ #descendance-table th:first-child, #ascendance-table th:first-child {
 
 
50
  min-width: 200px;
 
 
 
51
  }
52
 
53
+ /* Empêche le texte de se couper dans les cellules, force le défilement horizontal */
54
+ #descendance-table th, #descendance-table td,
55
+ #ascendance-table th, #ascendance-table td {
56
+ white-space: nowrap;
57
+ vertical-align: middle; /* Centrage vertical pour un look plus propre */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
58
  }
59
 
60
  /* Personnalisation de l'input de recherche de DataTables pour qu'il ressemble à un champ Bootstrap */
61
  div.dataTables_wrapper div.dataTables_filter input {
62
+ border: 1px solid var(--bs-border-color);
63
+ border-radius: var(--bs-border-radius);
 
 
 
64
  padding: 0.375rem 0.75rem;
65
  margin-left: 0.5em;
66
  }
 
100
  /* Ce style est pour si vous utilisez une <ul> simple.
101
  Si vous avez bien une <ul class="list-group">, vous pouvez supprimer ce bloc. */
102
  box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15);
103
+ border-radius: var(--bs-border-radius);
104
+ background-color: var(--bs-light);
 
 
 
 
105
  }
106
  #suggestions-list li:hover {
107
  background-color: #94bfeb; ;
 
198
  }
199
 
200
  /* Change la couleur de fond des cases à cocher lorsqu'elles sont cochées */
201
+ .btn {
202
  background-color: #6a11cb;
203
  border-color:#6a11cb;
204
  }
205
 
 
 
 
 
 
 
 
 
 
 
 
206
  .stretched-link{
207
  color: #6a11cb;
208
  }
 
268
  .btn-modern:hover {
269
  background: linear-gradient(135deg, #5a0fbf, #1d63e1);
270
  transform: translateY(-3px);
271
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
application_neo4j/static/js/browser_compatibility.js DELETED
@@ -1,14 +0,0 @@
1
- (function () {
2
- "use strict";
3
-
4
- // `document.documentMode` is exposed by Internet Explorer only. The rest of
5
- // the application deliberately targets maintained browsers supported by
6
- // Bootstrap 5.
7
- if (document.documentMode) {
8
- var warning = document.getElementById("legacy-browser-warning");
9
- if (warning) {
10
- warning.hidden = false;
11
- warning.style.display = "block";
12
- }
13
- }
14
- }());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
application_neo4j/static/js/script.js CHANGED
@@ -193,8 +193,7 @@ document.addEventListener("DOMContentLoaded", () => {
193
  const common_dt_options = {
194
  "language": { "url": datatablesLangUrl },
195
  "pageLength": 10,
196
- "responsive": true,
197
- "scrollX": true,
198
  // Afficher en premier les modèles les plus téléchargés.
199
  "order": [[2, "desc"]],
200
  "columnDefs": [
 
193
  const common_dt_options = {
194
  "language": { "url": datatablesLangUrl },
195
  "pageLength": 10,
196
+ "responsive": true,"scrollX": true , "scrollY":true,
 
197
  // Afficher en premier les modèles les plus téléchargés.
198
  "order": [[2, "desc"]],
199
  "columnDefs": [
application_neo4j/static/js/script_dataset.js CHANGED
@@ -209,8 +209,7 @@ document.addEventListener("DOMContentLoaded", () => {
209
  const common_dt_options = {
210
  "language": { "url": datatablesLangUrl },
211
  "pageLength": 10,
212
- "responsive": true,
213
- "scrollX": true,
214
  "columnDefs": [
215
  {
216
  // Appliquer notre plugin 'numeric-string' aux colonnes cibles
 
209
  const common_dt_options = {
210
  "language": { "url": datatablesLangUrl },
211
  "pageLength": 10,
212
+ "responsive": true,"scrollX": true , "scrollY":true,
 
213
  "columnDefs": [
214
  {
215
  // Appliquer notre plugin 'numeric-string' aux colonnes cibles
application_neo4j/static/notice/notice.pdf CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:98c0455e1d8419a184a2471fc69960027976f9cb7d9ee07752516c3b216b4a79
3
- size 1166198
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:dced59e9dc43bd1823fd18cee4005415e375e9f77c7a58bc6ffcf3a48e732a3c
3
+ size 409000
application_neo4j/static/notice/notice_en.pdf CHANGED
The diff for this file is too large to render. See raw diff
 
application_neo4j/templates/expert.html CHANGED
@@ -18,15 +18,13 @@
18
  </head>
19
 
20
  <body class="d-flex flex-column min-vh-100">
21
- <div id="legacy-browser-warning" class="legacy-browser-warning" role="alert" hidden>{{ t('site.legacy_browser_warning') }}</div>
22
- <script src="{{ url_for('static', filename='js/browser_compatibility.js') }}"></script>
23
  <header class="navbar navbar-expand-lg navbar-light bg-light border-bottom">
24
  <div class="container">
25
  <a class="navbar-brand" href="{{ url_for('home', lang=current_lang) }}">
26
  <span class="fw-bold">{{ t('site.nav_brand_model_expert') }}</span>
27
  <small class="d-block text-muted">{{ t('site.nav_subtitle') }}</small>
28
  </a>
29
- <div class="navbar-actions d-flex align-items-center justify-content-end flex-wrap gap-2">
30
  <a href="{{ url_for('home', lang=current_lang) }}" class="btn btn-sm btn-dark me-3">
31
  <i class="bi bi-house-door-fill me-1" aria-hidden="true"></i>{{ t('site.home_button') }}
32
  </a>
 
18
  </head>
19
 
20
  <body class="d-flex flex-column min-vh-100">
 
 
21
  <header class="navbar navbar-expand-lg navbar-light bg-light border-bottom">
22
  <div class="container">
23
  <a class="navbar-brand" href="{{ url_for('home', lang=current_lang) }}">
24
  <span class="fw-bold">{{ t('site.nav_brand_model_expert') }}</span>
25
  <small class="d-block text-muted">{{ t('site.nav_subtitle') }}</small>
26
  </a>
27
+ <div class="d-flex align-items-center justify-content-end flex-wrap gap-2">
28
  <a href="{{ url_for('home', lang=current_lang) }}" class="btn btn-sm btn-dark me-3">
29
  <i class="bi bi-house-door-fill me-1" aria-hidden="true"></i>{{ t('site.home_button') }}
30
  </a>
application_neo4j/templates/index.html CHANGED
@@ -5,7 +5,7 @@
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <title>{{ t('site.title_home') }}</title>
7
  <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
8
- <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
9
 
10
  <style>/* Style simple pour la page d'accueil */
11
  body {
@@ -116,30 +116,11 @@
116
  background: #3498db;
117
  color: #fff;
118
  }
119
-
120
- @media (max-width: 575.98px) {
121
- .lang-switch {
122
- position: static;
123
- justify-content: flex-end;
124
- padding: 12px 15px 0;
125
- }
126
-
127
- .welcome-container {
128
- padding-top: 24px;
129
- }
130
-
131
- .content-card {
132
- padding: 22px;
133
- text-align: left;
134
- }
135
- }
136
 
137
  </style>
138
  </head>
139
 
140
  <body>
141
- <div id="legacy-browser-warning" class="legacy-browser-warning" role="alert" hidden>{{ t('site.legacy_browser_warning') }}</div>
142
- <script src="{{ url_for('static', filename='js/browser_compatibility.js') }}"></script>
143
  <!-- Language selector -->
144
  <div class="lang-switch">
145
  <a href="{{ url_for('set_language_route', lang='fr') }}" class="{{ 'active' if current_lang == 'fr' else '' }}">{{ t('lang.fr') }}</a>
 
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
  <title>{{ t('site.title_home') }}</title>
7
  <link rel="stylesheet" href="{{ url_for('static', filename='css/style.css') }}">
8
+ <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet">
9
 
10
  <style>/* Style simple pour la page d'accueil */
11
  body {
 
116
  background: #3498db;
117
  color: #fff;
118
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
 
120
  </style>
121
  </head>
122
 
123
  <body>
 
 
124
  <!-- Language selector -->
125
  <div class="lang-switch">
126
  <a href="{{ url_for('set_language_route', lang='fr') }}" class="{{ 'active' if current_lang == 'fr' else '' }}">{{ t('lang.fr') }}</a>
application_neo4j/templates/infos.html CHANGED
@@ -7,7 +7,6 @@
7
  <style>
8
  body, html { margin: 0; padding: 0; height: 100%; overflow: hidden; }
9
  body { display: flex; flex-direction: column; font-family: sans-serif; }
10
- .legacy-browser-warning { display: none; padding: 0.75rem 1rem; color: #664d03; background: #fff3cd; border-bottom: 1px solid #ffecb5; font-weight: 600; text-align: center; }
11
  .toolbar {
12
  display: flex;
13
  align-items: center;
@@ -25,13 +24,11 @@
25
  font-weight: 600;
26
  }
27
  .home-button:hover { color: #fff; background: #424649; }
28
- .pdf-container { width: 100%; height: calc(100% - 52px); flex: 1; min-height: 0; }
29
- .pdf-container iframe { display: block; border: none; width: 100%; height: 100%; }
30
  </style>
31
  </head>
32
  <body>
33
- <div id="legacy-browser-warning" class="legacy-browser-warning" role="alert" hidden>{{ t('site.legacy_browser_warning') }}</div>
34
- <script src="{{ url_for('static', filename='js/browser_compatibility.js') }}"></script>
35
  <nav class="toolbar" aria-label="{{ t('site.home_button') }}">
36
  <a class="home-button" href="{{ url_for('home', lang=current_lang) }}">⌂ {{ t('site.home_button') }}</a>
37
  </nav>
 
7
  <style>
8
  body, html { margin: 0; padding: 0; height: 100%; overflow: hidden; }
9
  body { display: flex; flex-direction: column; font-family: sans-serif; }
 
10
  .toolbar {
11
  display: flex;
12
  align-items: center;
 
24
  font-weight: 600;
25
  }
26
  .home-button:hover { color: #fff; background: #424649; }
27
+ .pdf-container { width: 100%; flex: 1; min-height: 0; }
28
+ .pdf-container iframe { border: none; width: 100%; height: 100%; }
29
  </style>
30
  </head>
31
  <body>
 
 
32
  <nav class="toolbar" aria-label="{{ t('site.home_button') }}">
33
  <a class="home-button" href="{{ url_for('home', lang=current_lang) }}">⌂ {{ t('site.home_button') }}</a>
34
  </nav>
application_neo4j/templates/search.html CHANGED
@@ -33,15 +33,13 @@
33
  </head>
34
 
35
  <body class="d-flex flex-column min-vh-100">
36
- <div id="legacy-browser-warning" class="legacy-browser-warning" role="alert" hidden>{{ t('site.legacy_browser_warning') }}</div>
37
- <script src="{{ url_for('static', filename='js/browser_compatibility.js') }}"></script>
38
  <header class="navbar navbar-expand-lg navbar-light bg-light border-bottom">
39
  <div class="container">
40
  <a class="navbar-brand" href="{{ url_for('home', lang=current_lang) }}">
41
  <span class="fw-bold">{{ t('site.nav_brand') }}</span>
42
  <small class="d-block text-muted">{{ t('site.nav_subtitle_full') }}</small>
43
  </a>
44
- <div class="navbar-actions d-flex align-items-center justify-content-end flex-wrap gap-2">
45
  <a href="{{ url_for('home', lang=current_lang) }}" class="btn btn-sm btn-dark me-3">
46
  <i class="bi bi-house-door-fill me-1" aria-hidden="true"></i>{{ t('site.home_button') }}
47
  </a>
 
33
  </head>
34
 
35
  <body class="d-flex flex-column min-vh-100">
 
 
36
  <header class="navbar navbar-expand-lg navbar-light bg-light border-bottom">
37
  <div class="container">
38
  <a class="navbar-brand" href="{{ url_for('home', lang=current_lang) }}">
39
  <span class="fw-bold">{{ t('site.nav_brand') }}</span>
40
  <small class="d-block text-muted">{{ t('site.nav_subtitle_full') }}</small>
41
  </a>
42
+ <div class="d-flex align-items-center justify-content-end flex-wrap gap-2">
43
  <a href="{{ url_for('home', lang=current_lang) }}" class="btn btn-sm btn-dark me-3">
44
  <i class="bi bi-house-door-fill me-1" aria-hidden="true"></i>{{ t('site.home_button') }}
45
  </a>
application_neo4j/templates/search_dataset.html CHANGED
@@ -33,15 +33,13 @@
33
  </head>
34
 
35
  <body class="d-flex flex-column min-vh-100">
36
- <div id="legacy-browser-warning" class="legacy-browser-warning" role="alert" hidden>{{ t('site.legacy_browser_warning') }}</div>
37
- <script src="{{ url_for('static', filename='js/browser_compatibility.js') }}"></script>
38
  <header class="navbar navbar-expand-lg navbar-light bg-light border-bottom">
39
  <div class="container">
40
  <a class="navbar-brand" href="{{ url_for('home', lang=current_lang) }}">
41
  <span class="fw-bold">{{ t('site.nav_brand') }}</span>
42
  <small class="d-block text-muted">{{ t('site.nav_subtitle') }}</small>
43
  </a>
44
- <div class="navbar-actions d-flex align-items-center justify-content-end flex-wrap gap-2">
45
  <a href="{{ url_for('home', lang=current_lang) }}" class="btn btn-sm btn-dark me-3">
46
  <i class="bi bi-house-door-fill me-1" aria-hidden="true"></i>{{ t('site.home_button') }}
47
  </a>
 
33
  </head>
34
 
35
  <body class="d-flex flex-column min-vh-100">
 
 
36
  <header class="navbar navbar-expand-lg navbar-light bg-light border-bottom">
37
  <div class="container">
38
  <a class="navbar-brand" href="{{ url_for('home', lang=current_lang) }}">
39
  <span class="fw-bold">{{ t('site.nav_brand') }}</span>
40
  <small class="d-block text-muted">{{ t('site.nav_subtitle') }}</small>
41
  </a>
42
+ <div class="d-flex align-items-center justify-content-end flex-wrap gap-2">
43
  <a href="{{ url_for('home', lang=current_lang) }}" class="btn btn-sm btn-dark me-3">
44
  <i class="bi bi-house-door-fill me-1" aria-hidden="true"></i>{{ t('site.home_button') }}
45
  </a>
application_neo4j/translations.py CHANGED
@@ -46,7 +46,6 @@ TRANSLATIONS = {
46
  "site.nav_subtitle": "Exploration des relations entre modèles et datasets",
47
  "site.nav_subtitle_full": "Exploration des relations entre modèles et datasets (base de données actualisée le {date})",
48
  "site.home_button": "Accueil",
49
- "site.legacy_browser_warning": "Ce navigateur n’est plus pris en charge. Pour un affichage stable, utilisez une version récente de Firefox, Chrome, Edge ou Safari.",
50
  "site.footer": "Application de recherche et visualisation des relations entre modèles et jeux de données publiés sur la plateforme HuggingFace. © 2025",
51
  "site.footer_expert": "Application de recherche et visualisation... © 2025",
52
 
@@ -77,7 +76,7 @@ TRANSLATIONS = {
77
  "• aux modèles issus du modèle interrogé et publiés sur HuggingFace<br>"
78
  "• aux modèles parents de ce modèle.<br><br>"
79
  "(A condition que les liens entre modèles soient déclarés par les utiliateurs sur HuggingFace)",
80
- "home.find_label": "Vous souhaitez connaître la descendance et l'ascendance de ...",
81
  "home.btn_model": "Un modèle",
82
  "home.btn_dataset": "Un dataset",
83
  "home.btn_unsure": "Je ne sais pas",
@@ -86,10 +85,10 @@ TRANSLATIONS = {
86
  "home.download_date": "Date de téléchargement de la base de données : {date}",
87
  "home.notice_title": "Mentions d'information sur les traitements de données à caractère personnel",
88
  "home.notice_p1": "Afin d'étudier le développement de la communauté de l'IA open source, et de préparer la possibilité d'exercices de droits des citoyens, le projet vise à étudier la base de données des jeux de données et modèles présents sur la plateforme HuggingFace. Cette base de données permet d'établir un arbre généalogique des modèles.",
89
- "home.notice_p2": "Dans le cadre de son projet, la CNIL télécharge chaque semaine la base de données présente sur HuggingFace. Les données traitées sont le pseudonyme de l'auteur (quand il apparaît dans les métadonnées), le nom du modèle/jeu de données et plusieurs informations inhérentes à ce modèle/jeu de données telles que la date de publication, la licence utilisée ou encore le nombre de téléchargements.",
90
  "home.notice_p3": "Ce projet relève de la mission d'intérêt public dont est investie la CNIL en application du règlement général sur la protection des données et de la loi Informatique et Libertés modifiée (article 8).",
91
  "home.notice_p4": "Les données sont publiées à partir de l'espace CNIL sur HuggingFace.",
92
- "home.notice_p5": "Après une première phase d'évaluation de 6 mois de son outil, la CNIL a réalisé des améliorations et poursuit l’évaluation sur une nouvelle période d’un an. A cette échéance, l'outil pourra être à nouveau modifié et le projet reconduit.",
93
  "home.notice_p6": "Vous pouvez accéder et obtenir une copie de vos données, vous opposer au traitement de ces données, les faire rectifier ou effacer. Vous disposez également du droit de limiter le traitement de vos données.",
94
  "home.notice_p7": "Vous pouvez exercer vos droits ou poser vos questions sur ce projet en contactant le service IA de la CNIL : <a href=\"mailto:ia@cnil.fr\">ia@cnil.fr</a>.",
95
  "home.notice_p8": "Si vous estimez, après nous avoir contactés, que vos droits « Informatique et Libertés » ne sont pas respectés, vous pouvez contacter le DPO de la CNIL ou adresser une réclamation à la CNIL.",
@@ -100,7 +99,7 @@ TRANSLATIONS = {
100
  "search.page_lead_dataset": "Explorez la généalogie des modèles et datasets",
101
  "search.label_name": "Nom à rechercher",
102
  "search.placeholder_model": "Taper le nom du modèle ou l'id de son repo Hugging Face.",
103
- "search.placeholder_dataset": "Taper le nom du dataset à investiguer.",
104
  "search.label_filters": "Filtres",
105
  "search.filter_model": "Modèle",
106
  "search.filter_dataset": "Dataset",
@@ -197,7 +196,7 @@ TRANSLATIONS = {
197
  # ── expert.html ──
198
  "expert.page_title": "Recherche Experte",
199
  "expert.page_lead": "Explorez et filtrez la généalogie des modèles",
200
- "expert.placeholder": "Taper le nom du modèle à investiguer.",
201
  "expert.filter_author": "Auteur",
202
  "expert.connected_component": "Composante connexe du noeud recherché",
203
  "expert.legend_title": "Légendes",
@@ -285,7 +284,6 @@ TRANSLATIONS = {
285
  "site.nav_subtitle": "Exploration of relations between models and datasets",
286
  "site.nav_subtitle_full": "Exploration of relations between models and datasets (database updated on {date})",
287
  "site.home_button": "Home",
288
- "site.legacy_browser_warning": "This browser is no longer supported. For a stable display, use a recent version of Firefox, Chrome, Edge or Safari.",
289
  "site.footer": "Application for searching and visualizing relations between models and datasets published on the HuggingFace platform. © 2025",
290
  "site.footer_expert": "Application for searching and visualizing... © 2025",
291
 
 
46
  "site.nav_subtitle": "Exploration des relations entre modèles et datasets",
47
  "site.nav_subtitle_full": "Exploration des relations entre modèles et datasets (base de données actualisée le {date})",
48
  "site.home_button": "Accueil",
 
49
  "site.footer": "Application de recherche et visualisation des relations entre modèles et jeux de données publiés sur la plateforme HuggingFace. © 2025",
50
  "site.footer_expert": "Application de recherche et visualisation... © 2025",
51
 
 
76
  "• aux modèles issus du modèle interrogé et publiés sur HuggingFace<br>"
77
  "• aux modèles parents de ce modèle.<br><br>"
78
  "(A condition que les liens entre modèles soient déclarés par les utiliateurs sur HuggingFace)",
79
+ "home.find_label": "Vous souhaitez connaître la descendance et l'acsendance de ...",
80
  "home.btn_model": "Un modèle",
81
  "home.btn_dataset": "Un dataset",
82
  "home.btn_unsure": "Je ne sais pas",
 
85
  "home.download_date": "Date de téléchargement de la base de données : {date}",
86
  "home.notice_title": "Mentions d'information sur les traitements de données à caractère personnel",
87
  "home.notice_p1": "Afin d'étudier le développement de la communauté de l'IA open source, et de préparer la possibilité d'exercices de droits des citoyens, le projet vise à étudier la base de données des jeux de données et modèles présents sur la plateforme HuggingFace. Cette base de données permet d'établir un arbre généalogique des modèles.",
88
+ "home.notice_p2": "Les données traitées sont le pseudonyme de l'auteur (quand il apparaît dans les métadonnées), le nom du modèle/jeu de données et plusieurs informations inhérentes à ce modèle/jeu de données telles que la date de publication, la licence utilisée ou encore le nombre de téléchargements.",
89
  "home.notice_p3": "Ce projet relève de la mission d'intérêt public dont est investie la CNIL en application du règlement général sur la protection des données et de la loi Informatique et Libertés modifiée (article 8).",
90
  "home.notice_p4": "Les données sont publiées à partir de l'espace CNIL sur HuggingFace.",
91
+ "home.notice_p5": "Une première phase d'évaluation de l'utilité de l'outil interviendra après 6 mois de publication. A cette échéance, l'outil pourra être modifié et le projet reconduit.",
92
  "home.notice_p6": "Vous pouvez accéder et obtenir une copie de vos données, vous opposer au traitement de ces données, les faire rectifier ou effacer. Vous disposez également du droit de limiter le traitement de vos données.",
93
  "home.notice_p7": "Vous pouvez exercer vos droits ou poser vos questions sur ce projet en contactant le service IA de la CNIL : <a href=\"mailto:ia@cnil.fr\">ia@cnil.fr</a>.",
94
  "home.notice_p8": "Si vous estimez, après nous avoir contactés, que vos droits « Informatique et Libertés » ne sont pas respectés, vous pouvez contacter le DPO de la CNIL ou adresser une réclamation à la CNIL.",
 
99
  "search.page_lead_dataset": "Explorez la généalogie des modèles et datasets",
100
  "search.label_name": "Nom à rechercher",
101
  "search.placeholder_model": "Taper le nom du modèle ou l'id de son repo Hugging Face.",
102
+ "search.placeholder_dataset": "Taper le nom du dataset suspecté.",
103
  "search.label_filters": "Filtres",
104
  "search.filter_model": "Modèle",
105
  "search.filter_dataset": "Dataset",
 
196
  # ── expert.html ──
197
  "expert.page_title": "Recherche Experte",
198
  "expert.page_lead": "Explorez et filtrez la généalogie des modèles",
199
+ "expert.placeholder": "Taper le nom du modèle suspecté.",
200
  "expert.filter_author": "Auteur",
201
  "expert.connected_component": "Composante connexe du noeud recherché",
202
  "expert.legend_title": "Légendes",
 
284
  "site.nav_subtitle": "Exploration of relations between models and datasets",
285
  "site.nav_subtitle_full": "Exploration of relations between models and datasets (database updated on {date})",
286
  "site.home_button": "Home",
 
287
  "site.footer": "Application for searching and visualizing relations between models and datasets published on the HuggingFace platform. © 2025",
288
  "site.footer_expert": "Application for searching and visualizing... © 2025",
289
 
start.sh CHANGED
@@ -1,11 +1,18 @@
1
  set -euo pipefail
2
 
 
 
 
 
 
3
  # Load the database backup. Metadata is optional for compatibility with the
4
  # original dump; the application then falls back to its historical date.
5
- # The dumps are Git-LFS files behind Hugging Face's signed redirects, so use
6
- # huggingface_hub (which follows them, authenticates and retries) instead of
7
- # wget, which aborts with a 400 on the S3 presigned URL.
8
- python3 /application_neo4j/download_dumps.py
 
 
9
  neo4j-admin database load --expand-commands system --from-path=/backups --overwrite-destination=true
10
  neo4j-admin database load --expand-commands neo4j --from-path=/backups --overwrite-destination=true
11
 
 
1
  set -euo pipefail
2
 
3
+ DUMP_REPO="${GENMOD_DUMP_REPO:-cnil/genmod-dump-neo4j}"
4
+ DUMP_REVISION="${GENMOD_DUMP_REVISION:-main}"
5
+ DUMP_BASE_URL="https://huggingface.co/datasets/${DUMP_REPO}/resolve/${DUMP_REVISION}"
6
+ AUTH_HEADER="Authorization: Bearer ${HF_TOKEN}"
7
+
8
  # Load the database backup. Metadata is optional for compatibility with the
9
  # original dump; the application then falls back to its historical date.
10
+ wget --header="${AUTH_HEADER}" "${DUMP_BASE_URL}/system.dump" -O /backups/system.dump
11
+ wget --header="${AUTH_HEADER}" "${DUMP_BASE_URL}/neo4j.dump" -O /backups/neo4j.dump
12
+ if ! wget --header="${AUTH_HEADER}" "${DUMP_BASE_URL}/database_metadata.json" \
13
+ -O /backups/database_metadata.json; then
14
+ rm -f /backups/database_metadata.json
15
+ fi
16
  neo4j-admin database load --expand-commands system --from-path=/backups --overwrite-destination=true
17
  neo4j-admin database load --expand-commands neo4j --from-path=/backups --overwrite-destination=true
18