toulouse-maelis: [tools] add raw SOAP scripts (#75927) #165

Merged
nroche merged 2 commits from wip/75927-parsifal-soap-scripts into main 2023-04-03 12:31:09 +02:00
33 changed files with 1261 additions and 50 deletions

View File

@ -1,35 +0,0 @@
#!/usr/bin/python3
import argparse
import requests
import zeep
from zeep.transports import Transport
from zeep.wsse.username import UsernameToken
WSSE = UsernameToken('maelis-webservice', 'maelis-password')
WSDL_URL = 'https://demo-toulouse.sigec.fr/maelisws-toulouse-recette/services/FamilyService?wsdl'
def read_family(family_id, verbose):
session = requests.Session()
session.verify = False
transport = Transport(session=session)
settings = zeep.Settings(strict=False, xsd_ignore_sequence_order=True)
client = zeep.Client(WSDL_URL, transport=transport, wsse=WSSE, settings=settings)
result = client.service.readFamily(
dossierNumber=family_id,
# schoolYear=
# incomeYear=2022, # <-- pour filtrer les quotients sur cette année
# referenceYear=2020,
)
print(result)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('family_id', help='196544', nargs='?', default='196544')
args = parser.parse_args()
read_family(args.family_id, verbose=args.verbose)

View File

@ -0,0 +1,5 @@
*~
*.pyc
*.xml
*.txt
*.json

View File

@ -0,0 +1,90 @@
Scripts SOAP Parsifal
=====================
Scripts pour produire rapidement des trames SOAP à poster sur
https://redmine.sigec.fr/
mais aussi pour vérifier rapidement le contenus des référentiels,
qui sont mis en cache dans le connecteur,
ou sinon pour les tests.
ex:
$ ./read_referential_list.py civility
$ cat soap_sent.xml
$ cat soap_received.xml
Les scripts appellent les WS définis sur

typo ici (srcipts)

typo ici (srcipts)

(quelle review de qualité ;) )

(quelle review de qualité ;) )

(corrigé)

(corrigé)
https://demo-toulouse.sigec.fr/maelisws-toulouse-recette/
Il y a d'autres infos sur le connecteur dans ce wiki :
https://redmine.sigec.fr/projects/toulouse/wiki/Le_connecteur_publik
Install
-------
Créer un fichier config.json à la racine (au même niveau que ce
fichier Readme) avec le contenu qui est donné par le lien suivant :
https://redmine.sigec.fr/projects/toulouse/wiki/Les_scripts_SOAP
Mémo
----
Nouveautés dans les WSDL
........................
$ ./check_wsdl.py -e dev -v1
Référentiels
............
$ ./read_referential_list.py -e dev civility
$ ./read_nursery_list.py -e dev
DUI
...
$ ./read_family.py -e dev 322423
Catalogue des activités
.......................
$ ./read_activity_list.py -e dev
$ ./read_activity_nature_type.py -e dev
Catalogue personnalisé
......................
$ ./get_person_catalogue_activity.py -e dev -f 322423 -P 261768
$ ./grep_activity_info.py -e dev -f 322423 -P 261771 -d > to_grep_into.txt
Inscriptions
............
$ ./get_person_unit_info.py -e dev -f 322423 -P 261768 -a A10055585940 -u A10055585942 -p M10053212180
$ ./add_person_unit_basket.py -e dev -f 322423 -P 261772 -a A10055585940 -u A10055585942 -p M10053212180 -S 2023-02-07 -E 2023-07-07
$ ./add_person_unit_subscribe.py -e dev -f 322423 -P 264026 -a A10055585940 -u A10055585942 -p M10053212180 -S 2023-02-07 -E 2023-07-07
$ ./get_person_unit_info.py -e dev -f 322423 -P 261768 -a A10055590330 -u A10055590332 -p A10053179224
$ ./add_person_unit_basket.py -e dev -f 322423 -P 261771 -a A10055590330 -u A10055590332 -p A10053179224 -S 2023-01-01 -E 2023-06-30
Réservations (agenda)
.....................
$ ./get_person_schedule_list.py -e dev -f 322423 -P 261768 A10055585940 -y 2023 -m 4
$ ./update_person_schedule_list.py -e dev -f 322423 -P 261768 -a A10055585940 -u A10055585942 -D "2023-04-12" -A ADD_PRES_PREVI
Réservations (semaine type)
...........................
$ ./get_person_schedule_list.py -e dev -f 322423 -P 261768 -y 2023 -m 4 -d A10049327682
$ ./update_week_calendar.py -e dev -f 322423 -P 261768 -a A10049327682 -S "2023-04-01" -E "2222-05-01" -W "XB_____"
Paniers
.......
$ ./get_family_basket.py -e dev 322423
$ ./delete_basket.py -e dev S10055618250
$ ./delete_basket_line.py -e dev S10055618251
$ ./validate_basket.py -e dev S10055618250
penser à noter les idIns pour ensuite pouvoir faire :
$ ./delete_subscribe_activity.py -e dev S10055619138
Factures
........
$ ./read_referential_list.py -e dev -s invoice regie
$ ./read_invoices.py -e dev -r 104 -f 322423
(à venir...)
$ ./pay_invoices.py -e dev --help
(il y aura aussi le WS cancelInvoiceAndDeleteSubscribeList)

View File

@ -0,0 +1,45 @@
#!/usr/bin/python3
import argparse
import utils
FAMILY_ID = '322573' # NICO
PERSON_ID = '263781' # BART
ACTIVITY_ID = 'A10055227963'
UNIT_ID = 'A10055227965'
PLACE_ID = 'A10055129635'
START_DATE = '2023-02-01'
END_DATE = '2023-07-01'
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
result = client.service.addPersonUnitBasket(
addPersonUnitBasketRequestBean={
'numFamily': args.family,
'numPerson': args.person,
'idAct': args.activity,
'idUnit': args.unit,
'idPlace': args.place,
'dateStartSubscribe': args.start,
'dateEndSubscribe': args.end,
}
)
print(result)

J'utiliserais pprint pour mieux voir la structure retournée.

J'utiliserais `pprint` pour mieux voir la structure retournée.

Pas besoin en fait,
les objets zeep s'affichent déjà en json avec de l'indentation.

(Pdb) type(results)
<class 'zeep.objects.getPersonUnitInfoResponseBean'>

(ce qui ne serait pas le cas si on utilisait le serializer)
from zeep.helpers import serialize_object

Pas besoin en fait, les objets zeep s'affichent déjà en json avec de l'indentation. ``` (Pdb) type(results) <class 'zeep.objects.getPersonUnitInfoResponseBean'> ``` (ce qui ne serait pas le cas si on utilisait le serializer) `from zeep.helpers import serialize_object`
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('--family', '-f', default=FAMILY_ID, help='family id')
parser.add_argument('--person', '-P', default=PERSON_ID, help='person id')
parser.add_argument('--activity', '-a', default=ACTIVITY_ID, help='activity id')
parser.add_argument('--unit', '-u', default=UNIT_ID, help='unit id')
parser.add_argument('--place', '-p', default=PLACE_ID, help='place id')
parser.add_argument('--start', '-S', default=START_DATE, help='start date (ex: 2023-02-01)')
parser.add_argument('--end', '-E', default=START_DATE, help='end date (ex: 2023-07-01)')
check(parser.parse_args())

View File

@ -0,0 +1,45 @@
#!/usr/bin/python3
import argparse
import utils
FAMILY_ID = '322573' # NICO
PERSON_ID = '263781' # BART
ACTIVITY_ID = 'A10055227963'
UNIT_ID = 'A10055227965'
PLACE_ID = 'A10055129635'
START_DATE = '2023-02-01'
END_DATE = '2023-07-01'
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
result = client.service.addPersonUnitSubscribe(
AddPersonSubscribeRequestBean={
'numFamily': args.family,
'numPerson': args.person,
'idAct': args.activity,
'idUnit': args.unit,
'idPlace': args.place,
'dateStartSubscribe': args.start,
'dateEndSubscribe': args.end,
}
)
print(result)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('--family', '-f', default=FAMILY_ID, help='family id')
parser.add_argument('--person', '-P', default=PERSON_ID, help='person id')
parser.add_argument('--activity', '-a', default=ACTIVITY_ID, help='activity id')
parser.add_argument('--unit', '-u', default=UNIT_ID, help='unit id')
parser.add_argument('--place', '-p', default=PLACE_ID, help='place id')
parser.add_argument('--start', '-S', default=START_DATE, help='start date (ex: 2023-02-01)')
parser.add_argument('--end', '-E', default=START_DATE, help='end date (ex: 2023-07-01)')
check(parser.parse_args())

View File

@ -0,0 +1,64 @@
#!/usr/bin/python3
import argparse
import os
import subprocess
import sys
import requests
import utils
def check_one(args, service):
wsdl_url = utils.get_wsdl_url(args.env, service)
print(wsdl_url)
# previous result
wsdl_file_path = 'wsdl/%sService.wsdl' % service.title()
if not os.path.exists(wsdl_file_path):
with open(wsdl_file_path, 'w'):
pass
result = requests.get(wsdl_url, verify=False)
assert result.status_code == 200
# result
last_wsdl_file_path = wsdl_file_path + '.new'
with open(last_wsdl_file_path, 'w') as wsdl_last_file:
wsdl_last_file.write(result.text)
# diff
if args.verbose > 1:
stdout = stderr = None
else:
stdout = stderr = subprocess.PIPE
cmd = 'diff %s %s' % (wsdl_file_path, last_wsdl_file_path)
output = subprocess.run(cmd, shell=True, check=False, stdout=stdout, stderr=stderr)
if output.returncode:
print('WSDL change on %s' % service)
return output.returncode
def check(args):
returncode = 0
utils.configure_logging(args.verbose)
if args.service == 'all':
for service in ['family', 'activity', 'invoice', 'ape', 'site']:
result = check_one(args, service)
returncode = returncode or result
else:
returncode = check_one(args, args.service)
sys.exit(returncode)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument(
'service', help='family, activity, invoice, ape, site or all', nargs='?', default='all'
)
args = parser.parse_args()
check(args)

View File

@ -0,0 +1,26 @@
#!/usr/bin/python3
import argparse
import utils
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
results = client.service.deleteBasket(
deleteBasketRequestBean={
'idBasket': args.basket,
'idUtilisat': "Entr'ouvert",
}
)
print(results)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('basket', help='basket id')
check(parser.parse_args())

View File

@ -0,0 +1,25 @@
#!/usr/bin/python3
import argparse
import utils
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
results = client.service.deletePersonUnitBasket(
deletePersonUnitBasketRequestBean={
'idBasketLine': args.line,
}
)
print(results)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('line', nargs='?', help='basket line id')
check(parser.parse_args())

View File

@ -0,0 +1,21 @@
#!/usr/bin/python3
import argparse
import utils
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
results = client.service.deleteSubscribeActivity(idSubscribe=args.subscribe)
print(results)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('subscribe', nargs='?', help='subscribe id (idIns du panier)')
check(parser.parse_args())

View File

@ -0,0 +1,30 @@
#!/usr/bin/python3
from math import inf
from dateutil.relativedelta import relativedelta
from django.utils.dateparse import parse_date
def get_ages_criteria(today, start_dob, end_dob):
ages_txt = ['<=2', '3-11', '12-17', '18-25', '26-59', '>=60']
ages = [0, 3, 12, 18, 26, 60, 62]
data = []
max_age = relativedelta(today, parse_date(start_dob[:10])).years if start_dob else inf
min_age = relativedelta(today, parse_date(end_dob[:10])).years if end_dob else 0
print('activity: [%s:%s]' % (min_age, max_age))
for i in range(0, len(ages) - 1):
print('check for laps [%s:%s]' % (ages[i], ages[i + 1] - 1))
for age in range(ages[i], ages[i + 1]):
# print('check for age %s <= %s <= %s (%s)' % (min_age, age, max_age, bool(min_age <= age <= max_age)))
if min_age <= age <= max_age:
print('found %s' % ages_txt[i])
data.append((i, ages_txt[i]))
break
return data
today = parse_date('2023-01-01')
print(get_ages_criteria(today, '1964-01-01', '1964-01-01'))

View File

@ -0,0 +1,27 @@
#!/usr/bin/python3
import argparse
import utils
FAMILY_ID = '322423' # NICO
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
results = client.service.getFamilyBasket(
getFamilyBasketRequestBean={
'numFamily': args.family,
}
)
print(results)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('family', help=FAMILY_ID, nargs='?', default=FAMILY_ID)
check(parser.parse_args())

View File

@ -0,0 +1,93 @@
#!/usr/bin/python3
import argparse
import json
import utils
from zeep.helpers import serialize_object
FAMILY_ID = '322573' # NICO
PERSON_ID = '263781' # BART
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
results = client.service.getPersonCatalogueActivity(
getPersonCatalogueActivityRequestBean={
'numDossier': args.family,
'numPerson': args.person,
# facultatif, pour fitrer sur une nature d'activité
#'codeNatureActivity': None, # 'P' ou 'V'
# facultatif, ne fait que retirer des lignes
#'yearSchool': '2022', # aucune influence ici
#'dateStartActivity': '2022-09-01',
#'dateEndActivity': '2023-08-01',
}
)
if args.dump:
print(json.dumps(serialize_object(results), cls=utils.DjangoJSONEncoder, indent=2))
return
for activity in results['catalogueActivityList']:
if args.nature:
if args.nature.lower() == 'loisir':
if activity['activity']['activityType'] and activity['activity']['activityType'][
'natureSpec'
]['code'] in ['A', 'R', 'X']:
continue
elif args.nature and not (
activity['activity']['activityType']
and activity['activity']['activityType']['natureSpec']['code'] == args.nature
):
continue
print(
'* %s / %s'
% ( # / %s' % (
activity['activity']['idActivity'],
activity['activity']['libelle1'],
# activity['activity']['libelle2'],
)
)
# print(' calendarGeneration: %s' % activity['activity']['calendarGeneration']['code'])
if activity['activity']['activityType']:
print(
' type: %s / %s'
% (
activity['activity']['activityType']['code'],
activity['activity']['activityType']['natureSpec']['code'],
)
)
else:
print("' type: no activity type")
# print(' weeklyCalendarActivityList: %s' %
# bool('weeklyCalendarActivityList' in activity['activity']))
# print(' openDayList: %s' % len(activity['openDayList']))
for unit in activity['unitInfoList']:
print(' * %s / %s' % (unit['idUnit'], unit['libelle']))
print(' start: %s' % (unit['dateStart'].strftime('%Y-%m-%d')))
print(' end: %s' % (unit['dateEnd'].strftime('%Y-%m-%d')))
# print(' places: %s' % len(unit['placeInfoList']))
for item in unit['placeInfoList']:
place = item['place']
print(
' * %s / %s: (x/y: %s/%s)'
% (place['idPlace'], place['lib1'], place['longitude'], place['latitude'])
)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('--dump', '-d', default=False, action='store_true', help='dump')
parser.add_argument('--family', '-f', default=FAMILY_ID, help='family id')
parser.add_argument('--person', '-P', default=PERSON_ID, help='person id')
parser.add_argument('--nature', '-n', default=None, help='code nature, ex: "X"')
check(parser.parse_args())

View File

@ -0,0 +1,52 @@
#!/usr/bin/python3
import argparse
import utils
FAMILY_ID = '322573' # NICO
PERSON_ID = '263781' # BART
ACTIVITY_ID = 'A10055227963'
YEAR = '2023'
MONTH = '4'
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
res = client.service.getPersonScheduleList(
requestBean={
'numDossier': args.family,
'numPerson': args.person,
'year': args.year,
'month': args.month,
'idAct': args.activity,
}
)
if args.dump:
print(res)
return
for person in res:
for activity in person['activityScheduleList']:
print('* %s / %s' % (activity['activity']['idAct'], activity['activity']['libelle']))
for unit in activity['unitScheduleList']:
print(' * %s / %s' % (unit['unit']['idUnit'], unit['unit']['libelle']))
for day in unit['dayInfoList']:
if day['status'] in ['NO_READ', 'NO_CUSTODY']:
continue
print(day)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('--dump', '-d', default=False, action='store_true', help='dump')
parser.add_argument('--family', '-f', default=FAMILY_ID, help='family id')
parser.add_argument('--person', '-P', default=PERSON_ID, help='person id')
parser.add_argument('--activity', '-a', default=ACTIVITY_ID, help='activity id')
parser.add_argument('--year', '-y', default=YEAR, help='year (ex: 2023)')
parser.add_argument('--month', '-m', default=MONTH, help='month (ex: 4)')
parser.add_argument('activity', nargs='?', default=None, help='activity id')
check(parser.parse_args())

View File

@ -0,0 +1,81 @@
#!/usr/bin/python3
import argparse
import utils
FAMILY_ID = '322573' # NICO
PERSON_ID = '263781' # BART
ACTIVITY_ID = 'A10055227963'
UNIT_ID = 'A10055227965'
PLACE_ID = 'A10055129635'
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
results = client.service.getPersonUnitInfo(
getPersonUnitInfoRequestBean={
'numDossier': args.family,
'numPerson': args.person,
'activityUnitPlace': {
'idActivity': args.activity,
'idUnit': args.unit,
'idPlace': args.place,
},
'dateRef': None, # si nulle, date du jour
}
)
if args.dump:
print(results)
exit(0)
print(
'* %s / %s / %s'
% (
results['activity']['idActivity'],
results['activity']['libelle1'],
results['activity']['libelle2'],
)
)
print(
' control: %s / %s'
% (
results['controlResult']['controlOK'],
results['controlResult']['message'],
)
)
print(' calendarGeneration: %s' % results['calendarGeneration']['code'])
if results['activity']['activityType']:
print(
' type: %s / %s'
% (
results['activity']['activityType']['code'],
results['activity']['activityType']['natureSpec']['code'],
)
)
else:
print("' type: no activity type")
print(' weeklyCalendarActivityList: %s' % bool('weeklyCalendarActivityList' in results))
print(' openDayList: %s' % len(results['openDayList']))
print(' unit: %s / %s' % (results['unit']['idUnit'], results['unit']['libelle']))
print(' start: %s' % (results['unit']['dateStart'].strftime('%Y-%m-%d')))
print(' end: %s' % (results['unit']['dateEnd'].strftime('%Y-%m-%d')))
print(' place: %s / %s' % (results['place']['idPlace'], results['place']['lib1']))
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('--dump', '-d', default=False, action='store_true', help='dump')
parser.add_argument('--family', '-f', default=FAMILY_ID, help='family id')
parser.add_argument('--person', '-P', default=PERSON_ID, help='person id')
parser.add_argument('--activity', '-a', default=ACTIVITY_ID, help='activity id')
parser.add_argument('--unit', '-u', default=UNIT_ID, help='unit id')
parser.add_argument('--place', '-p', default=PLACE_ID, help='place id')
check(parser.parse_args())

View File

@ -0,0 +1,72 @@
#!/usr/bin/python3
import argparse
import utils
FAMILY_ID = '322573' # NICO
PERSON_ID = '263781' # BART
def activity_info(args, client, activity_id, unit_id, text_id):
results = client.service.getPersonUnitInfo(
getPersonUnitInfoRequestBean={
'numDossier': args.family,
'numPerson': args.person,
'activityUnitPlace': {
'idActivity': activity_id,
'idUnit': unit_id,
'idPlace': text_id,
},
'dateRef': None, # si nulle, date du jour
}
)
print('* %s / %s / %s\n' % (activity_id, unit_id, text_id))
if args.dump:
print(results)
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
results = client.service.getPersonCatalogueActivity(
getPersonCatalogueActivityRequestBean={
'numDossier': args.family,
'numPerson': args.person,
# facultatif, pour fitrer sur une nature d'activité
'codeNatureActivity': None, # 'P' ou 'V'
# facultatif, ne fait que retirer des lignes
'yearSchool': '2022', # aucune influence ici
'dateStartActivity': '2022-09-01',
'dateEndActivity': '2023-08-01',
}
)
for activity in results['catalogueActivityList']:
activity_id = activity['activity']['idActivity']
activity_text = activity['activity']['libelle1']
for unit in activity['unitInfoList']:
unit_id = unit['idUnit']
unit_text = unit['libelle']
i = 0
for place in unit['placeInfoList']:
place_id = place['place']['idPlace']
place_text = place['place']['lib1']
print('\n=== %s - %s - %s ===' % (activity_text, unit_text, place_text))
activity_info(args, client, activity_id, unit_id, place_id)
i += 1
if i == 3:
print('(...)')
break
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('--dump', '-d', default=False, action='store_true', help='dump')
parser.add_argument('--family', '-f', default=FAMILY_ID, help='family id')
parser.add_argument('--person', '-P', default=PERSON_ID, help='person id')
check(parser.parse_args())

View File

@ -0,0 +1,112 @@
#!/usr/bin/python3
import argparse
import json
import pprint
import utils
from zeep.helpers import serialize_object
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
results = client.service.readActivityList(
schoolyear=2022,
# schoolyear=2023, # si je fais ça je perd "A10049327682 / RESTAURATION SCOLAIRE 22/23"
dateStartCalend='2022-09-01',
dateEndCalend='2023-08-31',
# dateEndCalend='2022-09-01' # si je fais ça je perd "A10053187065 / Vacances Hivers 2023" et "A10053187089 / Vacances Ete 2023"
)
if args.dump:
print(json.dumps(serialize_object(results), cls=utils.DjangoJSONEncoder, indent=2))
exit(0)
for activity in serialize_object(results):
nature_code = None
nature_lib = None
type_code = None
type_lib = None
if activity['activityPortail'].get('activityType'):
nature_code = activity['activityPortail']['activityType']['natureSpec']['code']
nature_lib = activity['activityPortail']['activityType']['natureSpec']['libelle']
type_code = activity['activityPortail']['activityType']['code']
type_lib = activity['activityPortail']['activityType']['libelle']
print(
'* %s / %s (nature: (%s) %s / type: (%s) %s)'
% (
activity['activityPortail']['idAct'],
activity['activityPortail']['libelle'],
nature_code,
nature_lib,
type_code,
type_lib,
)
)
# # # print(' schoolYear: %s' % activity['activityPortail']['schoolYear'])
# print(' calendarGeneration: %s' % activity['activityPortail']['calendarGeneration']['code'])
# if activity['activityPortail']['activityType']:
# print(' type: %s / %s' % (
# activity['activityPortail']['activityType']['code'],
# activity['activityPortail']['activityType']['libelle'],
# ))
# # print(' weeklyCalendarActivityList: %s' %
# # bool('weeklyCalendarActivityList' in activity['activityPortail']))
# # print(' openDayList: %s' % len(activity['openDayList']))
# for unit in activity['unitPortailList']:
# print(' * %s / %s' % (unit['idUnit'], unit['libelle']))
# #print(' age: %s -> %s' % (unit['birthDateStart'], unit['birthDateEnd']))
# #print(' places: %s' % len(unit['placeList']))
# #for place in unit['placeList']:
# # print(' * %s : (%s/%s)' % (place['lib'], place['longitude'], place['latitude']))
exit(0)
for activity in serialize_object(results):
if activity['activityPortail']['activityType']['natureSpec']['code'] not in ('P', 'L', 'S'):
continue
print(
'* %s / %s'
% (
activity['activityPortail']['idAct'],
activity['activityPortail']['libelle'],
)
)
print(
' nature: %s: %s'
% (
activity['activityPortail']['activityType']['natureSpec']['code'],
activity['activityPortail']['activityType']['natureSpec']['libelle'],
)
)
print(
' type: %s: %s'
% (
activity['activityPortail']['activityType']['code'],
activity['activityPortail']['activityType']['libelle'],
)
)
exit(0)
data = []
for a, activity in enumerate(serialize_object(results)):
if activity['activityPortail']['activityType']['natureSpec']['code'] not in ('P', 'L', 'S', 'V'):
continue
results[a]['openDayList'] = 'hidden (%s)' % len(activity['openDayList'])
for u, unit in enumerate(activity['unitPortailList']):
# del result[a]['unitPortailList'][u]['placeList']
results[a]['unitPortailList'][u]['placeList'] = 'hidden (%s)' % len(unit['placeList'])
data.append(activity)
pprint.pprint(data)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('--dump', '-d', default=False, action='store_true', help='dump')
args = parser.parse_args()
check(args)

View File

@ -0,0 +1,23 @@
#!/usr/bin/python3
import argparse
import utils
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
results = client.service.readActivityNatureTypeList()
for nature in results:
print('* %s: %s' % (nature['code'], nature['libelle']))
for a_type in nature['activityTypeList']:
print(' * %s: %s' % (a_type['code'], a_type['libelle']))
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
check(parser.parse_args())

View File

@ -0,0 +1,31 @@
#!/usr/bin/python3
import argparse
import utils
FAMILY_ID = '322423' # NICO
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Family')
result = client.service.readFamily(
dossierNumber=args.family,
# schoolYear=
# incomeYear=2020, # <-- pour avoir les quotients
# referenceYear=2020,
)
if args.verbose > 1:
print(result)
return result
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('family', help=FAMILY_ID, nargs='?', default=FAMILY_ID)
args = parser.parse_args()
check(args)

View File

@ -0,0 +1,35 @@
#!/usr/bin/python3
import argparse
import utils
FAMILY_ID = '322573' # NICO
PERSON_ID = '263781' # BART
REGIE_ID = '100' # CANTINE / CLAE
START_DATE = '1970-01-01'
END_DATE = '2222-02-22'
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Invoice')
result = client.service.readInvoices(
numDossier=args.family,
codeRegie=args.regie,
dateStart=args.start,
dateEnd=args.end,
)
print(result)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('--family', '-f', default=FAMILY_ID, help='family id')
parser.add_argument('--regie', '-r', default=REGIE_ID, help='person id')
parser.add_argument('--start', '-S', default=START_DATE, help='start date (ex: 1970-01-01)')
parser.add_argument('--end', '-E', default=START_DATE, help='end date (ex: 2222-02-22)')
check(parser.parse_args())

View File

@ -0,0 +1,28 @@
#!/usr/bin/python3
import argparse
import json
import utils
from zeep.helpers import serialize_object
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Ape')
results = client.service.readNurseryList(
request={
#'activityTypeCode': '', #'CRECHFAM', # 'CRECHCO'
#'codePSU': '', #'REGULAR', # 'OCCASIONAL'
}
)
print(json.dumps(serialize_object(results), cls=utils.DjangoJSONEncoder, indent=2))
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
check(parser.parse_args())

View File

@ -0,0 +1,54 @@
#!/usr/bin/python3
import argparse
import utils
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, args.service.title())
ref = args.referential.title()
if ref == 'Csp':
ref = 'CSP'
elif ref == 'Dietcode':
ref = 'DietCode'
elif ref == 'Pai':
ref = 'PAI'
elif ref == 'Childindicator':
ref = 'ChildIndicator'
elif ref == 'Rlindicator':
ref = 'RLIndicator'
elif ref == 'Activitynaturetype':
ref = 'ActivityNatureType'
elif ref == 'Yearschool':
ref = 'YearSchool'
elif ref == 'Derogreason':
ref = 'DerogReason'
elif ref == 'Activitynaturetype':
ref = 'ActivityNatureType'
method = getattr(client.service, 'read%sList' % ref)
results = method()
print(results)
assert len(results) > 1
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('--service', '-s', default='Family', help='Family, Activity, Site, Invoice, Ape')
parser.add_argument(
'referential',
help='category childIndicator civility country county csp dietcode direct organ pai quality quotient rlIndicator service situation street town vaccin'
+ 'activityNatureType derogReason level yearschool'
+ 'regie'
+ 'apeIndicator',
nargs='?',
default='civility',
)
args = parser.parse_args()
check(args)

View File

@ -0,0 +1,25 @@
#!/usr/bin/python3
import argparse
import utils
FAMILY_ID = '322423' # NICO
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
result = client.service.updateBasketTime(
idBasket=args.basket,
)
print(result)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('basket', nargs='?', help='basket id')
check(parser.parse_args())

View File

@ -0,0 +1,47 @@
#!/usr/bin/python3
import argparse
import utils
FAMILY_ID = '322573' # NICO
PERSON_ID = '263781' # BART
ACTIVITY_ID = 'A10055227963'
UNIT_ID = 'A10055227965'
DATE = '2023-04-12'
YEAR = '2023'
ACTION = 'ADD_PRES_PREVI'
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
res = client.service.updatePersonSchedule(
requestBean={
'numDossier': args.family,
'unitPersonDayInfoList': [
{
'numPerson': args.person,
'idAct': args.activity,
'idUni': args.unit,
'date': args.date,
'action': args.action,
},
],
}
)
print(res)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('--family', '-f', default=FAMILY_ID, help='family id')
parser.add_argument('--person', '-P', default=PERSON_ID, help='person id')
parser.add_argument('--activity', '-a', default=ACTIVITY_ID, help='activity id')
parser.add_argument('--unit', '-u', default=UNIT_ID, help='unit id')
parser.add_argument('--date', '-D', default=DATE, help='date (ex: 2023-04-12)')
parser.add_argument('--action', '-A', default=ACTION, help='ADD_PRES_PREVI, DEL_PRES_PREVI, ...')
check(parser.parse_args())

View File

@ -0,0 +1,55 @@
#!/usr/bin/python3
import argparse
import utils
FAMILY_ID = '322573' # NICO
PERSON_ID = '263781' # BART
ACTIVITY_ID = 'A10055227963'
START_DATE = '2023-02-01'
END_DATE = '2023-07-01'
WEEK = '_XB____'
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
if len(args.week) != 7:
raise Exception("week must contain 7 letters (on per week day)")
week = []
for i, unit_letter in enumerate(args.week):
if unit_letter in ['_', ' ']:
letter = None
else:
letter = unit_letter
week.append(
{
'dayNum': i + 1,
'calendarLetter': letter,
'isPresent': bool(letter is not None),
}
)
result = client.service.updateWeekCalendar(
numPerson=args.person,
idActivity=args.activity,
dateStart=args.start,
dateEnd=args.end,
dayWeekInfoList=week,
)
print(result)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('--family', '-f', default=FAMILY_ID, help='family id')
parser.add_argument('--person', '-P', default=PERSON_ID, help='person id')
parser.add_argument('--activity', '-a', default=ACTIVITY_ID, help='activity id')
parser.add_argument('--start', '-S', default=START_DATE, help='start date (ex: 2023-02-01)')
parser.add_argument('--end', '-E', default=START_DATE, help='end date (ex: 2023-07-01)')
parser.add_argument('--week', '-W', default=WEEK, help='7 unit lettres or "_" (ex: _XB____)')
check(parser.parse_args())

View File

@ -0,0 +1,126 @@
import datetime
import json
import logging.config
import os
import time
import requests
import zeep
from django.core.serializers.json import DjangoJSONEncoder
from lxml import etree
from zeep.transports import Transport
from zeep.wsse.username import UsernameToken
class SoapFilter(logging.Filter):
def filter(elf, record):
# ignore get WSDL record
if 'HTTP Post to' in record.message:
return True
if 'HTTP Response from' in record.message:
return True
return False
class SoapHandler(logging.Handler):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for purpose in 'sent', 'received':
try:
os.remove('soap_' + purpose + '.xml')
except OSError:
pass
def format(self, record):
# cannot use formatter to do that
start = record.message.find('<soap')
soap = record.message[start:]
return soap
def emit(self, record):
msg = self.format(record)
xml = etree.fromstring(msg)
if 'HTTP Post to' in record.message:
path = 'soap_sent.xml'
elif 'HTTP Response from' in record.message:
path = 'soap_received.xml'
with open(path, 'ab') as soap_file:
soap_file.write(('---8<---' + '-' * 50 + '\n').encode())
soap_file.write(etree.tostring(xml, pretty_print=True, encoding='UTF-8'))
# keep all traces
path = 'all_' + path
with open(path, 'ab') as soap_file:
soap_file.write(('---8<---' + '-' * 50 + '\n').encode())
soap_file.write(etree.tostring(xml, pretty_print=True, encoding='UTF-8'))
def configure_logging(verbose):
if verbose > 1:
level = 'DEBUG'
else:
level = 'INFO'
logging.config.dictConfig(
{
'version': 1,
'filters': {
'soap_filter': {
'()': 'utils.SoapFilter',
},
},
'formatters': {'verbose': {'format': '%(name)s: %(message)s'}},
'handlers': {
'console': {
'level': level,
'class': 'logging.StreamHandler',
'formatter': 'verbose',
},
'soap': {
'level': level,
'class': 'utils.SoapHandler',
'filters': ['soap_filter'],
# no formatter used
},
},
'loggers': {
'zeep.transports': {
'level': 'DEBUG',
'propagate': True,
'handlers': ['console', 'soap'],
},
},
}
)
def load_config(env):
with open('config.json') as conf_file:
config = json.load(conf_file)
return config[env.lower()]
def get_wsdl_url(env, service):
'''VPN is required to access test and integ environments'''
config = load_config(env)
return config['url'] + 'services/' + service.title() + 'Service?wsdl'
def get_client(env, service):
config = load_config(env)
settings = zeep.Settings(strict=False, xsd_ignore_sequence_order=True)
wsse = UsernameToken(config['login'], config['password'])
session = requests.Session()
session.verify = config['session_verify']
wsdl_url = get_wsdl_url(env, service)
print(wsdl_url)
transport = Transport(session=session)
client = zeep.Client(wsdl_url, transport=transport, wsse=wsse, settings=settings)
return client
class JSONEncoder(DjangoJSONEncoder):
def default(self, o):
if isinstance(o, time.struct_time):
o = datetime.datetime(*tuple(o)[:6])
return super().default(o)

View File

@ -0,0 +1,25 @@
#!/usr/bin/python3
import argparse
import utils
def check(args):
utils.configure_logging(args.verbose)
client = utils.get_client(args.env, 'Activity')
result = client.service.validateBasket(
validateBasketRequestBean={
'idBasket': args.basket,
}
)
print(result)
if __name__ == "__main__":
parser = argparse.ArgumentParser()
parser.add_argument('--verbose', '-v', type=int, default=2, help='display errors')
parser.add_argument('--env', '-e', default='integ', help='dev, test, integ, prod')
parser.add_argument('basket', help='basket id')
check(parser.parse_args())

View File

@ -0,0 +1 @@
*.wsdl.new

View File

@ -36,6 +36,9 @@ from tests.test_manager import login
from tests.utils import FakedResponse, ResponsesSoap, generic_endpoint_url, setup_access_rights
TEST_BASE_DIR = os.path.join(os.path.dirname(__file__), 'data', 'toulouse_maelis')
WSDL_BASE_DIR = os.path.join(
os.path.dirname(__file__), '..', 'passerelle', 'contrib', 'toulouse_maelis', 'tools', 'wsdl'
)
def get_xml_file(filename):
@ -48,12 +51,17 @@ def get_media_file(filename):
return desc.read()
def get_wsdl_file(filename):
with open(os.path.join(WSDL_BASE_DIR, filename), 'rb') as desc:
return desc.read()
CONNECTION_ERROR = ConnectionError('No address associated with hostname')
FAMILY_SERVICE_WSDL = FakedResponse(content=get_xml_file('FamilyService.wsdl'), status_code=200)
ACTIVITY_SERVICE_WSDL = FakedResponse(content=get_xml_file('ActivityService.wsdl'), status_code=200)
INVOICE_SERVICE_WSDL = FakedResponse(content=get_xml_file('InvoiceService.wsdl'), status_code=200)
SITE_SERVICE_WSDL = FakedResponse(content=get_xml_file('SiteService.wsdl'), status_code=200)
APE_SERVICE_WSDL = FakedResponse(content=get_xml_file('ApeService.wsdl'), status_code=200)
FAMILY_SERVICE_WSDL = FakedResponse(content=get_wsdl_file('FamilyService.wsdl'), status_code=200)
ACTIVITY_SERVICE_WSDL = FakedResponse(content=get_wsdl_file('ActivityService.wsdl'), status_code=200)
INVOICE_SERVICE_WSDL = FakedResponse(content=get_wsdl_file('InvoiceService.wsdl'), status_code=200)
SITE_SERVICE_WSDL = FakedResponse(content=get_wsdl_file('SiteService.wsdl'), status_code=200)
APE_SERVICE_WSDL = FakedResponse(content=get_wsdl_file('ApeService.wsdl'), status_code=200)
FAILED_AUTH = FakedResponse(content=get_xml_file('R_failed_authentication.xml'), status_code=500)
ISWSRUNNING_TRUE = FakedResponse(content=get_xml_file('R_is_ws_running.xml') % b'true', status_code=200)
ISWSRUNNING_FALSE = FakedResponse(content=get_xml_file('R_is_ws_running.xml') % b'false', status_code=200)
@ -74,7 +82,7 @@ def requests_mock():
def family_service(requests_mock):
responses_soap = ResponsesSoap(
wsdl_url='https://example.org/FamilyService?wsdl',
wsdl_content=get_xml_file('FamilyService.wsdl'),
wsdl_content=get_wsdl_file('FamilyService.wsdl'),
settings=Settings(strict=False, xsd_ignore_sequence_order=True),
requests_mock=requests_mock,
)
@ -86,7 +94,7 @@ def family_service(requests_mock):
def activity_service(requests_mock):
responses_soap = ResponsesSoap(
wsdl_url='https://example.org/ActivityService?wsdl',
wsdl_content=get_xml_file('ActivityService.wsdl'),
wsdl_content=get_wsdl_file('ActivityService.wsdl'),
settings=Settings(strict=False, xsd_ignore_sequence_order=True),
requests_mock=requests_mock,
)
@ -98,7 +106,7 @@ def activity_service(requests_mock):
def invoice_service(requests_mock):
responses_soap = ResponsesSoap(
wsdl_url='https://example.org/InvoiceService?wsdl',
wsdl_content=get_xml_file('InvoiceService.wsdl'),
wsdl_content=get_wsdl_file('InvoiceService.wsdl'),
settings=Settings(strict=False, xsd_ignore_sequence_order=True),
requests_mock=requests_mock,
)
@ -110,7 +118,7 @@ def invoice_service(requests_mock):
def site_service(requests_mock):
responses_soap = ResponsesSoap(
wsdl_url='https://example.org/SiteService?wsdl',
wsdl_content=get_xml_file('SiteService.wsdl'),
wsdl_content=get_wsdl_file('SiteService.wsdl'),
settings=Settings(strict=False, xsd_ignore_sequence_order=True),
requests_mock=requests_mock,
)
@ -122,7 +130,7 @@ def site_service(requests_mock):
def ape_service():
with ResponsesSoap(
wsdl_url='https://example.org/ApeService?wsdl',
wsdl_content=get_xml_file('ApeService.wsdl'),
wsdl_content=get_wsdl_file('ApeService.wsdl'),
settings=Settings(strict=False, xsd_ignore_sequence_order=True),
)() as mock:
yield mock
@ -144,31 +152,31 @@ def django_db_setup(django_db_setup, django_db_blocker):
site_service = ResponsesSoap(
wsdl_url='https://example.org/SiteService?wsdl',
wsdl_content=get_xml_file('SiteService.wsdl'),
wsdl_content=get_wsdl_file('SiteService.wsdl'),
settings=Settings(strict=False, xsd_ignore_sequence_order=True),
)
family_service = ResponsesSoap(
wsdl_url='https://example.org/FamilyService?wsdl',
wsdl_content=get_xml_file('FamilyService.wsdl'),
wsdl_content=get_wsdl_file('FamilyService.wsdl'),
settings=Settings(strict=False, xsd_ignore_sequence_order=True),
)
activity_service = ResponsesSoap(
wsdl_url='https://example.org/ActivityService?wsdl',
wsdl_content=get_xml_file('ActivityService.wsdl'),
wsdl_content=get_wsdl_file('ActivityService.wsdl'),
settings=Settings(strict=False, xsd_ignore_sequence_order=True),
)
ape_service = ResponsesSoap(
wsdl_url='https://example.org/ApeService?wsdl',
wsdl_content=get_xml_file('ApeService.wsdl'),
wsdl_content=get_wsdl_file('ApeService.wsdl'),
settings=Settings(strict=False, xsd_ignore_sequence_order=True),
)
invoice_service = ResponsesSoap(
wsdl_url='https://example.org/InvoiceService?wsdl',
wsdl_content=get_xml_file('InvoiceService.wsdl'),
wsdl_content=get_wsdl_file('InvoiceService.wsdl'),
settings=Settings(strict=False, xsd_ignore_sequence_order=True),
)