101 lines
3.1 KiB
Python
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)
|