Files
Pivot/services/smartschool_api.py
T
2026-10-14 13:34:37 +02:00

122 lines
5.3 KiB
Python

import zeep
import json
class SmartschoolService:
def __init__(self, platform, webservice_pwd):
#-----------------------------------
clean_platform = platform.replace("https://", "").replace("http://", "").split('/')[0]
self.platform = clean_platform
#------------------------------
#self.platform = platform
self.webservice_pwd = webservice_pwd
self.wsdl_url = f"https://{self.platform}/Webservices/V3?wsdl"
self.client = zeep.Client(wsdl=self.wsdl_url)
def get_student_details(self, search_term):
"""Zoekt een student op basis van internnummer of gebruikersnaam."""
try:
# Poging 1: Via internnummer
raw_result = self.client.service.getUserDetails(self.webservice_pwd, search_term)
if raw_result and isinstance(raw_result, str) and raw_result.startswith('{'):
return json.loads(raw_result)
# Poging 2: Via gebruikersnaam
raw_result_alt = self.client.service.getUserDetailsByUsername(self.webservice_pwd, search_term)
if raw_result_alt and isinstance(raw_result_alt, str) and raw_result_alt.startswith('{'):
return json.loads(raw_result_alt)
return None
except Exception as e:
print(f"Service Error (GetDetails): {e}")
return None
def get_co_accounts_from_details(self, username):
"""Haalt co-accounts op en onthoudt hun index (1-6) voor wachtwoordresets."""
try:
raw_result = self.client.service.getUserDetailsByUsername(self.webservice_pwd, username)
if raw_result and isinstance(raw_result, str) and raw_result.startswith('{'):
data = json.loads(raw_result)
co_accounts = []
for i in range(1, 7):
voornaam = data.get(f"voornaam_coaccount{i}")
if voornaam:
co_accounts.append({
"voornaam": voornaam,
"naam": data.get(f"naam_coaccount{i}", ""),
"type": data.get(f"type_coaccount{i}", "Co-account"),
"index": i, # Belangrijk voor savePassword
"parent_internnummer": data.get("internnummer") # Nodig voor de reset actie
})
return co_accounts
return []
except Exception as e:
print(f"Service Error (Co-Accounts): {e}")
return []
def reset_password(self, identifier, new_password, account_type=0):
"""
account_type: 0 voor leerling, 1-6 voor co-accounts.
"""
try:
# Gebruik de parameters uit je werkende voorbeeld
result_code = self.client.service.savePassword(
self.webservice_pwd,
identifier,
new_password,
account_type,
0
)
return str(result_code)
except Exception as e:
print(f"Service Error (ResetPassword): {e}")
return "ERROR"
def get_co_accounts_with_login(self, username):
"""Haalt co-accounts op met de exacte velden uit de Smartschool JSON."""
try:
# Gebruik de bestaande methode om de JSON op te halen
raw_result = self.client.service.getUserDetailsByUsername(self.webservice_pwd, username)
if raw_result and isinstance(raw_result, str) and raw_result.startswith('{'):
data = json.loads(raw_result)
co_accounts = []
# Smartschool ondersteunt tot 6 co-accounts
for i in range(1, 7):
voornaam = data.get(f"voornaam_coaccount{i}")
# Alleen toevoegen als er daadwerkelijk een voornaam is ingevuld (account bestaat)
if voornaam and voornaam.strip() != "":
# Gebruik het specifieke veld uit jouw JSON voorbeeld
last_login = data.get(f"last_successful_login_coaccount{i}")
co_accounts.append({
"voornaam": voornaam,
"naam": data.get(f"naam_coaccount{i}", ""),
"type": data.get(f"type_coaccount{i}", "Onbekend"),
"last_login": last_login if last_login else "Nooit ingelogd",
"email": data.get(f"email_coaccount{i}", ""),
"index": i
})
return co_accounts
return []
except Exception as e:
print(f"Fout bij ophalen co-account status: {e}")
return []
def get_coaccount_report(self, search_query):
"""
Bundelt alle logica: zoekt student, formatteert naam en haalt co-accounts op.
Geeft een tuple terug: (student_naam, resultaten_lijst)
"""
student_data = self.get_student_details(search_query)
if not student_data:
return None, []
student_name = f"{student_data.get('voornaam')} {student_data.get('naam')}"
username = student_data.get('gebruikersnaam')
results = self.get_co_accounts_with_login(username)
return student_name, results