nuta_2023_samples/h1wsutils.py
2023-05-30 10:47:48 +02:00

101 lines
3.1 KiB
Python

# -*- coding: utf-8 -*-
#
# @author Dr. Wolfgang Wiedermann
#
# Webservice-Handling für HISinOne
#
# Abhängigkeiten:
# * zeep (pip install zeep oder python -m pip install zeep)
#
# Doku der HIS zu Webservices im Bereich Bewerbung:
# * https://wiki.his.de/mediawiki/index.php/APP-Webservices-HISinOne
#
class H1WebServiceUtils:
#
# Attribute
#
user = None
password = None
host = "localhost"
wsdl_folder = "wsdl"
service_names = []
proxies = {}
#
# Konstruktor
#
def __init__(self, user, password, host, wsdl_folder, services):
self.user = user
self.password = password
self.host = host
self.wsdl_folder = wsdl_folder
self.service_names = services
#
# Einzelne WSDL laden und relevante Teile ersetzen
#
def __download_wsdl(self, wsdl):
global HOST
import urllib.request
import re
txt = ""
new_file = "{0}/{1}.wsdl".format(self.wsdl_folder, wsdl)
urllib.request.urlretrieve("https://{0}.kdv-fh-bayern.de/qisserver/services2/{1}?wsdl".format(self.host, wsdl), new_file)
with open(new_file) as f:
txt = f.read()
txt = re.sub(r"http://[^/]+:8080/", ("https://{0}.kdv-fh-bayern.de/".format(self.host)), txt)
txt = re.sub(r"https://[^/]+:8443/", ("https://{0}.kdv-fh-bayern.de/".format(self.host)), txt)
txt = re.sub(r"http://localhost/", ("https://{0}.kdv-fh-bayern.de/".format(self.host)), txt)
with open(new_file, "w+") as f:
f.write(txt)
#
# WSDL-Beschreibung von HISinOne laden
#
def download_wsdls(self):
import os
# Falls nötig, Ordner für WSDL-Dateien anlegen
if not os.path.isdir(self.wsdl_folder):
os.makedirs(self.wsdl_folder)
# Falls nötig, WSDL-Dateien laden
for service in self.service_names:
if not os.path.isfile("{0}/{1}.wsdl".format(self.wsdl_folder, service)):
self.__download_wsdl(service)
#
# Proxy für einzelnen Service laden
#
def get_proxy(self, service):
from zeep import Client
from zeep.wsse.username import UsernameToken
if service not in self.proxies.keys():
svc = Client("./{0}/{1}.wsdl".format(self.wsdl_folder, service), wsse=UsernameToken(self.user, self.password))
self.proxies[service] = svc
return self.proxies[service]
#
# Typ aus WSDL-Definition laden
#
def get_type(self, service, typename):
return self.proxies[service].get_type("ns0:{0}".format(typename))
#
# Passwort ermitteln (entweder erfragen oder aus Passwort-Save)
#
def get_password(appname, username):
import getpass
import keyring
# Passwort sinnvoll behandeln!
if keyring.get_password(appname, username) is None:
print("Bitte geben Sie das Passwort für den Benutzer {0} an.".format(username))
p = getpass.getpass()
keyring.set_password(appname, username, p)
return keyring.get_password(appname, username)