use MechanicalSoup for Lodur API
This commit is contained in:
parent
461638d13f
commit
f7c23f65c2
178
lodur.py
178
lodur.py
|
@ -5,42 +5,38 @@
|
|||
import re
|
||||
import logging
|
||||
from datetime import datetime
|
||||
import requests
|
||||
import mechanicalsoup
|
||||
|
||||
class Lodur:
|
||||
""" Lodur """
|
||||
|
||||
def __init__(self, url, username, password):
|
||||
self.logger = logging.getLogger(__name__)
|
||||
self.session = requests.session()
|
||||
# Authenticate
|
||||
self.logger.info('Connecting to Lodur')
|
||||
answer = self.session.post(
|
||||
url,
|
||||
data={
|
||||
'login_member_name': username,
|
||||
'login_member_pwd': password,
|
||||
}
|
||||
)
|
||||
# When login failed the form has the CSS class error
|
||||
# This is the only way to tell if it worked or not
|
||||
if re.search('"login error"', answer.text):
|
||||
|
||||
self.url = url
|
||||
|
||||
# MechanicalSoup initialization and login to Lodur
|
||||
self.browser = mechanicalsoup.StatefulBrowser()
|
||||
# The login form is located in module number 9
|
||||
self.browser.open(self.url + '?modul=9')
|
||||
self.browser.select_form()
|
||||
|
||||
self.browser['login_member_name'] = username
|
||||
self.browser['login_member_pwd'] = password
|
||||
self.browser.submit_selected()
|
||||
|
||||
# Check if login succeeded by finding the img with
|
||||
# alt text LOGOUT
|
||||
page = self.browser.get_current_page()
|
||||
if page.find(alt='LOGOUT'):
|
||||
self.logger.info('Login to Lodur succeeded')
|
||||
else:
|
||||
self.logger.fatal('Login to Lodur failed - exiting')
|
||||
raise SystemExit(1)
|
||||
else:
|
||||
self.logger.info('Login to Lodur succeeded')
|
||||
|
||||
def create_einsatzrapport(self, f_id, pdf_data):
|
||||
""" Create a new Einsatzrapport """
|
||||
|
||||
params = (
|
||||
('modul', '36'),
|
||||
('what', '144'),
|
||||
('sp', '1'),
|
||||
('event', ''),
|
||||
('edit', ''),
|
||||
('is_herznotfall', ''),
|
||||
)
|
||||
def einsatzrapport(self, f_id, pdf_data):
|
||||
""" Form in module 36 - Einsatzrapport """
|
||||
|
||||
# when PDF parsing fails, pdf_data is false. fill with tbd when this happens
|
||||
if pdf_data:
|
||||
|
@ -56,94 +52,62 @@ class Lodur:
|
|||
adr = pdf_data['strasse'] + ', ' + pdf_data['plzort']
|
||||
else:
|
||||
date = datetime.now()
|
||||
eins_ereig = 'TBD'
|
||||
adr = 'TBD'
|
||||
time = datetime.now()
|
||||
eins_ereig = 'UNKNOWN'
|
||||
adr = 'UNKNOWN'
|
||||
|
||||
data = {
|
||||
'e_r_num': (None, f_id), # 01. Einsatzrapportnummer
|
||||
'eins_stat_kantone': (None, '1'), # 02. Einsatzart FKS
|
||||
'emergency_concept_id': (None, '2'), # 03. Verrechnungsart
|
||||
'ver_sart': (None, 'ab'), # 03. Verrechnungsart internal: ab, th, uh, ak, tt
|
||||
'dtv_d': (None, str(date.day)), # 04. Datum von
|
||||
'dtv_m': (None, str(date.month)), # 04. Datum von
|
||||
'dtv_y': (None, str(date.year)), # 04. Datum von
|
||||
'dtb_d': (None, str(date.day)), # 04. Datum bis - we dont know yet the end date
|
||||
'dtb_m': (None, str(date.month)), # 04. Datum bis - assume the same day
|
||||
'dtb_y': (None, str(date.year)), # 04. Datum bis
|
||||
'ztv_h': (None, str(time.hour)), # 05. Zeit von
|
||||
'ztv_m': (None, str(time.minute)), # 05. Zeit von
|
||||
'ztb_h': (None, str(time.hour + 1)), # 05. Zeit bis - we dont know yet the end time
|
||||
'ztb_m': (None, str(time.minute)), # 05. Zeit bis - just add one hour and correct later
|
||||
'e_ort_1': (None, '306'), # 06. Einsatzort: Urdorf 306, Birmensdorf 298
|
||||
'eins_ereig': (None, eins_ereig.encode('iso-8859-1')), # 07. Ereignis
|
||||
'adr': (None, adr.encode('iso-8859-1')), # 08. Adresse
|
||||
#'zh_alarmierung_h': (None, 'UNKNOWN'), # 12. Alarmierung
|
||||
#'zh_alarmierung_m': (None, 'UNKNOWN'), # 12. Alarmierung
|
||||
#'zh_fw_ausg_h': (None, 'UNKNOWN'), # 13. FW ausgerückt
|
||||
#'zh_fw_ausg_m': (None, 'UNKNOWN'), # 13. FW ausgerückt
|
||||
#'zh_am_schad_h': (None, 'UNKNOWN'), # 14. Am Schadenplatz
|
||||
#'zh_am_schad_m': (None, 'UNKNOWN'), # 14. Am Schadenplatz
|
||||
#'zh_fw_einge_h': (None, 'UNKNOWN'), # 15. FW eingerückt
|
||||
#'zh_fw_einge_m': (None, 'UNKNOWN'), # 15. FW eingerückt
|
||||
#'eins_erst_h': (None, 'UNKNOWN'), # 16. Einsatzbereitschaft erstellt
|
||||
#'eins_erst_m': (None, 'UNKNOWN'), # 16. Einsatzbereitschaft erstellt
|
||||
'ang_sit': (None, 'TBD1'), # 17. Angetroffene Situation
|
||||
'mn': (None, 'TBD2'), # 19. Massnahmen
|
||||
'bk': (None, 'TBD3'), # 20. Bemerkungen
|
||||
'en_kr_feuwehr': (None, '1'), # 21. Einsatzkräfte
|
||||
'ali_io': (None, '1'), # 24. Alarmierung
|
||||
'kopie_gvz': (None, '1'), # 31. Kopie innert 10 Tagen an GVZ
|
||||
'mannschaftd_einsa': (None, '70'), # 32. Einsatzleiter|in
|
||||
}
|
||||
# Prepare the form
|
||||
self.browser.open(self.url + '?modul=36')
|
||||
self.browser.select_form('#einsatzrapport_main_form')
|
||||
|
||||
# Fill in form data
|
||||
self.browser['e_r_num'] = f_id # 01. Einsatzrapportnummer
|
||||
self.browser['eins_stat_kantone'] = '1' # 02. Einsatzart FKS
|
||||
self.browser['emergency_concept_id'] = '2' # 03. Verrechnungsart
|
||||
self.browser['ver_sart'] = 'ab' # 03. Verrechnungsart internal: ab, th, uh, ak, tt
|
||||
self.browser['dtv_d'] = str(date.day) # 04. Datum von
|
||||
self.browser['dtv_m'] = str(date.month) # 04. Datum von
|
||||
self.browser['dtv_y'] = str(date.year) # 04. Datum von
|
||||
self.browser['dtb_d'] = str(date.day) # 04. Datum bis - we dont know yet the end date
|
||||
self.browser['dtb_m'] = str(date.month) # 04. Datum bis - assume the same day
|
||||
self.browser['dtb_y'] = str(date.year) # 04. Datum bis
|
||||
self.browser['ztv_h'] = str(time.hour) # 05. Zeit von
|
||||
self.browser['ztv_m'] = str(time.minute) # 05. Zeit von
|
||||
self.browser['ztb_h'] = str(time.hour + 1) # 05. Zeit bis - we dont know yet the end time
|
||||
self.browser['ztb_m'] = str(time.minute) # 05. Zeit bis - just add 1 hour and correct later
|
||||
self.browser['e_ort_1'] = '306' # 06. Einsatzort: Urdorf 306, Birmensdorf 298
|
||||
self.browser['eins_ereig'] = eins_ereig.encode('iso-8859-1') # 07. Ereignis
|
||||
self.browser['adr'] = adr.encode('iso-8859-1') # 08. Adresse
|
||||
self.browser['ang_sit'] = 'TBD1' # 17. Angetroffene Situation
|
||||
self.browser['mn'] = 'TBD2' # 19. Massnahmen
|
||||
self.browser['bk'] = 'TBD3' # 20. Bemerkungen
|
||||
self.browser['en_kr_feuwehr'] = '1' # 21. Einsatzkräfte
|
||||
self.browser['ali_io'] = '1' # 24. Alarmierung
|
||||
self.browser['kopie_gvz'] = '1' # 31. Kopie innert 10 Tagen an GVZ
|
||||
self.browser['mannschaftd_einsa'] = '70' # 32. Einsatzleiter|in
|
||||
|
||||
# Submit the form
|
||||
self.logger.info('Submitting form Einsatzrapport')
|
||||
response = self.browser.submit_selected()
|
||||
|
||||
# post data to create new einsatzrapport
|
||||
answer = self.session.post(
|
||||
'https://lodur-zh.ch/urdorf/index.php',
|
||||
params=params,
|
||||
files=data,
|
||||
)
|
||||
# very ugly way to find the assigned event id by lodur
|
||||
# lodur really adds a script element at the bottom of the returned html
|
||||
# lodur adds a script element at the bottom of the returned html
|
||||
# with the location to reload the page - containing the assigned event id
|
||||
lodur_id = re.search('modul=36&event=([0-9].*)&edit=1&what=144', answer.text).group(1)
|
||||
lodur_id = re.search('modul=36&event=([0-9].*)&edit=1&what=144', response.text).group(1)
|
||||
self.logger.info('Lodur assigned the id ' + lodur_id + ' to ' + f_id)
|
||||
return lodur_id
|
||||
|
||||
def upload_alarmdepesche(self, lodur_id, file_path):
|
||||
def einsatzrapport_alarmdepesche(self, lodur_id, file_path):
|
||||
""" Upload a file to Alarmdepesche """
|
||||
|
||||
params = (
|
||||
('modul', '36'),
|
||||
('what', '828'),
|
||||
('event', lodur_id),
|
||||
)
|
||||
# Prepare the form
|
||||
self.browser.open(self.url + '?modul=36&what=828&event=' + lodur_id)
|
||||
self.browser.select_form('#frm_alarmdepesche')
|
||||
|
||||
data = {
|
||||
'alarmdepesche': open(file_path, 'rb')
|
||||
}
|
||||
# Fill in form data
|
||||
self.logger.info('Submitting Alarmdepesche to Lodur id ' + lodur_id)
|
||||
self.browser['alarmdepesche'] = open(file_path, 'rb')
|
||||
|
||||
self.session.post(
|
||||
'https://lodur-zh.ch/urdorf/index.php',
|
||||
params=params,
|
||||
files=data,
|
||||
)
|
||||
|
||||
# TODO this doesnt work. We first have to fetch the current form with its
|
||||
# data, update the fields we want to change and resubmit the form
|
||||
def update_einsatzrapport(self, lodur_id, data):
|
||||
""" Update the Einsatzrapport """
|
||||
|
||||
params = (
|
||||
('modul', '36'),
|
||||
('what', '144'),
|
||||
('sp', '1'),
|
||||
('event', lodur_id),
|
||||
('edit', '1'),
|
||||
('is_herznotfall', ''),
|
||||
)
|
||||
|
||||
answer = self.session.post(
|
||||
'https://lodur-zh.ch/urdorf/index.php',
|
||||
params=params,
|
||||
files=data,
|
||||
)
|
||||
print(answer.headers)
|
||||
# Submit the form
|
||||
self.browser.submit_selected()
|
||||
self.logger.info('Alarmdepesche submitted')
|
||||
|
|
13
main.py
13
main.py
|
@ -103,7 +103,7 @@ def main():
|
|||
'Einsatzrapport ' + f_id + ' already created in Lodur: ' + lodur_id
|
||||
)
|
||||
# Upload Alarmdepesche as it could contain more information than the first one
|
||||
lodur_client.upload_alarmdepesche(
|
||||
lodur_client.einsatzrapport_alarmdepesche(
|
||||
lodur_id,
|
||||
os.path.join(TMP_DIR, file_name),
|
||||
)
|
||||
|
@ -120,18 +120,15 @@ def main():
|
|||
|
||||
# create new Einsatzrapport in Lodur
|
||||
logger.info('Creating Einsatzrapport in Lodur for ' + f_id)
|
||||
lodur_id = lodur_client.create_einsatzrapport(
|
||||
lodur_id = lodur_client.einsatzrapport(
|
||||
f_id,
|
||||
pdf_data,
|
||||
)
|
||||
logger.info('Sent data to Lodur. Assigned Lodur ID: ' + lodur_id)
|
||||
# store lodur id in webdav
|
||||
webdav_client.store_lodur_id(lodur_id, f_id)
|
||||
|
||||
logger.info(
|
||||
'Uploading PDF for ' + f_id + ' to Lodur Einsatzrapport ' + lodur_id
|
||||
)
|
||||
lodur_client.upload_alarmdepesche(
|
||||
# upload Alarmdepesche to Lodur
|
||||
lodur_client.einsatzrapport_alarmdepesche(
|
||||
lodur_id,
|
||||
os.path.join(TMP_DIR, file_name),
|
||||
)
|
||||
|
@ -142,7 +139,7 @@ def main():
|
|||
lodur_id = webdav_client.get_lodur_id(f_id)
|
||||
if lodur_id:
|
||||
logger.info('Uploading Einsatzprotokoll to Lodur')
|
||||
lodur_client.upload_alarmdepesche(
|
||||
lodur_client.einsatzrapport_alarmdepesche(
|
||||
lodur_id,
|
||||
os.path.join(TMP_DIR, file_name),
|
||||
)
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
aioeasywebdav==2.4.0
|
||||
MechanicalSoup==0.9.0.post4
|
||||
paho-mqtt==1.3.1
|
||||
pdfminer.six==20170720
|
||||
python-dotenv==0.7.1
|
||||
requests==2.18.4
|
||||
requests==2.18.4
|
Loading…
Reference in New Issue