273 lines
7.6 KiB
Python
273 lines
7.6 KiB
Python
import datetime
|
|
import json
|
|
import re
|
|
from decimal import Decimal
|
|
|
|
import requests
|
|
from dateutil.relativedelta import relativedelta
|
|
from django import template
|
|
from django.utils.safestring import SafeText
|
|
from wcs.qommon import misc
|
|
from wcs.qommon.templatetags.qommon import unlazy
|
|
from wcs.variables import LazyDateObject
|
|
|
|
register = template.Library()
|
|
|
|
|
|
def unlazy_date(fdate):
|
|
if isinstance(fdate, LazyDateObject):
|
|
return str(unlazy(fdate))
|
|
else:
|
|
return fdate
|
|
|
|
|
|
@register.filter
|
|
def clean_string(value):
|
|
return value.replace(" ", "").replace(".", "").replace("-", "")
|
|
|
|
|
|
@register.filter
|
|
def check_class(value):
|
|
return str(type(value))
|
|
|
|
|
|
@register.filter
|
|
def retour_chariot(value):
|
|
return f"{value}\n"
|
|
|
|
|
|
@register.filter
|
|
def capitalize(value: str):
|
|
"""
|
|
même chose que string.capitalize()
|
|
"""
|
|
return value.capitalize()
|
|
|
|
|
|
@register.filter
|
|
def is_valid_belgian_nrn(value):
|
|
return misc.validate_belgian_nrn(unlazy(value))
|
|
|
|
|
|
@register.filter
|
|
def is_strong_authentication(session_user):
|
|
"""
|
|
Anciennement town.py is_strong_authentication
|
|
session_user : session_user
|
|
return : (bool) True si le user est connecté avec une authentification forte
|
|
"""
|
|
return bool("_niss" in session_user.verified_fields)
|
|
|
|
|
|
@register.filter
|
|
def authentication_delivrance_items_visibility(data_source, session_user):
|
|
"""
|
|
Anciennement commune.py authentication_delivrance_items_visibility
|
|
data_source : data source mode_de_delivrance json
|
|
session_user : session_user
|
|
"""
|
|
if is_strong_authentication(session_user):
|
|
data_source = json.loads(data_source)
|
|
for elm in data_source:
|
|
if "commune" not in elm["id"]:
|
|
elm["disabled"] = False
|
|
return json.dumps(data_source)
|
|
return data_source
|
|
|
|
|
|
@register.filter
|
|
def is_agent(session_user):
|
|
"""
|
|
Anciennement town.py is_agent
|
|
session_user : session_user
|
|
return : (bool) True si le user est autorisé à aller dans le backoffice.
|
|
"""
|
|
return session_user.can_go_in_backoffice()
|
|
|
|
|
|
@register.filter
|
|
def get_roles(session_user):
|
|
return session_user.get_roles()
|
|
|
|
|
|
@register.filter
|
|
def diff_dates(oldest_date, newest_date):
|
|
"""
|
|
Anciennement town.py diff_dates
|
|
oldest_date : datetime ou SafeText sous la forme "jj/mm/aaaa" ou "aaaa-mm-jj" ou "jj-mm-aaaa"
|
|
newest_date : datetime ou SafeText sous la forme "jj/mm/aaaa" ou "aaaa-mm-jj" ou "jj-mm-aaaa"
|
|
return : (str) nombre de jours de différence entre les 2 dates
|
|
"""
|
|
|
|
def transform_date(fdate):
|
|
if type(fdate) == LazyDateObject:
|
|
fdate = unlazy(fdate)
|
|
fdate = fdate[:10]
|
|
if "/" in fdate:
|
|
return datetime.datetime.strptime(fdate, "%d/%m/%Y")
|
|
if "-" in fdate:
|
|
if len(fdate.split("-")[0]) == 4:
|
|
return datetime.datetime.strptime(fdate, "%Y-%m-%d")
|
|
if len(fdate.split("-")[0]) == 2:
|
|
return datetime.datetime.strptime(fdate, "%d-%m-%Y")
|
|
|
|
oldest_date = unlazy_date(oldest_date)
|
|
newest_date = unlazy_date(newest_date)
|
|
|
|
if type(oldest_date) in (SafeText, str):
|
|
oldest_date = transform_date(oldest_date)
|
|
if type(newest_date) in (SafeText, str):
|
|
newest_date = transform_date(newest_date)
|
|
diff = abs((oldest_date - newest_date).days)
|
|
return str(diff)
|
|
|
|
|
|
@register.filter
|
|
def get_birthday_from_nn(numero_national):
|
|
"""
|
|
numero_national : (str) numero national peut contenir espace . et -
|
|
return : (datetime) la date de naissance
|
|
"""
|
|
numero_national = clean_string(unlazy(numero_national))
|
|
date = numero_national[:6]
|
|
birthday = datetime.datetime.strptime(date, "%y%m%d")
|
|
if birthday > datetime.datetime.now():
|
|
birthday -= relativedelta(years=100)
|
|
return birthday
|
|
|
|
|
|
@register.filter
|
|
def is_valid_tva_number(tva_number, formatage=True):
|
|
"""
|
|
tva_number : (str) numéro de tva BE0000000097
|
|
formatage : (bool) True/False
|
|
return : (bool) True si le numéro est valide
|
|
"""
|
|
# si formatage alors enlève les espaces, points et tirets
|
|
if formatage:
|
|
tva_number = clean_string(tva_number)
|
|
|
|
if not tva_number[:2].upper() == "BE":
|
|
return False
|
|
if not len(tva_number) == 12:
|
|
if len(tva_number) == 11:
|
|
tva_number = tva_number[:2] + "0" + tva_number[2:]
|
|
else:
|
|
return False
|
|
if re.match(r"^\d{10}$", tva_number[2:]):
|
|
int_value = int(tva_number[2:10])
|
|
check_digit = int(int_value / 97) * 97
|
|
if (97 - (int_value - check_digit)) == int(tva_number[10:12]):
|
|
return True
|
|
else:
|
|
return False
|
|
|
|
|
|
@register.filter
|
|
def liste_type_rdv_plusieurs_personnes(value):
|
|
"""
|
|
Anciennement liste_type_general_rdv.py
|
|
value : (str) url api liste des types de rendez-vous
|
|
return : (list[str]) liste des différent type de rendez-vous sans - x personnes
|
|
"""
|
|
headers = {"Accept": "application/json"}
|
|
liste = requests.get(value, headers=headers).json()
|
|
return list(set([re.sub(r" (pour|-) [0-9]+ personne(s)?$", "", x["text"]) for x in liste["data"]]))
|
|
|
|
|
|
@register.filter
|
|
def liste_type_rdv_nombres_personnes(value, arg):
|
|
"""
|
|
Anciennement liste_type_rdv.py
|
|
value : (str) url api liste des type de rendez-vous
|
|
arg : (str) type de rendez-vous
|
|
return : (list[str]) liste des rendez-vous de type arg
|
|
"""
|
|
headers = {"Accept": "application/json"}
|
|
liste = requests.get(value, headers=headers).json()
|
|
|
|
return [x for x in liste["data"] if arg in x["text"]]
|
|
|
|
|
|
@register.filter
|
|
def request_url_json(url):
|
|
"""
|
|
Permet de get les données d'une url JSON
|
|
url : (str) url du json
|
|
return : {'data':[]}
|
|
"""
|
|
headers = {"Accept": "application/json"}
|
|
|
|
return requests.get(url, headers=headers).json()
|
|
|
|
|
|
@register.filter
|
|
def stop_monday_for_we(value):
|
|
"""
|
|
Empêche de prendre rdv le lundi matin pendant le w-e
|
|
"""
|
|
headers = {"Accept": "application/json"}
|
|
meeting_liste = requests.get(value, headers=headers).json()
|
|
today = datetime.datetime.today()
|
|
weekday = today.weekday()
|
|
if 4 >= weekday >= 0:
|
|
return meeting_liste
|
|
|
|
if 5 <= weekday <= 6:
|
|
next_day = today
|
|
while weekday != 0:
|
|
next_day = next_day + datetime.timedelta(days=1)
|
|
weekday = next_day.weekday()
|
|
|
|
monday = next_day.replace(hour=12, minute=0, second=0, microsecond=0)
|
|
return [
|
|
x
|
|
for x in meeting_liste
|
|
if datetime.datetime.strptime(x["datetime"], "%Y-%m-%d %H:%M:%S") < monday
|
|
]
|
|
|
|
if weekday > 6 or weekday < 0:
|
|
raise Exception("Index OutOf weekday")
|
|
|
|
|
|
@register.filter
|
|
def calcul_total_abonnement_stationnement(fields_bloc):
|
|
"""
|
|
Anciennement fields_bloc.py
|
|
fields_bloc : (list[dict]) Bloc de champ Abonnements de stationnement données bénéficiaires
|
|
return : (Decimal) addition des entrées price
|
|
"""
|
|
total = 0
|
|
|
|
for field in fields_bloc:
|
|
for value in field.values():
|
|
if isinstance(value, dict):
|
|
total += Decimal(value.get("price"))
|
|
|
|
return total
|
|
|
|
|
|
@register.filter
|
|
def autorisation_voyage_enfants_concernes(lst_enfants_concernes):
|
|
"""
|
|
Anciennement autorisation_voyage_enfants_concernes.py
|
|
lst_enfants_concernes : (list)
|
|
return : (str)
|
|
"""
|
|
enfants_concernes = ""
|
|
if lst_enfants_concernes is not None:
|
|
for e in lst_enfants_concernes:
|
|
enfants_concernes = enfants_concernes + "- " + e[0] + " né(e) à " + e[1] + " le " + e[2] + "\r\n"
|
|
|
|
return enfants_concernes
|
|
|
|
|
|
@register.filter
|
|
def distinct_list(value):
|
|
"""
|
|
Permet de trier les doublons d'une liste
|
|
value : (list)
|
|
return : (list)
|
|
"""
|
|
return list(set(value))
|