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)