File size: 4,047 Bytes
0a56c42
 
6a403bf
77d44b9
b417c45
 
 
f13624c
6a403bf
 
 
 
 
 
9d6dd50
6a403bf
f13624c
 
 
 
 
 
 
 
6a403bf
 
f13624c
 
 
 
 
 
6a403bf
 
 
 
 
9d6dd50
3dc7a4b
 
9d6dd50
 
f13624c
9d6dd50
 
 
 
 
 
3dc7a4b
9d6dd50
 
f13624c
9d6dd50
f13624c
 
 
 
 
 
 
 
 
b417c45
 
f13624c
 
 
 
b417c45
 
6a403bf
b417c45
 
 
 
6a403bf
b417c45
77d44b9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
268cd30
df77b9b
77d44b9
 
 
 
 
0a56c42
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
from tecnicas.models import Calificacion, Dato, Palabra, ValorDecimal, ValorBooleano, Tecnica, Catador
from tecnicas.utils import controller_error, getId
from django.core.exceptions import ValidationError
from django.db.models import F


class DatoController():
    def __init__(self, word: Palabra | int, rating: Calificacion | int, value_rating: int | bool):
        atributes = {
            "id_palabra_id": getId(word),
            "id_calificacion_id": getId(rating)
        }

        self.data = Dato(**atributes)
        self.value_rating = value_rating

    def setRating(self, new_rating: Calificacion):
        try:
            self.data.id_calificacion = new_rating
            return self.data.id_calificacion
        except ValidationError as e:
            return controller_error(e.message)

    def validateRating(self):
        try:
            self.data.full_clean()
            return self.data
        except ValidationError as e:
            return controller_error(e.message)

    def saveData(self):
        try:
            self.data.save()
            return self.data
        except ValidationError as e:
            return controller_error(e.message)

    def setValue(self):
        type_technique = self.data.id_calificacion.id_tecnica.tipo_tecnica
        if type_technique == "cata":
            self.value_data = ValorBooleano(valor=self.value_rating)

        else:
            type_scale = self.data.id_calificacion.id_tecnica.escala_tecnica.id_tipo_escala.nombre_escala

            if type_scale == "continua":
                decimal_value = self.value_rating/100
                value_rounded = round(decimal_value)
                self.value_data = ValorDecimal(valor=value_rounded)

            else:
                self.value_data = ValorDecimal(valor=self.value_rating)

        self.value_data.id_dato = self.data
        return self.value_data

    def saveValue(self):
        try:
            self.value_data.save()
            return self.value_data
        except ValidationError as e:
            return controller_error(e.message)

    @staticmethod
    def getRerecordedData(ratings: list[Calificacion]):
        '''
        Get Datos' registers for each Calificacion.
        Datos' registers no contain the value of rating.
        '''
        if not ratings:
            return []

        ids_ratings = [rat.id for rat in ratings]

        recoreded_data = list(Dato.objects.filter(
            id_calificacion_id__in=ids_ratings))

        return recoreded_data

    @staticmethod
    def getWordValuesForConvecional(technique: Tecnica, ratings: list[Calificacion]):
        model = ValorBooleano if technique.tipo_tecnica == "cata" else ValorDecimal

        ids_ratings = [rat.id for rat in ratings]

        result = (
            model.objects
            .filter(id_dato__id_calificacion_id__in=ids_ratings)
            .values(
                nombre_palabra=F("id_dato__id_palabra__nombre_palabra"),
                repeticion=F("id_dato__id_calificacion__num_repeticion"),
                producto_code=F(
                    "id_dato__id_calificacion__id_producto__codigoProducto"),
                usuario_catador=F(
                    "id_dato__id_calificacion__id_catador__user__username"),
                dato_valor=F("valor")
            )
        )

        return list(result)

    @staticmethod
    def getWordValuesPF(technique: Tecnica, ratings: list[Calificacion], tester: Catador):
        ids_ratings = [rat.id for rat in ratings]

        result = (
            ValorDecimal.objects
            .filter(id_dato__id_calificacion_id__in=ids_ratings, id_dato__id_calificacion__id_catador=tester)
            .values(
                nombre_palabra=F("id_dato__id_palabra__nombre_palabra"),
                repeticion=F("id_dato__id_calificacion__num_repeticion"),
                producto_code=F(
                    "id_dato__id_calificacion__id_producto__codigoProducto"),
                dato_valor=F("valor")
            )
        )

        return list(result)