PIVOT 1.1.0

This commit is contained in:
marijn committed 2026-10-14 13:34:37 +02:00
commit 8a53234eb6
161 files changed
+31109

No files matched your search

+95
View File
@@ -0,0 +1,95 @@
import csv
import io
from datetime import datetime
from flask import Blueprint, render_template, request, redirect, url_for, flash, session, Response
from tenancy import huidige_school, per_school
from blueprints.auth import login_required
from rechten import recht_vereist
from services.google_license_service import GoogleLicenseService, SKU_NAMES
google_licenties_bp = Blueprint('google_licenties', __name__)
license_service = per_school(GoogleLicenseService)
# Tabel aanmaken bij de eerste request (niet bij import, zodat de app ook start zonder DB)
_table_ready = set() # scholen waarvoor de tabellen al gecontroleerd zijn
def _ensure_table():
if huidige_school().code not in _table_ready:
try:
license_service.ensure_table()
_table_ready.add(huidige_school().code)
except Exception as e:
flash(f"Kon tabel google_licenties niet aanmaken: {e}", "error")
#---------------------------------------------
# Overzichtspagina
#---------------------------------------------
@google_licenties_bp.route('/', methods=['GET'])
@login_required
@recht_vereist('google_licenties')
def overzicht():
_ensure_table()
data, fout = license_service.get_overview(force=request.args.get('vernieuw') == '1')
if request.args.get('vernieuw') == '1':
return redirect(url_for('google_licenties.overzicht'))
opgehaald = None
if data:
opgehaald = datetime.fromtimestamp(data['opgehaald']).strftime('%d-%m-%Y %H:%M')
return render_template('google_licenties.html', data=data, fout=fout,
opgehaald=opgehaald, sku_names=SKU_NAMES)
#---------------------------------------------
# Aangekochte aantallen opslaan
#---------------------------------------------
@google_licenties_bp.route('/aangekocht', methods=['POST'])
@login_required
@recht_vereist('google_licenties')
def aangekocht_opslaan():
_ensure_table()
gewijzigd = 0
for key, waarde in request.form.items():
if not key.startswith('aangekocht_'):
continue
sku_id = key.replace('aangekocht_', '', 1)
if sku_id not in SKU_NAMES:
continue
waarde = (waarde or '').strip()
if waarde == '':
continue
if not waarde.isdigit():
flash(f"Ongeldig aantal voor {SKU_NAMES[sku_id]}: '{waarde}'", "error")
continue
license_service.set_purchased(sku_id, int(waarde), session.get('user'))
gewijzigd += 1
license_service.clear_cache()
if gewijzigd:
flash("Aangekochte aantallen opgeslagen.", "success")
return redirect(url_for('google_licenties.overzicht'))
#---------------------------------------------
# Export van alle toegewezen licenties
#---------------------------------------------
@google_licenties_bp.route('/export.csv', methods=['GET'])
@login_required
@recht_vereist('google_licenties')
def export_csv():
data, fout = license_service.get_overview()
if fout or not data:
flash(fout or "Geen gegevens om te exporteren.", "error")
return redirect(url_for('google_licenties.overzicht'))
buf = io.StringIO()
w = csv.writer(buf, delimiter=';')
w.writerow(['E-mail', 'Naam', 'Organisatie-eenheid', 'Licentie', 'SKU', 'Geschorst', 'Gearchiveerd', 'Laatste login'])
for u in data['users']:
w.writerow([u['email'], u['naam'], u['ou'], u['sku_naam'], u['sku_id'],
'ja' if u['geschorst'] else 'nee', 'ja' if u['gearchiveerd'] else 'nee', u['laatste_login']])
bestandsnaam = f"google_licenties_{datetime.now():%Y%m%d}.csv"
return Response('' + buf.getvalue(), mimetype='text/csv',
headers={'Content-Disposition': f'attachment; filename={bestandsnaam}'})