# -*- 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)