Files
Pivot/blueprints/google_licenties_bp.py
T
2026-10-14 12:29:29 +02:00

96 lines
3.7 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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}'})