diff --git a/functests/toulouse_maelis/read_family.py b/functests/toulouse_maelis/read_family.py deleted file mode 100755 index a153db9e..00000000 --- a/functests/toulouse_maelis/read_family.py +++ /dev/null @@ -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) diff --git a/passerelle/contrib/toulouse_maelis/tools/.gitignore b/passerelle/contrib/toulouse_maelis/tools/.gitignore new file mode 100644 index 00000000..4bcc9dfb --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/.gitignore @@ -0,0 +1,5 @@ +*~ +*.pyc +*.xml +*.txt +*.json diff --git a/passerelle/contrib/toulouse_maelis/tools/README b/passerelle/contrib/toulouse_maelis/tools/README new file mode 100644 index 00000000..4512fa4e --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/README @@ -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 +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) diff --git a/passerelle/contrib/toulouse_maelis/tools/add_person_unit_basket.py b/passerelle/contrib/toulouse_maelis/tools/add_person_unit_basket.py new file mode 100755 index 00000000..52ce5045 --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/add_person_unit_basket.py @@ -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) + + +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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/add_person_unit_subscribe.py b/passerelle/contrib/toulouse_maelis/tools/add_person_unit_subscribe.py new file mode 100755 index 00000000..365d2069 --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/add_person_unit_subscribe.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/check_wsdl.py b/passerelle/contrib/toulouse_maelis/tools/check_wsdl.py new file mode 100755 index 00000000..7233677e --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/check_wsdl.py @@ -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) diff --git a/passerelle/contrib/toulouse_maelis/tools/delete_basket.py b/passerelle/contrib/toulouse_maelis/tools/delete_basket.py new file mode 100755 index 00000000..e63e928e --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/delete_basket.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/delete_basket_line.py b/passerelle/contrib/toulouse_maelis/tools/delete_basket_line.py new file mode 100755 index 00000000..702707af --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/delete_basket_line.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/delete_subscribe_activity.py b/passerelle/contrib/toulouse_maelis/tools/delete_subscribe_activity.py new file mode 100755 index 00000000..fbd5ba04 --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/delete_subscribe_activity.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/get_ages.py b/passerelle/contrib/toulouse_maelis/tools/get_ages.py new file mode 100755 index 00000000..fc40e90f --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/get_ages.py @@ -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')) diff --git a/passerelle/contrib/toulouse_maelis/tools/get_family_basket.py b/passerelle/contrib/toulouse_maelis/tools/get_family_basket.py new file mode 100755 index 00000000..43e97459 --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/get_family_basket.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/get_person_catalogue_activity.py b/passerelle/contrib/toulouse_maelis/tools/get_person_catalogue_activity.py new file mode 100755 index 00000000..62c8c6cd --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/get_person_catalogue_activity.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/get_person_schedule_list.py b/passerelle/contrib/toulouse_maelis/tools/get_person_schedule_list.py new file mode 100755 index 00000000..abe75fa4 --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/get_person_schedule_list.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/get_person_unit_info.py b/passerelle/contrib/toulouse_maelis/tools/get_person_unit_info.py new file mode 100755 index 00000000..f6357e27 --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/get_person_unit_info.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/grep_activity_info.py b/passerelle/contrib/toulouse_maelis/tools/grep_activity_info.py new file mode 100755 index 00000000..54a3e60e --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/grep_activity_info.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/read_activity_list.py b/passerelle/contrib/toulouse_maelis/tools/read_activity_list.py new file mode 100755 index 00000000..cfe65e48 --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/read_activity_list.py @@ -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) diff --git a/passerelle/contrib/toulouse_maelis/tools/read_activity_nature_type.py b/passerelle/contrib/toulouse_maelis/tools/read_activity_nature_type.py new file mode 100755 index 00000000..f0e88da8 --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/read_activity_nature_type.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/read_family.py b/passerelle/contrib/toulouse_maelis/tools/read_family.py new file mode 100755 index 00000000..2e9c824b --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/read_family.py @@ -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) diff --git a/passerelle/contrib/toulouse_maelis/tools/read_invoices.py b/passerelle/contrib/toulouse_maelis/tools/read_invoices.py new file mode 100755 index 00000000..48baad85 --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/read_invoices.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/read_nursery_list.py b/passerelle/contrib/toulouse_maelis/tools/read_nursery_list.py new file mode 100755 index 00000000..5ae27d5a --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/read_nursery_list.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/read_referential_list.py b/passerelle/contrib/toulouse_maelis/tools/read_referential_list.py new file mode 100755 index 00000000..e0cce418 --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/read_referential_list.py @@ -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) diff --git a/passerelle/contrib/toulouse_maelis/tools/update_basket_time.py b/passerelle/contrib/toulouse_maelis/tools/update_basket_time.py new file mode 100755 index 00000000..dd5bd191 --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/update_basket_time.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/update_person_schedule_list.py b/passerelle/contrib/toulouse_maelis/tools/update_person_schedule_list.py new file mode 100755 index 00000000..f12c70b2 --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/update_person_schedule_list.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/update_week_calendar.py b/passerelle/contrib/toulouse_maelis/tools/update_week_calendar.py new file mode 100755 index 00000000..bf07490c --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/update_week_calendar.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/utils/__init__.py b/passerelle/contrib/toulouse_maelis/tools/utils/__init__.py new file mode 100644 index 00000000..a9bb9e3f --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/utils/__init__.py @@ -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(' 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) diff --git a/passerelle/contrib/toulouse_maelis/tools/validate_basket.py b/passerelle/contrib/toulouse_maelis/tools/validate_basket.py new file mode 100755 index 00000000..3ab8903c --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/validate_basket.py @@ -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()) diff --git a/passerelle/contrib/toulouse_maelis/tools/wsdl/.gitignore b/passerelle/contrib/toulouse_maelis/tools/wsdl/.gitignore new file mode 100644 index 00000000..1cf6116b --- /dev/null +++ b/passerelle/contrib/toulouse_maelis/tools/wsdl/.gitignore @@ -0,0 +1 @@ +*.wsdl.new diff --git a/tests/data/toulouse_maelis/ActivityService.wsdl b/passerelle/contrib/toulouse_maelis/tools/wsdl/ActivityService.wsdl similarity index 100% rename from tests/data/toulouse_maelis/ActivityService.wsdl rename to passerelle/contrib/toulouse_maelis/tools/wsdl/ActivityService.wsdl diff --git a/tests/data/toulouse_maelis/ApeService.wsdl b/passerelle/contrib/toulouse_maelis/tools/wsdl/ApeService.wsdl similarity index 100% rename from tests/data/toulouse_maelis/ApeService.wsdl rename to passerelle/contrib/toulouse_maelis/tools/wsdl/ApeService.wsdl diff --git a/tests/data/toulouse_maelis/FamilyService.wsdl b/passerelle/contrib/toulouse_maelis/tools/wsdl/FamilyService.wsdl similarity index 100% rename from tests/data/toulouse_maelis/FamilyService.wsdl rename to passerelle/contrib/toulouse_maelis/tools/wsdl/FamilyService.wsdl diff --git a/tests/data/toulouse_maelis/InvoiceService.wsdl b/passerelle/contrib/toulouse_maelis/tools/wsdl/InvoiceService.wsdl similarity index 100% rename from tests/data/toulouse_maelis/InvoiceService.wsdl rename to passerelle/contrib/toulouse_maelis/tools/wsdl/InvoiceService.wsdl diff --git a/tests/data/toulouse_maelis/SiteService.wsdl b/passerelle/contrib/toulouse_maelis/tools/wsdl/SiteService.wsdl similarity index 100% rename from tests/data/toulouse_maelis/SiteService.wsdl rename to passerelle/contrib/toulouse_maelis/tools/wsdl/SiteService.wsdl diff --git a/tests/test_toulouse_maelis.py b/tests/test_toulouse_maelis.py index 19cf794d..6d2e304c 100644 --- a/tests/test_toulouse_maelis.py +++ b/tests/test_toulouse_maelis.py @@ -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), )