Files
musiclist-server/utils/__init__.py
Daniel Cortes 65c77c679f Continuando con el almacenamiento de datos en cache
Va a mejor la cosa, tengo que hacer tests si o tambien porque no estoy
nada seguro si es que todo funciona como espero ya que toda llamada a la
api corresponde a una llamada a cache y descubrir si es que esta todo en
cache como se espera

Voy a terminar del modo que lo estoy haciendo y tal vez cambio esto a un
modulo de cache el cual se encargara de o obtener datos desde cache o
llamar a music brainz para suplir los datos que no puede responder
2020-06-10 00:02:45 -04:00

128 lines
3.8 KiB
Python

"""Modulo de funciones utilitarias"""
import json
import logging
import functools
import datetime
from django.http import JsonResponse
from django.conf import settings
import redis
from pygments import highlight
from pygments.lexers import JsonLexer # pylint: disable=no-name-in-module
from pygments.formatters import TerminalTrueColorFormatter # pylint: disable=no-name-in-module
from utils.ratelimit import ratelimit
_log = logging.getLogger('utils')
_log.addHandler(logging.NullHandler())
def pretty_print_json(json_input):
"""Formats and prints json to stdout with colors using pygments"""
formatted_json = json.dumps(json_input, indent=2)
print(highlight(formatted_json, JsonLexer(), TerminalTrueColorFormatter()))
def message_response(status, error_message):
"""Sends an error response with the status code of the error and an explanation"""
json_message = {
'status_code': status,
'message': error_message
}
return JsonResponse(json_message, status=status)
def require_json(function):
"""Decorator to make a view only accept a json body"""
@functools.wraps(function)
def decorator(*args, **kwargs):
try:
received_json = json.loads(args[0].body)
return function(*args, **kwargs, received_json=received_json)
except json.JSONDecodeError:
_log.warning('Function %s got a non json request body', function.__name__)
return message_response(400, 'Se envío json no valido')
return decorator
def expected_keys(keys, dictionary):
"""Verifica que un diccionario contiene todas las keys de una lista"""
for key in keys:
if key not in dictionary:
return f'No se encuentra {key}'
return None
def replace_key(dictionary, old, new):
"""Remplaza una key en un diccionario
En esencia crea una nueva key con los contenidos de la antigua y elimina la antigua
Esto lo hace inplace por lo que el diccionario es modificado
TODO que cree un nuevo diccionario, es mas bonito el codigo asi
"""
dictionary[new] = dictionary[old]
del dictionary[old]
def sanitize_keys(dictionary):
"""Remplaza las keys de un diccionario que contienen '-' ya que el diccionario pretende
ser json y acceder a json con esos caracteres en javascript es incomodo
El diccionario es modificado inplace pero de todas formas se retorna
"""
for key in list(dictionary.keys()):
if '-' in key and key in dictionary:
new_key = key.replace('-', '_')
replace_key(dictionary, key, new_key)
return dictionary
def make_key(key, key_prefix=None, version=1):
"""Key generation function for cache"""
if key_prefix is None:
key_prefix = settings.CACHES.get('default').get('KEY_PREFIX')
return ':'.join([key_prefix, str(version), key])
def get_redis_connection():
"""Obtiene una conexion con el cliente de redis"""
host = settings.DATA_CACHE.get('host')
port = settings.DATA_CACHE.get('port')
db = settings.DATA_CACHE.get('db')
return redis.Redis(host=host, port=port, db=db, decode_responses=True)
def parse_date(date, default=datetime.datetime(1, 1, 1)):
"""Intenta parsear una fecha la cual le pueden faltar partes
Esta pensado para parsear fechas entregadas por musicbrainz, el cual puede entrar fechas con
año, con año y mes, o, con año, mes y dia
Si es que no puede lograrlo retornara el default definido
"""
try:
parsed = datetime.datetime.strptime(date, "%Y")
return parsed
except ValueError:
pass
try:
parsed = datetime.datetime.strptime(date, "%Y-%m")
return parsed
except ValueError:
pass
try:
parsed = datetime.datetime.strptime(date, "%Y-%m-%d")
return parsed
except ValueError:
pass
return default