forked from JoaquinCardonaRuiz/proyecto-final
-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.py
186 lines (166 loc) · 7.37 KB
/
utils.py
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
import custom_exceptions
from classes import CantArticulo
import datetime
from hashlib import blake2b, blake2s
class Utils():
"""Clase con funciones de utilidad para el programa."""
@classmethod
def replace_dots(cls, number, decimals):
"""
Redondea la cantidad de decimales del número recibido como parámetro, y reemplaza el
punto por una coma para denotarlos.
"""
try:
if decimals == 0:
number = str(int(round(float(number),decimals))).replace('.', ',')
return number
else:
if (number).is_integer():
number = str(int(number)).replace('.', ',')
else:
number = str(round(float(number),decimals)).replace('.', ',')
return number
except Exception as e:
raise custom_exceptions.ErrorDeNegocio(origen="negocio.replace_dots()",
msj=str(e),
msj_adicional="Error formateando los números.")
@classmethod
def round_float(cls, number, decimals):
"""
Redondea la cantidad de decimales del número recibido como parámetro, y reemplaza el
punto por una coma para denotarlos.
"""
try:
if decimals == 0:
number = float(str(number).replace(',', '.'))
return number
else:
number = round(float(str(number).replace(',', '.')),decimals)
return number
except Exception as e:
raise custom_exceptions.ErrorDeNegocio(origen="negocio.replace_dots()",
msj=str(e),
msj_adicional="Error formateando los números.")
@classmethod
def difference_between_lists(cls, lista1, lista2):
"""
Obtiene la diferencia de la lista 1 con repsecto de la lista 2 listas, y devuelve el resultado.
"""
try:
return list(set(lista1).difference(lista2))
except Exception as e:
raise custom_exceptions.ErrorDeNegocio(origen="utils.difference_between_lists()",
msj=str(e),
msj_adicional="Error obteniendo la diferencia entre dos listas.")
@classmethod
def lower_higher_elements_than(cls, lista, valor):
"""
Filtra de una lista, aquellos elementos que son menores que el valor pasado como parametro, y aquellos que son mayores. Devuelve una lista para cada caso de la forma [[menores], [mayores]]
"""
try:
mayores = sorted(i for i in lista if i > valor)
menores = sorted(i for i in lista if i < valor)
return [menores, mayores]
except Exception as e:
raise custom_exceptions.ErrorDeNegocio(origen="utils.difference_between_lists()",
msj=str(e),
msj_adicional="Error obteniendo elementos menores y mayores.")
@classmethod
def nearest_element(cls, lista, valor):
"""
Encuentra el valor más cercano al que recibe como parámetro dentro de una lista.
"""
try:
if len(lista) > 0:
absolute_difference_function = lambda list_value : abs(list_value - valor)
return min(lista, key=absolute_difference_function)
else:
return False
except Exception as e:
raise custom_exceptions.ErrorDeNegocio(origen="utils.nearest_element()",
msj=str(e),
msj_adicional="Error obteniendo el elemento más cercano.")
@classmethod
def date_format(cls, fecha):
"""
Convierte la fecha del formato utilizado por MySQL (aaaa-mm-dd) al formato (dd/mm/aaaa).
TODO: Esto es innecesario. No hace falta hacerle strftime al parametro pasado, para despues hacerle strptime y strftime de vuelta
esta funcion solo tiene que hacer:
return fecha.strftime("%d/%m/%Y")
"""
try:
fecha = fecha.strftime('%Y-%m-%d')
return(datetime.datetime.strptime(fecha, "%Y-%m-%d").strftime("%d/%m/%Y"))
except Exception as e:
raise custom_exceptions.ErrorDeNegocio(origen="utils.date_format()",
msj=str(e),
msj_adicional="Error formateando la fecha")
@classmethod
def adress_format(cls, value):
"""
Convierte la dirección al formato deseado para mostrar (elimina la ciudad).
"""
try:
return(value.partition(",")[0])
except Exception as e:
raise custom_exceptions.ErrorDeNegocio(origen="utils.adress_format()",
msj=str(e),
msj_adicional="Error convirtiendo el formato de la dirección.")
@classmethod
def traductor_nombre_dias(cls, dia):
"""
Traduce el nombre de un día recibido como parámetro de ingles a español.
"""
try:
if dia == "Monday":
return "Lunes"
elif dia == "Tuesday":
return "Martes"
elif dia == "Wednesday":
return "Miércoles"
elif dia == "Thursday":
return "Jueves"
elif dia == "Friday":
return "Viernes"
elif dia == "Saturday":
return "Sábado"
elif dia == "Sunday":
return "Domingo"
except Exception as e:
raise custom_exceptions.ErrorDeNegocio(origen="utils.raductor_nombre_dias()",
msj=str(e),
msj_adicional="Error traduciendo el nombre de un día.")
@classmethod
def js_py_bool_converter(cls, bool):
"""
Convierte el String que devuelve Javascript como booleano al tipo Bool de Python.
"""
try:
if bool == "true":
return True
else:
return False
except Exception as e:
raise custom_exceptions.ErrorDeNegocio(origen="utils.js_py_bool_converter()",
msj=str(e),
msj_adicional="Error convirtiendo booleanos entre front-end y back-end.")
@classmethod
def carrito_to_list(cls, carrito):
"""
Convierte el carrito, que es un dic, a un arreglo de CantArticulos
"""
nuevo_carrito = []
for art in carrito.keys():
nuevo_carrito.append(CantArticulo(carrito[art],art))
return nuevo_carrito
@classmethod
def encripta_codigo(cls,code):
h = blake2b(key=b'pseudorandom key', digest_size=8)
h.update(code.encode('utf-8'))
return h.hexdigest()
@classmethod
def get_files(cls):
from os import listdir
from os.path import isfile, join
onlyfiles = [f for f in listdir(".") if isfile(join(".", f))]
print(onlyfiles)