3 from django.contrib.auth.decorators import login_required
4 from django.http import HttpResponse, HttpResponseRedirect, FileResponse
5 from django.shortcuts import render
6 from django.template import loader
8 from .AWK import config, routines, util
14 VorlagenVerwaltungForm,
16 MitgliederAuswahlForm,
17 DatenfileVerwaltungForm )
18 from eh_app.AWK.pdf_ersteller import PdfErsteller
20 from mysite import settings
23 # Create your views here.
25 # change working dir due to relative paths in scripts
26 os.chdir(settings.BASE_DIR)
29 home = os.environ["HOME"]
30 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/"):
31 # its a eclipse development environment
32 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/")
39 LOGIN_URL = "/eh-app/login"
41 def erstelle_datenquelle_liste(data_path):
44 if os.path.isdir(data_path):
45 dirlist = os.listdir(data_path) # returns list
48 vorlagen_liste.append((t,t))
51 def erstelle_vorlagen_liste(verein):
52 # Erstelle Vorlagenliste
53 os.chdir(settings.BASE_DIR)
54 dirlist = os.listdir()
55 util.schreibe_log(str(dirlist))
58 if os.path.isdir("eh_app/templates/"+verein):
59 dirlist = os.listdir("eh_app/templates/"+verein) # returns list
62 tpl_name_wo_ext = os.path.splitext(t)[0]
63 vorlagen_liste.append((t,tpl_name_wo_ext))
66 def check(request, verein):
67 # überprüft, ob für den gegebenen Verein alles angelegt ist
69 vconf = config.getInstance(verein)
70 data_path = vconf.getConfig("data_path")
71 check_erg["data_path"] = "ok"
73 data_path = f"auf /var/mysite/eh_app/{verein}"
74 vconf.setConfig("data_path", data_path)
75 check_erg["data_path"] = f"auf /var/mysite/eh_app/{verein} gesetzt"
77 ehappdir = vconf.getConfig("ehappdir", "/opt/eh_app")
78 vereinchecker = f"{ehappdir}/bin/ehapp-verein-check.sh"
79 check_erg["vereinchecker"] = "ok"
80 if not os.path.exists(vereinchecker):
81 check_erg["vereinchecker"] = "ehapp-verein-check.sh nicht gefunden"
83 rc = os.system(f'{vereinchecker} {data_path}')
85 check_erg["vereinchecker"] = f"ehapp-verein-check.sh fehlgeschlagen: {rc}"
87 template = loader.get_template("check.html")
88 return HttpResponse(template.render(
91 "check_erg" : check_erg },
94 @login_required(login_url=LOGIN_URL)
95 def vorlagen_verwalten(request, verein):
96 vorlagen_liste = erstelle_vorlagen_liste(verein)
98 if request.method == 'POST':
100 form = VorlagenVerwaltungForm(request.POST, request.FILES, vorlagen=vorlagen_liste)
102 zu_loschen = form.cleaned_data['vorlagen_zu_loschen']
103 zu_install = request.FILES.get('vorlage_neu', None)
104 routines.vorlagen_verwalten(verein, zu_loschen, zu_install)
106 raise RuntimeError(f"Form not valid: {form.errors}")
107 # Verarbeitung in routines.py aufrufen
109 # Wenn alles gut gegangen, zurück zum Kassenbrief
110 return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
112 vorlagen_form = VorlagenVerwaltungForm(vorlagen=vorlagen_liste)
114 template = loader.get_template("vorlagen_verwalten.html")
115 return HttpResponse(template.render(
118 "vorlagen_form" : vorlagen_form },
121 @login_required(login_url=LOGIN_URL)
122 def datenquelle_andern(request, verein):
123 cf = config.getInstance(verein)
124 data_path = cf.requireConfig("data_path")
125 ehappdir = cf.getConfig("ehappdir", "/opt/eh_app")
126 vereinchecker = f"{ehappdir}/bin/ehapp-verein-check.sh"
127 if not os.path.exists(vereinchecker):
128 raise RuntimeError("ehapp-verein-check.sh nicht gefunden: "+vereinchecker)
130 rc = os.system(f'{vereinchecker} {data_path}')
132 raise RuntimeError(f"ehapp-verein-check.sh fehlgeschlagen: {rc}")
133 quellen_path = os.path.join(data_path, "quellen")
134 datenquellen_liste = erstelle_datenquelle_liste(quellen_path)
136 if request.method == 'POST':
138 form = DatenfileVerwaltungForm(
141 datenquellen=datenquellen_liste)
143 zu_loschen = form.cleaned_data['dateien_zu_loschen']
144 zu_verwenden = form.cleaned_data['datei_verwendung']
145 zu_install = request.FILES.get('datei_neu', None)
146 routines.datenquelle_andern(verein, quellen_path, zu_loschen, zu_verwenden, zu_install)
148 raise RuntimeError(f"Form not valid: {form.errors}")
149 # Verarbeitung in routines.py aufrufen
151 # Wenn alles gut gegangen, zurück zum Kassenbrief
152 letzte_seite = request.POST.get("letzte_seite")
153 return HttpResponseRedirect(f'/eh-app/{verein}/{letzte_seite}')
155 form = DatenfileVerwaltungForm(datenquellen=datenquellen_liste)
157 letzte_seite = request.GET.get("letzte_seite") or ""
158 template = loader.get_template("datenquelle_andern.html")
159 return HttpResponse(template.render(
162 "datenquelle_form" : form,
163 "letzte_seite" : letzte_seite },
166 @login_required(login_url=LOGIN_URL)
167 def mitglieder_auswahlen(request, verein):
168 mitglieder = (request.COOKIES.get('mausw2') or "").split(",")
169 config.getInstance(verein) # wird in qmodel gebraucht
170 from eh_app.qmodels import Mitglied
171 mm = Mitglied.objects.all()
172 mitglieder_liste = []
174 mitglieder_liste.append((m.mitgliedsnr, m.nachname+" "+m.vorname))
176 if request.method == 'POST':
178 form = MitgliederAuswahlForm(
181 mitglieder=mitglieder_liste)
183 mg_ausw = form.cleaned_data['mg_auswahl']
185 raise RuntimeError(f"Form not valid: {form.errors}")
187 # Wenn alles gut gegangen, zurück zum Kassenbrief
188 response = HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
189 mg_ausw_str = ",".join(mg_ausw)
190 response.set_cookie("mausw2", mg_ausw_str)
193 mausw_form = MitgliederAuswahlForm(mitglieder=mitglieder_liste, initial={"mg_auswahl":mitglieder})
195 template = loader.get_template("mitglieder_auswahlen.html")
196 return HttpResponse(template.render(
199 "mausw_form" : mausw_form },
202 @login_required(login_url=LOGIN_URL)
203 def kassenbrief(request, verein):
206 Diese Methode liest aus der Config die Einstellungen und zeigt sie an.
209 Diese Methode lädt die Zusammenfassung
211 ---------------------------------------------------------------
214 Ausgewähltes Template: <Wert aus Config>
215 Link -> Neue Templates installieren
216 ---------------------------------------------------------------
219 mg_ausw = request.COOKIES.get('mausw1') or "leer"
220 mg_zul = request.COOKIES.get('mausw2') or "leer"
222 fehlertext_quelle = ""
223 fehlertext_vorlage = ""
224 fehlertext_beitrag = ""
225 vconf = config.getInstance(verein)
226 datenquelle = vconf.getConfig("datenquelle")
227 beitrag_basis = vconf.getConfig("beitrag_basis", 0)
228 beitrag_zusatz = vconf.getConfig("beitrag_zusatz", 0)
229 vorlagen_liste = erstelle_vorlagen_liste(verein)
230 vorlage = vconf.getConfig("vorlage", "")
231 mausw_form = MitgliederForm(
233 initial={"mg_auswahl" : mg_ausw,}
235 if request.method == 'POST':
238 fehlertext_quelle = "Datenquelle auswählen"
242 vorlagen_form = VorlagenForm(request.POST, request.FILES, templates=vorlagen_liste)
243 if not vorlagen_form.is_valid():
244 raise RuntimeError("VorlagenForm invalid: "+str(vorlagen_form.errors))
245 vorlage = vorlagen_form.cleaned_data["vorlagen"]
247 fehlertext_vorlage = "Bitte Kassenbriefvorlage auswählen"
251 beitrag_form = BeitragForm(request.POST, request.FILES)
252 if not beitrag_form.is_valid():
253 raise RuntimeError("BeitragForm invalid: Formular nochmal schicken")
254 beitrag_basis = beitrag_form.cleaned_data["basisbeitrag"]
255 beitrag_zusatz = beitrag_form.cleaned_data["zusatzbeitrag"]
256 if beitrag_basis == 0 or beitrag_zusatz == 0:
257 fehlertext_beitrag = "Beiträge ausfüllen"
260 routines.aktualisiere_config(vconf, vorlage, beitrag_form.cleaned_data)
262 # Speichere Migliederauswahl in Cookie
263 mausw_form = MitgliederForm(request.POST, request.FILES)
264 if not mausw_form.is_valid():
265 raise RuntimeError("MitgliederForm invalid: "+str(mausw_form.errors))
266 mausw = mausw_form.cleaned_data["mg_auswahl"]
270 response = HttpResponseRedirect('zusammenfassung')
271 response.set_cookie("mausw1", mausw)
274 # GET request / POST mit Fehlern
275 vorlagen_form = VorlagenForm(
276 templates=vorlagen_liste,
277 initial={'vorlagen' : vorlage } )
278 beitrag_form = BeitragForm(
280 "basisbeitrag" : beitrag_basis,
281 "zusatzbeitrag" : beitrag_zusatz,
283 return render(request, 'kassenbrief.html', {
284 "datenquelle" : datenquelle or "Keine Datenquelle ausgewählt",
285 'vorlagen_form': vorlagen_form,
286 'beitrag_form' : beitrag_form,
287 'mausw_form' : mausw_form,
289 'fehler_quelle': fehlertext_quelle
292 @login_required(login_url=LOGIN_URL)
293 def kassenbrief_zusammenfassung(request, verein):
294 vconf = config.getInstance(verein)
295 datenquelle = vconf.getConfig("datenquelle")
296 beitrag_basis = vconf.getConfig("beitrag_basis", 0)
297 beitrag_zusatz = vconf.getConfig("beitrag_zusatz", 0)
298 vorlage = vconf.getConfig("vorlage")
299 mitglieder = request.COOKIES.get('mausw1')
300 if mitglieder == "zul":
301 mitglieder = request.COOKIES.get('mausw2')
302 if request.method == 'POST':
304 if "erstellen" in post:
305 data_path = vconf.getConfig("data_path", "/var/ehapp")
306 build_name = time.strftime("%Y%m%d%H%M%S", time.localtime())
308 rc, anzahl, gesamtbetrag = routines.pdfs_erstellen(request, verein, mitglieder, vorlage, data_path, build_name)
310 return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief/kein_erfolg?rc={rc}')
311 response = HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief/erfolg')
312 response.set_cookie("build_name", build_name)
313 response.set_cookie("anzahl", anzahl)
314 response.set_cookie("gesamtbetrag", gesamtbetrag)
317 return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
320 tpl_name_wo_ext = os.path.splitext(vorlage)[0]
321 return render(request, 'kassenbrief_zusammenfassung.html', {
323 'datenquelle' : datenquelle,
324 'vorlage' : tpl_name_wo_ext,
325 'basisbeitrag' : beitrag_basis,
326 'zusatzbeitrag' : beitrag_zusatz,
327 'miglieder' : mitglieder })
329 @login_required(login_url=LOGIN_URL)
330 def kassenbrief_erfolg(request, verein):
331 return render(request, 'kassenbrief_erfolg.html', {
333 'anzahl' : request.COOKIES.get('anzahl'),
334 'gesamtbetrag' : request.COOKIES.get('gesamtbetrag'),
337 def kassenbrief_kein_erfolg(request, verein):
338 rc = request.GET.get("rc", "unknown")
339 return HttpResponse(f"<html><body><h1>Die PDF-Erzeugung schlug fehl</h1><p>Fehlercode: {rc}</p><p>Kontaktieren Sie Ihren Systembetreuer.</p></body></html>")
341 @login_required(login_url=LOGIN_URL)
342 def kassenbrief_download(request, verein):
343 vconf = config.getInstance(verein)
344 data_path = vconf.getConfig("data_path", "/var/ehapp")
345 build_name = request.COOKIES.get('build_name')
347 ergebnis_datei = os.path.join(data_path, "build", build_name, "ergebnis.tgz")
349 response = FileResponse(open(ergebnis_datei, 'rb'), as_attachment=True, filename=f"{build_name}.tgz")
352 @login_required(login_url=LOGIN_URL)
353 def ehmeldung(request, verein):
354 # if this is a POST request we need to process the form data
355 if request.method == 'POST':
356 # create a form instance and populate it with data from the request:
357 form = EhmeldungForm(request.POST, request.FILES)
358 # check whether it's valid:
360 # bei Änderungen Konfiguration aktualisieren
361 routines.erstelle_ehmeldung(form.cleaned_data, verein)
362 routines.erstelle_ausweis(form.cleaned_data, verein)
363 # redirect to a new URL:
364 return HttpResponseRedirect(f'/eh-app/{verein}/ehmeldung/erfolg')
366 # if a GET (or any other method) we'll create a blank form
368 form = EhmeldungForm()
370 return render(request, 'ehmeldung.html', {'form': form, 'verein': verein})
372 @login_required(login_url=LOGIN_URL)
373 def ehmeldung_erfolg(request, verein):
374 return render(request, 'ehmeldung_erfolg.html', {
378 @login_required(login_url=LOGIN_URL)
379 def ehmeldung_download(request, verein):
380 vconf = config.getInstance(verein)
381 data_path = vconf.requireConfig("data_path")
383 ergebnis_datei = os.path.join(data_path, "build", "meldung.pdf")
385 response = FileResponse(open(ergebnis_datei, 'rb'), as_attachment=True, filename="meldung.pdf")
388 @login_required(login_url=LOGIN_URL)
389 def ausweis_download(request, verein):
390 vconf = config.getInstance(verein)
391 data_path = vconf.requireConfig("data_path")
393 ergebnis_datei = os.path.join(data_path, "build", "ausweis.pdf")
395 response = FileResponse(open(ergebnis_datei, 'rb'), as_attachment=True, filename="ausweis.pdf")
398 @login_required(login_url=LOGIN_URL)
399 def vertragsliste(request, verein):
400 vconf = config.getInstance(verein)
401 data_path = vconf.requireConfig("data_path")
402 ergebnis_datei = routines.vertragsliste_erstellen(verein, data_path)
403 response = FileResponse(open(os.path.join(data_path, "build",ergebnis_datei), 'rb'), as_attachment=True, filename=ergebnis_datei)
406 def index(request, verein):
407 if request.user.is_authenticated:
408 print("index login ok")
410 print("index not logged in")
412 datenquelle = config.getInstance(verein).getConfig("datenquelle")
414 template = loader.get_template('eh_app.html')
415 response = HttpResponse(template.render(
417 "verein_name" : verein,
418 "datenquelle" : datenquelle,
423 from django.contrib import auth
424 from .forms import LoginForm
427 # if this is a POST request we need to process the form data
428 if request.method == 'POST':
429 # create a form instance and populate it with data from the request:
430 form = LoginForm(request.POST, request.FILES)
431 # check whether it's valid:
433 user = auth.authenticate(
434 username = request.POST["name"],
435 password = request.POST["password"],
437 verein = request.POST["verein"]
441 for group in user.groups.all():
442 if group.name == verein:
443 auth.login(request, user)
444 if request.user.is_authenticated:
445 auth.login(request, user)
446 next = request.POST.get("next", None)
448 return HttpResponseRedirect(next)
450 return HttpResponseRedirect(f'/eh-app/{verein}')
451 # login fehlgeschlagen
452 fehlertext = "Login fehlgeschlagen"
454 # if a GET (or any other method) we'll create a blank form
458 next = request.GET.get("next", None)
460 path_elems = next.split("/")
461 verein = path_elems[2]
462 form = LoginForm(initial={'next': next, 'verein': verein})
464 return render(request, 'login.html', {'form': form, 'fehlertext': fehlertext})