Spaces:
Sleeping
Sleeping
File size: 4,136 Bytes
6a403bf b417c45 79a50aa 5c77a4a 6a403bf 268cd30 6a403bf 268cd30 6a403bf 268cd30 6a403bf 5c77a4a fbcc0ff ceb2f28 77d44b9 b417c45 d9a3269 b417c45 268cd30 b417c45 268cd30 b417c45 268cd30 b417c45 268cd30 b417c45 268cd30 b417c45 268cd30 b417c45 268cd30 b417c45 268cd30 b417c45 268cd30 b417c45 268cd30 b417c45 268cd30 b417c45 268cd30 b417c45 268cd30 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
from django.core.exceptions import ValidationError
from collections import defaultdict
from tecnicas.models import Calificacion, Tecnica, Posicion, Producto, Catador
from tecnicas.utils import controller_error, getId
class CalificacionController():
def __init__(self, product: Producto | int, technique: Tecnica | int, tester: Catador | int):
technique = Tecnica.objects.only(
"repeticion").get(id=getId(technique))
atributes = {
"num_repeticion": technique.repeticion,
"id_tecnica": technique,
"id_producto_id": getId(product),
"id_catador_id": getId(tester),
}
(self.rating, created) = Calificacion.objects.get_or_create(**atributes)
@staticmethod
def getRatingsByTechnique(technique: Tecnica):
repetition = technique.repeticion
ratings = list(Calificacion.objects.filter(id_tecnica=technique, num_repeticion=repetition))
return ratings
@staticmethod
def getRatings(
technique: Tecnica = None,
id_technique: int = None,
repetition: int = None,
product: Producto = None,
id_product: int = None,
tester: Catador = None,
id_tester: int = None,
user_tester: str = None,):
if repetition is None:
return controller_error("Es necesario especificar la repetición")
filters = {"num_repeticion": repetition}
if technique is not None:
filters["id_tecnica"] = technique
elif id_technique is not None:
filters["id_tecnica__id"] = id_technique
else:
return controller_error("Es necesario especificar la técnica")
if product is not None:
filters["id_producto"] = product
elif id_product is not None:
filters["id_producto__id"] = id_product
if tester is not None:
filters["id_catador"] = tester
elif id_tester is not None:
filters["id_catador__id"] = id_tester
elif user_tester is not None:
filters["id_catador__user__username"] = user_tester
ratings = list(Calificacion.objects.filter(**filters).select_related(
"id_producto",
"id_tecnica",
"id_catador",
))
return ratings
@staticmethod
def checkPositionWithoutRating(
positions: list[Posicion] = None,
user_cata: Catador | str = None,
repetition: int = None,
technique: Tecnica | int = None,
num_words: int = None):
end_rating = False
# Obtener lista con codigos de productos
check_products = [
position.id_producto.codigoProducto for position in positions]
filters = {
"num_repeticion": repetition,
"id_tecnica": getId(technique)
}
if isinstance(user_cata, Catador):
filters["id_catador"] = user_cata
else:
filters["id_catador"] = Catador.objects.get(
user__username=user_cata)
ratings = list(Calificacion.objects.filter(**filters).select_related(
"id_producto",
"id_tecnica",
"id_catador",
))
# Si no hay calificaciones regresar las posiciones
if len(ratings) == 0:
return (positions, end_rating)
rating_products = [
rating.id_producto.codigoProducto for rating in ratings]
for index, rating in enumerate(ratings):
data_rating = rating.dato_calificacion.all()
if len(data_rating) < num_words or len(data_rating) == 0:
return (positions[index], end_rating)
next_product = list(set(check_products) - set(rating_products))
if len(next_product) != 0:
next_position = [
position for position in positions if position.id_producto.codigoProducto == next_product[0]][0]
return (next_position, end_rating)
else:
end_rating = True
return (positions[-1], end_rating)
|