Files
Pivot/blueprints/basisonderwijs_bp.py
2026-10-14 13:34:37 +02:00

68 lines
2.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Basisonderwijs › Bingel: leerlingenlijst uit Informat als Excel voor de import in Bingel."""
import io
from datetime import date
from flask import Blueprint, render_template, request, Response, redirect, url_for, flash
from blueprints.auth import login_required
from rechten import recht_vereist
from services import bingel_service as bs
from tenancy import huidige_school
basisonderwijs_bp = Blueprint('basisonderwijs', __name__)
KOLOMMEN = ['Klas', 'Voornaam', 'Familienaam', 'Wachtwoord', 'Klasnummer', 'Geslacht']
@basisonderwijs_bp.route('/bingel', methods=['GET'])
@login_required
@recht_vereist('bingel')
def bingel():
rijen, voorbeeld, fout, waarschuwing = [], {}, None, None
try:
rijen, voorbeeld, waarschuwing = bs.leerlingen(vernieuw=bool(request.args.get('vernieuw')))
except bs.BingelFout as e:
fout = str(e)
except Exception as e:
fout = f"Leerlingen ophalen uit Informat mislukt: {e}"
if request.args.get('vernieuw'):
return redirect(url_for('basisonderwijs.bingel'))
klassen = sorted({r['klas'] for r in rijen}, key=str.lower)
return render_template('bingel.html', rijen=rijen, klassen=klassen, voorbeeld=voorbeeld, fout=fout, waarschuwing=waarschuwing,
kolommen=KOLOMMEN, school_naam=huidige_school().naam,
zonder_klas=sum(1 for r in rijen if not r['klas']),
zonder_geslacht=sum(1 for r in rijen if r['geslacht'] not in ('M', 'V')))
@basisonderwijs_bp.route('/bingel/export.xlsx', methods=['GET'])
@login_required
@recht_vereist('bingel')
def bingel_export():
from openpyxl import Workbook
from openpyxl.styles import Font
try:
rijen, _, _ = bs.leerlingen()
except Exception as e:
flash(str(e), "error")
return redirect(url_for('basisonderwijs.bingel'))
gekozen = request.args.getlist('klas') # aangevinkte klassen (niets = alle)
if gekozen:
rijen = [r for r in rijen if r['klas'] in gekozen]
klas = gekozen[0] if len(gekozen) == 1 else ''
wb = Workbook()
ws = wb.active
ws.title = 'Leerlingen'
ws.append(KOLOMMEN)
for c in ws[1]:
c.font = Font(bold=True)
for r in rijen:
ws.append([r['klas'], r['voornaam'], r['naam'], '', r['klasnummer'], r['geslacht']])
for kol, breedte in zip('ABCDEF', (12, 18, 22, 14, 11, 10)):
ws.column_dimensions[kol].width = breedte
ws.freeze_panes = 'A2'
buf = io.BytesIO()
wb.save(buf)
deel = ''.join(c if c.isalnum() else '_' for c in klas) + '_' if klas else ''
return Response(buf.getvalue(), mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
headers={'Content-Disposition': f"attachment; filename=Bingel_{huidige_school().code}_{deel}"
f"{date.today():%Y%m%d}.xlsx"})