documentation

This commit is contained in:
2026-05-14 15:59:55 +02:00
parent ed67438739
commit e9256f538c
21 changed files with 4380 additions and 561 deletions
File diff suppressed because it is too large Load Diff
+1 -2
View File
@@ -214,12 +214,11 @@ LOCALE_PATHS = (
STATIC_URL = '/static/' STATIC_URL = '/static/'
STATIC_ROOT = APP_DATAS / 'staticfiles' STATIC_ROOT = APP_DATAS / 'staticfiles'
print("Django application STATIC_ROOT:", STATIC_ROOT)
MEDIA_URL = '/media/' MEDIA_URL = '/media/'
MEDIA_ROOT = APP_DATAS / 'media' MEDIA_ROOT = APP_DATAS / 'media'
print("Django application MEDIA_ROOT:", MEDIA_ROOT) print("Django application MEDIA_ROOT:", MEDIA_ROOT, "\nDjango application STATIC_ROOT:", STATIC_ROOT)
""" """
@@ -0,0 +1,98 @@
/* ============================================================
doc_calibration.css
Styles spécifiques à la page de calibration du scanner.
Dépend de doc_database.css (variables, composants de base).
============================================================ */
/* ─── Badge teal ─── */
.badge-teal {
background: rgba(45,212,191,.12);
color: var(--accent-teal);
border: 1px solid rgba(45,212,191,.3);
}
/* ─── Badge blue ─── */
.badge-blue {
background: rgba(88,166,255,.12);
color: var(--accent-blue);
border: 1px solid rgba(88,166,255,.3);
}
/* ─── Tag teal ─── */
.tag-teal {
background: rgba(45,212,191,.12);
color: var(--accent-teal);
border: 1px solid rgba(45,212,191,.2);
}
/* ─── Schéma des 3 zones de l'écran ─── */
.screen-layout {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
gap: 8px;
margin-bottom: 24px;
border: 1px solid var(--border);
border-radius: var(--radius);
overflow: hidden;
background: var(--bg-card);
}
.screen-zone {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
gap: 8px;
padding: 20px 10px;
font-size: 12px;
font-weight: 600;
color: var(--text-secondary);
text-align: center;
border-right: 1px solid var(--border);
transition: background .15s;
}
.screen-zone:last-child { border-right: none; }
.screen-zone i { font-size: 20px; }
.zone-left { color: var(--accent-indigo); }
.zone-left i { color: var(--accent-indigo); }
.zone-center {
background: rgba(45,212,191,.04);
color: var(--accent-teal);
}
.zone-center i { font-size: 26px; color: var(--accent-teal); }
.zone-right { color: var(--accent-orange); }
.zone-right i { color: var(--accent-orange); }
/* ─── Barre visuelle des seuils de centrage ─── */
.center-bar {
display: flex;
margin-top: 12px;
border-radius: var(--radius-sm);
overflow: hidden;
height: 28px;
font-size: 11px;
font-weight: 700;
}
.cb-seg {
flex: 1;
display: flex;
align-items: center;
justify-content: center;
}
.cb-red { background: rgba(248,81,73,.18); color: var(--accent-red); border: 1px solid rgba(248,81,73,.3); }
.cb-yellow { background: rgba(227,179,65,.18); color: var(--accent-yellow); border: 1px solid rgba(227,179,65,.3); }
.cb-green { background: rgba(63,185,80,.18); color: var(--accent-green); border: 1px solid rgba(63,185,80,.3); }
/* ─── Responsive ─── */
@media (max-width: 768px) {
.screen-layout {
grid-template-columns: 1fr;
}
.screen-zone {
border-right: none;
border-bottom: 1px solid var(--border);
padding: 14px;
}
.screen-zone:last-child { border-bottom: none; }
}
@@ -40,8 +40,10 @@
/* ─── Reset minimal ─── */ /* ─── Reset minimal ─── */
*, *::before, *::after { box-sizing: border-box; } *, *::before, *::after { box-sizing: border-box; }
a { color: var(--accent-blue); text-decoration: none; } a { color: var(--accent-blue); text-decoration: none; }
a:hover { text-decoration: underline; } /*a:hover { text-decoration: underline; }*/
ul { padding: 0; margin: 0; list-style: none; } ul { padding: 0; margin: 0; list-style: none; }
/* ─── Mise en page principale ─── */ /* ─── Mise en page principale ─── */
@@ -0,0 +1,126 @@
/* ============================================================
doc_experiments.css
Styles spécifiques à la page "Démarrer des expériences".
Dépend de doc_database.css + doc_calibration.css.
============================================================ */
/* ─── Badges supplémentaires ─── */
.badge-green {
background: rgba(63,185,80,.12);
color: var(--accent-green);
border: 1px solid rgba(63,185,80,.3);
}
.badge-purple {
background: rgba(188,140,255,.12);
color: var(--accent-purple);
border: 1px solid rgba(188,140,255,.3);
}
.badge-orange {
background: rgba(240,136,62,.12);
color: var(--accent-orange);
border: 1px solid rgba(240,136,62,.3);
}
/* ─── Tags supplémentaires ─── */
.tag-purple {
background: rgba(188,140,255,.12);
color: var(--accent-purple);
border: 1px solid rgba(188,140,255,.2);
}
.tag-yellow {
background: rgba(227,179,65,.12);
color: var(--accent-yellow);
border: 1px solid rgba(227,179,65,.2);
}
/* ─── Étapes numérotées ─── */
ol.doc-steps {
list-style: none;
padding: 0;
margin: 8px 0 0;
counter-reset: step-counter;
display: flex;
flex-direction: column;
gap: 8px;
}
ol.doc-steps li {
display: flex;
align-items: flex-start;
gap: 10px;
color: var(--text-secondary);
font-size: 13px;
counter-increment: step-counter;
padding: 6px 8px;
background: rgba(255,255,255,.02);
border-radius: var(--radius-sm);
border: 1px solid var(--border);
transition: background .12s;
}
ol.doc-steps li:hover {
background: rgba(255,255,255,.05);
}
ol.doc-steps li::before {
content: counter(step-counter);
min-width: 20px;
height: 20px;
border-radius: 50%;
background: rgba(88,166,255,.15);
color: var(--accent-blue);
font-size: 11px;
font-weight: 700;
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
margin-top: 1px;
}
ol.doc-steps li i {
width: 16px;
text-align: center;
margin-top: 2px;
flex-shrink: 0;
}
/* ─── Alert info (bleu, non critique) ─── */
.alert-box.alert-info {
background: rgba(88,166,255,.08);
border-color: rgba(88,166,255,.25);
color: var(--accent-blue);
}
/* ─── Titre de groupe de métriques ─── */
.metrics-group-title {
font-size: 13px;
font-weight: 600;
color: var(--text-secondary);
margin: 16px 0 10px;
display: flex;
align-items: center;
gap: 8px;
text-transform: uppercase;
letter-spacing: .05em;
}
.metrics-group-title i {
color: var(--text-muted);
}
/* ─── Cartes métriques : padding réduit ─── */
.metrics-card {
min-width: 180px;
}
.metrics-card .card-body h4 {
font-size: 13px;
margin-bottom: 8px;
}
/* ─── Tags métriques : inline compact ─── */
.metric-tags {
display: flex;
flex-wrap: wrap;
gap: 5px;
margin-top: 4px;
}
.metric-tags .tag {
font-family: var(--font-mono);
font-size: 11px;
}
@@ -0,0 +1,32 @@
/* ============================================================
doc_results.css
Styles spécifiques à la page "Exploiter les résultats".
Dépend de doc_database.css + doc_calibration.css
+ doc_experiments.css
+ doc_scanning.css.
============================================================ */
/* ─── Bloc chemin serveur ─── */
.path-block {
display: flex;
align-items: center;
gap: 12px;
margin-top: 10px;
padding: 10px 14px;
background: rgba(45,212,191,.06);
border: 1px solid rgba(45,212,191,.2);
border-radius: var(--radius-sm);
color: var(--accent-teal);
}
.path-block i {
font-size: 16px;
flex-shrink: 0;
}
.path-block code {
color: var(--accent-teal);
background: transparent;
border: none;
font-size: 13px;
letter-spacing: .03em;
word-break: break-all;
}
@@ -0,0 +1,54 @@
/* ============================================================
doc_scanning.css
Styles spécifiques à la page "Balayage des puits".
Dépend de doc_database.css + doc_calibration.css
+ doc_experiments.css.
============================================================ */
/* ─── Badge indigo ─── */
.badge-indigo {
background: rgba(129,140,248,.12);
color: var(--accent-indigo);
border: 1px solid rgba(129,140,248,.3);
}
/* ─── Badge red ─── */
.badge-red {
background: rgba(248,81,73,.12);
color: var(--accent-red);
border: 1px solid rgba(248,81,73,.3);
}
/* ─── Badge superadmin ─── */
.badge-superadmin {
font-size: 10px;
background: rgba(188,140,255,.15);
color: var(--accent-purple);
border: 1px solid rgba(188,140,255,.3);
padding: 1px 8px;
border-radius: 20px;
margin-left: 6px;
font-weight: 700;
font-family: var(--font-mono);
}
/* ─── Exemple UUID ─── */
.uuid-example {
display: flex;
align-items: center;
gap: 10px;
margin-top: 10px;
padding: 8px 12px;
background: rgba(227,179,65,.06);
border: 1px dashed rgba(227,179,65,.25);
border-radius: var(--radius-sm);
color: var(--accent-yellow);
font-size: 12.5px;
}
.uuid-example code {
color: var(--accent-yellow);
background: transparent;
border: none;
font-size: 12.5px;
letter-spacing: .04em;
}
@@ -0,0 +1,473 @@
{% extends 'scanner/base.html' %}
{% load i18n %}
{% block columns %}{% endblock %}
{% block styles %}
{{ block.super }}
<link rel="stylesheet" href="/static/css/doc_database.css">
<link rel="stylesheet" href="/static/css/doc_calibration.css">
{% endblock %}
{% block content %}
<div class="doc-wrapper">
<!-- ─── En-tête ─── -->
<header class="doc-header">
<div class="doc-header-inner">
<div class="doc-header-icon" style="background: linear-gradient(135deg, var(--accent-teal), var(--accent-blue));">
<i class="fas fa-crosshairs"></i>
</div>
<div>
<h1 class="doc-title">{% trans "Calibration du scanner" %}</h1>
<p class="doc-subtitle">{% trans "Procédure, organisation de l'écran et commandes disponibles" %}</p>
</div>
</div>
</header>
<!-- ─── Navigation latérale ─── -->
<nav class="doc-sidenav" id="sidenav">
<p class="nav-section-label">{% trans "Navigation" %}</p>
<a href="#section-intro" class="nav-link active"><i class="fas fa-info-circle"></i> {% trans "Présentation" %}</a>
<a href="#section-screen" class="nav-link"> <i class="fas fa-desktop"></i> {% trans "Organisation écran" %}</a>
<a href="#section-left" class="nav-link nav-sub"><i class="fas fa-arrows-alt"></i> {% trans "Panneau gauche" %}</a>
<a href="#section-center" class="nav-link nav-sub"><i class="fas fa-video"></i> {% trans "Centre — vidéo live" %}</a>
<a href="#section-right" class="nav-link nav-sub"><i class="fas fa-sliders-h"></i> {% trans "Panneau droit" %}</a>
<a href="#section-centering" class="nav-link nav-sub-2"><i class="fas fa-dot-circle"></i> {% trans "Centrage" %}</a>
<a href="#section-base" class="nav-link nav-sub-2"><i class="fas fa-map-pin"></i> {% trans "Définir la base" %}</a>
</nav>
<!-- ─── Contenu principal ─── -->
<main class="doc-content">
<!-- ============================================================ -->
<!-- SECTION 1 : Présentation -->
<!-- ============================================================ -->
<section class="doc-section" id="section-intro">
<div class="section-header">
<span class="section-badge badge-teal">{% trans "Prérequis" %}</span>
<h2><i class="fas fa-crosshairs"></i> {% trans "Calibration" %}</h2>
<p class="section-desc">
{% trans "La calibration est indispensable au fonctionnement du scanner." %}<br>
<i class="fas fa-exclamation-triangle w3-text-red"></i> {% trans "Affichage des logs en bas de page" %}
</p>
</div>
<div class="info-row">
<!-- Pourquoi calibrer -->
<div class="info-card card-accent-teal">
<div class="card-icon"><i class="fas fa-bullseye"></i></div>
<div class="card-body">
<h4>{% trans "Objectifs" %}</h4>
<ul class="doc-list">
<li>
<i class="fas fa-camera text-blue"></i>
{% trans "Pointer l'axe de la caméra dans l'axe du tube." %}
</li>
<li>
<i class="fas fa-crop-alt text-cyan"></i>
{% trans "Recadrer l'image pour porter l'origine du suivi des planaires au centre du tube." %}
</li>
</ul>
</div>
</div>
<!-- Avantage recadrage -->
<div class="info-card card-accent-green">
<div class="card-icon"><i class="fas fa-compress-arrows-alt"></i></div>
<div class="card-body">
<h4>{% trans "Avantage du recadrage" %}</h4>
<ul class="doc-list">
<li>
<i class="fas fa-hdd text-green"></i>
{% trans "Réduit la taille des images stockées." %}
</li>
</ul>
</div>
</div>
</div>
<!-- IMPORTANT : base de départ -->
<div class="info-row">
<div class="info-card card-accent-red full-width">
<div class="card-icon"><i class="fas fa-exclamation-triangle"></i></div>
<div class="card-body">
<h4>{% trans "IMPORTANT — Avant toute manipulation" %} <span class="badge-important">{% trans "IMPORTANT" %}</span></h4>
<p>{% trans "Pour tout multi-puits, trouver la base de départ avant de commencer." %}</p>
</div>
</div>
</div>
</section>
<!-- ============================================================ -->
<!-- SECTION 2 : Organisation de l'écran -->
<!-- ============================================================ -->
<section class="doc-section" id="section-screen">
<div class="section-header">
<span class="section-badge badge-blue">{% trans "Interface" %}</span>
<h2><i class="fas fa-desktop"></i> {% trans "Organisation de l'écran" %}</h2>
<p class="section-desc">{% trans "L'écran de calibration est divisé en trois zones fonctionnelles." %}</p>
</div>
<!-- Schéma des 3 zones -->
<div class="screen-layout">
<div class="screen-zone zone-left">
<i class="fas fa-arrows-alt"></i>
<span>{% trans "Déplacements" %}</span>
</div>
<div class="screen-zone zone-center">
<i class="fas fa-video"></i>
<span>{% trans "Vidéo live" %}</span>
</div>
<div class="screen-zone zone-right">
<i class="fas fa-sliders-h"></i>
<span>{% trans "Commandes" %}</span>
</div>
</div>
<!-- ─── Panneau GAUCHE ─── -->
<div class="subsection" id="section-left">
<h3 class="subsection-title">
<i class="fas fa-arrow-left"></i> {% trans "Panneau gauche — Déplacements caméra" %}
</h3>
<div class="info-row">
<!-- Sélection & vitesse -->
<div class="info-card card-accent-indigo">
<div class="card-icon"><i class="fas fa-exchange-alt"></i></div>
<div class="card-body">
<h4>{% trans "Sélection & vitesse" %}</h4>
<ul class="doc-list">
<li><i class="fas fa-th"></i> {% trans "Changer de multi-puits" %}</li>
<li><i class="fas fa-tachometer-alt"></i> {% trans "Modifier la vitesse (mm/mn)" %}</li>
<li><i class="fas fa-ruler-horizontal"></i> {% trans "Modifier le pas de déplacement (mm)" %}</li>
</ul>
</div>
</div>
<!-- Manœuvre manuelle -->
<div class="info-card card-accent-blue">
<div class="card-icon"><i class="fas fa-gamepad"></i></div>
<div class="card-body">
<h4>{% trans "Manœuvre manuelle" %}</h4>
<ul class="doc-list">
<li>
<i class="fas fa-arrows-alt"></i>
{% trans "Déplacement" %}
<div class="tag-list inline">
<span class="tag tag-blue">±X</span>
<span class="tag tag-blue">±Y</span>
</div>
</li>
<li><i class="fas fa-save"></i> {% trans "Sauver la position courante" %}</li>
</ul>
</div>
</div>
<!-- Déplacement puit à puit -->
<div class="info-card card-accent-cyan">
<div class="card-icon"><i class="fas fa-step-forward"></i></div>
<div class="card-body">
<h4>{% trans "Navigation puit à puit" %}</h4>
<ul class="doc-list">
<li><i class="fas fa-arrow-right text-cyan"></i> {% trans "Boutons de déplacement puit à puit" %}</li>
<li><i class="fas fa-compress-arrows-alt text-cyan"></i> {% trans "Bouton centrage manuel" %}</li>
<li><i class="fas fa-magic text-cyan"></i> {% trans "Bouton calibrage automatique" %}</li>
</ul>
</div>
</div>
</div>
<!-- Sous-section : Définir la base -->
<div class="sub-subsection" id="section-base">
<h4 class="table-title">
<i class="fas fa-map-pin"></i>
{% trans "Définir la base" %}
<span class="badge-important">{% trans "IMPORTANT" %}</span>
</h4>
<div class="info-row">
<!-- Création en BDD -->
<div class="info-card card-accent-orange">
<div class="card-icon"><i class="fas fa-database"></i></div>
<div class="card-body">
<h4>{% trans "À la création du multi-puits en base" %}</h4>
<ul class="doc-list">
<li>
<i class="fas fa-map-marker-alt text-orange"></i>
{% trans "Fixe la base par défaut en" %} <code>(50, 50)</code>
</li>
<li>
<i class="fas fa-calculator text-orange"></i>
{% trans "Calcule et enregistre toutes les positions des puits dans" %}
<code>scanner.wellposition</code>
<p class="task-desc">
<i class="fas fa-bolt text-green"></i>
{% trans "Permet de gagner du temps au centrage manuel ou automatique." %}
</p>
</li>
</ul>
</div>
</div>
<!-- Donnée positions générées -->
<div class="info-card card-accent-yellow">
<div class="card-icon"><i class="fas fa-sync-alt"></i></div>
<div class="card-body">
<h4>
{% trans "Positions générées" %} — <code>scanner.multiwell</code>
<span class="badge-important">{% trans "ATTENTION" %}</span>
</h4>
<ul class="doc-list">
<li>
<i class="fas fa-check-circle text-green"></i>
{% trans "À la création : donnée fixée à" %} <strong>{% trans "Oui" %}</strong>
</li>
<li>
<i class="fas fa-times-circle text-red"></i>
{% trans "Non → efface" %} <code>WellPosition</code>
{% trans "et recalcule toutes les positions" %}
</li>
</ul>
</div>
</div>
</div>
<!-- Bouton Définir la base -->
<div class="info-row">
<div class="info-card card-accent-blue full-width">
<div class="card-icon"><i class="fas fa-flag-checkered"></i></div>
<div class="card-body">
<h4>{% trans "Bouton « Définir la base »" %}</h4>
<ul class="doc-list">
<li>
<i class="fas fa-map-marker text-blue"></i>
{% trans "Fixe la base aux coordonnées" %} <code>(X, Y)</code> {% trans "courantes" %}
</li>
<li>
<i class="fas fa-redo text-blue"></i>
{% trans "Recalcule toutes les positions des puits dans" %} <code>scanner.wellposition</code>
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Sous-section : Centrage -->
<div class="sub-subsection" id="section-centering">
<h4 class="table-title">
<i class="fas fa-dot-circle"></i>
{% trans "Centrage manuel / automatique" %}
<span class="badge-important">{% trans "ATTENTION" %}</span>
</h4>
<div class="info-row">
<!-- Conditions -->
<div class="info-card card-accent-purple">
<div class="card-icon"><i class="fas fa-lightbulb"></i></div>
<div class="card-body">
<h4>{% trans "Conditions requises" %}</h4>
<ul class="doc-list">
<li>
<i class="fas fa-sun text-yellow"></i>
{% trans "Éclairage important des puits — éviter les ombres." %}
</li>
<li>
<i class="fas fa-toggle-on text-blue"></i>
{% trans "Actif uniquement si Debug" %} <strong>{% trans "ET" %}</strong> {% trans "Recadrage activés (commandes à droite)." %}
</li>
</ul>
</div>
</div>
<!-- Indicateurs visuels -->
<div class="info-card card-accent-indigo">
<div class="card-icon"><i class="fas fa-circle-notch"></i></div>
<div class="card-body">
<h4>{% trans "Indicateurs visuels de centrage" %}</h4>
<ul class="doc-list">
<li>
<i class="fas fa-circle" style="color:#f85149;"></i>
<strong class="text-red">{% trans "Cercle rouge" %}</strong>
— {% trans "déplacement centre" %} <code>&lt; 20 px</code>
</li>
<li>
<i class="fas fa-circle" style="color:#e3b341;"></i>
<strong style="color:var(--accent-yellow);">{% trans "Cercle jaune" %}</strong>
— {% trans "au plus près" %} <code>&lt; 5 px</code>
</li>
<li>
<i class="fas fa-circle" style="color:#3fb950;"></i>
<strong class="text-green">{% trans "Cercle vert" %}</strong>
— {% trans "centré" %}
</li>
</ul>
<!-- Barre visuelle des seuils -->
<div class="center-bar">
<div class="cb-seg cb-red">
<span>&lt; 20 px</span>
</div>
<div class="cb-seg cb-yellow">
<span>&lt; 5 px</span>
</div>
<div class="cb-seg cb-green">
<span>{% trans "OK" %}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<!-- ─── CENTRE ─── -->
<div class="subsection" id="section-center">
<h3 class="subsection-title">
<i class="fas fa-video"></i> {% trans "Centre — Vidéo live" %}
</h3>
<div class="info-row">
<div class="info-card card-accent-teal full-width">
<div class="card-icon"><i class="fas fa-film"></i></div>
<div class="card-body">
<h4>{% trans "Flux vidéo en temps réel" %}</h4>
<p>{% trans "Affiche le flux caméra en direct, avec ou sans recadrage selon l'état de la commande." %}</p>
<div class="tag-list">
<span class="tag tag-teal">{% trans "Recadrage actif" %}</span>
<span class="tag tag-gray">{% trans "Image pleine" %}</span>
</div>
</div>
</div>
</div>
</div>
<!-- ─── PANNEAU DROIT ─── -->
<div class="subsection" id="section-right">
<h3 class="subsection-title">
<i class="fas fa-arrow-right"></i> {% trans "Panneau droit — Commandes" %}
</h3>
<div class="info-row">
<!-- Navigation rapide -->
<div class="info-card card-accent-blue">
<div class="card-icon"><i class="fas fa-location-arrow"></i></div>
<div class="card-body">
<h4>{% trans "Navigation rapide" %}</h4>
<ul class="doc-list">
<li><i class="fas fa-home text-blue"></i> {% trans "Déplacer à l'origine (0, 0)" %}</li>
<li><i class="fas fa-map-pin text-blue"></i> {% trans "Aller à la base du multi-puits" %}</li>
</ul>
</div>
</div>
<!-- Bascules -->
<div class="info-card card-accent-indigo">
<div class="card-icon"><i class="fas fa-toggle-on"></i></div>
<div class="card-body">
<h4>{% trans "Bascules" %}</h4>
<ul class="doc-list">
<li>
<i class="fas fa-bug text-purple"></i>
{% trans "Debug" %}
<div class="tag-list inline">
<span class="tag tag-green">{% trans "Oui" %}</span>
<span class="tag tag-gray">{% trans "Non" %}</span>
</div>
</li>
<li>
<i class="fas fa-ruler-combined text-purple"></i>
{% trans "Tracer axes" %}
<div class="tag-list inline">
<span class="tag tag-green">{% trans "Oui" %}</span>
<span class="tag tag-gray">{% trans "Non" %}</span>
</div>
</li>
<li>
<i class="fas fa-crop-alt text-purple"></i>
{% trans "Recadrage" %}
<div class="tag-list inline">
<span class="tag tag-green">{% trans "Oui" %}</span>
<span class="tag tag-gray">{% trans "Non" %}</span>
</div>
</li>
</ul>
</div>
</div>
</div>
<div class="info-row">
<!-- Rayon de recadrage -->
<div class="info-card card-accent-cyan">
<div class="card-icon"><i class="fas fa-circle-notch"></i></div>
<div class="card-body">
<h4>{% trans "Rayon de recadrage" %}</h4>
<p>{% trans "Ajuster le recadrage en pixels." %}</p>
</div>
</div>
<!-- Durée test -->
<div class="info-card card-accent-orange">
<div class="card-icon"><i class="fas fa-stopwatch"></i></div>
<div class="card-body">
<h4>{% trans "Durée entre puits" %}</h4>
<p>{% trans "Durée de pause entre chaque puit lors du test du circuit." %}</p>
</div>
</div>
<!-- Tester le circuit -->
<div class="info-card card-accent-green">
<div class="card-icon"><i class="fas fa-route"></i></div>
<div class="card-body">
<h4>{% trans "Tester le circuit" %}</h4>
<p>{% trans "Vérifier les déplacements en parcourant automatiquement tous les puits." %}</p>
</div>
</div>
</div>
<!-- ARRÊT -->
<div class="info-row">
<div class="info-card card-accent-red full-width">
<div class="card-icon"><i class="fas fa-hand-paper"></i></div>
<div class="card-body">
<h4>
{% trans "ARRÊT" %}
<span class="badge-important">{% trans "URGENCE" %}</span>
</h4>
<div class="alert-box">
<i class="fas fa-stop-circle"></i>
{% trans "Stoppe immédiatement tout mouvement du scanner." %}
</div>
</div>
</div>
</div>
</div><!-- end section-right -->
</section><!-- end section-screen -->
</main>
</div>
{% endblock %}
{% block js_footer %}
{{ block.super }}
<script>
/* Mise en évidence du lien actif dans la navigation latérale */
(function () {
const links = document.querySelectorAll('.nav-link');
const sections = document.querySelectorAll('[id^="section-"]');
const observer = new IntersectionObserver(
(entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
links.forEach(l => l.classList.remove('active'));
const target = document.querySelector(`.nav-link[href="#${entry.target.id}"]`);
if (target) target.classList.add('active');
}
});
},
{ rootMargin: '-10% 0px -80% 0px' }
);
sections.forEach(s => observer.observe(s));
})();
</script>
{% endblock %}
@@ -0,0 +1,541 @@
{% extends 'scanner/base.html' %}
{% load i18n %}
{% block columns %}{% endblock %}
{% block styles %}
{{ block.super }}
<link rel="stylesheet" href="/static/css/doc_database.css">
<link rel="stylesheet" href="/static/css/doc_calibration.css>
<link rel="stylesheet" href="/static/css/doc_experiments.css">
{% endblock %}
{% block content %}
<div class="doc-wrapper">
<!-- ─── En-tête ─── -->
<header class="doc-header">
<div class="doc-header-inner">
<div class="doc-header-icon" style="background: linear-gradient(135deg, var(--accent-green), var(--accent-teal));">
<i class="fas fa-flask"></i>
</div>
<div>
<h1 class="doc-title">{% trans "Démarrer des expériences" %}</h1>
<p class="doc-subtitle">{% trans "Sessions, expériences, configurations et import CSV — interface Administration Django" %}</p>
</div>
</div>
</header>
<!-- ─── Navigation latérale ─── -->
<nav class="doc-sidenav" id="sidenav">
<p class="nav-section-label">{% trans "Navigation" %}</p>
<a href="#section-intro" class="nav-link active"><i class="fas fa-info-circle"></i> {% trans "Présentation" %}</a>
<a href="#section-workflow" class="nav-link"> <i class="fas fa-random"></i> {% trans "Ordre de création" %}</a>
<a href="#section-session" class="nav-link"> <i class="fas fa-play-circle"></i> {% trans "Session" %}</a>
<a href="#section-session-data" class="nav-link nav-sub"><i class="fas fa-table"></i> {% trans "Données" %}</a>
<a href="#section-session-tasks" class="nav-link nav-sub"><i class="fas fa-clock"></i> {% trans "Tâches périodiques" %}</a>
<a href="#section-experiment" class="nav-link"> <i class="fas fa-vial"></i> {% trans "Expérience" %}</a>
<a href="#section-exp-data" class="nav-link nav-sub"><i class="fas fa-table"></i> {% trans "Données" %}</a>
<a href="#section-exp-create" class="nav-link nav-sub"><i class="fas fa-magic"></i> {% trans "Création automatique" %}</a>
<a href="#section-metrics" class="nav-link nav-sub"><i class="fas fa-chart-line"></i> {% trans "Métriques" %}</a>
<a href="#section-config" class="nav-link"> <i class="fas fa-cog"></i> {% trans "Configuration puits" %}</a>
<a href="#section-csv" class="nav-link"> <i class="fas fa-file-csv"></i> {% trans "Import CSV" %}</a>
</nav>
<!-- ─── Contenu principal ─── -->
<main class="doc-content">
<!-- ============================================================ -->
<!-- SECTION 1 : Présentation -->
<!-- ============================================================ -->
<section class="doc-section" id="section-intro">
<div class="section-header">
<span class="section-badge badge-green">{% trans "Administration Django" %}</span>
<h2><i class="fas fa-flask"></i> {% trans "Démarrer des expériences" %}</h2>
<p class="section-desc">
{% trans "C'est l'interface Administration Django qui est chargée de créer les données." %}
</p>
</div>
<div class="info-row">
<div class="info-card card-accent-green full-width">
<div class="card-icon"><i class="fas fa-th-large"></i></div>
<div class="card-body">
<h4>{% trans "Principe général" %}</h4>
<ul class="doc-list">
<li>
<i class="fas fa-link text-green"></i>
{% trans "Une expérience est toujours affectée à un multi-puits." %}
</li>
<li>
<i class="fas fa-th text-green"></i>
{% trans "Il y a 4 emplacements multi-puits, donc" %}
<strong>{% trans "4 expériences maximum par session." %}</strong>
</li>
</ul>
</div>
</div>
</div>
</section>
<!-- ============================================================ -->
<!-- SECTION 2 : Ordre de création -->
<!-- ============================================================ -->
<section class="doc-section" id="section-workflow">
<div class="section-header">
<span class="section-badge badge-blue">{% trans "Workflow" %}</span>
<h2><i class="fas fa-random"></i> {% trans "Ordre de création" %}</h2>
<p class="section-desc">{% trans "Les deux approches sont équivalentes — au choix." %}</p>
</div>
<div class="info-row">
<!-- Option A -->
<div class="info-card card-accent-indigo">
<div class="card-icon"><i class="fas fa-list-ol"></i></div>
<div class="card-body">
<h4><i class="fas fa-play-circle text-indigo"></i> {% trans "Option A — Session en premier" %}</h4>
<ol class="doc-steps">
<li><i class="fas fa-plus-circle"></i> {% trans "Créer la session" %}</li>
<li><i class="fas fa-vial"></i> {% trans "Créer les expériences (4 maxi)" %}</li>
<li><i class="fas fa-link"></i> {% trans "Revenir sur la session et ajouter les expériences" %}</li>
</ol>
</div>
</div>
<!-- Option B -->
<div class="info-card card-accent-blue">
<div class="card-icon"><i class="fas fa-list-ol"></i></div>
<div class="card-body">
<h4><i class="fas fa-vial text-blue"></i> {% trans "Option B — Expériences en premier" %}</h4>
<ol class="doc-steps">
<li><i class="fas fa-vial"></i> {% trans "Créer les expériences" %}</li>
<li><i class="fas fa-plus-circle"></i> {% trans "Créer la session" %}</li>
<li><i class="fas fa-link"></i> {% trans "Ajouter les expériences à la session" %}</li>
</ol>
</div>
</div>
</div>
</section>
<!-- ============================================================ -->
<!-- SECTION 3 : Session -->
<!-- ============================================================ -->
<section class="doc-section" id="section-session">
<div class="section-header">
<span class="section-badge badge-purple">scanner_session</span>
<h2><i class="fas fa-play-circle"></i> {% trans "Session" %}</h2>
</div>
<!-- Données importantes -->
<div class="sub-subsection" id="section-session-data">
<h4 class="table-title">
<i class="fas fa-table"></i> {% trans "Données importantes" %}
</h4>
<div class="info-row">
<div class="info-card card-accent-purple">
<div class="card-icon"><i class="fas fa-id-card"></i></div>
<div class="card-body">
<h4>{% trans "Identification" %}</h4>
<ul class="doc-list">
<li><i class="fas fa-heading text-purple"></i> {% trans "Titre" %}</li>
<li><i class="fas fa-user text-purple"></i> {% trans "Auteur" %}</li>
</ul>
</div>
</div>
<!-- Expériences de la session -->
<div class="info-card card-accent-indigo">
<div class="card-icon"><i class="fas fa-layer-group"></i></div>
<div class="card-body">
<h4>{% trans "Expériences d'une session" %}</h4>
<p>{% trans "Ajouter les expériences à la suite dans l'inline" %} <code>scanner_sessionexperiment</code>.</p>
<div class="tag-list">
<span class="tag tag-blue">{% trans "4 maximum" %}</span>
</div>
</div>
</div>
</div>
</div>
<!-- Tâches périodiques -->
<div class="sub-subsection" id="section-session-tasks">
<h4 class="table-title">
<i class="fas fa-clock"></i> {% trans "Options tâches périodiques" %}
</h4>
<div class="info-row">
<div class="info-card card-accent-orange">
<div class="card-icon"><i class="fas fa-file-export"></i></div>
<div class="card-body">
<h4>{% trans "Date d'exportation" %}</h4>
<p>{% trans "Crée une tâche différée pour exporter automatiquement les images et vidéos à la date choisie." %}</p>
<div class="tag-list">
<span class="tag tag-orange">export_session</span>
</div>
</div>
</div>
<div class="info-card card-accent-teal">
<div class="card-icon"><i class="fas fa-calendar-alt"></i></div>
<div class="card-body">
<h4>{% trans "Date du balayage" %}</h4>
<p>{% trans "Planifie le déclenchement du balayage de la session à une date ultérieure." %}</p>
<div class="tag-list">
<span class="tag tag-teal">scanning_session</span>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- ============================================================ -->
<!-- SECTION 4 : Expérience -->
<!-- ============================================================ -->
<section class="doc-section" id="section-experiment">
<div class="section-header">
<span class="section-badge badge-green">scanner_experiment</span>
<h2><i class="fas fa-vial"></i> {% trans "Expérience" %}</h2>
</div>
<!-- Données -->
<div class="sub-subsection" id="section-exp-data">
<h4 class="table-title"><i class="fas fa-table"></i> {% trans "Données" %}</h4>
<div class="info-row">
<div class="info-card card-accent-green">
<div class="card-icon"><i class="fas fa-id-card"></i></div>
<div class="card-body">
<h4>{% trans "Identification" %}</h4>
<ul class="doc-list">
<li><i class="fas fa-heading text-green"></i> {% trans "Titre" %}</li>
<li><i class="fas fa-user text-green"></i> {% trans "Auteur" %}</li>
<li><i class="fas fa-comment-alt text-green"></i> {% trans "Commentaires" %}</li>
</ul>
</div>
</div>
<div class="info-card card-accent-red">
<div class="card-icon"><i class="fas fa-exclamation-circle"></i></div>
<div class="card-body">
<h4>{% trans "Paramètres critiques" %} <span class="badge-important">{% trans "IMPORTANT" %}</span></h4>
<ul class="doc-list">
<li>
<i class="fas fa-th text-red"></i>
{% trans "Choix du multi-puits" %}
</li>
<li>
<i class="fas fa-stopwatch text-red"></i>
{% trans "Durée de la prise de vue (secondes)" %}
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Création automatique -->
<div class="sub-subsection" id="section-exp-create">
<h4 class="table-title">
<i class="fas fa-magic"></i> {% trans "Fonctionnement à la création" %}
</h4>
<div class="info-row">
<!-- experimentwell -->
<div class="info-card card-accent-blue">
<div class="card-icon"><i class="fas fa-circle-notch"></i></div>
<div class="card-body">
<h4>{% trans "Création/MAJ" %} <code>scanner.experimentwell</code></h4>
<ul class="doc-list">
<li>
<i class="fas fa-plus text-blue"></i>
{% trans "Création de chaque puit individuel." %}
</li>
<li>
<i class="fas fa-check-circle text-green"></i>
{% trans "Par défaut, tous les puits sont actifs." %}
</li>
</ul>
<div class="alert-box alert-info">
<i class="fas fa-info-circle"></i>
{% trans "Il est possible d'ignorer le balayage d'un ou plusieurs puits au choix." %}
</div>
</div>
</div>
<!-- experimentconfig -->
<div class="info-card card-accent-cyan">
<div class="card-icon"><i class="fas fa-sliders-h"></i></div>
<div class="card-body">
<h4>{% trans "Création/MAJ" %} <code>planarian.experimentconfig</code></h4>
<p>{% trans "Paramètres d'une expérience PlanarianScanner." %}</p>
<ul class="doc-list">
<li>
<i class="fas fa-user-cog text-cyan"></i>
{% trans "Créé depuis Django admin" %}
</li>
<li>
<i class="fas fa-file-csv text-cyan"></i>
{% trans "Ou import CSV depuis l'admin" %}
</li>
<li>
<i class="fas fa-pencil-alt text-muted"></i>
<em>{% trans "Données descriptives supplémentaires (à définir)" %}</em>
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- Métriques -->
<div class="sub-subsection" id="section-metrics">
<h4 class="table-title">
<i class="fas fa-chart-line"></i>
{% trans "Intégration métriques EthoVision XT + comportementales" %}
</h4>
<!-- Métriques par frame -->
<h5 class="metrics-group-title">
<i class="fas fa-film"></i> {% trans "Métriques par frame" %}
</h5>
<div class="info-row">
<div class="info-card card-accent-blue metrics-card">
<div class="card-icon"><i class="fas fa-running"></i></div>
<div class="card-body">
<h4>{% trans "Mobilité" %}</h4>
<div class="metric-tags">
<span class="tag tag-blue">velocity</span>
<span class="tag tag-blue">distance</span>
<span class="tag tag-blue">moving</span>
<span class="tag tag-blue">mobility_state</span>
</div>
</div>
</div>
<div class="info-card card-accent-orange metrics-card">
<div class="card-icon"><i class="fas fa-border-style"></i></div>
<div class="card-body">
<h4>{% trans "Thigmotaxie" %}</h4>
<div class="metric-tags">
<span class="tag tag-orange">dist_to_wall_mm</span>
<span class="tag tag-orange">near_wall</span>
</div>
</div>
</div>
<div class="info-card card-accent-yellow metrics-card">
<div class="card-icon"><i class="fas fa-sun"></i></div>
<div class="card-body">
<h4>{% trans "Phototaxie" %}</h4>
<div class="metric-tags">
<span class="tag tag-yellow">dist_to_light_mm</span>
<span class="tag tag-yellow">heading_to_light_deg</span>
<span class="tag tag-yellow">fleeing_light</span>
</div>
</div>
</div>
</div>
<div class="info-row">
<div class="info-card card-accent-green metrics-card">
<div class="card-icon"><i class="fas fa-utensils"></i></div>
<div class="card-body">
<h4>{% trans "Chimiotaxie" %}</h4>
<div class="metric-tags">
<span class="tag tag-green">dist_to_food_mm</span>
<span class="tag tag-green">heading_to_food_deg</span>
<span class="tag tag-green">approaching_food</span>
<span class="tag tag-green">in_food_zone</span>
</div>
</div>
</div>
<div class="info-card card-accent-purple metrics-card">
<div class="card-icon"><i class="fas fa-users"></i></div>
<div class="card-body">
<h4>{% trans "Social" %}</h4>
<div class="metric-tags">
<span class="tag tag-purple">nearest_neighbour_mm</span>
<span class="tag tag-purple">in_avoid_zone</span>
<span class="tag tag-purple">in_aggreg_zone</span>
<span class="tag tag-purple">chem_repulsion_level</span>
</div>
</div>
</div>
</div>
<!-- Métriques résumé -->
<h5 class="metrics-group-title" style="margin-top:20px;">
<i class="fas fa-clipboard-list"></i> {% trans "Métriques résumé (summary)" %}
</h5>
<div class="info-row">
<div class="info-card card-accent-blue metrics-card">
<div class="card-icon"><i class="fas fa-running"></i></div>
<div class="card-body">
<h4>{% trans "Mobilité" %}</h4>
<div class="metric-tags">
<span class="tag tag-blue">movedCenter_pointTotal_mm</span>
<span class="tag tag-blue">velocity_mean_mm_s</span>
<span class="tag tag-blue">{% trans "durations par état" %}</span>
</div>
</div>
</div>
<div class="info-card card-accent-orange metrics-card">
<div class="card-icon"><i class="fas fa-border-style"></i></div>
<div class="card-body">
<h4>{% trans "Thigmotaxie" %}</h4>
<div class="metric-tags">
<span class="tag tag-orange">thigmotaxis_pct_time_near_wall</span>
</div>
</div>
</div>
<div class="info-card card-accent-yellow metrics-card">
<div class="card-icon"><i class="fas fa-sun"></i></div>
<div class="card-body">
<h4>{% trans "Phototaxie" %}</h4>
<div class="metric-tags">
<span class="tag tag-yellow">photo_pct_time_fleeing</span>
<span class="tag tag-yellow">photo_mean_dist_mm</span>
<span class="tag tag-yellow">photo_latency_s</span>
</div>
</div>
</div>
</div>
<div class="info-row">
<div class="info-card card-accent-green metrics-card">
<div class="card-icon"><i class="fas fa-utensils"></i></div>
<div class="card-body">
<h4>{% trans "Chimiotaxie" %}</h4>
<div class="metric-tags">
<span class="tag tag-green">chemo_pct_time_approaching</span>
<span class="tag tag-green">chemo_pct_time_in_zone</span>
<span class="tag tag-green">chemo_latency_s</span>
<span class="tag tag-green">chemo_mean_dist_mm</span>
</div>
</div>
</div>
<div class="info-card card-accent-purple metrics-card">
<div class="card-icon"><i class="fas fa-users"></i></div>
<div class="card-body">
<h4>{% trans "Social" %}</h4>
<div class="metric-tags">
<span class="tag tag-purple">social_pct_time_avoiding</span>
<span class="tag tag-purple">social_pct_time_aggregating</span>
<span class="tag tag-purple">social_mean_nn_mm</span>
<span class="tag tag-purple">social_contact_events</span>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- ============================================================ -->
<!-- SECTION 5 : Configuration des puits -->
<!-- ============================================================ -->
<section class="doc-section" id="section-config">
<div class="section-header">
<span class="section-badge badge-teal">{% trans "Interface Scanner" %}</span>
<h2><i class="fas fa-cog"></i> {% trans "Configuration des expériences" %}</h2>
<p class="section-desc">{% trans "Sélectionner l'expérience et le puit à modifier pour compléter la fiche." %}</p>
</div>
<div class="info-row">
<div class="info-card card-accent-teal full-width">
<div class="card-icon"><i class="fas fa-edit"></i></div>
<div class="card-body">
<h4>{% trans "Procédure" %}</h4>
<ol class="doc-steps">
<li><i class="fas fa-mouse-pointer"></i> {% trans "Sélectionner l'expérience dans la liste" %}</li>
<li><i class="fas fa-circle"></i> {% trans "Sélectionner le puit à modifier" %}</li>
<li><i class="fas fa-pen"></i> {% trans "Compléter la fiche de configuration" %}</li>
</ol>
</div>
</div>
</div>
</section>
<!-- ============================================================ -->
<!-- SECTION 6 : Import CSV -->
<!-- ============================================================ -->
<section class="doc-section" id="section-csv">
<div class="section-header">
<span class="section-badge badge-orange">{% trans "Import" %}</span>
<h2><i class="fas fa-file-csv"></i> {% trans "Importer des configurations depuis CSV" %}</h2>
</div>
<div class="info-row">
<!-- Menu gauche -->
<div class="info-card card-accent-indigo">
<div class="card-icon"><i class="fas fa-bars"></i></div>
<div class="card-body">
<h4>{% trans "Menu gauche" %}</h4>
<ol class="doc-steps">
<li><i class="fas fa-play-circle"></i> {% trans "Sélectionner la session" %}</li>
<li><i class="fas fa-check-square"></i> {% trans "Cocher l'expérience souhaitée" %}</li>
</ol>
</div>
</div>
<!-- Zone de dépôt -->
<div class="info-card card-accent-blue">
<div class="card-icon"><i class="fas fa-cloud-upload-alt"></i></div>
<div class="card-body">
<h4>{% trans "Zone d'import" %}</h4>
<ol class="doc-steps">
<li><i class="fas fa-file-csv"></i> {% trans "Glisser-déposer le fichier CSV" %}</li>
<li><i class="fas fa-upload"></i> {% trans "Cliquer sur Importer" %}</li>
</ol>
</div>
</div>
</div>
<!-- Astuce CSV -->
<div class="info-row">
<div class="info-card card-accent-yellow full-width">
<div class="card-icon"><i class="fas fa-lightbulb"></i></div>
<div class="card-body">
<h4>{% trans "Astuce — Générer le template CSV depuis Django admin" %}</h4>
<ol class="doc-steps">
<li>
<i class="fas fa-th-list"></i>
{% trans "Aller dans" %}
<strong>{% trans "Planarian Configurations des expériences" %}</strong>
</li>
<li>
<i class="fas fa-check-square"></i>
{% trans "Cocher le puit de l'expérience ou un groupe d'expériences" %}
</li>
<li>
<i class="fas fa-bolt"></i>
{% trans "Action :" %} <strong>{% trans "Exporter un template CSV…" %}</strong>
</li>
<li>
<i class="fas fa-download"></i>
{% trans "Vérifier l'emplacement du fichier téléchargé (dossier Download)." %}
</li>
</ol>
</div>
</div>
</div>
</section>
</main>
</div>
{% endblock %}
{% block js_footer %}
{{ block.super }}
<script>
/* Mise en évidence du lien actif dans la navigation latérale */
(function () {
const links = document.querySelectorAll('.nav-link');
const sections = document.querySelectorAll('[id^="section-"]');
const observer = new IntersectionObserver(
(entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
links.forEach(l => l.classList.remove('active'));
const target = document.querySelector(`.nav-link[href="#${entry.target.id}"]`);
if (target) target.classList.add('active');
}
});
},
{ rootMargin: '-10% 0px -80% 0px' }
);
sections.forEach(s => observer.observe(s));
})();
</script>
{% endblock %}
@@ -0,0 +1,22 @@
{% extends 'scanner/base.html' %}
{% load i18n %}
{% block columns %}{% endblock %}
{% block styles %}
{{ block.super }}
<link rel="stylesheet" href="/static/css/doc_database.css">
<link rel="stylesheet" href="/static/css/doc_calibration.css>
<link rel="stylesheet" href="/static/css/doc_experiments.css">
<link rel="stylesheet" href="/static/css/doc_scanning.css">
<link rel="stylesheet" href="/static/css/doc_results.css">
{% endblock %}
{% block content %}
{% endblock %}
{% block js_footer %}
{{ block.super }}
</script>
{% endblock %}
@@ -0,0 +1,204 @@
{% extends 'scanner/base.html' %}
{% load i18n %}
{% block columns %}{% endblock %}
{% block styles %}
{{ block.super }}
<link rel="stylesheet" href="/static/css/doc_database.css">
<link rel="stylesheet" href="/static/css/doc_calibration.css>
<link rel="stylesheet" href="/static/css/doc_experiments.css">
<link rel="stylesheet" href="/static/css/doc_scanning.css">
<link rel="stylesheet" href="/static/css/doc_results.css">
{% endblock %}
{% block content %}
<div class="doc-wrapper">
<!-- ─── En-tête ─── -->
<header class="doc-header">
<div class="doc-header-inner">
<div class="doc-header-icon" style="background: linear-gradient(135deg, var(--accent-green), var(--accent-blue));">
<i class="fas fa-chart-bar"></i>
</div>
<div>
<h1 class="doc-title">{% trans "Exploiter les résultats" %}</h1>
<p class="doc-subtitle">{% trans "Export CSV des métriques par session, expérience et planaire" %}</p>
</div>
</div>
</header>
<!-- ─── Navigation latérale ─── -->
<nav class="doc-sidenav" id="sidenav">
<p class="nav-section-label">{% trans "Navigation" %}</p>
<a href="#section-intro" class="nav-link active"><i class="fas fa-info-circle"></i> {% trans "Présentation" %}</a>
<a href="#section-left" class="nav-link"> <i class="fas fa-bars"></i> {% trans "Menu gauche" %}</a>
<a href="#section-export" class="nav-link nav-sub"><i class="fas fa-server"></i> {% trans "Export serveur" %}</a>
<a href="#section-right" class="nav-link"> <i class="fas fa-download"></i> {% trans "Partie droite" %}</a>
<a href="#section-generate" class="nav-link nav-sub"><i class="fas fa-file-csv"></i> {% trans "Générer le CSV" %}</a>
</nav>
<!-- ─── Contenu principal ─── -->
<main class="doc-content">
<!-- ============================================================ -->
<!-- SECTION 1 : Présentation -->
<!-- ============================================================ -->
<section class="doc-section" id="section-intro">
<div class="section-header">
<span class="section-badge badge-green">{% trans "Export CSV" %}</span>
<h2><i class="fas fa-chart-bar"></i> {% trans "Exploiter les résultats des expériences" %}</h2>
<p class="section-desc">{% trans "Les métriques de suivi des planaires sont exportables au format CSV depuis l'interface Scanner." %}</p>
</div>
</section>
<!-- ============================================================ -->
<!-- SECTION 2 : Menu gauche -->
<!-- ============================================================ -->
<section class="doc-section" id="section-left">
<div class="section-header">
<span class="section-badge badge-blue">{% trans "Sélection" %}</span>
<h2><i class="fas fa-bars"></i> {% trans "Menu gauche" %}</h2>
</div>
<div class="info-row">
<div class="info-card card-accent-indigo">
<div class="card-icon"><i class="fas fa-mouse-pointer"></i></div>
<div class="card-body">
<h4>{% trans "Sélection" %}</h4>
<ol class="doc-steps">
<li><i class="fas fa-play-circle"></i> {% trans "Sélectionner la session" %}</li>
<li><i class="fas fa-check-square"></i> {% trans "Cocher l'expérience souhaitée" %}</li>
<li><i class="fas fa-file-export"></i> {% trans "Cliquer sur Exporter les métriques de l'expérience" %}</li>
</ol>
</div>
</div>
</div>
<!-- Export serveur -->
<div class="sub-subsection" id="section-export">
<h4 class="table-title">
<i class="fas fa-server"></i> {% trans "Export côté serveur" %}
<span class="badge-important">{% trans "ATTENTION" %}</span>
</h4>
<div class="info-row">
<!-- Durée -->
<div class="info-card card-accent-orange">
<div class="card-icon"><i class="fas fa-hourglass-half"></i></div>
<div class="card-body">
<h4>{% trans "Durée variable" %}</h4>
<div class="alert-box" style="margin-bottom:0;">
<i class="fas fa-exclamation-triangle"></i>
{% trans "La procédure peut être longue selon le nombre de planaires à suivre." %}
</div>
</div>
</div>
<!-- Tâche de fond -->
<div class="info-card card-accent-blue">
<div class="card-icon"><i class="fas fa-cogs"></i></div>
<div class="card-body">
<h4>{% trans "Tâche de fond" %}</h4>
<p>{% trans "Le service est exécuté en arrière-plan (Celery)." %}</p>
<div class="tag-list">
<span class="tag tag-blue">export_session</span>
</div>
</div>
</div>
</div>
<!-- Emplacement fichiers -->
<div class="info-row">
<div class="info-card card-accent-teal full-width">
<div class="card-icon"><i class="fas fa-folder-open"></i></div>
<div class="card-body">
<h4>{% trans "Emplacement des fichiers sur le serveur" %}</h4>
<div class="path-block">
<i class="fas fa-hdd"></i>
<code>/home/rpi4/export/csv/*.csv</code>
</div>
</div>
</div>
</div>
</div>
</section>
<!-- ============================================================ -->
<!-- SECTION 3 : Partie droite — téléchargement client -->
<!-- ============================================================ -->
<section class="doc-section" id="section-right">
<div class="section-header">
<span class="section-badge badge-green">{% trans "Téléchargement" %}</span>
<h2><i class="fas fa-download"></i> {% trans "Partie droite — Téléchargement client" %}</h2>
</div>
<div class="sub-subsection" id="section-generate">
<div class="info-row">
<!-- Sélections -->
<div class="info-card card-accent-indigo">
<div class="card-icon"><i class="fas fa-sliders-h"></i></div>
<div class="card-body">
<h4>{% trans "Paramètres" %}</h4>
<ul class="doc-list">
<li>
<i class="fas fa-circle text-teal"></i>
{% trans "Choisir le puit" %}
</li>
<li>
<i class="fas fa-hashtag text-indigo"></i>
{% trans "Choisir l'index du planaire" %}
<p class="task-desc">
<i class="fas fa-info-circle"></i>
{% trans "Le nombre de planaires est défini dans" %}
<em>{% trans "Paramètres d'une expérience" %}</em>.
</p>
</li>
</ul>
</div>
</div>
<!-- Bouton Générer -->
<div class="info-card card-accent-green">
<div class="card-icon"><i class="fas fa-file-download"></i></div>
<div class="card-body">
<h4>{% trans "Bouton Générer" %}</h4>
<p>{% trans "Télécharge le fichier CSV directement sur le poste client." %}</p>
<div class="alert-box alert-info">
<i class="fas fa-hourglass-half"></i>
{% trans "La procédure peut être longue." %}
</div>
</div>
</div>
</div>
</div>
</section>
</main>
</div>
{% endblock %}
{% block js_footer %}
{{ block.super }}
<script>
/* Mise en évidence du lien actif dans la navigation latérale */
(function () {
const links = document.querySelectorAll('.nav-link');
const sections = document.querySelectorAll('[id^="section-"]');
const observer = new IntersectionObserver(
(entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
links.forEach(l => l.classList.remove('active'));
const target = document.querySelector(`.nav-link[href="#${entry.target.id}"]`);
if (target) target.classList.add('active');
}
});
},
{ rootMargin: '-10% 0px -80% 0px' }
);
sections.forEach(s => observer.observe(s));
})();
</script>
{% endblock %}
@@ -0,0 +1,266 @@
{% extends 'scanner/base.html' %}
{% load i18n %}
{% block columns %}{% endblock %}
{% block styles %}
{{ block.super }}
<link rel="stylesheet" href="/static/css/doc_database.css">
<link rel="stylesheet" href="/static/css/doc_calibration.css>
<link rel="stylesheet" href="/static/css/doc_experiments.css">
<link rel="stylesheet" href="/static/css/doc_scanning.css">
{% endblock %}
{% block content %}
<div class="doc-wrapper">
<!-- ─── En-tête ─── -->
<header class="doc-header">
<div class="doc-header-inner">
<div class="doc-header-icon" style="background: linear-gradient(135deg, var(--accent-indigo), var(--accent-purple));">
<i class="fas fa-route"></i>
</div>
<div>
<h1 class="doc-title">{% trans "Balayage des puits" %}</h1>
<p class="doc-subtitle">{% trans "Lancement, suivi et procédure en cas d'arrêt" %}</p>
</div>
</div>
</header>
<!-- ─── Navigation latérale ─── -->
<nav class="doc-sidenav" id="sidenav">
<p class="nav-section-label">{% trans "Navigation" %}</p>
<a href="#section-intro" class="nav-link active"><i class="fas fa-info-circle"></i> {% trans "Présentation" %}</a>
<a href="#section-cmd" class="nav-link"> <i class="fas fa-gamepad"></i> {% trans "Commandes" %}</a>
<a href="#section-start" class="nav-link nav-sub"><i class="fas fa-play"></i> {% trans "Lancer le balayage" %}</a>
<a href="#section-stop" class="nav-link nav-sub"><i class="fas fa-stop"></i> {% trans "Arrêt" %}</a>
<a href="#section-recover" class="nav-link"> <i class="fas fa-undo-alt"></i> {% trans "Procédure après arrêt" %}</a>
<a href="#section-reduct" class="nav-link nav-sub"><i class="fas fa-database"></i> ReductStore</a>
</nav>
<!-- ─── Contenu principal ─── -->
<main class="doc-content">
<!-- ============================================================ -->
<!-- SECTION 1 : Présentation -->
<!-- ============================================================ -->
<section class="doc-section" id="section-intro">
<div class="section-header">
<span class="section-badge badge-indigo">{% trans "Balayage" %}</span>
<h2><i class="fas fa-route"></i> {% trans "Balayage des puits" %}</h2>
</div>
<div class="info-row">
<div class="info-card card-accent-indigo">
<div class="card-icon"><i class="fas fa-crop-alt"></i></div>
<div class="card-body">
<h4>{% trans "Recadrage forcé" %}</h4>
<p>{% trans "Le balayage force toujours le recadrage de l'image." %}</p>
<p>{% trans "Le balayage est disponible quand la session est marquée ACTIVE" %}</p>
<div class="alert-box alert-info">
<i class="fas fa-info-circle"></i>
{% trans "Les boutons Axes et Recadrer sont affichés à titre indicatif uniquement." %}
</div>
</div>
</div>
</div>
</section>
<!-- ============================================================ -->
<!-- SECTION 2 : Commandes -->
<!-- ============================================================ -->
<section class="doc-section" id="section-cmd">
<div class="section-header">
<span class="section-badge badge-blue">{% trans "Interface" %}</span>
<h2><i class="fas fa-gamepad"></i> {% trans "Commandes importantes" %}</h2>
</div>
<!-- Lancer le balayage -->
<div class="sub-subsection" id="section-start">
<h4 class="table-title">
<i class="fas fa-play"></i> {% trans "Lancer le balayage" %}
</h4>
<div class="info-row">
<div class="info-card card-accent-green full-width">
<div class="card-icon"><i class="fas fa-play-circle"></i></div>
<div class="card-body">
<ul class="doc-list">
<li>
<i class="fas fa-shoe-prints text-green"></i>
{% trans "Suivi pas à pas de tous les puits de la session." %}
</li>
<li>
<i class="fas fa-terminal text-green"></i>
{% trans "Les logs s'affichent en bas de l'écran en temps réel." %}
</li>
</ul>
</div>
</div>
</div>
</div>
<!-- ARRÊT -->
<div class="sub-subsection" id="section-stop">
<h4 class="table-title">
<i class="fas fa-stop"></i> {% trans "ARRÊT" %}
<span class="badge-important">{% trans "ATTENTION" %}</span>
</h4>
<div class="info-row">
<div class="info-card card-accent-green">
<div class="card-icon"><i class="fas fa-images"></i></div>
<div class="card-body">
<h4><i class="fas fa-check-circle text-green"></i> {% trans "Images" %}</h4>
<p>{% trans "Les images capturées jusqu'à l'arrêt seront enregistrées." %}</p>
</div>
</div>
<div class="info-card card-accent-red">
<div class="card-icon"><i class="fas fa-chart-line"></i></div>
<div class="card-body">
<h4><i class="fas fa-times-circle text-red"></i> {% trans "Données" %}</h4>
<p>{% trans "Les données de suivi ne seront pas enregistrées." %}</p>
</div>
</div>
</div>
</div>
</section>
<!-- ============================================================ -->
<!-- SECTION 3 : Procédure après arrêt -->
<!-- ============================================================ -->
<section class="doc-section" id="section-recover">
<div class="section-header">
<span class="section-badge badge-red">{% trans "Récupération" %}</span>
<h2><i class="fas fa-undo-alt"></i> {% trans "Procédure en cas d'arrêt" %}</h2>
</div>
<!-- Étapes Django -->
<div class="info-row">
<div class="info-card card-accent-orange full-width">
<div class="card-icon"><i class="fas fa-redo-alt"></i></div>
<div class="card-body">
<h4>{% trans "Réinitialiser la session" %}</h4>
<ol class="doc-steps">
<li>
<i class="fas fa-trash-alt text-red"></i>
{% trans "Supprimer la session en cours depuis l'administration Django." %}
</li>
<li>
<i class="fas fa-plus-circle text-green"></i>
{% trans "Créer une nouvelle session." %}
</li>
</ol>
</div>
</div>
</div>
<!-- ReductStore — superadmin -->
<div class="sub-subsection" id="section-reduct">
<h4 class="table-title">
<i class="fas fa-database"></i>
{% trans "Nettoyage ReductStore" %}
<span class="badge-superadmin">superadmin</span>
</h4>
<div class="info-row">
<div class="info-card card-accent-red full-width">
<div class="card-icon"><i class="fas fa-exclamation-triangle"></i></div>
<div class="card-body">
<h4>{% trans "Accès ReductStore" %}</h4>
<a href="http://192.168.1.200:8383/ui/dashboard" target="_blank" class="access-link">
192.168.1.200:8383/ui/dashboard <i class="fas fa-external-link-alt"></i>
</a>
</div>
</div>
</div>
<div class="info-row">
<!-- Bucket camera -->
<div class="info-card card-accent-cyan">
<div class="card-icon"><i class="fas fa-images"></i></div>
<div class="card-body">
<h4>
{% trans "Bucket" %} <code>camera</code>
</h4>
<ol class="doc-steps">
<li>
<i class="fas fa-search"></i>
{% trans "Localiser les entrées correspondant aux UUIDs des expériences." %}
</li>
<li>
<i class="fas fa-trash-alt text-red"></i>
{% trans "Supprimer les UUIDs des expériences concernées." %}
</li>
</ol>
</div>
</div>
<!-- Bucket planarian_metrics -->
<div class="info-card card-accent-green">
<div class="card-icon"><i class="fas fa-chart-line"></i></div>
<div class="card-body">
<h4>
{% trans "Bucket" %} <code>planarian_metrics</code>
</h4>
<ol class="doc-steps">
<li>
<i class="fas fa-tag"></i>
{% trans "Repérer les enregistrements dont le label correspond aux UUIDs." %}
</li>
<li>
<i class="fas fa-trash-alt text-red"></i>
{% trans "Supprimer ces enregistrements." %}
</li>
</ol>
<div class="tag-list" style="margin-top:10px;">
<span class="tag tag-gray">label: uuid</span>
</div>
</div>
</div>
</div>
<!-- Résumé visuel uuid -->
<div class="info-row">
<div class="info-card card-accent-yellow full-width">
<div class="card-icon"><i class="fas fa-key"></i></div>
<div class="card-body">
<h4>{% trans "Identifier les UUIDs à supprimer" %}</h4>
<p>{% trans "Les UUIDs des expériences sont visibles dans l'administration Django, dans la session supprimée ou dans les logs affichés pendant le balayage." %}</p>
<div class="uuid-example">
<i class="fas fa-fingerprint"></i>
<code>3-HD-A4</code>
</div>
</div>
</div>
</div>
</div>
</section>
</main>
</div>
{% endblock %}
{% block js_footer %}
{{ block.super }}
<script>
/* Mise en évidence du lien actif dans la navigation latérale */
(function () {
const links = document.querySelectorAll('.nav-link');
const sections = document.querySelectorAll('[id^="section-"]');
const observer = new IntersectionObserver(
(entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
links.forEach(l => l.classList.remove('active'));
const target = document.querySelector(`.nav-link[href="#${entry.target.id}"]`);
if (target) target.classList.add('active');
}
});
},
{ rootMargin: '-10% 0px -80% 0px' }
);
sections.forEach(s => observer.observe(s));
})();
</script>
{% endblock %}
@@ -1,3 +1,5 @@
#from django.utils.translation import gettext_lazy as _
""" """
Interface abstraite de capture vidéo. Interface abstraite de capture vidéo.
Définit le contrat que toutes les implémentations doivent respecter. Définit le contrat que toutes les implémentations doivent respecter.
@@ -23,15 +23,15 @@
{% endfor %} {% endfor %}
</div> </div>
</form> </form>
{% block export_csv %}
{% if current_session and current_experiment %} {% if current_session and current_experiment %}
{% url "planarian:api-export-csv" as url_export %} {% url "planarian:api-export-csv" as url_export %}
<a href="#" class="w3-bar-item w3-btn w3-hover-opacity" onclick="export_csv('{{ url_export }}', {{ current_experiment.id }}, 'experiment_csv')"> <a href="#" class="w3-bar-item w3-btn w3-hover-opacity" onclick="export_csv('{{ url_export }}', {{ current_experiment.id }}, 'experiment_csv')">
<i class="fa-solid fa-file-export w3-text-red w3-xlarge"></i> {% trans "Exporter les metrics de l'expérience" %}<br> <i class="fa-solid fa-file-export w3-text-red w3-xlarge"></i> {% trans "Exporter les metrics de l'expérience" %}<br>
<span class="w3-margin-left-5">&nbsp;$> {{ export_csv_destination }} <span class="w3-margin-left-5">&nbsp;$> {{ export_csv_destination }}
</a> </a>
{% endif %} {% endif %}
{% endblock %}
{% endblock %} {% endblock %}
{% block js_footer %} {% block js_footer %}
@@ -1,6 +1,6 @@
{% extends "planarian/base.html" %} {% extends "planarian/base.html" %}
{% load i18n %} {% load i18n %}
{% block export_csv %}{% endblock %}
{% block content %} {% block content %}
<div class="w3-container w3-padding-32" style="max-width:760px; margin:auto;"> <div class="w3-container w3-padding-32" style="max-width:760px; margin:auto;">
{% if current_session and current_experiment %} {% if current_session and current_experiment %}
+1 -1
View File
@@ -34,7 +34,7 @@ class ConfigurationAdmin(admin.ModelAdmin):
"classes": ("collapse",), "classes": ("collapse",),
}), }),
(_("Tracking: valeurs par défaut"), { (_("Tracking: valeurs par défaut"), {
"fields": ("tracking", "min_area_px", "max_area_ratio", "max_planarians", "merge_kernel_size", "min_contour_dist_px"), "fields": ("tracking", "tracking_setting", "min_area_px", "max_area_ratio", "max_planarians", "merge_kernel_size", "min_contour_dist_px"),
"classes": ("collapse",), "classes": ("collapse",),
}), }),
+1
View File
@@ -29,6 +29,7 @@ class DefaultConfig:
calibration_default_step: float = 1.0 calibration_default_step: float = 1.0
calibration_default_duration: float = 3.0 calibration_default_duration: float = 3.0
tracking: bool = False tracking: bool = False
tracking_setting: bool = False
tube_axis: str = 'vertical' tube_axis: str = 'vertical'
min_area_px: int = 20 min_area_px: int = 20
max_area_ratio: float = 0.10 max_area_ratio: float = 0.10
+4 -4
View File
@@ -17,8 +17,6 @@ MULTIWELL_POSITION = [
('HD', _("HD-Haut droit")), ('HD', _("HD-Haut droit")),
('BG', _("BG-Bas gauche")), ('BG', _("BG-Bas gauche")),
('BD', _("BD-Bas droit")), ('BD', _("BD-Bas droit")),
('BM', _("BM-Bas milieu")),
('HM', _("HM-Haut milieu")),
] ]
FOURCC_FORMAT = [ FOURCC_FORMAT = [
@@ -71,6 +69,8 @@ class Configuration(models.Model):
calibration_default_duration = models.FloatField(_("Duruée calibration"), help_text=_("Durée de pose entre chaque puits en s"), default=3.0) calibration_default_duration = models.FloatField(_("Duruée calibration"), help_text=_("Durée de pose entre chaque puits en s"), default=3.0)
# tracking # tracking
tracking = models.BooleanField(_("Suivi"), help_text=_("Suivi et analyse des planaires"), default=False) tracking = models.BooleanField(_("Suivi"), help_text=_("Suivi et analyse des planaires"), default=False)
tracking_setting = models.BooleanField(_("Réglage dans calibration"), help_text=_("Autorise le réglage des valeurs par défaut dans la calibration"), default=False)
tube_axis = models.CharField(_("Axe du puit"), help_text=_("Axe du tube"), default='vertical', max_length=16, choices=TUBE_AXIS_TYPE, null=True, blank=False) tube_axis = models.CharField(_("Axe du puit"), help_text=_("Axe du tube"), default='vertical', max_length=16, choices=TUBE_AXIS_TYPE, null=True, blank=False)
min_area_px = models.PositiveIntegerField(_("Surface minimale"), help_text=_("surface minimale d'un contour pour être considéré valide (px²)"), default=20) min_area_px = models.PositiveIntegerField(_("Surface minimale"), help_text=_("surface minimale d'un contour pour être considéré valide (px²)"), default=20)
max_area_ratio = models.FloatField(_("surface maximale "), help_text=_("surface maximale d'un contour en fraction de la frame (défaut 10%)"), default=0.10) max_area_ratio = models.FloatField(_("surface maximale "), help_text=_("surface maximale d'un contour en fraction de la frame (défaut 10%)"), default=0.10)
@@ -399,8 +399,8 @@ class SessionExperiment(models.Model):
class Meta: class Meta:
ordering = ['session',] ordering = ['session',]
unique_together = ["session", "experiment"] unique_together = ["session", "experiment"]
verbose_name = _("Session expérience") verbose_name = _("Expérience d'une session")
verbose_name_plural = _("Sessions expériences") verbose_name_plural = _("Expériences d'une session")
def __str__(self): def __str__(self):
return f'{self.session.id}: {self.experiment.title}' return f'{self.session.id}: {self.experiment.title}'
-3
View File
@@ -34,9 +34,6 @@ if not settings.GRBL_SIMULATION:
else: else:
from modules.grbl_simulator import GRBLController # @Reimport from modules.grbl_simulator import GRBLController # @Reimport
from . import models
@dataclass @dataclass
class ProcessData: class ProcessData:
play: bool = True play: bool = True
@@ -29,7 +29,6 @@
<a href="{% url 'scanner:adminer' %}" class="w3-bar-item w3-btn w3-hover-opacity" target="_blank" title="{% trans "Accès système" %}"> <a href="{% url 'scanner:adminer' %}" class="w3-bar-item w3-btn w3-hover-opacity" target="_blank" title="{% trans "Accès système" %}">
<img class="w3-no-padding" src="/static/img/adminer.png" style="width: 28px"> {% trans "Base de données mariadb" %} <img class="w3-no-padding" src="/static/img/adminer.png" style="width: 28px"> {% trans "Base de données mariadb" %}
</a> </a>
<a href="{% url 'scanner:logs_scheduler' %}" class="w3-bar-item w3-btn w3-hover-opacity" target="_blank"> <a href="{% url 'scanner:logs_scheduler' %}" class="w3-bar-item w3-btn w3-hover-opacity" target="_blank">
<i class="fa-regular fa-file-lines w3-text-orange"></i> {% trans "Logs des planifications" %} <i class="fa-regular fa-file-lines w3-text-orange"></i> {% trans "Logs des planifications" %}
</a> </a>
@@ -37,11 +36,26 @@
<i class="fa-regular fa-file-lines w3-text-amber"></i> {% trans "Logs des services" %} <i class="fa-regular fa-file-lines w3-text-amber"></i> {% trans "Logs des services" %}
</a> </a>
{% endif %} {% endif %}
<hr class="w3-bar-item divider w3-grey"> <div class="w3-bar-item w3-blue-grey"><i class="fa-solid fa-circle-question w3-text-amber"></i> {% trans "Guides" %}</div>
<a href="{% url 'scanner:documentation' 'doc_database' %}" class="w3-bar-item w3-btn w3-hover-opacity"> <a href="{% url 'scanner:documentation' 'doc_database' %}" class="w3-bar-item w3-btn w3-hover-opacity">
<i class="fa-solid fa-book w3-text-green"></i> {% trans "Descriptif des données" %} <i class="fa-solid fa-book w3-text-green"></i> {% trans "Descriptif des données" %}
</a> </a>
<a href="{% url 'scanner:documentation' 'doc_calibration' %}" class="w3-bar-item w3-btn w3-hover-opacity">
<i class="fa-solid fa-book w3-text-pink"></i> {% trans "Calibration des multi-puits" %}
</a>
<a href="{% url 'scanner:documentation' 'doc_experiment' %}" class="w3-bar-item w3-btn w3-hover-opacity">
<i class="fa-solid fa-book w3-text-khaki"></i> {% trans "Démarrer des expériences" %}
</a>
<a href="{% url 'scanner:documentation' 'doc_scanning' %}" class="w3-bar-item w3-btn w3-hover-opacity">
<i class="fa-solid fa-book w3-text-orange"></i> {% trans "Balayage des puits" %}
</a>
<a href="{% url 'scanner:documentation' 'doc_results' %}" class="w3-bar-item w3-btn w3-hover-opacity">
<i class="fa-solid fa-book w3-text-amber"></i> {% trans "Exploiter les résultats des expériences" %}
</a>
<a href="{% url 'scanner:documentation' 'doc_medias' %}" class="w3-bar-item w3-btn w3-hover-opacity">
<i class="fa-solid fa-photo-film w3-text-purple"></i> {% trans "Gestionnaires des médias" %}
</a>
<hr class="w3-bar-item divider w3-grey">
<form method="post" action="{% url 'logout' %}"> <form method="post" action="{% url 'logout' %}">
{% csrf_token %} {% csrf_token %}
<button class="w3-bar-item w3-btn w3-hover-opacity" type="submit"> <button class="w3-bar-item w3-btn w3-hover-opacity" type="submit">
@@ -122,7 +136,7 @@
<a href="{% url 'scanner:scanning' %}" class="w3-bar-item w3-btn w3-hover-opacity"> <a href="{% url 'scanner:scanning' %}" class="w3-bar-item w3-btn w3-hover-opacity">
<i class="fa-solid fa-film w3-text-green w3-xlarge""></i> {% trans "Balayage multi-puits" %} <i class="fa-solid fa-film w3-text-green w3-xlarge""></i> {% trans "Balayage multi-puits" %}
</a> </a>
<div class="w3-bar-item w3-light-blue">{% trans "Résultats " %}</div> <div class="w3-bar-item w3-blue-grey"><i class="fa-solid fa-square-poll-vertical w3-text-amber"></i> {% trans "Résultats " %}</div>
{% if conf.tracking %} {% if conf.tracking %}
<a href="{% url 'planarian:export-csv' %}" class="w3-bar-item w3-btn w3-hover-opacity"> <a href="{% url 'planarian:export-csv' %}" class="w3-bar-item w3-btn w3-hover-opacity">
<i class="fa-solid fa-file-export w3-text-lime w3-xlarge"></i> {% trans "Export CSV des expériences" %} <i class="fa-solid fa-file-export w3-text-lime w3-xlarge"></i> {% trans "Export CSV des expériences" %}
@@ -149,7 +149,7 @@
</button> </button>
</div> </div>
</div> </div>
{% if conf.tracking %} {% if conf.tracking and conf.tracking_setting %}
<div class="w3-row w3-row-padding w3-light-grey w3-padding-small w3-margin-1 w3-round w3-round-large w3-margin-top w3-left-align w3-paddin-top"> <div class="w3-row w3-row-padding w3-light-grey w3-padding-small w3-margin-1 w3-round w3-round-large w3-margin-top w3-left-align w3-paddin-top">
<div class="w3-half"> <div class="w3-half">
<input id="_min_area_px" type="number" min="5" max="100" step="1" class="w3-round" value="{{ conf.min_area_px }}" <input id="_min_area_px" type="number" min="5" max="100" step="1" class="w3-round" value="{{ conf.min_area_px }}"