This repository has been archived on 2021-09-15. You can view files and clone it, but cannot push or open issues or pull requests.
M2OLA/backend/app/utils.py

73 lines
2.4 KiB
Python

import random
import string
from hashlib import sha512
from flask import json
from mailer import Mailer
from mailer import Message
from sqlalchemy.ext.declarative import DeclarativeMeta
from app.core import app
SIMPLE_CHARS = string.ascii_letters + string.digits
def get_random_string(length=32):
return ''.join(random.choice(SIMPLE_CHARS) for i in range(length))
def get_random_hash(length=64):
hash = sha512()
hash.update(get_random_string())
return hash.hexdigest()[:length]
def new_alchemy_encoder(revisit_self=False, fields_to_expand=[]):
_visited_objs = []
class AlchemyEncoder(json.JSONEncoder):
def default(self, obj):
if isinstance(obj.__class__, DeclarativeMeta):
# don't re-visit self
if revisit_self:
if obj in _visited_objs:
return None
_visited_objs.append(obj)
# go through each field in this SQLalchemy class
fields = {}
for field in [x for x in dir(obj) if not x.startswith('_') and x != 'metadata']:
val = obj.__getattribute__(field)
# is this field another SQLalchemy object, or a list of SQLalchemy objects?
if isinstance(val.__class__, DeclarativeMeta) or (
isinstance(val, list) and len(val) > 0 and isinstance(val[0].__class__,
DeclarativeMeta)):
# unless we're expanding this field, stop here
if field not in fields_to_expand:
# not expanding this field: set it to None and continue
fields[field] = None
continue
fields[field] = val
# a json-encodable dict
return fields
return json.JSONEncoder.default(self, obj)
return AlchemyEncoder
def checkParams(wanted, args):
inter = [elt for elt in wanted if elt in args]
return len(inter) == len(wanted)
def send_mail(subject, to, html):
if app.config['MAILER']:
message = Message(From="ola.noreply@univ-tlse2.fr", To=to, charset="utf-8")
message.Subject = subject
message.Html = html
sender = Mailer('localhost') # TODO: Mettre le SMTP de la fac ici
sender.send(message)