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}'})