|
|
|
@ -1,4 +1,5 @@
|
|
|
|
|
import datetime
|
|
|
|
|
import json
|
|
|
|
|
import re
|
|
|
|
|
from decimal import Decimal
|
|
|
|
|
|
|
|
|
@ -8,21 +9,30 @@ 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
|
|
|
|
|
from wcs.variables import LazyDateObject, LazyFieldVarDate
|
|
|
|
|
|
|
|
|
|
register = template.Library()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def unlazy_date(fdate):
|
|
|
|
|
if isinstance(fdate, LazyDateObject):
|
|
|
|
|
if isinstance(fdate, (LazyDateObject, LazyFieldVarDate)):
|
|
|
|
|
return str(unlazy(fdate))
|
|
|
|
|
else:
|
|
|
|
|
return fdate
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@register.filter
|
|
|
|
|
def unlazy_filter(value):
|
|
|
|
|
if isinstance(value, LazyDateObject):
|
|
|
|
|
return str(unlazy(value))
|
|
|
|
|
else:
|
|
|
|
|
return unlazy(value)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@register.filter
|
|
|
|
|
def clean_string(value):
|
|
|
|
|
return value.replace(" ", "").replace(".", "").replace("-", "")
|
|
|
|
|
value = unlazy_filter(value)
|
|
|
|
|
return value.replace(' ', '').replace('.', '').replace('-', '')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@register.filter
|
|
|
|
@ -30,6 +40,33 @@ 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 sort_list_dict(list_dict, sort_key):
|
|
|
|
|
"""
|
|
|
|
|
list_dict : liste de dictionnaires [{},{},... ]
|
|
|
|
|
sort_key : string clef utilisée pour le triage de la liste
|
|
|
|
|
"""
|
|
|
|
|
return sorted(list_dict, key=lambda x: x[sort_key], reverse=False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@register.filter
|
|
|
|
|
def to_list(value):
|
|
|
|
|
return list(value)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@register.filter
|
|
|
|
|
def is_valid_belgian_nrn(value):
|
|
|
|
|
return misc.validate_belgian_nrn(unlazy(value))
|
|
|
|
@ -42,7 +79,23 @@ def is_strong_authentication(session_user):
|
|
|
|
|
session_user : session_user
|
|
|
|
|
return : (bool) True si le user est connecté avec une authentification forte
|
|
|
|
|
"""
|
|
|
|
|
return bool("_niss" in session_user.verified_fields)
|
|
|
|
|
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
|
|
|
|
|
session_user : session_user
|
|
|
|
|
"""
|
|
|
|
|
if is_strong_authentication(session_user):
|
|
|
|
|
for elm in data_source:
|
|
|
|
|
if 'commune' not in elm['id']:
|
|
|
|
|
# si connecté en authentification forte met l'item sans commune en id en disabled False
|
|
|
|
|
elm['disabled'] = False
|
|
|
|
|
return data_source
|
|
|
|
|
return data_source
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@register.filter
|
|
|
|
@ -55,6 +108,11 @@ def is_agent(session_user):
|
|
|
|
|
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):
|
|
|
|
|
"""
|
|
|
|
@ -68,13 +126,13 @@ def diff_dates(oldest_date, newest_date):
|
|
|
|
|
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")
|
|
|
|
|
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)
|
|
|
|
@ -95,7 +153,7 @@ def get_birthday_from_nn(numero_national):
|
|
|
|
|
"""
|
|
|
|
|
numero_national = clean_string(unlazy(numero_national))
|
|
|
|
|
date = numero_national[:6]
|
|
|
|
|
birthday = datetime.datetime.strptime(date, "%y%m%d")
|
|
|
|
|
birthday = datetime.datetime.strptime(date, '%y%m%d')
|
|
|
|
|
if birthday > datetime.datetime.now():
|
|
|
|
|
birthday -= relativedelta(years=100)
|
|
|
|
|
return birthday
|
|
|
|
@ -112,14 +170,14 @@ def is_valid_tva_number(tva_number, formatage=True):
|
|
|
|
|
if formatage:
|
|
|
|
|
tva_number = clean_string(tva_number)
|
|
|
|
|
|
|
|
|
|
if not tva_number[:2].upper() == "BE":
|
|
|
|
|
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:]
|
|
|
|
|
tva_number = tva_number[:2] + '0' + tva_number[2:]
|
|
|
|
|
else:
|
|
|
|
|
return False
|
|
|
|
|
if re.match(r"^\d{10}$", tva_number[2:]):
|
|
|
|
|
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]):
|
|
|
|
@ -132,26 +190,90 @@ def is_valid_tva_number(tva_number, formatage=True):
|
|
|
|
|
def liste_type_rdv_plusieurs_personnes(value):
|
|
|
|
|
"""
|
|
|
|
|
Anciennement liste_type_general_rdv.py
|
|
|
|
|
value : (str) url api liste des types de rendez-vous
|
|
|
|
|
value : (str) urls 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"]]))
|
|
|
|
|
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_agenda['data'] = sorted(meetings_agenda['data'], key=lambda x: x['api']['datetimes_url'])
|
|
|
|
|
meetings_types.extend(
|
|
|
|
|
list(
|
|
|
|
|
dict.fromkeys(
|
|
|
|
|
[
|
|
|
|
|
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) url api liste des type de rendez-vous
|
|
|
|
|
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
|
|
|
|
|
"""
|
|
|
|
|
headers = {"Accept": "application/json"}
|
|
|
|
|
liste = requests.get(value, headers=headers).json()
|
|
|
|
|
value = value.strip()
|
|
|
|
|
headers = {'Accept': 'application/json'}
|
|
|
|
|
meetings_agendas = []
|
|
|
|
|
for url in value.split(' '):
|
|
|
|
|
meetings_agendas.append(requests.get(url, headers=headers).json())
|
|
|
|
|
|
|
|
|
|
return [x for x in liste["data"] if arg in x["text"]]
|
|
|
|
|
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
|
|
|
|
@ -166,7 +288,7 @@ def calcul_total_abonnement_stationnement(fields_bloc):
|
|
|
|
|
for field in fields_bloc:
|
|
|
|
|
for value in field.values():
|
|
|
|
|
if isinstance(value, dict):
|
|
|
|
|
total += Decimal(value.get("price"))
|
|
|
|
|
total += Decimal(value.get('price'))
|
|
|
|
|
|
|
|
|
|
return total
|
|
|
|
|
|
|
|
|
@ -178,9 +300,181 @@ def autorisation_voyage_enfants_concernes(lst_enfants_concernes):
|
|
|
|
|
lst_enfants_concernes : (list)
|
|
|
|
|
return : (str)
|
|
|
|
|
"""
|
|
|
|
|
enfants_concernes = ""
|
|
|
|
|
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"
|
|
|
|
|
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]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
###################
|
|
|
|
|
# PORTAIL PARENTS #
|
|
|
|
|
###################
|
|
|
|
|
@register.filter
|
|
|
|
|
def get_plaines(data_source):
|
|
|
|
|
"""
|
|
|
|
|
data_source : webservice.aes_get_available_plaines
|
|
|
|
|
return : plaine available ?
|
|
|
|
|
"""
|
|
|
|
|
return [
|
|
|
|
|
activity for activities in [week['activities'] for week in data_source] for activity in activities
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@register.filter
|
|
|
|
|
def get_navettes(url, plaines):
|
|
|
|
|
"""
|
|
|
|
|
url : url de l'agenda des navettes
|
|
|
|
|
plaines : json plaines response aes
|
|
|
|
|
return : evenement navettes
|
|
|
|
|
"""
|
|
|
|
|
horaires = request_url_json(url)
|
|
|
|
|
horaires = horaires['data']
|
|
|
|
|
plaines_dates = [plaine['start_date'] for plaine in plaines]
|
|
|
|
|
navettes = [horaire for horaire in horaires if horaire['date'] in plaines_dates]
|
|
|
|
|
return navettes
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#####################
|
|
|
|
|
# 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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@register.simple_tag
|
|
|
|
|
def format_text(modele, *args):
|
|
|
|
|
len_args = len(args)
|
|
|
|
|
for i in range(0, len_args, 2):
|
|
|
|
|
expression = '{{' + args[i] + '}}'
|
|
|
|
|
if args[i + 1] is not None:
|
|
|
|
|
modele = modele.replace(expression, unlazy(args[i + 1]))
|
|
|
|
|
return modele
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
####################
|
|
|
|
|
# ABONNEMENT LIEGE #
|
|
|
|
|
####################
|
|
|
|
|
@register.filter
|
|
|
|
|
def somme_prix_bdc(bdc, key):
|
|
|
|
|
"""
|
|
|
|
|
bdc : bloc de champs
|
|
|
|
|
key : (str) champ du bloc de champs qui contient le prix
|
|
|
|
|
si la key renvoie un dictionnaire il faut alors que la clef de celui-ci soit "prix" (mieux vaut d'ailleur utiliser
|
|
|
|
|
|sum d'EO dans ce cas)
|
|
|
|
|
return (int) la somme des prix du bloc de champs
|
|
|
|
|
"""
|
|
|
|
|
bdc = unlazy(bdc)
|
|
|
|
|
key = unlazy(key)
|
|
|
|
|
|
|
|
|
|
somme = 0
|
|
|
|
|
data = bdc['data'] if 'data' in bdc else bdc
|
|
|
|
|
|
|
|
|
|
for champ in data:
|
|
|
|
|
prix = champ[key]
|
|
|
|
|
if isinstance(prix, dict):
|
|
|
|
|
somme += int(prix['prix'])
|
|
|
|
|
if isinstance(prix, (str, int)):
|
|
|
|
|
somme += int(prix)
|
|
|
|
|
|
|
|
|
|
return somme
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@register.filter
|
|
|
|
|
def max_values(values):
|
|
|
|
|
"""
|
|
|
|
|
values : (list) liste de valeur
|
|
|
|
|
return la valeur la plus grande
|
|
|
|
|
"""
|
|
|
|
|
return max(values)
|
|
|
|
|