Compare commits

...

39 Commits
v0.2 ... main

Author SHA1 Message Date
Nicolas Selva 1749d16938 [MPPNIVA-11]add navettes filter
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2024-04-29 13:25:30 +02:00
Frédéric Péters 6dc6e67eea tox: bump django to 3.2 (#89094)
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2024-04-04 10:51:02 +02:00
Frédéric Péters a8f3d96cb2 tox: add new wcs dependencies (#89094)
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2024-04-04 10:49:46 +02:00
Nicolas Selva c002108868 secure format_text
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2024-02-06 14:22:13 +01:00
Nicolas Selva b878bca185 add balise format_text
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2024-01-29 12:38:12 +01:00
Nicolas Selva 3a02c90df2 add get_plaines for Portail parents
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2024-01-25 16:08:27 +01:00
Nicolas Selva 5ae3cd1abc fix unlazy filter
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2024-01-24 13:44:46 +01:00
Nicolas Selva 5f0de04160 reformat name transform_to_list in to_list
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2024-01-19 13:27:11 +01:00
Nicolas Selva cf3d159a25 add filter to transform into list
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2024-01-18 15:56:25 +01:00
Nicolas Selva 6b24e52e59 add sort filter for list of dictionnary
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2024-01-18 15:31:14 +01:00
Nicolas Selva 2aaefdceee fix dif_dates
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-12-19 10:12:17 +01:00
Nicolas Selva 410aba65bf [MTELELIE-327]add max_values V2
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-12-18 14:26:33 +01:00
Nicolas Selva 30966b5c37 [MTELELIE-327]add max_values
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-12-18 14:24:59 +01:00
Nicolas Selva 2d9dab1d89 [MTELELIE-326]add somme_prix_bdc to calcul total
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-12-18 12:04:36 +01:00
Valentin Deniaud 1fbad65ad4 misc: update git-blame-ignore-revs to ignore quote changes (#79788)
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-08-16 11:52:49 +02:00
Valentin Deniaud 0914e9800c misc: apply double-quote-string-fixer (#79788) 2023-08-16 11:52:48 +02:00
Valentin Deniaud e0ec22b135 misc: add pre commit hook to force single quotes (#79788) 2023-08-16 11:52:48 +02:00
Nicolas Selva 94de7a1a2d [TELE-1756]remove fix json for authentication_delivrance_items_visibility
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-07-24 11:35:35 +02:00
Frédéric Péters a21a719761 ci: build deb package for bookworm (#78968)
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-06-23 17:33:40 +02:00
Nicolas Selva 63eef25da4 [SUP-30668]add sort by url for liste_type_rdv_plusieurs_personnes
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-06-06 13:54:13 +02:00
Nicolas Selva b02406094b [MTELESENA-22]rework liste_type_rdv_plusieurs_personnes and liste_type_rdv_nombres_personnes for multiple urls
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-06-01 12:21:49 +02:00
Nicolas Selva de0019c435 [SUP-29976]add format_avis
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-04-24 12:00:14 +02:00
Frédéric Péters 203e29f7dd tox: add emoji (new wcs dependency)
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-04-14 12:37:07 +02:00
Nicolas Selva 58cdf40f9c unlazy clean_string and add unlazy_filter
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-03-31 12:56:25 +02:00
Nicolas Selva 7e35838003 [TELE-1607]add filter comprehensive_list
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-03-31 11:12:54 +02:00
Nicolas Selva 094008f9f4 [MTELECHAA-139]add condition salle and fix indisponibilites_for_a_date
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-03-07 12:18:12 +01:00
Nicolas Selva e5ce3628b6 [MTELECHAA-139]add indisponibilites_for_a_date
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-03-07 10:59:13 +01:00
Frédéric Péters 6e589ed837 ci: update to use gitea clone URLs for dependencies (like #74706)
gitea/imio-teleservices-templatetags/pipeline/head This commit looks good Details
2023-02-22 10:11:50 +01:00
Agate 95080288d9 Prepare Jenkinsfile for Gitea migration (#74572)
gitea/imio-teleservices-templatetags/pipeline/head There was a failure building this commit Details
2023-02-20 15:08:44 +01:00
Nicolas Selva 027fbfc299 [MTELEGENA-14]add distinct_list 2023-02-14 15:48:29 +01:00
Nicolas Selva 9a74113fa3 [TELE-1620]add authentication_delivrance_items_visibility V2 2023-02-06 14:48:52 +01:00
Nicolas Selva 20b0bee51c [TELE-1620]add authentication_delivrance_items_visibility 2023-02-06 13:51:54 +01:00
Frédéric Péters 30605e75fb ci: upgrade isort (#74044) 2023-02-01 09:29:07 +01:00
Nicolas Selva 6bab9f5fb9 [MTELESILA-5]add request_url_json 2023-01-25 12:12:45 +01:00
Frédéric Péters 962987ac45 ci: only build package for bullseye (#72729) 2022-12-22 17:21:27 +01:00
Nicolas Selva 6ef1acc326 [SUP-27250]add capitalize filter 2022-12-14 14:54:10 +01:00
Nicolas Selva ca1dc6c2ba [MTELEBURA-24]add filter to avoid reservation during we v2 2022-12-14 14:45:17 +01:00
Frédéric Péters f62b115e16 tox: add phonenumbers (new wcs dependency) (#69838) 2022-11-30 14:02:38 +01:00
Nicolas Selva 00d08cec8e [TELE-1570]add retour_chariot filter 2022-11-30 13:46:20 +01:00
5 changed files with 345 additions and 33 deletions

2
.git-blame-ignore-revs Normal file
View File

@ -0,0 +1,2 @@
# misc: apply double-quote-string-fixer (#79788)
0914e9800cf737957ccfeb2fa2ac0d421b801bbd

View File

@ -1,13 +1,17 @@
# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0
hooks:
- id: double-quote-string-fixer
- repo: https://github.com/psf/black
rev: 22.3.0
hooks:
- id: black
args: ['--target-version', 'py37', '--skip-string-normalization', '--line-length', '110']
- repo: https://github.com/PyCQA/isort
rev: 5.7.0
rev: 5.12.0
hooks:
- id: isort
args: ['--profile', 'black', '--line-length', '110']

14
Jenkinsfile vendored
View File

@ -19,10 +19,18 @@ pipeline {
stage('Packaging') {
steps {
script {
if (env.JOB_NAME == 'imio-teleservices-templatetags' && env.GIT_BRANCH == 'origin/main') {
sh 'sudo -H -u eobuilder /usr/local/bin/eobuilder -d buster,bullseye imio-teleservices-templatetags'
env.SHORT_JOB_NAME=sh(
returnStdout: true,
// given JOB_NAME=gitea/project/PR-46, returns project
// given JOB_NAME=project/main, returns project
script: '''
echo "${JOB_NAME}" | sed "s/gitea\\///" | awk -F/ '{print $1}'
'''
).trim()
if (env.GIT_BRANCH == 'main' || env.GIT_BRANCH == 'origin/main') {
sh "sudo -H -u eobuilder /usr/local/bin/eobuilder -d bullseye,bookworm ${SHORT_JOB_NAME}"
} else if (env.GIT_BRANCH.startsWith('hotfix/')) {
sh "sudo -H -u eobuilder /usr/local/bin/eobuilder -d buster,bullseye --branch ${env.GIT_BRANCH} --hotfix imio-teleservices-templatetags"
sh "sudo -H -u eobuilder /usr/local/bin/eobuilder -d bullseye,bookworm --branch ${env.GIT_BRANCH} --hotfix ${SHORT_JOB_NAME}"
}
}
}

View File

@ -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)

10
tox.ini
View File

@ -21,7 +21,10 @@ deps =
requests
vobject
qrcode
emoji
lxml
psutil
freezegun
pyquery
Pillow
workalendar
@ -29,15 +32,16 @@ deps =
docutils
langdetect
django-ratelimit<3
git+https://git.entrouvert.org/debian/django-ckeditor.git
https://git.entrouvert.org/godo.js.git/snapshot/godo.js-0.6.tar.gz
git+https://git.entrouvert.org/entrouvert/debian-django-ckeditor.git
git+https://git.entrouvert.org/entrouvert/godo.js.git
pyproj
pyzbar
bleach
dnspython
phonenumbers
gadjo
Quixote>=3.0,<3.2
django>=2.2,<2.3
django>=3.2,<3.3
unidecode
psycopg2-binary
pre-commit