Spaces:
Running
Running
Catador vista para plasmar datos en Sesion con tecnica escalas mandada
Browse files- tecnicas/controllers/__init__.py +5 -0
- tecnicas/controllers/models_controller/calificacion_controller.py +83 -1
- tecnicas/controllers/models_controller/catador_controller.py +10 -0
- tecnicas/controllers/models_controller/dato_controller.py +16 -0
- tecnicas/controllers/models_controller/escala_controller.py +29 -1
- tecnicas/controllers/models_controller/ordenes_controller.py +8 -0
- tecnicas/controllers/models_controller/palabras_controller.py +28 -12
- tecnicas/controllers/models_controller/particiapacion_controller.py +36 -0
- tecnicas/controllers/models_controller/posicion_controller.py +20 -0
- tecnicas/controllers/models_controller/productos_controller.py +14 -0
- tecnicas/controllers/views_controller/login_tester_controller.py +1 -1
- tecnicas/controllers/views_controller/main_tester_form_controller.py +9 -19
- tecnicas/templates/tecnicas/forms_tester/convencional.html +29 -1
- tecnicas/views/login_tester.py +3 -0
- tecnicas/views/tester_forms/convencional_scales.py +88 -4
- tecnicas/views/tester_forms/main_tester_form.py +8 -6
tecnicas/controllers/__init__.py
CHANGED
|
@@ -7,6 +7,11 @@ from .models_controller.estilo_palabras_controller import EstiloPalabrasControll
|
|
| 7 |
from .models_controller.palabras_controller import PalabrasController
|
| 8 |
from .models_controller.sesion_controller import SesionController
|
| 9 |
from .models_controller.calificacion_controller import CalificacionController
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 10 |
from .views_controller.detalles_sesion_controller import DetallesSesionController
|
| 11 |
from .views_controller.login_tester_controller import LoginTesterController
|
| 12 |
from .views_controller.main_tester_form_controller import MainTesterFormController
|
|
|
|
| 7 |
from .models_controller.palabras_controller import PalabrasController
|
| 8 |
from .models_controller.sesion_controller import SesionController
|
| 9 |
from .models_controller.calificacion_controller import CalificacionController
|
| 10 |
+
from .models_controller.catador_controller import CatadorController
|
| 11 |
+
from .models_controller.posicion_controller import PosicionController
|
| 12 |
+
from .models_controller.particiapacion_controller import ParticipacionController
|
| 13 |
+
from .models_controller.dato_controller import DatoController
|
| 14 |
+
|
| 15 |
from .views_controller.detalles_sesion_controller import DetallesSesionController
|
| 16 |
from .views_controller.login_tester_controller import LoginTesterController
|
| 17 |
from .views_controller.main_tester_form_controller import MainTesterFormController
|
tecnicas/controllers/models_controller/calificacion_controller.py
CHANGED
|
@@ -1,4 +1,6 @@
|
|
| 1 |
-
from ...models import Calificacion, Tecnica
|
|
|
|
|
|
|
| 2 |
|
| 3 |
|
| 4 |
class CalificacionController():
|
|
@@ -17,3 +19,83 @@ class CalificacionController():
|
|
| 17 |
data_rating[f"repeticion_{i+1}"] = response_data
|
| 18 |
|
| 19 |
return data_rating
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from ...models import Calificacion, Tecnica, Posicion, Producto, Catador
|
| 2 |
+
from ...utils import controller_error
|
| 3 |
+
from collections import defaultdict
|
| 4 |
|
| 5 |
|
| 6 |
class CalificacionController():
|
|
|
|
| 19 |
data_rating[f"repeticion_{i+1}"] = response_data
|
| 20 |
|
| 21 |
return data_rating
|
| 22 |
+
|
| 23 |
+
@staticmethod
|
| 24 |
+
def getRatings(
|
| 25 |
+
technique: Tecnica = None,
|
| 26 |
+
id_technique: int = None,
|
| 27 |
+
repetition: int = None,
|
| 28 |
+
product: Producto = None,
|
| 29 |
+
id_product: int = None,
|
| 30 |
+
tester: Catador = None,
|
| 31 |
+
id_tester: int = None,
|
| 32 |
+
user_tester: str = None,):
|
| 33 |
+
if repetition is None:
|
| 34 |
+
return controller_error("Es necesario especificar la repetición")
|
| 35 |
+
|
| 36 |
+
filters = {"num_repeticion": repetition}
|
| 37 |
+
|
| 38 |
+
if technique is not None:
|
| 39 |
+
filters["id_tecnica"] = technique
|
| 40 |
+
elif id_technique is not None:
|
| 41 |
+
filters["id_tecnica__id"] = id_technique
|
| 42 |
+
else:
|
| 43 |
+
return controller_error("Es necesario especificar la técnica")
|
| 44 |
+
|
| 45 |
+
if product is not None:
|
| 46 |
+
filters["id_producto"] = product
|
| 47 |
+
elif id_product is not None:
|
| 48 |
+
filters["id_producto__id"] = id_product
|
| 49 |
+
|
| 50 |
+
if tester is not None:
|
| 51 |
+
filters["id_catador"] = tester
|
| 52 |
+
elif id_tester is not None:
|
| 53 |
+
filters["id_catador__id"] = id_tester
|
| 54 |
+
elif user_tester is not None:
|
| 55 |
+
filters["id_catador__usuarioCatador"] = user_tester
|
| 56 |
+
|
| 57 |
+
ratings = list(Calificacion.objects.filter(**filters).select_related(
|
| 58 |
+
"id_producto",
|
| 59 |
+
"id_tecnica",
|
| 60 |
+
"id_catador",
|
| 61 |
+
))
|
| 62 |
+
|
| 63 |
+
return ratings
|
| 64 |
+
|
| 65 |
+
@staticmethod
|
| 66 |
+
def checkProducsWithoutRating(
|
| 67 |
+
positions: list[Posicion] = None,
|
| 68 |
+
user_cata: str = None,
|
| 69 |
+
repetition: int = None,
|
| 70 |
+
technique: Tecnica = None,
|
| 71 |
+
id_technique: int = None,
|
| 72 |
+
num_words: int = None):
|
| 73 |
+
check_products = [position.id_producto for position in positions]
|
| 74 |
+
|
| 75 |
+
filters = {
|
| 76 |
+
"user_tester": user_cata,
|
| 77 |
+
"repetition": repetition
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
if technique is not None:
|
| 81 |
+
filters["technique"] = technique
|
| 82 |
+
elif id_technique is not None:
|
| 83 |
+
filters["id_technique"] = id_technique
|
| 84 |
+
|
| 85 |
+
ratings = CalificacionController.getRatings(**filters)
|
| 86 |
+
|
| 87 |
+
if len(ratings) == 0:
|
| 88 |
+
return positions
|
| 89 |
+
|
| 90 |
+
ratings_dict = defaultdict(list)
|
| 91 |
+
|
| 92 |
+
for rat in ratings:
|
| 93 |
+
ratings_dict[rat.id_producto.id].append(rat)
|
| 94 |
+
|
| 95 |
+
for index, product in enumerate(check_products):
|
| 96 |
+
rating_of_product = ratings_dict.get(product.id, [])
|
| 97 |
+
|
| 98 |
+
if rating_of_product < num_words or len(rating_of_product) == 0:
|
| 99 |
+
return positions[index]
|
| 100 |
+
|
| 101 |
+
return controller_error("Sin productos por calificar")
|
tecnicas/controllers/models_controller/catador_controller.py
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from ...models import Catador
|
| 2 |
+
from ...utils import controller_error
|
| 3 |
+
|
| 4 |
+
class CatadorController:
|
| 5 |
+
def getTesterByUsername(username:str):
|
| 6 |
+
try:
|
| 7 |
+
tester = Catador.objects.get(usuarioCatador=username)
|
| 8 |
+
return tester
|
| 9 |
+
except Catador.DoesNotExist:
|
| 10 |
+
return controller_error("No se encontró el Catador")
|
tecnicas/controllers/models_controller/dato_controller.py
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from ...models import Calificacion, Dato
|
| 2 |
+
from ...utils import controller_error
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
class DatoController():
|
| 6 |
+
@staticmethod
|
| 7 |
+
def getRerecordedData(ratings: list[Calificacion]):
|
| 8 |
+
if not ratings:
|
| 9 |
+
return []
|
| 10 |
+
|
| 11 |
+
ids_ratings = [rat.id for rat in ratings]
|
| 12 |
+
|
| 13 |
+
recoreded_data = list(Dato.objects.filter(
|
| 14 |
+
id_calificacion_id__in=ids_ratings))
|
| 15 |
+
|
| 16 |
+
return recoreded_data
|
tecnicas/controllers/models_controller/escala_controller.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
from ...models import Etiqueta, EtiquetasEscala, Escala, TipoEscala
|
| 2 |
from django.db import DatabaseError
|
| 3 |
from ...utils import controller_error
|
| 4 |
|
|
@@ -68,3 +68,31 @@ class EscalaController():
|
|
| 68 |
except DatabaseError as error:
|
| 69 |
self.deleteRelationshipsWithLabels()
|
| 70 |
return controller_error("error guardar relacion etiqueta escala")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from ...models import Etiqueta, EtiquetasEscala, Escala, TipoEscala, Tecnica
|
| 2 |
from django.db import DatabaseError
|
| 3 |
from ...utils import controller_error
|
| 4 |
|
|
|
|
| 68 |
except DatabaseError as error:
|
| 69 |
self.deleteRelationshipsWithLabels()
|
| 70 |
return controller_error("error guardar relacion etiqueta escala")
|
| 71 |
+
|
| 72 |
+
@staticmethod
|
| 73 |
+
def getScaleByTechnique(technique: Tecnica = None, id_technique: int = None):
|
| 74 |
+
if technique is not None:
|
| 75 |
+
scale = Escala.objects.select_related("id_tipo_escala").only(
|
| 76 |
+
"id_tipo_escala", "longitud").get(tecnica=technique)
|
| 77 |
+
return scale
|
| 78 |
+
|
| 79 |
+
if id_technique is not None:
|
| 80 |
+
scale = Escala.objects.select_related("id_tipo_escala").only(
|
| 81 |
+
"id_tipo_escala", "longitud").get(tecnica_id=id_technique)
|
| 82 |
+
return scale
|
| 83 |
+
|
| 84 |
+
@staticmethod
|
| 85 |
+
def getRelatedTagsInScale(scale: Escala = None, id_scale: int = None):
|
| 86 |
+
if scale is not None:
|
| 87 |
+
scale_tags = list(EtiquetasEscala.objects.filter(
|
| 88 |
+
id_escala=scale).select_related("id_etiqueta"))
|
| 89 |
+
if len(scale_tags) == 0:
|
| 90 |
+
return controller_error("Imposible obtener las etiquetas")
|
| 91 |
+
return scale_tags
|
| 92 |
+
|
| 93 |
+
if id_scale is not None:
|
| 94 |
+
scale_tags = list(EtiquetasEscala.objects.filter(
|
| 95 |
+
id_escala_id=scale).select_related("id_etiqueta"))
|
| 96 |
+
if len(scale_tags) == 0:
|
| 97 |
+
return controller_error("Imposible obtener las etiquetas")
|
| 98 |
+
return scale_tags
|
tecnicas/controllers/models_controller/ordenes_controller.py
CHANGED
|
@@ -74,3 +74,11 @@ class OrdenesController():
|
|
| 74 |
return self.positions
|
| 75 |
except DatabaseError as error:
|
| 76 |
return controller_error("error al guardar las posiciones")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 74 |
return self.positions
|
| 75 |
except DatabaseError as error:
|
| 76 |
return controller_error("error al guardar las posiciones")
|
| 77 |
+
|
| 78 |
+
@staticmethod
|
| 79 |
+
def getOrderById(id: int):
|
| 80 |
+
try:
|
| 81 |
+
order = Orden.objects.get(id=id)
|
| 82 |
+
return order
|
| 83 |
+
except Orden.DoesNotExist:
|
| 84 |
+
return controller_error("No existe orden")
|
tecnicas/controllers/models_controller/palabras_controller.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
from ...models import Palabra, Tecnica, EsAtributo
|
| 2 |
from django.db import DatabaseError
|
| 3 |
from ...utils import controller_error
|
| 4 |
|
|
@@ -15,17 +15,33 @@ class PalabrasController():
|
|
| 15 |
|
| 16 |
def setWords(self):
|
| 17 |
self.words = []
|
| 18 |
-
|
| 19 |
-
|
| 20 |
-
|
| 21 |
-
|
| 22 |
-
self.words = searched_words
|
| 23 |
-
return self.words
|
| 24 |
-
except DatabaseError as error:
|
| 25 |
-
return controller_error("error al guardar buscar palabras")
|
| 26 |
|
| 27 |
@staticmethod
|
| 28 |
def getWordsInTechnique(technique: Tecnica):
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from ...models import Palabra, Tecnica, EsAtributo, EsVocabulario, Dato
|
| 2 |
from django.db import DatabaseError
|
| 3 |
from ...utils import controller_error
|
| 4 |
|
|
|
|
| 15 |
|
| 16 |
def setWords(self):
|
| 17 |
self.words = []
|
| 18 |
+
searched_words = list(Palabra.objects.filter(id__in=self.ids_words))
|
| 19 |
+
if not len(searched_words):
|
| 20 |
+
return controller_error("no se han encontrado registros")
|
| 21 |
+
return self.words
|
|
|
|
|
|
|
|
|
|
|
|
|
| 22 |
|
| 23 |
@staticmethod
|
| 24 |
def getWordsInTechnique(technique: Tecnica):
|
| 25 |
+
if technique.id_estilo.nombre_estilo == "atributos":
|
| 26 |
+
es_atribute = EsAtributo.objects.get(id_tecnica=technique)
|
| 27 |
+
words = list(es_atribute.palabras.all())
|
| 28 |
+
return words
|
| 29 |
+
elif technique.id_estilo.nombre_estilo == "vocabulario":
|
| 30 |
+
try:
|
| 31 |
+
palabras = Palabra.objects.filter(
|
| 32 |
+
vocabulario__esvocabulario__id_tecnica=technique
|
| 33 |
+
)
|
| 34 |
+
return list(palabras.distinct()) if palabras.exists() else controller_error("Técnica sin palabras con vocabulario")
|
| 35 |
+
except Exception as e:
|
| 36 |
+
return controller_error("Técnica sin palabras con vocabulario")
|
| 37 |
+
|
| 38 |
+
@staticmethod
|
| 39 |
+
def getWordsWithoutData(recoreded_data: list[Dato], words: list[Palabra]):
|
| 40 |
+
qualified_words = [data.id_palabra for data in recoreded_data]
|
| 41 |
+
|
| 42 |
+
if set(qualified_words) == set(words):
|
| 43 |
+
return controller_error("No hay palabras por usar")
|
| 44 |
+
|
| 45 |
+
words_without_use = list(set(words).difference(set(qualified_words)))
|
| 46 |
+
|
| 47 |
+
return words_without_use
|
tecnicas/controllers/models_controller/particiapacion_controller.py
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from ...models import Participacion
|
| 2 |
+
from ...utils import controller_error
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
class ParticipacionController():
|
| 6 |
+
@staticmethod
|
| 7 |
+
def enterSession(id_participation: int):
|
| 8 |
+
try:
|
| 9 |
+
participation = Participacion.objects.get(id=id_participation)
|
| 10 |
+
participation.finalizado = False
|
| 11 |
+
participation.activo = True
|
| 12 |
+
participation.save()
|
| 13 |
+
return participation
|
| 14 |
+
except Participacion.DoesNotExist:
|
| 15 |
+
return controller_error("No se ha encontrado la participación")
|
| 16 |
+
|
| 17 |
+
@staticmethod
|
| 18 |
+
def finishSession(id_participation: int):
|
| 19 |
+
try:
|
| 20 |
+
participation = Participacion.objects.get(id=id_participation)
|
| 21 |
+
participation.finalizado = True
|
| 22 |
+
participation.activo = False
|
| 23 |
+
participation.save()
|
| 24 |
+
return participation
|
| 25 |
+
except Participacion.DoesNotExist:
|
| 26 |
+
return controller_error("No se ha encontrado la participación")
|
| 27 |
+
|
| 28 |
+
@staticmethod
|
| 29 |
+
def outSession(id_participation: int):
|
| 30 |
+
try:
|
| 31 |
+
participation = Participacion.objects.get(id=id_participation)
|
| 32 |
+
participation.activo = False
|
| 33 |
+
participation.save()
|
| 34 |
+
return participation
|
| 35 |
+
except Participacion.DoesNotExist:
|
| 36 |
+
return controller_error("No se ha encontrado la participación")
|
tecnicas/controllers/models_controller/posicion_controller.py
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from ...utils import controller_error
|
| 2 |
+
from ...models import Orden, Posicion
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
class PosicionController():
|
| 6 |
+
@staticmethod
|
| 7 |
+
def getPostionsInOrder(order: Orden = None, id_order: id = None):
|
| 8 |
+
if order is not None:
|
| 9 |
+
positions = list(Posicion.objects.filter(id_orden=order))
|
| 10 |
+
if not positions:
|
| 11 |
+
return controller_error("No existe orden")
|
| 12 |
+
return positions
|
| 13 |
+
|
| 14 |
+
if id_order is not None:
|
| 15 |
+
positions = list(Posicion.objects.filter(id_orden_id=id_order))
|
| 16 |
+
if not positions:
|
| 17 |
+
return controller_error("No existe orden")
|
| 18 |
+
return positions
|
| 19 |
+
|
| 20 |
+
return controller_error("No se define búsqueda")
|
tecnicas/controllers/models_controller/productos_controller.py
CHANGED
|
@@ -37,3 +37,17 @@ class ProductosController():
|
|
| 37 |
return self.list_product
|
| 38 |
except DatabaseError as error:
|
| 39 |
return controller_error("error al guardar los productos")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
return self.list_product
|
| 38 |
except DatabaseError as error:
|
| 39 |
return controller_error("error al guardar los productos")
|
| 40 |
+
|
| 41 |
+
@staticmethod
|
| 42 |
+
def getProductsByTechniqe(technique: Tecnica = None, id_technique: int = None):
|
| 43 |
+
if technique is not None:
|
| 44 |
+
products = list(Producto.objects.filter(id_tecnica=technique))
|
| 45 |
+
if not products:
|
| 46 |
+
return controller_error("No existen productos en esta técnica")
|
| 47 |
+
return products
|
| 48 |
+
|
| 49 |
+
if id_technique is not None:
|
| 50 |
+
products = list(Producto.objects.filter(id_tecnica_id=id_technique))
|
| 51 |
+
if not products:
|
| 52 |
+
return controller_error("No existen productos en esta técnica")
|
| 53 |
+
return products
|
tecnicas/controllers/views_controller/login_tester_controller.py
CHANGED
|
@@ -18,7 +18,7 @@ class LoginTesterController():
|
|
| 18 |
self.session = SesionSensorial.objects.get(
|
| 19 |
codigo_sesion=code_session)
|
| 20 |
|
| 21 |
-
return
|
| 22 |
except (Catador.DoesNotExist, SesionSensorial.DoesNotExist):
|
| 23 |
return controller_error("Credenciales inválidas")
|
| 24 |
|
|
|
|
| 18 |
self.session = SesionSensorial.objects.get(
|
| 19 |
codigo_sesion=code_session)
|
| 20 |
|
| 21 |
+
return (self.tester, self.session)
|
| 22 |
except (Catador.DoesNotExist, SesionSensorial.DoesNotExist):
|
| 23 |
return controller_error("Credenciales inválidas")
|
| 24 |
|
tecnicas/controllers/views_controller/main_tester_form_controller.py
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
from ...models import Catador, SesionSensorial, Orden, Participacion, Producto, EsAtributo, Calificacion,
|
| 2 |
from ...utils import controller_error, shuffleArray
|
| 3 |
from django.db import transaction
|
| 4 |
|
|
@@ -18,10 +18,10 @@ class MainTesterFormController():
|
|
| 18 |
|
| 19 |
def assignOrder(self):
|
| 20 |
with transaction.atomic():
|
| 21 |
-
orders_without_tester = Orden.objects.select_for_update().filter(
|
| 22 |
-
id_tecnica=self.session.tecnica, id_catador=None)
|
| 23 |
|
| 24 |
-
if not
|
| 25 |
return controller_error("Las ordenes se han acabado")
|
| 26 |
|
| 27 |
shuffle_orders = shuffleArray(orders_without_tester)
|
|
@@ -44,24 +44,14 @@ class MainTesterFormController():
|
|
| 44 |
except Orden.DoesNotExist:
|
| 45 |
return controller_error("Catador sin orden")
|
| 46 |
|
| 47 |
-
def
|
| 48 |
-
try:
|
| 49 |
-
self.participation = Participacion.objects.get(id=id_participation)
|
| 50 |
-
self.participation.finalizado = False
|
| 51 |
-
self.participation.activo = True
|
| 52 |
-
self.participation.save()
|
| 53 |
-
return self.participation
|
| 54 |
-
except Participacion.DoesNotExist:
|
| 55 |
-
return controller_error("No se ha encontrado la participación")
|
| 56 |
-
|
| 57 |
-
def isEndedSession(self, id_participation: int):
|
| 58 |
if not self.order or not id_participation:
|
| 59 |
return controller_error("Se requieren datos para comprobar la finalización")
|
| 60 |
|
| 61 |
try:
|
| 62 |
-
|
| 63 |
|
| 64 |
-
if
|
| 65 |
num_products = Producto.objects.filter(
|
| 66 |
id_tecnica=self.session.tecnica).count()
|
| 67 |
|
|
@@ -79,12 +69,12 @@ class MainTesterFormController():
|
|
| 79 |
num_words = e_vocabulary.id_vocabulario.palabras.count()
|
| 80 |
|
| 81 |
num_ratings_now = Calificacion.objects.filter(
|
| 82 |
-
id_tecnica=self.session.tecnica, id_catador=self.tester).count()
|
| 83 |
|
| 84 |
num_ratings_max_by_tester = num_products * num_words
|
| 85 |
|
| 86 |
return not num_ratings_now <= num_ratings_max_by_tester
|
| 87 |
else:
|
| 88 |
-
return
|
| 89 |
except Participacion.DoesNotExist:
|
| 90 |
return controller_error("No se ha encontrado la participación")
|
|
|
|
| 1 |
+
from ...models import Catador, SesionSensorial, Orden, Participacion, Producto, EsAtributo, Calificacion, EsVocabulario
|
| 2 |
from ...utils import controller_error, shuffleArray
|
| 3 |
from django.db import transaction
|
| 4 |
|
|
|
|
| 18 |
|
| 19 |
def assignOrder(self):
|
| 20 |
with transaction.atomic():
|
| 21 |
+
orders_without_tester = list(Orden.objects.select_for_update().filter(
|
| 22 |
+
id_tecnica=self.session.tecnica, id_catador=None))
|
| 23 |
|
| 24 |
+
if not orders_without_tester:
|
| 25 |
return controller_error("Las ordenes se han acabado")
|
| 26 |
|
| 27 |
shuffle_orders = shuffleArray(orders_without_tester)
|
|
|
|
| 44 |
except Orden.DoesNotExist:
|
| 45 |
return controller_error("Catador sin orden")
|
| 46 |
|
| 47 |
+
def isEndedSession(self, id_participation: int, repetition: int):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 48 |
if not self.order or not id_participation:
|
| 49 |
return controller_error("Se requieren datos para comprobar la finalización")
|
| 50 |
|
| 51 |
try:
|
| 52 |
+
participation = Participacion.objects.get(id=id_participation)
|
| 53 |
|
| 54 |
+
if participation.finalizado:
|
| 55 |
num_products = Producto.objects.filter(
|
| 56 |
id_tecnica=self.session.tecnica).count()
|
| 57 |
|
|
|
|
| 69 |
num_words = e_vocabulary.id_vocabulario.palabras.count()
|
| 70 |
|
| 71 |
num_ratings_now = Calificacion.objects.filter(
|
| 72 |
+
id_tecnica=self.session.tecnica, id_catador=self.tester, num_repeticion=repetition).count()
|
| 73 |
|
| 74 |
num_ratings_max_by_tester = num_products * num_words
|
| 75 |
|
| 76 |
return not num_ratings_now <= num_ratings_max_by_tester
|
| 77 |
else:
|
| 78 |
+
return participation.finalizado
|
| 79 |
except Participacion.DoesNotExist:
|
| 80 |
return controller_error("No se ha encontrado la participación")
|
tecnicas/templates/tecnicas/forms_tester/convencional.html
CHANGED
|
@@ -1,4 +1,4 @@
|
|
| 1 |
-
{% extends 'tecnicas/layouts/base.html' %}
|
| 2 |
|
| 3 |
{% block title %}Convencional{% endblock %}
|
| 4 |
|
|
@@ -11,11 +11,39 @@
|
|
| 11 |
</h1>
|
| 12 |
</header>
|
| 13 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 14 |
<article>
|
| 15 |
<p class="text-lg font-medium text-center bg-gray-200 p-4 rounded">
|
| 16 |
{{ session.tecnica.instrucciones }}
|
| 17 |
</p>
|
| 18 |
</article>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
</article>
|
| 20 |
</article>
|
| 21 |
{% endblock %}
|
|
|
|
| 1 |
+
{% extends 'tecnicas/layouts/base.html' %}
|
| 2 |
|
| 3 |
{% block title %}Convencional{% endblock %}
|
| 4 |
|
|
|
|
| 11 |
</h1>
|
| 12 |
</header>
|
| 13 |
|
| 14 |
+
{% if error %}
|
| 15 |
+
<hr>
|
| 16 |
+
|
| 17 |
+
<article class="bg-red-600 p-4 text-white rounded-xl ct-notification-error">
|
| 18 |
+
<p class="block font-sans text-white text-xl antialiased font-bold uppercase tracking-wider text-center">
|
| 19 |
+
{{ error }}
|
| 20 |
+
</p>
|
| 21 |
+
</article>
|
| 22 |
+
{% endif %}
|
| 23 |
+
|
| 24 |
<article>
|
| 25 |
<p class="text-lg font-medium text-center bg-gray-200 p-4 rounded">
|
| 26 |
{{ session.tecnica.instrucciones }}
|
| 27 |
</p>
|
| 28 |
</article>
|
| 29 |
+
|
| 30 |
+
<article>
|
| 31 |
+
<p class="text-lg font-medium text-center bg-gray-200 p-4 rounded">
|
| 32 |
+
{{ scale }}
|
| 33 |
+
</p>
|
| 34 |
+
</article>
|
| 35 |
+
|
| 36 |
+
<article>
|
| 37 |
+
<p class="text-lg font-medium text-center bg-gray-200 p-4 rounded">
|
| 38 |
+
{{ tags }}
|
| 39 |
+
</p>
|
| 40 |
+
</article>
|
| 41 |
+
|
| 42 |
+
<article>
|
| 43 |
+
<p class="text-lg font-medium text-center bg-gray-200 p-4 rounded">
|
| 44 |
+
{{ words }}
|
| 45 |
+
</p>
|
| 46 |
+
</article>
|
| 47 |
</article>
|
| 48 |
</article>
|
| 49 |
{% endblock %}
|
tecnicas/views/login_tester.py
CHANGED
|
@@ -21,6 +21,8 @@ def testerLogin(req: HttpRequest):
|
|
| 21 |
if isinstance(existCredentials, dict):
|
| 22 |
context = {"error": existCredentials["error"]}
|
| 23 |
return render(req, "tecnicas/cata-login.html", context)
|
|
|
|
|
|
|
| 24 |
|
| 25 |
taster_participation = login_controller.validateEntry()
|
| 26 |
if isinstance(taster_participation, dict):
|
|
@@ -29,6 +31,7 @@ def testerLogin(req: HttpRequest):
|
|
| 29 |
|
| 30 |
req.session["cata_username"] = tester_user
|
| 31 |
req.session["code_session"] = session_code
|
|
|
|
| 32 |
req.session["id_participation"] = taster_participation.id
|
| 33 |
|
| 34 |
req.session.set_expiry(20*60)
|
|
|
|
| 21 |
if isinstance(existCredentials, dict):
|
| 22 |
context = {"error": existCredentials["error"]}
|
| 23 |
return render(req, "tecnicas/cata-login.html", context)
|
| 24 |
+
|
| 25 |
+
session = existCredentials[1]
|
| 26 |
|
| 27 |
taster_participation = login_controller.validateEntry()
|
| 28 |
if isinstance(taster_participation, dict):
|
|
|
|
| 31 |
|
| 32 |
req.session["cata_username"] = tester_user
|
| 33 |
req.session["code_session"] = session_code
|
| 34 |
+
req.session["id_techniqe"] = session.tecnica.id
|
| 35 |
req.session["id_participation"] = taster_participation.id
|
| 36 |
|
| 37 |
req.session.set_expiry(20*60)
|
tecnicas/views/tester_forms/convencional_scales.py
CHANGED
|
@@ -1,17 +1,101 @@
|
|
| 1 |
-
from django.http import HttpRequest
|
| 2 |
from django.shortcuts import redirect, render
|
| 3 |
from django.urls import reverse
|
| 4 |
-
from ...controllers import SesionController
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 5 |
|
| 6 |
|
| 7 |
def convencionalScales(req: HttpRequest):
|
| 8 |
if not "id_order" in req.session:
|
| 9 |
-
return redirect(reverse("cata_system:
|
| 10 |
|
| 11 |
session = SesionController.getSessionByCode(req.session["code_session"])
|
|
|
|
| 12 |
|
| 13 |
context = {
|
| 14 |
"session": session
|
| 15 |
}
|
| 16 |
|
| 17 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from django.http import HttpRequest
|
| 2 |
from django.shortcuts import redirect, render
|
| 3 |
from django.urls import reverse
|
| 4 |
+
from ...controllers import SesionController, PosicionController, CalificacionController, ParticipacionController, PalabrasController, EscalaController, DatoController
|
| 5 |
+
|
| 6 |
+
'''
|
| 7 |
+
**** Esta vista para sesion con tecnica convencional de escalas, al entrar debe:
|
| 8 |
+
**** ****
|
| 9 |
+
* Obtner los productos que se evaluan en la tecnica
|
| 10 |
+
* Ordenar los productos segun la Poscion en que se encuentre en el Orden ya establecidos
|
| 11 |
+
* Obtner las palabras para evaluar
|
| 12 |
+
- Revisar que estilo usan
|
| 13 |
+
- Obtner las palabras si el estilo es atributos
|
| 14 |
+
- Obtner las palabras si el estilo es Vocabulario
|
| 15 |
+
- El Catador plasma sus resultados para las palabras sin importar el estilo
|
| 16 |
+
* Comprobar que productos se han calificado
|
| 17 |
+
- Revisar el numero de palabras
|
| 18 |
+
- Comenzar con el primer producto e ir revisando uno a uno
|
| 19 |
+
- Revisar el numero de calificaciones del producto
|
| 20 |
+
- Numero de calificaciones del producto == 0
|
| 21 |
+
- Continuar con la evaluacion o comezar con este producto
|
| 22 |
+
- Numero de calificaciones del producto < numero de palabras
|
| 23 |
+
- Continuar con la evaluacion
|
| 24 |
+
- Numero de calificacion == numero de palabras
|
| 25 |
+
- Pasar con el siguiente producto
|
| 26 |
+
* Si no quedan mas productos por revisar
|
| 27 |
+
- Participacion.finalizado = True
|
| 28 |
+
- Participacion.activo = False
|
| 29 |
+
- Redirigir a "catador_main"
|
| 30 |
+
* Optner la siguiente palabra sin calificar
|
| 31 |
+
- Obtener las calificaiones de producto
|
| 32 |
+
- Obtener los datos de las calificaciones
|
| 33 |
+
- Comprobar que palabras no estan tienen dato
|
| 34 |
+
- Mandar palabras para el usuario
|
| 35 |
+
* Obtener informacion de la escala para mandar
|
| 36 |
+
'''
|
| 37 |
|
| 38 |
|
| 39 |
def convencionalScales(req: HttpRequest):
|
| 40 |
if not "id_order" in req.session:
|
| 41 |
+
return redirect(reverse("cata_system:catador_main"))
|
| 42 |
|
| 43 |
session = SesionController.getSessionByCode(req.session["code_session"])
|
| 44 |
+
technique = session.tecnica
|
| 45 |
|
| 46 |
context = {
|
| 47 |
"session": session
|
| 48 |
}
|
| 49 |
|
| 50 |
+
if req.method == "GET":
|
| 51 |
+
positions = PosicionController.getPostionsInOrder(
|
| 52 |
+
id_order=req.session["id_order"])
|
| 53 |
+
|
| 54 |
+
sorted_positions = sorted(positions, key=lambda posi: posi.posicion)
|
| 55 |
+
|
| 56 |
+
words = PalabrasController.getWordsInTechnique(technique=technique)
|
| 57 |
+
|
| 58 |
+
next_position = CalificacionController.checkProducsWithoutRating(
|
| 59 |
+
positions=sorted_positions,
|
| 60 |
+
user_cata=req.session["cata_username"],
|
| 61 |
+
id_technique=req.session["id_techniqe"],
|
| 62 |
+
repetition=session.tecnica.repecion,
|
| 63 |
+
technique=technique,
|
| 64 |
+
num_words=len(words)
|
| 65 |
+
)
|
| 66 |
+
|
| 67 |
+
if isinstance(next_position, dict):
|
| 68 |
+
updated_participation = ParticipacionController.finishSession(
|
| 69 |
+
req.session["id_participation"])
|
| 70 |
+
return redirect(reverse("cata_system:catador_main"))
|
| 71 |
+
|
| 72 |
+
if isinstance(next_position, list):
|
| 73 |
+
next_position = next_position[0]
|
| 74 |
+
|
| 75 |
+
ratings_product = CalificacionController.getRatings(
|
| 76 |
+
technique=technique,
|
| 77 |
+
product=next_position.id_producto,
|
| 78 |
+
repetition=technique.repecion,
|
| 79 |
+
user_tester=req.session["cata_username"]
|
| 80 |
+
)
|
| 81 |
+
|
| 82 |
+
if isinstance(ratings_product, dict):
|
| 83 |
+
context["error"] = ratings_product["error"]
|
| 84 |
+
return render(req, "tecnicas/forms_tester/convencional.html", context)
|
| 85 |
+
elif not ratings_product:
|
| 86 |
+
context["words"] = words
|
| 87 |
+
else:
|
| 88 |
+
recoreded_data = DatoController.getRerecordedData(ratings=ratings_product)
|
| 89 |
+
if not recoreded_data:
|
| 90 |
+
context["words"] = words
|
| 91 |
+
|
| 92 |
+
words_to_use = PalabrasController.getWordsWithoutData(recoreded_data=recoreded_data, words=words)
|
| 93 |
+
context["words"] = words_to_use
|
| 94 |
+
|
| 95 |
+
scale = EscalaController.getScaleByTechnique(technique=technique)
|
| 96 |
+
context["scale"] = scale
|
| 97 |
+
|
| 98 |
+
use_tags = EscalaController.getRelatedTagsInScale(scale=scale)
|
| 99 |
+
context["tags"] = use_tags
|
| 100 |
+
|
| 101 |
+
return render(req, "tecnicas/forms_tester/convencional.html", context)
|
tecnicas/views/tester_forms/main_tester_form.py
CHANGED
|
@@ -1,7 +1,7 @@
|
|
| 1 |
from django.http import HttpRequest, JsonResponse
|
| 2 |
from django.shortcuts import render, redirect
|
| 3 |
from django.urls import reverse
|
| 4 |
-
from ...controllers import SesionController, MainTesterFormController
|
| 5 |
|
| 6 |
|
| 7 |
def mainTesterForm(req: HttpRequest):
|
|
@@ -20,7 +20,7 @@ def mainTesterForm(req: HttpRequest):
|
|
| 20 |
|
| 21 |
if not isinstance(order, dict):
|
| 22 |
req.session["id_order"] = order.id
|
| 23 |
-
if view_controller.isEndedSession(req.session["id_participation"]):
|
| 24 |
context["message"] = "El catador ha terminado de realizar su evaluación, espere instrucciones del presentador"
|
| 25 |
context["has_ended"] = True
|
| 26 |
|
|
@@ -28,19 +28,21 @@ def mainTesterForm(req: HttpRequest):
|
|
| 28 |
elif req.method == "POST":
|
| 29 |
if req.POST["action"] == "start_posting":
|
| 30 |
if "id_order" in req.session:
|
| 31 |
-
update_participation =
|
|
|
|
| 32 |
if isinstance(update_participation, dict):
|
| 33 |
context["error"] = update_participation["error"]
|
| 34 |
return render(req, "tecnicas/forms_tester/main_tester.html", context)
|
| 35 |
-
|
| 36 |
return redirect(reverse("cata_system:session_convencional"))
|
| 37 |
|
| 38 |
order = view_controller.assignOrder()
|
| 39 |
if isinstance(order, dict):
|
| 40 |
context["error"] = order["error"]
|
| 41 |
return render(req, "tecnicas/forms_tester/main_tester.html", context)
|
| 42 |
-
|
| 43 |
-
update_participation =
|
|
|
|
| 44 |
if isinstance(update_participation, dict):
|
| 45 |
context["error"] = update_participation["error"]
|
| 46 |
return render(req, "tecnicas/forms_tester/main_tester.html", context)
|
|
|
|
| 1 |
from django.http import HttpRequest, JsonResponse
|
| 2 |
from django.shortcuts import render, redirect
|
| 3 |
from django.urls import reverse
|
| 4 |
+
from ...controllers import SesionController, MainTesterFormController, ParticipacionController
|
| 5 |
|
| 6 |
|
| 7 |
def mainTesterForm(req: HttpRequest):
|
|
|
|
| 20 |
|
| 21 |
if not isinstance(order, dict):
|
| 22 |
req.session["id_order"] = order.id
|
| 23 |
+
if view_controller.isEndedSession(id_participation=req.session["id_participation"], repetition=session.tecnica.repecion):
|
| 24 |
context["message"] = "El catador ha terminado de realizar su evaluación, espere instrucciones del presentador"
|
| 25 |
context["has_ended"] = True
|
| 26 |
|
|
|
|
| 28 |
elif req.method == "POST":
|
| 29 |
if req.POST["action"] == "start_posting":
|
| 30 |
if "id_order" in req.session:
|
| 31 |
+
update_participation = ParticipacionController.enterSession(
|
| 32 |
+
id_participation=req.session["id_participation"])
|
| 33 |
if isinstance(update_participation, dict):
|
| 34 |
context["error"] = update_participation["error"]
|
| 35 |
return render(req, "tecnicas/forms_tester/main_tester.html", context)
|
| 36 |
+
|
| 37 |
return redirect(reverse("cata_system:session_convencional"))
|
| 38 |
|
| 39 |
order = view_controller.assignOrder()
|
| 40 |
if isinstance(order, dict):
|
| 41 |
context["error"] = order["error"]
|
| 42 |
return render(req, "tecnicas/forms_tester/main_tester.html", context)
|
| 43 |
+
|
| 44 |
+
update_participation = ParticipacionController.enterSession(
|
| 45 |
+
id_participation=req.session["id_participation"])
|
| 46 |
if isinstance(update_participation, dict):
|
| 47 |
context["error"] = update_participation["error"]
|
| 48 |
return render(req, "tecnicas/forms_tester/main_tester.html", context)
|