Merge pull request 'mijn eerste aanpassing' (#2) from import_eigendom into main

Reviewed-on: #2
This commit was merged in pull request #2.
This commit is contained in:
marijn committed 2026-10-14 13:28:05 +00:00
commit a85eff883e
7 files changed
+691 -3

No files matched your search

+86
View File
@@ -6,6 +6,8 @@ Toestellen:
GET /beheer/database/toestellen/sjabloon.xlsx → sjabloon downloaden
POST /beheer/database/toestellen/controleren → Excel lezen en voorbeeld tonen (niets bewaard)
POST /beheer/database/toestellen/importeren → bevestigen: het voorbeeld uitvoeren
Eigendom (toekenningen toestel ↔ leerling): dezelfde vier routes onder /beheer/database/eigendom
"""
import json
@@ -14,6 +16,7 @@ from flask import Blueprint, render_template, request, Response, redirect, url_f
from blueprints.auth import login_required
from database import execute_query
from rechten import recht_vereist, log
from services import eigendom_import as ei
from services import toestellen_import as ti
from tenancy import huidige_school
@@ -98,3 +101,86 @@ def toestellen_importeren():
if t['fout']:
flash(f"{t['fout']} rij(en) met een fout werden overgeslagen.", "warning")
return terug
# ---------------------------------------------------------------------------
# Eigendom
# ---------------------------------------------------------------------------
@database_bp.route('/eigendom', methods=['GET'])
@login_required
@recht_vereist('database_eigendom')
def eigendom():
try:
aantal = execute_query("SELECT COUNT(*) AS n FROM Eigendom WHERE Datum_inlevering IS NULL")[0]['n']
except Exception:
aantal = None
return render_template('database_eigendom.html', plan=None, aantal=aantal, kolommen=ei.KOLOMMEN,
max_rijen=ei.MAX_RIJEN)
@database_bp.route('/eigendom/sjabloon.xlsx', methods=['GET'])
@login_required
@recht_vereist('database_eigendom')
def eigendom_sjabloon():
school = huidige_school()
data = ei.maak_sjabloon(school.naam)
return Response(data, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
headers={'Content-Disposition': f"attachment; filename=Sjabloon_eigendom_{school.code}.xlsx"})
@database_bp.route('/eigendom/controleren', methods=['POST'])
@login_required
@recht_vereist('database_eigendom')
def eigendom_controleren():
terug = redirect(url_for('database_beheer.eigendom'))
bestand = request.files.get('bestand')
if not bestand or not bestand.filename:
flash("Kies eerst een Excel-bestand.", "error")
return terug
if not bestand.filename.lower().endswith(('.xlsx', '.xlsm')):
flash("Enkel Excel-bestanden (.xlsx) kunnen ingelezen worden. Sla een .xls of .csv eerst op als .xlsx.", "error")
return terug
modus = 'overschrijven' if request.form.get('modus') == 'overschrijven' else 'aanvullen'
try:
rijen, onbekend = ei.lees_excel(bestand)
except ei.ImportFout as e:
flash(str(e), "error")
return terug
if not rijen:
flash("Het bestand bevat geen toekenningen (enkel kolomkoppen of lege rijen).", "warning")
return terug
try:
plan = ei.maak_plan(rijen, modus)
except Exception as e:
flash(f"Controleren mislukt: {e}", "error")
return terug
return render_template('database_eigendom.html', plan=plan, bestandsnaam=bestand.filename, onbekend=onbekend,
rijen_json=json.dumps(rijen, ensure_ascii=False), kolommen=ei.KOLOMMEN,
max_rijen=ei.MAX_RIJEN, aantal=None)
@database_bp.route('/eigendom/importeren', methods=['POST'])
@login_required
@recht_vereist('database_eigendom')
def eigendom_importeren():
terug = redirect(url_for('database_beheer.eigendom'))
modus = 'overschrijven' if request.form.get('modus') == 'overschrijven' else 'aanvullen'
try:
rijen = json.loads(request.form.get('rijen') or '[]')
if not isinstance(rijen, list) or len(rijen) > ei.MAX_RIJEN or not all(isinstance(r, dict) for r in rijen):
raise ValueError
except ValueError:
flash("De gegevens van het voorbeeld zijn ongeldig. Upload het bestand opnieuw.", "error")
return terug
try:
plan, nieuw, bijgewerkt = ei.voer_uit(rijen, modus, session.get('user'))
except Exception as e:
flash(f"Importeren mislukt, er is niets bewaard: {e}", "error")
return terug
t = plan['tellers']
log(f"Eigendom geïmporteerd uit Excel: {nieuw} nieuw, {bijgewerkt} bijgewerkt ({modus})")
ongewijzigd = f", {t['ongewijzigd']} ongewijzigd" if t['ongewijzigd'] else ""
flash(f"Import klaar: {nieuw} toekenning(en) toegevoegd, {bijgewerkt} bijgewerkt{ongewijzigd}.", "success")
if t['fout']:
flash(f"{t['fout']} rij(en) met een fout werden overgeslagen.", "warning")
return terug