+import os,sys
+
+from django.contrib.auth.decorators import login_required
+from django.http import HttpResponse, HttpResponseRedirect, FileResponse
+from django.shortcuts import render
+from django.template import loader
+
+from .AWK import config, routines, util
+#import .forms
+from .forms import (
+ EhmeldungForm,
+ VorlagenForm,
+ BeitragForm,
+ VorlagenVerwaltungForm,
+ MitgliederForm,
+ MitgliederAuswahlForm,
+ DatenfileVerwaltungForm )
+from eh_app.AWK.pdf_ersteller import PdfErsteller
+
+from mysite import settings
+import time
+
+# Create your views here.
+
+# change working dir due to relative paths in scripts
+os.chdir(settings.BASE_DIR)
+
+try:
+ home = os.environ["HOME"]
+ if os.path.exists(f"{home}/.eclipse/org.eclipse.platform_4.18.0_1473617060_linux_gtk_x86_64/plugins/org.python.pydev.core_8.3.0.202104101217/pysrc/"):
+ # its a eclipse development environment
+ sys.path.append(f"{home}/.eclipse/org.eclipse.platform_4.18.0_1473617060_linux_gtk_x86_64/plugins/org.python.pydev.core_8.3.0.202104101217/pysrc/")
+ import pydevd
+ pydevd.settrace()
+
+except:
+ pass
+
+LOGIN_URL = "/eh-app/login"
+
+def erstelle_datenquelle_liste(data_path):
+ dirlist = None
+ vorlagen_liste = []
+ if os.path.isdir(data_path):
+ dirlist = os.listdir(data_path) # returns list
+ if dirlist:
+ for t in dirlist:
+ vorlagen_liste.append((t,t))
+ return vorlagen_liste
+
+def erstelle_vorlagen_liste(verein):
+ # Erstelle Vorlagenliste
+ os.chdir(settings.BASE_DIR)
+ dirlist = os.listdir()
+ util.schreibe_log(str(dirlist))
+ dirlist = None
+ vorlagen_liste = []
+ if os.path.isdir("eh_app/templates/"+verein):
+ dirlist = os.listdir("eh_app/templates/"+verein) # returns list
+ if dirlist:
+ for t in dirlist:
+ tpl_name_wo_ext = os.path.splitext(t)[0]
+ vorlagen_liste.append((t,tpl_name_wo_ext))
+ return vorlagen_liste
+
+@login_required(login_url=LOGIN_URL)
+def vorlagen_verwalten(request, verein):
+ vorlagen_liste = erstelle_vorlagen_liste(verein)
+
+ if request.method == 'POST':
+ # Form auswerten
+ form = VorlagenVerwaltungForm(request.POST, request.FILES, vorlagen=vorlagen_liste)
+ if form.is_valid():
+ zu_loschen = form.cleaned_data['vorlagen_zu_loschen']
+ zu_install = request.FILES.get('vorlage_neu', None)
+ routines.vorlagen_verwalten(verein, zu_loschen, zu_install)
+ else:
+ raise RuntimeError(f"Form not valid: {form.errors}")
+ # Verarbeitung in routines.py aufrufen
+
+ # Wenn alles gut gegangen, zurück zum Kassenbrief
+ return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
+ else:
+ vorlagen_form = VorlagenVerwaltungForm(vorlagen=vorlagen_liste)
+
+ template = loader.get_template("vorlagen_verwalten.html")
+ return HttpResponse(template.render(
+ {
+ "verein" : verein,
+ "vorlagen_form" : vorlagen_form },
+ request))
+
+@login_required(login_url=LOGIN_URL)
+def datenquelle_andern(request, verein):
+ cf = config.getInstance(verein)
+ data_path = cf.requireConfig("data_path")
+ ehappdir = cf.getConfig("ehappdir", "/opt/eh_app")
+ vereinchecker = f"{ehappdir}/bin/ehapp-verein-check.sh"
+ if not os.path.exists(vereinchecker):
+ raise RuntimeError("ehapp-verein-check.sh nicht gefunden: "+vereinchecker)
+
+ rc = os.system(f'{vereinchecker} {data_path}')
+ if rc != 0:
+ raise RuntimeError(f"ehapp-verein-check.sh fehlgeschlagen: {rc}")
+ quellen_path = os.path.join(data_path, "quellen")
+ datenquellen_liste = erstelle_datenquelle_liste(quellen_path)
+
+ if request.method == 'POST':
+ # Form auswerten
+ form = DatenfileVerwaltungForm(
+ request.POST,
+ request.FILES,
+ datenquellen=datenquellen_liste)
+ if form.is_valid():
+ zu_loschen = form.cleaned_data['dateien_zu_loschen']
+ zu_verwenden = form.cleaned_data['datei_verwendung']
+ zu_install = request.FILES.get('datei_neu', None)
+ routines.datenquelle_andern(verein, quellen_path, zu_loschen, zu_verwenden, zu_install)
+ else:
+ raise RuntimeError(f"Form not valid: {form.errors}")
+ # Verarbeitung in routines.py aufrufen
+
+ # Wenn alles gut gegangen, zurück zum Kassenbrief
+ letzte_seite = request.POST.get("letzte_seite")
+ return HttpResponseRedirect(f'/eh-app/{verein}/{letzte_seite}')
+ else:
+ form = DatenfileVerwaltungForm(datenquellen=datenquellen_liste)
+
+ letzte_seite = request.GET.get("letzte_seite") or ""
+ template = loader.get_template("datenquelle_andern.html")
+ return HttpResponse(template.render(
+ {
+ "verein" : verein,
+ "datenquelle_form" : form,
+ "letzte_seite" : letzte_seite },
+ request))
+
+@login_required(login_url=LOGIN_URL)
+def mitglieder_auswahlen(request, verein):
+ mitglieder = (request.COOKIES.get('mausw2') or "").split(",")
+ config.getInstance(verein) # wird in qmodel gebraucht
+ from eh_app.qmodels import Mitglied
+ mm = Mitglied.objects.all()
+ mitglieder_liste = []
+ for m in mm:
+ mitglieder_liste.append((m.mitgliedsnr, m.nachname+" "+m.vorname))
+
+ if request.method == 'POST':
+ # Form auswerten
+ form = MitgliederAuswahlForm(
+ request.POST,
+ request.FILES,
+ mitglieder=mitglieder_liste)
+ if form.is_valid():
+ mg_ausw = form.cleaned_data['mg_auswahl']
+ else:
+ raise RuntimeError(f"Form not valid: {form.errors}")
+
+ # Wenn alles gut gegangen, zurück zum Kassenbrief
+ response = HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
+ mg_ausw_str = ",".join(mg_ausw)
+ response.set_cookie("mausw2", mg_ausw_str)
+ return response
+ else:
+ mausw_form = MitgliederAuswahlForm(mitglieder=mitglieder_liste, initial={"mg_auswahl":mitglieder})
+
+ template = loader.get_template("mitglieder_auswahlen.html")
+ return HttpResponse(template.render(
+ {
+ "verein" : verein,
+ "mausw_form" : mausw_form },
+ request))
+
+@login_required(login_url=LOGIN_URL)
+def kassenbrief(request, verein):
+ '''
+ GET:
+ Diese Methode liest aus der Config die Einstellungen und zeigt sie an.
+
+ POST:
+ Diese Methode lädt die Zusammenfassung
+
+ ---------------------------------------------------------------
+ Templateauswahl
+
+ Ausgewähltes Template: <Wert aus Config>
+ Link -> Neue Templates installieren
+ ---------------------------------------------------------------
+ '''
+
+ mg_ausw = request.COOKIES.get('mausw1') or "leer"
+ mg_zul = request.COOKIES.get('mausw2') or "leer"
+ alles_ok = True
+ fehlertext_quelle = ""
+ fehlertext_vorlage = ""
+ fehlertext_beitrag = ""
+ vconf = config.getInstance(verein)
+ datenquelle = vconf.getConfig("datenquelle")
+ beitrag_basis = vconf.getConfig("beitrag_basis", 0)
+ beitrag_zusatz = vconf.getConfig("beitrag_zusatz", 0)
+ vorlagen_liste = erstelle_vorlagen_liste(verein)
+ vorlage = vconf.getConfig("vorlage", "")
+ mausw_form = MitgliederForm(
+ zul=mg_zul,
+ initial={"mg_auswahl" : mg_ausw,}
+ )
+ if request.method == 'POST':
+ # Prüfe Datenquelle
+ if not datenquelle:
+ fehlertext_quelle = "Datenquelle auswählen"
+ alles_ok = False
+
+ # Prüfe Vorlage
+ vorlagen_form = VorlagenForm(request.POST, request.FILES, templates=vorlagen_liste)
+ if not vorlagen_form.is_valid():
+ raise RuntimeError("VorlagenForm invalid: "+str(vorlagen_form.errors))
+ vorlage = vorlagen_form.cleaned_data["vorlagen"]
+ if not vorlage:
+ fehlertext_vorlage = "Bitte Kassenbriefvorlage auswählen"
+ alles_ok = False
+
+ # Prüfe Beiträge
+ beitrag_form = BeitragForm(request.POST, request.FILES)
+ if not beitrag_form.is_valid():
+ raise RuntimeError("BeitragForm invalid: Formular nochmal schicken")
+ beitrag_basis = beitrag_form.cleaned_data["basisbeitrag"]
+ beitrag_zusatz = beitrag_form.cleaned_data["zusatzbeitrag"]
+ if beitrag_basis == 0 or beitrag_zusatz == 0:
+ fehlertext_beitrag = "Beiträge ausfüllen"
+ alles_ok = False
+
+ routines.aktualisiere_config(vconf, vorlage, beitrag_form.cleaned_data)
+
+ # Speichere Migliederauswahl in Cookie
+ mausw_form = MitgliederForm(request.POST, request.FILES)
+ if not mausw_form.is_valid():
+ raise RuntimeError("MitgliederForm invalid: "+str(mausw_form.errors))
+ mausw = mausw_form.cleaned_data["mg_auswahl"]
+
+
+ if alles_ok:
+ response = HttpResponseRedirect('zusammenfassung')
+ response.set_cookie("mausw1", mausw)
+ return response
+
+ # GET request / POST mit Fehlern
+ vorlagen_form = VorlagenForm(
+ templates=vorlagen_liste,
+ initial={'vorlagen' : vorlage } )
+ beitrag_form = BeitragForm(
+ initial={
+ "basisbeitrag" : beitrag_basis,
+ "zusatzbeitrag" : beitrag_zusatz,
+ })
+ return render(request, 'kassenbrief.html', {
+ "datenquelle" : datenquelle or "Keine Datenquelle ausgewählt",
+ 'vorlagen_form': vorlagen_form,
+ 'beitrag_form' : beitrag_form,
+ 'mausw_form' : mausw_form,
+ 'verein' : verein,
+ 'fehler_quelle': fehlertext_quelle
+ })
+
+@login_required(login_url=LOGIN_URL)
+def kassenbrief_zusammenfassung(request, verein):
+ vconf = config.getInstance(verein)
+ datenquelle = vconf.getConfig("datenquelle")
+ beitrag_basis = vconf.getConfig("beitrag_basis", 0)
+ beitrag_zusatz = vconf.getConfig("beitrag_zusatz", 0)
+ vorlage = vconf.getConfig("vorlage")
+ mitglieder = request.COOKIES.get('mausw1')
+ if mitglieder == "zul":
+ mitglieder = request.COOKIES.get('mausw2')
+ if request.method == 'POST':
+ post = request.POST
+ if "erstellen" in post:
+ data_path = vconf.getConfig("data_path", "/var/ehapp")
+ build_name = time.strftime("%Y%m%d%H%M%S", time.localtime())
+
+ anzahl, gesamtbetrag = routines.pdfs_erstellen(request, verein, mitglieder, vorlage, data_path, build_name)
+ response = HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief/erfolg')
+ response.set_cookie("build_name", build_name)
+ response.set_cookie("anzahl", anzahl)
+ response.set_cookie("gesamtbetrag", gesamtbetrag)
+ return response
+ else:
+ return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
+
+ else:
+ tpl_name_wo_ext = os.path.splitext(vorlage)[0]
+ return render(request, 'kassenbrief_zusammenfassung.html', {
+ 'verein' : verein,
+ 'datenquelle' : datenquelle,
+ 'vorlage' : tpl_name_wo_ext,
+ 'basisbeitrag' : beitrag_basis,
+ 'zusatzbeitrag' : beitrag_zusatz,
+ 'miglieder' : mitglieder })
+
+@login_required(login_url=LOGIN_URL)
+def kassenbrief_erfolg(request, verein):
+ return render(request, 'kassenbrief_erfolg.html', {
+ 'verein' : verein,
+ 'anzahl' : request.COOKIES.get('anzahl'),
+ 'gesamtbetrag' : request.COOKIES.get('gesamtbetrag'),
+ })
+
+@login_required(login_url=LOGIN_URL)
+def kassenbrief_download(request, verein):
+ vconf = config.getInstance(verein)
+ data_path = vconf.getConfig("data_path", "/var/ehapp")
+ build_name = request.COOKIES.get('build_name')
+
+ ergebnis_datei = os.path.join(data_path, "build", build_name, "ergebnis.tgz")
+
+ response = FileResponse(open(ergebnis_datei, 'rb'), as_attachment=True, filename=f"{build_name}.tgz")
+ return response
+
+@login_required(login_url=LOGIN_URL)
+def ehmeldung(request, verein):
+ # if this is a POST request we need to process the form data
+ if request.method == 'POST':
+ # create a form instance and populate it with data from the request:
+ form = EhmeldungForm(request.POST, request.FILES)
+ # check whether it's valid:
+ if form.is_valid():
+ # bei Änderungen Konfiguration aktualisieren
+ routines.erstelle_ehmeldung(form.cleaned_data)
+ routines.erstelle_ausweis(form.cleaned_data)
+ # redirect to a new URL:
+ return HttpResponseRedirect('/thanks/')
+
+ # if a GET (or any other method) we'll create a blank form
+ else:
+ form = EhmeldungForm()
+
+ return render(request, 'ehmeldung.html', {'form': form, 'verein': verein})
+
+@login_required(login_url=LOGIN_URL)
+def vertragsliste(request, verein):
+ vconf = config.getInstance(verein)
+ data_path = vconf.getConfig("data_path", "/var/ehapp")
+ ergebnis_datei = routines.vertragsliste_erstellen(verein, data_path)
+ response = FileResponse(open(os.path.join(data_path, "build",ergebnis_datei), 'rb'), as_attachment=True, filename=ergebnis_datei)
+ return response
+
+def index(request, verein):
+ if request.user.is_authenticated:
+ print("index login ok")
+ else:
+ print("index not logged in")
+
+ datenquelle = config.getInstance(verein).getConfig("datenquelle")
+
+ template = loader.get_template('eh_app.html')
+ response = HttpResponse(template.render(
+ {"verein" : verein,
+ "verein_name" : verein,
+ "datenquelle" : datenquelle,
+ }, request))
+ return response
+
+def login(request):
+ from django.contrib import auth
+ from .forms import LoginForm
+
+ fehlertext = ""
+ # if this is a POST request we need to process the form data
+ if request.method == 'POST':
+ # create a form instance and populate it with data from the request:
+ form = LoginForm(request.POST, request.FILES)
+ # check whether it's valid:
+ if form.is_valid():
+ user = auth.authenticate(
+ username = request.POST["name"],
+ password = request.POST["password"],
+ )
+ verein = request.POST["verein"]
+ if user is not None:
+
+ # check group
+ for group in user.groups.all():
+ if group.name == verein:
+ auth.login(request, user)
+ if request.user.is_authenticated:
+ print("auth login ok")
+ else:
+ print("auth not logged in")
+ next = request.POST.get("next", None)
+ if next:
+ return HttpResponseRedirect(next)
+ else:
+ return HttpResponseRedirect(f'/eh-app/{verein}')
+ # login fehlgeschlagen
+ fehlertext = "Login fehlgeschlagen"
+
+ # if a GET (or any other method) we'll create a blank form
+ else:
+ next = None
+ verein = ""
+ next = request.GET.get("next", None)
+ if next:
+ path_elems = next.split("/")
+ verein = path_elems[2]
+ form = LoginForm(initial={'next': next, 'verein': verein})
+
+ return render(request, 'login.html', {'form': form, 'fehlertext': fehlertext})
+
\ No newline at end of file