imio-teleservices-templatetags/imio_teleservices_templatetags/templatetags/imio_teleservices.py

391 lines
11 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 unlazy_filter(value):
if isinstance(value, LazyDateObject):
return str(unlazy(value))
else:
return value
@register.filter
def clean_string(value):
value = unlazy_filter(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) urls api liste des types de rendez-vous
return : (list[str]) liste des différent type de rendez-vous sans - x personnes
"""
value = value.strip()
headers = {"Accept": "application/json"}
meetings_agendas = []
for url in value.split(" "):
meetings_agendas.append(requests.get(url, headers=headers).json())
meetings_types = []
for meetings_agenda in meetings_agendas:
meetings_types.extend(
list(
set(
[
re.sub(r" (pour|-) [0-9]+ personne(s)?$", "", x["text"])
for x in meetings_agenda["data"]
]
)
)
)
return meetings_types
@register.filter
def liste_type_rdv_nombres_personnes(value, arg):
"""
Anciennement liste_type_rdv.py
value : (str) urls api liste des type de rendez-vous
arg : (str) type de rendez-vous
return : (list[str]) liste des rendez-vous de type arg
"""
value = value.strip()
headers = {"Accept": "application/json"}
meetings_agendas = []
for url in value.split(" "):
meetings_agendas.append(requests.get(url, headers=headers).json())
meetings_types = []
for meetings_agenda in meetings_agendas:
meetings_types.extend([x for x in meetings_agenda["data"] if arg in x["text"]])
return meetings_types
@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))
@register.filter
def comprehensive_list(liste: list, key: str):
return [x[key] for x in liste]
#####################
# LOCATION DE SALLE #
#####################
@register.filter
def indisponibilites_for_a_date(date_debut_fin, indisponibilites):
"""
date_debut_fin : str date_debut|date_fin
indisponibilites : json
"""
if date_debut_fin == "|":
return []
format_date_demande = "%d/%m/%Y"
format_date_location = "%Y-%m-%dT%H:%M:%S"
date_debut = datetime.datetime.strptime(str(date_debut_fin).split("|")[0], format_date_demande).date()
date_fin = datetime.datetime.strptime(str(date_debut_fin).split("|")[1], format_date_demande).date()
date_indisponibles = []
for indisponibilite in indisponibilites["data"]:
StartDate = datetime.datetime.strptime(indisponibilite["StartDate"], format_date_location).date()
EndDate = datetime.datetime.strptime(indisponibilite["EndDate"], format_date_location).date()
if (
StartDate <= date_debut <= EndDate
or StartDate <= date_fin <= EndDate
or date_debut <= StartDate <= date_fin
or date_debut <= EndDate <= date_fin
):
date_indisponibles.append(indisponibilite)
return date_indisponibles
@register.filter
def condition_salle(date_heure_debut_fin, indisponibilites):
"""
date_heure_debut_fin : str date_debutTheure_debut|date_finTheure_fin
indisponibilites : json
"""
if date_heure_debut_fin == "T|T":
return False
format_date_heure_demande = "%d/%m/%YT%H:%M"
format_date_heure_location = "%Y-%m-%dT%H:%M:%S"
date_heure_debut_demande = datetime.datetime.strptime(
str(date_heure_debut_fin).split("|")[0], format_date_heure_demande
)
date_heure_fin_demande = datetime.datetime.strptime(
str(date_heure_debut_fin).split("|")[1], format_date_heure_demande
)
for indisponibilite in indisponibilites["data"]:
StartDate = datetime.datetime.strptime(indisponibilite["StartDate"], format_date_heure_location)
EndDate = datetime.datetime.strptime(indisponibilite["EndDate"], format_date_heure_location)
if (
StartDate <= date_heure_debut_demande <= EndDate
or StartDate <= date_heure_fin_demande <= EndDate
or date_heure_debut_demande <= StartDate <= date_heure_fin_demande
or date_heure_debut_demande <= EndDate <= date_heure_fin_demande
):
return False
return True
####################
# LIAISON IA.DELIB #
####################
@register.filter
def format_avis(avis):
"""
avis : str texte long
return : str
"""
if avis not in (None, "None", ""):
avis_formate = "\n------------------------------------\n\n" + f"{avis}"
else:
avis_formate = ""
return avis_formate