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'))