135 lines
5.4 KiB
Python
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')) |