From 6eac697bd2e07d8f9b59e7516e1ff06e7409dfc8 Mon Sep 17 00:00:00 2001 From: denis defolie Date: Fri, 15 May 2026 18:16:46 +0200 Subject: [PATCH] export --- test_tube_scanner/planarian/views.py | 5 +- test_tube_scanner/scanner/models.py | 8 +-- .../scanner/templates/scanner/base.html | 6 +- .../templates/scanner/export_medias.html | 68 +++++++++++++++++++ test_tube_scanner/scanner/urls.py | 2 + test_tube_scanner/scanner/views.py | 29 ++++++++ 6 files changed, 109 insertions(+), 9 deletions(-) create mode 100644 test_tube_scanner/scanner/templates/scanner/export_medias.html diff --git a/test_tube_scanner/planarian/views.py b/test_tube_scanner/planarian/views.py index dde25e2..c7565b1 100644 --- a/test_tube_scanner/planarian/views.py +++ b/test_tube_scanner/planarian/views.py @@ -67,10 +67,7 @@ def global_context(request, **ctx): def get_active_experiments(session, expid=None): if session: experiments = models.SessionExperiment.experiment_by_session(session.id, active=True) or [] - eid = [str(e.id) for e in experiments] - - print(f"Found {eid} active experiments for session {session.id}") - + eid = [str(e.id) for e in experiments] if experiments and not expid or expid not in eid: return experiments, experiments[0] diff --git a/test_tube_scanner/scanner/models.py b/test_tube_scanner/scanner/models.py index a83752c..8d0be6c 100644 --- a/test_tube_scanner/scanner/models.py +++ b/test_tube_scanner/scanner/models.py @@ -278,8 +278,8 @@ class Session(models.Model): name = models.CharField(_("Nom de la session"), help_text=_("Session d'expérience. 4 Multi-puits maximum"), max_length=100, null=True, blank=False) author = models.ForeignKey(User, on_delete=models.SET_NULL, verbose_name="Auteur", null=True, blank=True) active = models.BooleanField(_("Active"), default=True) - expected_export = models.DateTimeField(_("Date d'exportation"), help_text=_("Date d'exportation prévue"), null=True, blank=True) - expected_scanning = models.DateTimeField(_("Date du balayage"), help_text=_("Date du balayage prévue"), null=True, blank=True) + expected_export = models.DateTimeField(_("Date d'exportation"), help_text=_("Date d'exportation prévue"), null=True, blank=True) + expected_scanning = models.DateTimeField(_("Date du balayage"), help_text=_("Date du balayage prévue"), null=True, blank=True) created = models.DateTimeField(_("Date de création"), default=timezone.now) finished = models.DateTimeField (_("Date de fin"), null=True, blank=True) @@ -340,8 +340,8 @@ def create_periodic_task(sender, instance, created, **kwargs): ) # Sauvegarde sans re-déclencher le signal Session.objects.filter(pk=instance.pk).update(export_task=export_task) - except: - pass + except Exception as e: + print("create_periodic_task error", e) if instance.expected_scanning: try: diff --git a/test_tube_scanner/scanner/templates/scanner/base.html b/test_tube_scanner/scanner/templates/scanner/base.html index f2a021c..f8e1520 100644 --- a/test_tube_scanner/scanner/templates/scanner/base.html +++ b/test_tube_scanner/scanner/templates/scanner/base.html @@ -145,9 +145,13 @@ {% trans "Gestionnaire d'images" %} - + {% trans "Redifusion vidéos" %} + + {% trans "Exporter les fichiers multimédias" %} + + {% endblock %} {% endblock %} diff --git a/test_tube_scanner/scanner/templates/scanner/export_medias.html b/test_tube_scanner/scanner/templates/scanner/export_medias.html new file mode 100644 index 0000000..8d7deab --- /dev/null +++ b/test_tube_scanner/scanner/templates/scanner/export_medias.html @@ -0,0 +1,68 @@ +{% extends 'scanner/base.html' %} +{% load i18n %} +{% block columns %}{% endblock %} +{% block sidebar_list %} + {% trans "Retour accueil" %} +
+ {% csrf_token %} + +
+{% endblock %} + +{% block content %} +
+
+

+ {% trans "L'explortation des fichiers multimédia peut durer plusieurs heures." %} + {% trans "Préférer l'exportation différée." %} +

+
+ + {% if current_session %} +
+ {% csrf_token %} + +
+ {{ current_session.author }} + +
+
+ {{ current_session }} + +
+
+ {{ current_session.created }} +
+
+ {{ current_session.export_status }} +
+ +
+ + + {% trans "Annuler" %} + +
+
+ {% else %} +
+

{% trans "Choisir une session" %}

+
+ {% endif %} +
+ {% if current_session and current_session.export_status == 'running' %} +
+ +
+ {% endif %} +{% endblock %} + + + diff --git a/test_tube_scanner/scanner/urls.py b/test_tube_scanner/scanner/urls.py index 4471a91..49eafde 100644 --- a/test_tube_scanner/scanner/urls.py +++ b/test_tube_scanner/scanner/urls.py @@ -23,6 +23,8 @@ urlpatterns = [ path('scanning/', views.scanning_view, name='scanning'), path('images/', views.images_view, name='images'), path('replay/', views.replay_view, name='replay'), + path('export/medias/', views.export_medias, name='export_medias'), + path('api/stats/', views.stats_view, name='api_stats'), path('api/video/', views.download_api, name='download_api'), path('api/export/', views.export_api, name='export_api'), diff --git a/test_tube_scanner/scanner/views.py b/test_tube_scanner/scanner/views.py index a6bb798..d272750 100644 --- a/test_tube_scanner/scanner/views.py +++ b/test_tube_scanner/scanner/views.py @@ -9,6 +9,7 @@ from django.views.decorators.http import require_GET, require_POST from django.views.decorators.csrf import csrf_exempt from django.contrib.auth.decorators import login_required, user_passes_test from django.conf import settings +from django.utils import timezone from reduct.time import unix_timestamp_to_iso from modules.system_stats import get_cached_stats, start_background_updater @@ -195,6 +196,34 @@ def images_view(request): ) return render(request, "scanner/images.html", context=global_context(request, **ctx)) +@login_required +def export_medias(request): + cursid = 0 + if request.method == 'POST': + cursid = request.POST.get('_sid') + valid = request.POST.get('valid') + if valid == 'ok': + try: + session = models.Session.objects.get(pk=cursid) + session.expected_export = timezone.now() + if not session.export_status == "running": + session.export_status = "running" + if session.export_task: + session.export_task.enabled = True + session.export_task.save() + session.save() + + except Exception as e: + print("export_medias error", e) + + current_session = models.Session.get_session(cursid) + ctx = dict( + choice_title=_("Exporter les fichiers médias"), + sessions=models.Session.objects.filter(active=False).all(), + current_session=current_session, + url=f'http://{settings.LOCAL_IP_SERVER}:9001/logtail/test_tube:services', + ) + return render(request, "scanner/export_medias.html", context=global_context(request, **ctx)) @require_POST @csrf_exempt