68 lines
2.8 KiB
Python
68 lines
2.8 KiB
Python
"""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"})
|