chartManD commited on
Commit
a36f318
·
1 Parent(s): 3f5ed5b

Inicio y monitoreo de sesiones con Sort

Browse files
tecnicas/controllers/__init__.py CHANGED
@@ -34,6 +34,7 @@ from .views_controller.session_management.details.details_sort_controller import
34
  from .views_controller.session_management.monitor.monitor_escalas_controller import MonitorEscalasController
35
  from .views_controller.session_management.monitor.monitor_rata_controller import MonitorRATAController
36
  from .views_controller.session_management.monitor.monitor_pf_controller import MonitorPFController
 
37
 
38
  from .views_controller.sessions_tester.login_session_tester_controller import LoginSessionTesterController
39
  from .views_controller.sessions_tester.list_sessions_tester_controller import ListSessionsTesterController
 
34
  from .views_controller.session_management.monitor.monitor_escalas_controller import MonitorEscalasController
35
  from .views_controller.session_management.monitor.monitor_rata_controller import MonitorRATAController
36
  from .views_controller.session_management.monitor.monitor_pf_controller import MonitorPFController
37
+ from .views_controller.session_management.monitor.monitor_sort_controller import MonitorSortController
38
 
39
  from .views_controller.sessions_tester.login_session_tester_controller import LoginSessionTesterController
40
  from .views_controller.sessions_tester.list_sessions_tester_controller import ListSessionsTesterController
tecnicas/controllers/views_controller/session_management/details/details_controller.py CHANGED
@@ -7,7 +7,7 @@ from tecnicas.controllers import ParticipacionController
7
 
8
  class DetallesController():
9
  url_template: str
10
- url_next: str
11
 
12
  def __init__(self, session: SesionSensorial):
13
  self.session = session
 
7
 
8
  class DetallesController():
9
  url_template: str
10
+ url_next = "cata_system:monitor_sesion"
11
 
12
  def __init__(self, session: SesionSensorial):
13
  self.session = session
tecnicas/controllers/views_controller/session_management/monitor/monitor_controller.py CHANGED
@@ -1,8 +1,7 @@
1
  from django.http import HttpRequest
2
  from django.shortcuts import render, redirect
3
  from django.urls import reverse
4
- from tecnicas.models import SesionSensorial, Producto, EsAtributo, EsVocabulario
5
- from tecnicas.controllers import ParticipacionController
6
 
7
 
8
  class MonitorController():
@@ -13,20 +12,20 @@ class MonitorController():
13
  self.sensorial_session = session
14
 
15
  def controllPostFinishSession(self, request: HttpRequest):
16
- self.setContext()
17
  (is_all_end, message) = self.checkAllFinish()
18
  if not is_all_end:
 
19
  self.context["error"] = message
20
  return render(request, self.url_view, self.context)
21
  self.finishSession()
22
  return redirect(reverse(self.previus_view, kwargs={"session_code": self.sensorial_session.codigo_sesion}))
23
 
24
- def checkAllFinish(self):
25
  return (False, "Función sin implementar")
26
 
27
  def setContext(self):
28
- self.participations = ParticipacionController.getParticipationsInTechinique(
29
- self.sensorial_session.tecnica)
30
 
31
  self.context = {
32
  "code_session": self.sensorial_session.codigo_sesion,
 
1
  from django.http import HttpRequest
2
  from django.shortcuts import render, redirect
3
  from django.urls import reverse
4
+ from tecnicas.models import SesionSensorial, Producto, EsAtributo, EsVocabulario, Participacion
 
5
 
6
 
7
  class MonitorController():
 
12
  self.sensorial_session = session
13
 
14
  def controllPostFinishSession(self, request: HttpRequest):
 
15
  (is_all_end, message) = self.checkAllFinish()
16
  if not is_all_end:
17
+ self.setContext()
18
  self.context["error"] = message
19
  return render(request, self.url_view, self.context)
20
  self.finishSession()
21
  return redirect(reverse(self.previus_view, kwargs={"session_code": self.sensorial_session.codigo_sesion}))
22
 
23
+ def checkAllFinish(self) -> (bool, str):
24
  return (False, "Función sin implementar")
25
 
26
  def setContext(self):
27
+ self.participations = Participacion.objects.filter(
28
+ tecnica=self.sensorial_session.tecnica)
29
 
30
  self.context = {
31
  "code_session": self.sensorial_session.codigo_sesion,
tecnicas/controllers/views_controller/session_management/monitor/monitor_sort_controller.py ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from tecnicas.models import SesionSensorial
2
+ from tecnicas.models import Participacion
3
+ from .monitor_controller import MonitorController
4
+
5
+
6
+ class MonitorSortController(MonitorController):
7
+ def __init__(self, session: SesionSensorial):
8
+ super().__init__(session)
9
+ self.url_view = "tecnicas/manage_sesions/monitor-session-sort.html"
10
+ self.previus_view = "cata_system:detalles_sesion"
11
+
12
+ def checkAllFinish(self):
13
+ technique = self.sensorial_session.tecnica
14
+
15
+ num_participations = Participacion.objects.filter(
16
+ tecnica=technique).count()
17
+
18
+ if num_participations < technique.limite_catadores:
19
+ return (False, "No se ha alcanzado el número máximo de catadores")
20
+
21
+ unfinished_participations = Participacion.objects.filter(
22
+ tecnica=technique, finalizado=False).count()
23
+
24
+ if unfinished_participations > 0:
25
+ return (False, "No todos los catadores han finalizado su evaluación")
26
+
27
+ return (True, "Puedes finalizar la sesión")
tecnicas/templates/tecnicas/manage_sesions/monitor-session-sort.html ADDED
@@ -0,0 +1,126 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {% extends 'tecnicas/layouts/base.html' %}
2
+ {% load static %}
3
+
4
+ {% block title %}Monitoreo{% endblock %}
5
+
6
+ {% block content %}
7
+ <article class="cts-container-main">
8
+ <article class="cts-wrap-content">
9
+ <header class="text-center">
10
+ <h1 class="text-3xl font-bold text-black">Sesión sensorial en curso</h1>
11
+ </header>
12
+
13
+ <section class="flex flex-col sm:flex-row justify-between items-center gap-10">
14
+ <p class="text-xl text-center bg-surface-card p-4 text-black rounded-lg shadow-lg">
15
+ Código de sesión:<br>
16
+ <span class="font-mono text-2xl font-bold">{{ code_session }}</span>
17
+ </p>
18
+ <div class="flex flex-col gap-2">
19
+ <button class="uppercase cts-btn-general-compress cts-btn-secondary py-2 px-6 btn-push"
20
+ onclick="finishSession()">
21
+ Finalizar sesión
22
+ </button>
23
+ <a href="{% url 'cata_system:detalles_sesion' session_code=code_session %}" class="w-full">
24
+ <button class="uppercase cts-btn-general-compress cts-btn-error py-2 px-6 btn-push w-full">
25
+ Regresar
26
+ </button>
27
+ </a>
28
+ </div>
29
+ </section>
30
+
31
+ <form action="" method="post" class="hidden action-form">
32
+ <input type="hidden" name="action">
33
+ {% csrf_token %}
34
+ </form>
35
+
36
+ {% if error %}
37
+ {% include "../components/error-message.html" with message=error %}
38
+ {% endif %}
39
+
40
+ {% if message %}
41
+ {% include "../components/error-message.html" with message=message %}
42
+ {% endif %}
43
+
44
+ <section aria-labelledby="catadores-titulo">
45
+ <article
46
+ class="flex max-sm:flex-col justify-around bg-surface-card border border-gray-300 rounded-md p-3 mb-4 items-center shadow-lg">
47
+ <button class="uppercase cts-btn-general-compress cts-btn-tertiary py-2 px-6 btn-push"
48
+ onclick="reloadPage()">
49
+ Actualizar lista
50
+ </button>
51
+ <h2 id="catadores-titulo" class="text-2xl text-center font-bold rounded-lg text-gray-700 py-2 px-3">
52
+ Catadores activos
53
+ </h2>
54
+ </article>
55
+
56
+ <article
57
+ class="flex flex-col justify-center gap-3 bg-surface-card border border-gray-300 rounded-md p-3 mb-4 text-lg max-sm:text-sm text-gray-700 shadow-lg">
58
+ <div class="flex justify-center items-center">
59
+ <h2 class="text-xl font-semibold">Participantes</h2>
60
+ </div>
61
+ <section class="flex flex-wrap justify-around items-center">
62
+ <div class="flex flex-col sm:flex-row sm:items-center sm:gap-2">
63
+ <span class="font-semibold">Máximo:</span>
64
+ <span>{{ max_testers }}</span>
65
+ </div>
66
+ <div class="flex flex-col sm:flex-row sm:items-center sm:gap-2">
67
+ <span class="font-semibold">
68
+ Actuales:
69
+ </span>
70
+ <span>{{ current_testers }}</span>
71
+ </div>
72
+ <div class="flex flex-col sm:flex-row sm:items-center sm:gap-2">
73
+ <span class="font-semibold">Activos:</span>
74
+ <span class="text-green-600 font-semibold">{{ active_testers }}</span>
75
+ </div>
76
+ </section>
77
+ </article>
78
+
79
+ <article class="max-sm:overflow-x-auto shadow-lg">
80
+ <div class="min-w-[400px] sm:min-w-0">
81
+ <div
82
+ class="grid grid-cols-4 bg-surface-sweet text-center font-semibold text-black text-sm rounded-t-lg max-sm:w-full [&_>*]:px-2">
83
+ <div class="py-2 border-r border-gray-400">Usuario</div>
84
+ <div class="py-2 border-r border-gray-400">Nombre</div>
85
+ <div class="py-2 border-r border-gray-400">Estado</div>
86
+ <div class="py-2">Finalizado</div>
87
+ </div>
88
+
89
+ <ul class="divide-y divide-gray-400 max-sm:w-full text-black">
90
+ {% for parti in participations %}
91
+ <li class="grid grid-cols-4 text-center bg-surface-card py-2 [&_>*]:px-2">
92
+ <p class="border-r border-gray-400">{{ parti.catador.user.username }}</p>
93
+ <p class="border-r border-gray-400">
94
+ {{ parti.catador.user.first_name }}
95
+ {{ parti.catador.user.last_name}}
96
+ </p>
97
+
98
+ {% if parti.activo %}
99
+ <p class="border-r border-gray-400 text-green-600 font-semibold">Activo</p>
100
+ {% else %}
101
+ <p class="border-r border-gray-400 text-red-500 font-semibold">No activo</p>
102
+ {% endif %}
103
+
104
+ {% if parti.finalizado %}
105
+ <p class="text-green-600 font-semibold">Si</p>
106
+ {% else %}
107
+ <p class="text-red-500 font-semibold">No</p>
108
+ {% endif %}
109
+ </li>
110
+ {% endfor %}
111
+ </ul>
112
+ </div>
113
+ </article>
114
+ </section>
115
+ </article>
116
+ </article>
117
+ {% endblock %}
118
+
119
+ {% block extra_js %}
120
+ <script>
121
+ function reloadPage() {
122
+ location.reload()
123
+ }
124
+ </script>
125
+ <script src="{% static 'js/finish-session.js' %}"></script>
126
+ {% endblock %}
tecnicas/views/sessions_management/session_details.py CHANGED
@@ -13,8 +13,12 @@ def sessionDetails(req: HttpRequest, session_code: str):
13
  else:
14
  message = ""
15
 
16
- sensorial_session = SesionSensorial.objects.get(
17
- codigo_sesion=session_code)
 
 
 
 
18
  use_techinique = sensorial_session.tecnica.tipo_tecnica.nombre_tecnica
19
 
20
  if use_techinique == "escalas" or use_techinique == "rata":
@@ -52,28 +56,13 @@ def sessionDetails(req: HttpRequest, session_code: str):
52
  elif req.method == "POST":
53
  sensorial_session = SesionSensorial.objects.get(
54
  codigo_sesion=session_code)
55
- use_techinique = sensorial_session.tecnica.tipo_tecnica.nombre_tecnica
56
-
57
- if use_techinique == "escalas" or use_techinique == "rata" or use_techinique == "cata":
58
- controller_view = DetallesController(sensorial_session)
59
-
60
- if req.POST["action"] == "start_session":
61
- response = controller_view.startRepetition(
62
- presenter=req.user.user_presentador, request=req)
63
-
64
- elif req.POST.get("action") == "delete_session":
65
- controller_view.deleteSesorialSession()
66
- response = redirect(
67
- reverse("cata_system:panel_sesiones", kwargs={"page": 1}))
68
 
69
- else:
70
- response = controller_view.controllGetResponse(
71
- error="No se reconoce la acción a realizar")
72
 
73
- elif use_techinique == "perfil flash":
74
- controller_view = DetallesPFController(session=sensorial_session)
75
 
76
- if req.POST["action"] == "start_session":
 
77
  response = controller_view.startRepetition(
78
  presenter=req.user.user_presentador, request=req)
79
 
@@ -82,12 +71,9 @@ def sessionDetails(req: HttpRequest, session_code: str):
82
  response = redirect(
83
  reverse("cata_system:panel_sesiones", kwargs={"page": 1}))
84
 
85
- else:
86
- response = controller_view.controllGetResponse(
87
- error="No se reconoce la acción a realizar")
88
-
89
  else:
90
- response = noValidTechnique()
 
91
 
92
  return response
93
  else:
 
13
  else:
14
  message = ""
15
 
16
+ try:
17
+ sensorial_session = SesionSensorial.objects.get(
18
+ codigo_sesion=session_code)
19
+ except SesionSensorial.DoesNotExist:
20
+ return noValidTechnique(params={"page": 1}, query_params={"message": "Sesión no encontrada"}, name_view="cata_system:panel_sesiones")
21
+
22
  use_techinique = sensorial_session.tecnica.tipo_tecnica.nombre_tecnica
23
 
24
  if use_techinique == "escalas" or use_techinique == "rata":
 
56
  elif req.method == "POST":
57
  sensorial_session = SesionSensorial.objects.get(
58
  codigo_sesion=session_code)
 
 
 
 
 
 
 
 
 
 
 
 
 
59
 
60
+ use_techinique = sensorial_session.tecnica.tipo_tecnica.nombre_tecnica
 
 
61
 
62
+ controller_view = DetallesController(sensorial_session)
 
63
 
64
+ if use_techinique in ["escalas", "rata", "cata", "perfil flash", "sort"]:
65
+ if req.POST.get("action") == "start_session":
66
  response = controller_view.startRepetition(
67
  presenter=req.user.user_presentador, request=req)
68
 
 
71
  response = redirect(
72
  reverse("cata_system:panel_sesiones", kwargs={"page": 1}))
73
 
 
 
 
 
74
  else:
75
+ response = controller_view.controllGetResponse(
76
+ error="No se reconoce la acción a realizar")
77
 
78
  return response
79
  else:
tecnicas/views/sessions_management/session_monitor.py CHANGED
@@ -7,7 +7,7 @@ from django.http import HttpRequest, JsonResponse
7
  from django.shortcuts import render, redirect
8
  from django.urls import reverse
9
  from tecnicas.models import SesionSensorial
10
- from tecnicas.controllers import MonitorEscalasController, MonitorRATAController, MonitorPFController
11
  from tecnicas.utils import noValidTechnique
12
 
13
 
@@ -17,7 +17,7 @@ def sessionMonitor(req: HttpRequest, session_code: str):
17
  codigo_sesion=session_code)
18
  use_techinique = sensorial_session.tecnica.tipo_tecnica.nombre_tecnica
19
 
20
- if use_techinique == "escalas" or use_techinique == "rata" or use_techinique == "cata":
21
  controll_view = MonitorEscalasController(sensorial_session)
22
  response = controll_view.controllGetResponse(request=req)
23
 
@@ -25,6 +25,10 @@ def sessionMonitor(req: HttpRequest, session_code: str):
25
  controll_view = MonitorPFController(sensorial_session)
26
  response = controll_view.controllGetResponse(request=req)
27
 
 
 
 
 
28
  else:
29
  response = noValidTechnique(
30
  params={
@@ -74,6 +78,17 @@ def sessionMonitor(req: HttpRequest, session_code: str):
74
  response = controll_view.controlGetResponse(
75
  request=req, error="No se ha definido la acción a realizar")
76
 
 
 
 
 
 
 
 
 
 
 
 
77
  else:
78
  response = noValidTechnique(
79
  params={
 
7
  from django.shortcuts import render, redirect
8
  from django.urls import reverse
9
  from tecnicas.models import SesionSensorial
10
+ from tecnicas.controllers import MonitorEscalasController, MonitorRATAController, MonitorPFController, MonitorSortController
11
  from tecnicas.utils import noValidTechnique
12
 
13
 
 
17
  codigo_sesion=session_code)
18
  use_techinique = sensorial_session.tecnica.tipo_tecnica.nombre_tecnica
19
 
20
+ if use_techinique in ["escalas", "rata", "cata"]:
21
  controll_view = MonitorEscalasController(sensorial_session)
22
  response = controll_view.controllGetResponse(request=req)
23
 
 
25
  controll_view = MonitorPFController(sensorial_session)
26
  response = controll_view.controllGetResponse(request=req)
27
 
28
+ elif use_techinique == "sort":
29
+ controll_view = MonitorSortController(sensorial_session)
30
+ response = controll_view.controllGetResponse(request=req)
31
+
32
  else:
33
  response = noValidTechnique(
34
  params={
 
78
  response = controll_view.controlGetResponse(
79
  request=req, error="No se ha definido la acción a realizar")
80
 
81
+ elif use_techinique == "sort":
82
+ controll_view = MonitorSortController(sensorial_session)
83
+ action = req.POST["action"]
84
+
85
+ if action == "finish_session":
86
+ response = controll_view.controllPostFinishSession(
87
+ request=req)
88
+ else:
89
+ response = controll_view.controlGetResponse(
90
+ request=req, error="No se ha definido la acción a realizar")
91
+
92
  else:
93
  response = noValidTechnique(
94
  params={