Parcourir la source

Update of results info

Jérôme BUISINE il y a 4 ans
Parent
commit
e5d6d3ced9

+ 1 - 1
ThesisWebExpeDjango/urls.py

@@ -17,6 +17,6 @@ from django.contrib import admin
 from django.urls import include, path
 
 urlpatterns = [
-    path('', include('expe.urls')),
+    path('', include('expe.urls', namespace='expe')),
     path('admin/', admin.site.urls),
 ]

+ 1 - 1
expe/admin.py

@@ -1,3 +1,3 @@
 from django.contrib import admin
 
-# Register your models here.
+# Register your models here.

+ 8 - 7
expe/config.py

@@ -1,13 +1,14 @@
 # api variables
-DIRAN_DOMAIN_NAME           = "https://diran.univ-littoral.fr/"
-GET_SCENE_QUALITIES_API_URL = DIRAN_DOMAIN_NAME + "api/listSceneQualities?sceneName={0}"
-GET_SCENE_IMAGE_API_URL     = DIRAN_DOMAIN_NAME + "api/getImage?sceneName={0}&imageQuality={1}"
-GET_SCENES_API_URL          = DIRAN_DOMAIN_NAME + "api/listScenes"
+DIRAN_DOMAIN_NAME            = "https://diran.univ-littoral.fr/"
+GET_SCENE_QUALITIES_API_URL  = DIRAN_DOMAIN_NAME + "api/listSceneQualities?sceneName={0}"
+GET_SCENE_IMAGE_API_URL      = DIRAN_DOMAIN_NAME + "api/getImage?sceneName={0}&imageQuality={1}"
+GET_SCENES_API_URL           = DIRAN_DOMAIN_NAME + "api/listScenes"
 
 # folder variables
-model_expe_folder           = "expes_models/{0}/"
-output_expe_folder          = "expes_results/{0}/"
-output_tmp_folder           = "tmp"
+model_expe_folder            = "expes_models/{0}/{1}"
+output_expe_folder           = "expes_results"
+output_expe_folder_name_day  = "expes_results/{0}/{1}"
+output_tmp_folder            = "tmp"
 
 # expes list
 expe_name_list              = ["quest_one_image"]

+ 2 - 0
expe/templates/base.html

@@ -12,6 +12,7 @@
     {% block stylesheets %}
         <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
         <link rel="stylesheet" type="text/css" href="{% static "css/expe.css" %}">
+        <script src="https://kit.fontawesome.com/ee9d97bd14.js" crossorigin="anonymous"></script>
     {% endblock %}
 </head>
 <body>
@@ -23,5 +24,6 @@
     </div>
 
     {% block javascripts %}
+    
     {% endblock %}
 </body>

+ 64 - 0
expe/templates/expe/expe_results.html

@@ -0,0 +1,64 @@
+{% extends 'base.html' %}
+
+{% load staticfiles %}
+
+{% block title %}
+    Expe {{ expe_name }}
+{% endblock %}
+
+{% block content %}
+    
+    <h3>Results files of experiences</h3>
+    <br />
+
+    <div class="results-expe">
+
+        {% if expe %}
+            <h4>{{expe}}</h4>
+
+            <br/>
+            {% if folders %}
+
+                <ul class="list-group">
+
+                {% for name, folder in folders.items %} 
+                    <a href="#" class="date-folder-list">
+                        <li class="list-group-item">
+                            
+                            <div class="row">
+                                <div class="col-md-11">{{name}} </div>
+                                <div class="col-md-1"><i class="fas fa-arrow-circle-right"></i></div>
+                            </div>
+                            
+
+                            <ul class="list-group files-list" style="display: none">
+
+                                <hr />
+                                {% for f in folder %}
+                                    <li class="list-group-item">{{f}}</li>
+                                {% endfor %}
+                            </ul>
+                        </li>
+                    </a>
+                {% endfor %}
+
+                </ul>
+
+            {% else %}
+                <div class="alert alert-warning" role="alert">
+                    <i>Expe folder is empty</i>
+                </div>
+            {% endif %}
+        {% else %}
+             {% for f in folders %}
+                <ul class="list-group">
+                    <li class="list-group-item"><a href="{% url 'expe:results_expe' expe=f %}">{{f}}</a></li>
+                </ul>
+            {% endfor %}
+        {% endif %}
+    </div>
+
+    {% block javascripts %}
+        <script src="{% static "js/results.js" %}"></script>
+    {% endblock %}
+{% endblock %}

+ 4 - 0
expe/urls.py

@@ -5,10 +5,14 @@ from django.conf.urls.static import static
 
 from . import views
 
+app_name = 'expe'
+
 urlpatterns = [
     path('', views.expe_list, name='expe_list'),
     path('expe', views.expe, name='expe'),
     path('indications', views.indications, name='indications'),
+    path('admin/results', views.list_results, name='results'),
+    path('admin/results/<str:expe>', views.list_results, name='results_expe'),
 ]
 
 if settings.DEBUG is True:

+ 92 - 5
expe/views.py

@@ -2,6 +2,8 @@
 from django.shortcuts import render
 from django.http import HttpResponse
 from django.conf import settings
+from django.contrib.auth.decorators import login_required
+from django.http import Http404
 
 # main imports
 import os
@@ -12,6 +14,9 @@ import numpy as np
 from datetime import datetime
 import pickle 
 import time
+import zipfile
+from io import StringIO
+
 
 # expe imports
 from .expes.quest_plus import QuestPlus
@@ -39,6 +44,9 @@ def expe_list(request):
     # get list of experiences
     expes = cfg.expe_name_list
 
+    # by default user restart expe
+    request.session['expe_started'] = False
+
     return render(request, 'expe/expe_list.html', {'scenes': scenes, 'expes': expes})
 
 def indications(request):
@@ -80,12 +88,12 @@ def expe(request):
 
     # create output folder for expe_result
     current_day = datetime.strftime(datetime.utcnow(), "%Y-%m-%d")
-    results_folder = os.path.join(settings.MEDIA_ROOT, cfg.output_expe_folder.format(current_day))
+    results_folder = os.path.join(settings.MEDIA_ROOT, cfg.output_expe_folder_name_day.format(expe_name, current_day))
 
     if not os.path.exists(results_folder):
         os.makedirs(results_folder)
 
-    result_filename = expe_name + '_' + scene_name + '_' + request.session.get('id') + '_' + request.session.get('timestamp') +".csv"
+    result_filename = scene_name + '_' + request.session.get('id') + '_' + request.session.get('timestamp') +".csv"
     results_filepath = os.path.join(results_folder, result_filename)
 
     if not os.path.exists(results_filepath):
@@ -95,7 +103,7 @@ def expe(request):
         output_file = open(results_filepath, 'a')
 
     # create `quest` object if not exists    
-    models_folder = os.path.join(settings.MEDIA_ROOT, cfg.model_expe_folder.format(current_day))
+    models_folder = os.path.join(settings.MEDIA_ROOT, cfg.model_expe_folder.format(expe_name, current_day))
 
     if not os.path.exists(models_folder):
         os.makedirs(models_folder)
@@ -134,8 +142,85 @@ def expe(request):
     return render(request, 'expe/expe.html', data)
 
 
-def refresh_data(request, expe_name, scene_name):
+@login_required(login_url="login/")
+def list_results(request, expe=None):
+    """
+    Return all results obtained from experiences
+    """
+
+    if expe is None:
+        folders = cfg.expe_name_list
+    else:
+        if expe in cfg.expe_name_list:
+            folder_path = os.path.join(settings.MEDIA_ROOT, cfg.output_expe_folder, expe)
+
+            # init folder dictionnary
+            folders = {}
+
+            print(folder_path)
+
+            if os.path.exists(folder_path):
+            
+                days = os.listdir(folder_path)
+                print(days)
+
+                folder = {}
+
+                for day in days:
+                    day_path = os.path.join(folder_path, day)
+                    filenames = os.listdir(day_path)
+                    print(filenames)
+                    folders[day] = filenames
+        else:
+            raise Http404("Expe does not exists")
+
+    return render(request, 'expe/expe_results.html', {'expe': expe, 'folders': folders})
+
+
+@login_required(login_url="login/")
+def getfiles(request):
+    
+    day = request.POST.get('day')   
+
+    # get files from a specific day
+    folder_path = os.path.join(settings.MEDIA_ROOT, cfg.model_expe_folder.format(day))
+    filenames = os.listdir(folder_path)
+
+    # Folder name in ZIP archive which contains the above files
+    # E.g [thearchive.zip]/somefiles/file2.txt
+    # FIXME: Set this to something better
+    zip_subdir = "somefiles"
+    zip_filename = "%s.zip" % zip_subdir
+
+    # Open StringIO to grab in-memory ZIP contents
+    s = StringIO.StringIO()
+
+    # The zip compressor
+    zf = zipfile.ZipFile(s, "w")
+
+    for fpath in filenames:
+        # Calculate path for file in zip
+        fdir, fname = os.path.split(fpath)
+        zip_path = os.path.join(zip_subdir, fname)
+
+        # Add file, at correct path
+        zf.write(fpath, zip_path)
 
+    # Must close zip for all contents to be written
+    zf.close()
+
+    # Grab ZIP file from in-memory, make response with correct MIME-type
+    resp = HttpResponse(s.getvalue(), mimetype = "application/x-zip-compressed")
+    # ..and correct content-disposition
+    resp['Content-Disposition'] = 'attachment; filename=%s' % zip_filename
+
+    return resp
+
+
+def refresh_data(request, expe_name, scene_name):
+    '''
+    Utils method to refresh data from session
+    '''
     request.session['expe'] = expe_name
     request.session['scene'] = scene_name
 
@@ -150,4 +235,6 @@ def refresh_data(request, expe_name, scene_name):
     # get reference image
     #ref_image = api.get_image(scene_name, 'max')
     # save ref image as list (can't save python object)
-    #request.session['ref_img'] = np.array(ref_image).tolist()
+    #request.session['ref_img'] = np.array(ref_image).tolist()
+
+

+ 15 - 0
static/css/expe.css

@@ -13,4 +13,19 @@ body {
 
 #expeIndication{
     margin-top: 30%;
+}
+
+
+.results-expe{
+    margin-left: 20%;
+    margin-right: 20%;
+    text-align: left;
+}
+
+.results-expe a:hover{
+    text-decoration: none;
+}
+
+.results-expe a{
+    color:black;
 }

+ 22 - 0
static/js/results.js

@@ -0,0 +1,22 @@
+function toggle(elem) {
+    if (elem.style.display === "none") {
+        elem.style.display = "block";
+      } else {
+        elem.style.display = "none";
+      }
+}
+
+
+window.onload = function () {
+
+    elems = document.getElementsByClassName('date-folder-list')
+    
+    for (let item of elems) {
+
+        item.onclick = function(event){
+            event.preventDefault()
+            list = item.children[0].children[1]
+            toggle(list)
+        }
+    }
+}