Files
Pivot/blueprints/signpost_devices_bp.py
T
2026-10-14 12:29:29 +02:00

135 lines
5.4 KiB
Python

import requests
from flask import Blueprint, render_template, request, flash, redirect, url_for
from database import execute_query
from services import toestellen as tst
from blueprints.auth import login_required
from rechten import recht_vereist
# Importeer de benodigdheden uit je bestaande service-bestand
from services.signpost_byod_service import BASE_DATA_URL, get_signpost_token, signpost_token_met_reden
signpost_devices_bp = Blueprint('signpost_devices', __name__)
def sync_signpost_devices_to_db():
"""
Haalt alle toestellen op via de Signpost-API en voegt toestellen die
nog niet bestaan (op basis van serienummer) toe aan Signpost_database.
"""
token, fout = signpost_token_met_reden()
if not token:
return False, fout
headers = {
"Authorization": f"Bearer {token}",
"Accept": "application/json"
}
page_number = 1
page_size = 100
toegevoegd_teller = 0
overgeslagen_teller = 0
print("Starten met synchroniseren van toestellen naar Signpost_database...")
while True:
params = {
"$top": page_size,
"$skip": (page_number - 1) * page_size
}
url = "https://byod-api.signpost.be/v1/devices"
try:
res = requests.get(url, headers=headers, params=params, timeout=15)
if res.status_code != 200:
print(f"Fout bij pagina {page_number}: {res.status_code}")
return False, f"Signpost API gaf foutcode {res.status_code} op pagina {page_number}."
data = res.json()
items = data.get("items", [])
if not items:
break
for item in items:
signpost_nummer = item.get("signpostLabel")
serienummer = item.get("serialNumber")
model = item.get("modelName")
warranty_void_raw = item.get("warrantyVoidAt")
garantie = warranty_void_raw.split("T")[0] if warranty_void_raw else None
if not serienummer:
continue
# Bestaat het toestel al (op serienummer)? Zo niet: aanmaken in Toestellen.
bestaand = execute_query(
"SELECT t.Toestel_ID, sp.Toestel_ID AS heeft_signpost FROM Toestellen t "
"LEFT JOIN Signpost_DB sp ON sp.Toestel_ID = t.Toestel_ID WHERE t.Serienummer = %s LIMIT 1",
(serienummer,))
if bestaand and bestaand[0]['heeft_signpost']:
overgeslagen_teller += 1
continue
toestel_id = bestaand[0]['Toestel_ID'] if bestaand else tst.nieuw_toestel(
serienummer=serienummer, type_toestel=model)
execute_query(
"INSERT INTO Signpost_DB (Toestel_ID, Signpostnummer, Garantie) VALUES (%s, %s, %s) "
"ON DUPLICATE KEY UPDATE Signpostnummer = VALUES(Signpostnummer), Garantie = VALUES(Garantie)",
(toestel_id, signpost_nummer or None, garantie), commit=True)
toegevoegd_teller += 1
if len(items) < page_size:
break
page_number += 1
except Exception as e:
import traceback
print(f"Fout tijdens database/API sync: {e}")
traceback.print_exc() # Dit print de échte boosdoener in je terminal (bijv. IndexError of MySQL-fout)
return False, f"Er is een fout opgetreden tijdens de synchronisatie: {str(e)}"
return True, f"Synchronisatie voltooid! {toegevoegd_teller} nieuw(e) toestel(len) toegevoegd. {overgeslagen_teller} bestaand(e) toestel(len) overgeslagen."
@signpost_devices_bp.route('/signpost_database', methods=['GET', 'POST'])
@login_required
@recht_vereist('signpost')
def signpost_database_overzicht():
# Komt overeen met jouw methode om de query op te vangen bij GET of POST
query = request.form.get('query') if request.method == 'POST' else request.args.get('query')
# De basis-query aangepast naar de tabel Signpost_database en de gevraagde kolommen
basis_sql = """
SELECT sp.Signpostnummer, t.Serienummer AS Device_serienummer, t.Type AS Device_model, sp.Garantie,
sp.Aankoopbedrag, sp.Aankoopdatum, t.Schooleigen_ID
FROM Signpost_DB sp
JOIN Toestellen t ON t.Toestel_ID = sp.Toestel_ID
"""
if query:
# Als er gezocht wordt, zoeken we veilig op serienummer of signpostnummer
sql = basis_sql + " WHERE t.Serienummer LIKE %s OR sp.Signpostnummer LIKE %s ORDER BY Signpostnummer DESC"
params = (f"%{query}%", f"%{query}%")
results = execute_query(sql, params)
else:
# Als er geen zoekterm is, halen we alles op
sql = basis_sql + " ORDER BY Signpostnummer DESC"
results = execute_query(sql)
# We sturen de resultaten door naar de HTML-pagina
return render_template('signpost_devices.html', results=results, query=query)
@signpost_devices_bp.route('/sync_signpost', methods=['POST'])
@login_required
@recht_vereist('signpost')
def sync_signpost():
# Voer de vernieuwde synchronisatie uit
succes, melding = sync_signpost_devices_to_db()
if succes:
flash(melding, 'success')
else:
flash(melding, 'danger')
# Stuur de gebruiker terug naar het overzicht
return redirect(url_for('signpost_devices.signpost_database_overzicht'))