96 lines
3.7 KiB
Python
96 lines
3.7 KiB
Python
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}'})
|