PIVOT 1.1.0
This commit is contained in:
commit
8a53234eb6
161 files changed
+31109
No files matched your search
@@ -0,0 +1,135 @@
|
||||
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'))
|
||||
Reference in new issue
Block a user