]> wagnertech.de Git - SVBaL.git/blob - python/eh_app/views.py
Fehlerseite für PDF-Erzeugung
[SVBaL.git] / python / eh_app / views.py
1 import os,sys
2
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
7
8 from .AWK import config, routines, util
9 #import .forms 
10 from .forms import (
11     EhmeldungForm, 
12     VorlagenForm, 
13     BeitragForm, 
14     VorlagenVerwaltungForm, 
15     MitgliederForm, 
16     MitgliederAuswahlForm, 
17     DatenfileVerwaltungForm )
18 from eh_app.AWK.pdf_ersteller import PdfErsteller
19
20 from mysite import settings
21 import time
22
23 # Create your views here.
24
25 # change working dir due to relative paths in scripts
26 os.chdir(settings.BASE_DIR)
27
28 try:
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/")
33         import pydevd
34         pydevd.settrace()
35
36 except:
37     pass
38
39 LOGIN_URL = "/eh-app/login"
40
41 def erstelle_datenquelle_liste(data_path):
42     dirlist = None
43     vorlagen_liste = []
44     if os.path.isdir(data_path):
45         dirlist = os.listdir(data_path) # returns list
46     if dirlist:
47         for t in dirlist:
48             vorlagen_liste.append((t,t))
49     return vorlagen_liste
50
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))
56     dirlist = None
57     vorlagen_liste = []
58     if os.path.isdir("eh_app/templates/"+verein):
59         dirlist = os.listdir("eh_app/templates/"+verein) # returns list
60     if dirlist:
61         for t in dirlist:
62             tpl_name_wo_ext = os.path.splitext(t)[0]
63             vorlagen_liste.append((t,tpl_name_wo_ext))
64     return vorlagen_liste
65
66 @login_required(login_url=LOGIN_URL)
67 def vorlagen_verwalten(request, verein):
68     vorlagen_liste = erstelle_vorlagen_liste(verein)
69     
70     if request.method == 'POST':
71         # Form auswerten
72         form = VorlagenVerwaltungForm(request.POST, request.FILES, vorlagen=vorlagen_liste)
73         if form.is_valid():
74             zu_loschen = form.cleaned_data['vorlagen_zu_loschen']
75             zu_install = request.FILES.get('vorlage_neu', None)
76             routines.vorlagen_verwalten(verein, zu_loschen, zu_install)
77         else:
78             raise RuntimeError(f"Form not valid: {form.errors}")
79         # Verarbeitung in routines.py aufrufen
80
81         # Wenn alles gut gegangen, zurück zum Kassenbrief
82         return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
83     else:
84         vorlagen_form = VorlagenVerwaltungForm(vorlagen=vorlagen_liste)
85         
86     template = loader.get_template("vorlagen_verwalten.html")
87     return HttpResponse(template.render(
88         {
89             "verein" : verein, 
90             "vorlagen_form" : vorlagen_form }, 
91         request))
92
93 @login_required(login_url=LOGIN_URL)
94 def datenquelle_andern(request, verein):
95     cf = config.getInstance(verein)
96     data_path = cf.requireConfig("data_path")
97     ehappdir  = cf.getConfig("ehappdir", "/opt/eh_app")
98     vereinchecker = f"{ehappdir}/bin/ehapp-verein-check.sh"
99     if not os.path.exists(vereinchecker):
100         raise RuntimeError("ehapp-verein-check.sh nicht gefunden: "+vereinchecker)
101
102     rc = os.system(f'{vereinchecker} {data_path}')
103     if rc != 0:
104         raise RuntimeError(f"ehapp-verein-check.sh fehlgeschlagen: {rc}")
105     quellen_path = os.path.join(data_path, "quellen")
106     datenquellen_liste = erstelle_datenquelle_liste(quellen_path)
107     
108     if request.method == 'POST':
109         # Form auswerten
110         form = DatenfileVerwaltungForm(
111             request.POST, 
112             request.FILES, 
113             datenquellen=datenquellen_liste)
114         if form.is_valid():
115             zu_loschen   = form.cleaned_data['dateien_zu_loschen']
116             zu_verwenden = form.cleaned_data['datei_verwendung']
117             zu_install   = request.FILES.get('datei_neu', None)
118             routines.datenquelle_andern(verein, quellen_path, zu_loschen, zu_verwenden, zu_install)
119         else:
120             raise RuntimeError(f"Form not valid: {form.errors}")
121         # Verarbeitung in routines.py aufrufen
122
123         # Wenn alles gut gegangen, zurück zum Kassenbrief
124         letzte_seite = request.POST.get("letzte_seite")
125         return HttpResponseRedirect(f'/eh-app/{verein}/{letzte_seite}')
126     else:
127         form = DatenfileVerwaltungForm(datenquellen=datenquellen_liste)
128         
129     letzte_seite = request.GET.get("letzte_seite") or ""
130     template = loader.get_template("datenquelle_andern.html")
131     return HttpResponse(template.render(
132         {
133             "verein"           : verein, 
134             "datenquelle_form" : form,
135             "letzte_seite"     : letzte_seite }, 
136         request))
137
138 @login_required(login_url=LOGIN_URL)
139 def mitglieder_auswahlen(request, verein):
140     mitglieder = (request.COOKIES.get('mausw2') or "").split(",")
141     config.getInstance(verein) # wird in qmodel gebraucht
142     from eh_app.qmodels import Mitglied
143     mm = Mitglied.objects.all()
144     mitglieder_liste = []
145     for m in mm:
146         mitglieder_liste.append((m.mitgliedsnr, m.nachname+" "+m.vorname))
147
148     if request.method == 'POST':
149         # Form auswerten
150         form = MitgliederAuswahlForm(
151             request.POST, 
152             request.FILES, 
153             mitglieder=mitglieder_liste)
154         if form.is_valid():
155             mg_ausw  = form.cleaned_data['mg_auswahl']
156         else:
157             raise RuntimeError(f"Form not valid: {form.errors}")
158         
159         # Wenn alles gut gegangen, zurück zum Kassenbrief
160         response = HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
161         mg_ausw_str = ",".join(mg_ausw)
162         response.set_cookie("mausw2", mg_ausw_str)
163         return response
164     else:
165         mausw_form = MitgliederAuswahlForm(mitglieder=mitglieder_liste, initial={"mg_auswahl":mitglieder})
166         
167     template = loader.get_template("mitglieder_auswahlen.html")
168     return HttpResponse(template.render(
169         {
170             "verein" : verein, 
171             "mausw_form" : mausw_form }, 
172         request))
173
174 @login_required(login_url=LOGIN_URL)
175 def kassenbrief(request, verein):
176     '''
177     GET:
178     Diese Methode liest aus der Config die Einstellungen und zeigt sie an.
179     
180     POST: 
181     Diese Methode lädt die Zusammenfassung
182     
183     ---------------------------------------------------------------
184     Templateauswahl
185     
186     Ausgewähltes Template: <Wert aus Config>
187     Link -> Neue Templates installieren
188     ---------------------------------------------------------------
189     '''
190     
191     mg_ausw = request.COOKIES.get('mausw1') or "leer"
192     mg_zul  = request.COOKIES.get('mausw2') or "leer"
193     alles_ok = True
194     fehlertext_quelle  = ""
195     fehlertext_vorlage = ""
196     fehlertext_beitrag = ""
197     vconf = config.getInstance(verein)
198     datenquelle    = vconf.getConfig("datenquelle")
199     beitrag_basis  = vconf.getConfig("beitrag_basis", 0)
200     beitrag_zusatz = vconf.getConfig("beitrag_zusatz", 0)
201     vorlagen_liste = erstelle_vorlagen_liste(verein)
202     vorlage        = vconf.getConfig("vorlage", "")
203     mausw_form = MitgliederForm(
204         zul=mg_zul,
205         initial={"mg_auswahl"  : mg_ausw,}
206                  )
207     if request.method == 'POST':
208         # Prüfe Datenquelle
209         if not datenquelle:
210             fehlertext_quelle = "Datenquelle auswählen"
211             alles_ok = False
212         
213         # Prüfe Vorlage
214         vorlagen_form = VorlagenForm(request.POST, request.FILES, templates=vorlagen_liste)
215         if not vorlagen_form.is_valid():
216             raise RuntimeError("VorlagenForm invalid: "+str(vorlagen_form.errors))
217         vorlage = vorlagen_form.cleaned_data["vorlagen"]
218         if not vorlage:
219             fehlertext_vorlage = "Bitte Kassenbriefvorlage auswählen"
220             alles_ok = False
221
222         # Prüfe Beiträge
223         beitrag_form = BeitragForm(request.POST, request.FILES)
224         if not beitrag_form.is_valid():
225             raise RuntimeError("BeitragForm invalid: Formular nochmal schicken")
226         beitrag_basis  = beitrag_form.cleaned_data["basisbeitrag"]
227         beitrag_zusatz = beitrag_form.cleaned_data["zusatzbeitrag"]
228         if beitrag_basis == 0 or beitrag_zusatz == 0:
229             fehlertext_beitrag = "Beiträge ausfüllen"
230             alles_ok = False
231
232         routines.aktualisiere_config(vconf, vorlage, beitrag_form.cleaned_data)
233         
234         # Speichere Migliederauswahl in Cookie
235         mausw_form = MitgliederForm(request.POST, request.FILES)
236         if not mausw_form.is_valid():
237             raise RuntimeError("MitgliederForm invalid: "+str(mausw_form.errors))
238         mausw = mausw_form.cleaned_data["mg_auswahl"]
239         
240         
241         if alles_ok:
242             response = HttpResponseRedirect('zusammenfassung')
243             response.set_cookie("mausw1", mausw)
244             return response
245
246     # GET request / POST mit Fehlern
247     vorlagen_form = VorlagenForm(
248         templates=vorlagen_liste,
249         initial={'vorlagen' : vorlage } )
250     beitrag_form = BeitragForm(
251         initial={
252             "basisbeitrag"  : beitrag_basis,
253             "zusatzbeitrag" : beitrag_zusatz,
254     })
255     return render(request, 'kassenbrief.html', {
256         "datenquelle"  : datenquelle or "Keine Datenquelle ausgewählt",
257         'vorlagen_form': vorlagen_form, 
258         'beitrag_form' : beitrag_form, 
259         'mausw_form'   : mausw_form, 
260         'verein'       : verein,
261         'fehler_quelle': fehlertext_quelle
262     })
263
264 @login_required(login_url=LOGIN_URL)
265 def kassenbrief_zusammenfassung(request, verein):
266     vconf = config.getInstance(verein)
267     datenquelle    = vconf.getConfig("datenquelle")
268     beitrag_basis  = vconf.getConfig("beitrag_basis", 0)
269     beitrag_zusatz = vconf.getConfig("beitrag_zusatz", 0)
270     vorlage        = vconf.getConfig("vorlage")
271     mitglieder     = request.COOKIES.get('mausw1')
272     if mitglieder == "zul":
273         mitglieder = request.COOKIES.get('mausw2')
274     if request.method == 'POST':
275         post = request.POST
276         if "erstellen" in post:
277             data_path  = vconf.getConfig("data_path", "/var/ehapp")
278             build_name = time.strftime("%Y%m%d%H%M%S", time.localtime())
279
280             rc, anzahl, gesamtbetrag = routines.pdfs_erstellen(request, verein, mitglieder, vorlage, data_path, build_name)
281             if rc != 0:
282                 return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief/kein_erfolg?rc={rc}')
283             response = HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief/erfolg')
284             response.set_cookie("build_name", build_name)
285             response.set_cookie("anzahl", anzahl)
286             response.set_cookie("gesamtbetrag", gesamtbetrag)
287             return response
288         else:
289             return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
290         
291     else:
292         tpl_name_wo_ext = os.path.splitext(vorlage)[0]
293         return render(request, 'kassenbrief_zusammenfassung.html', {
294             'verein'        : verein,
295             'datenquelle'   : datenquelle,
296             'vorlage'       : tpl_name_wo_ext,
297             'basisbeitrag'  : beitrag_basis,
298             'zusatzbeitrag' : beitrag_zusatz,
299             'miglieder'     : mitglieder        })
300
301 @login_required(login_url=LOGIN_URL)
302 def kassenbrief_erfolg(request, verein):
303     return render(request, 'kassenbrief_erfolg.html', {
304             'verein'       : verein,
305             'anzahl'       : request.COOKIES.get('anzahl'),
306             'gesamtbetrag' : request.COOKIES.get('gesamtbetrag'),
307         })
308
309 def kassenbrief_kein_erfolg(request, verein):
310     rc = request.GET.get("rc", "unknown")
311     return HttpResponse(f"<html><body><h1>Die PDF-Erzeugung schlug fehl</h1><p>Fehlercode: {rc}</p><p>Kontaktieren Sie Ihren Systembetreuer.</p></body></html>")
312
313 @login_required(login_url=LOGIN_URL)
314 def kassenbrief_download(request, verein):
315     vconf = config.getInstance(verein)
316     data_path  = vconf.getConfig("data_path", "/var/ehapp")
317     build_name = request.COOKIES.get('build_name')
318     
319     ergebnis_datei = os.path.join(data_path, "build", build_name, "ergebnis.tgz")
320
321     response = FileResponse(open(ergebnis_datei, 'rb'), as_attachment=True, filename=f"{build_name}.tgz")
322     return response
323
324 @login_required(login_url=LOGIN_URL)
325 def ehmeldung(request, verein):
326     # if this is a POST request we need to process the form data
327     if request.method == 'POST':
328         # create a form instance and populate it with data from the request:
329         form = EhmeldungForm(request.POST, request.FILES)
330         # check whether it's valid:
331         if form.is_valid():
332             # bei Änderungen Konfiguration aktualisieren
333             routines.erstelle_ehmeldung(form.cleaned_data)
334             routines.erstelle_ausweis(form.cleaned_data)
335             # redirect to a new URL:
336             return HttpResponseRedirect('/thanks/')
337
338     # if a GET (or any other method) we'll create a blank form
339     else:
340         form = EhmeldungForm()
341
342     return render(request, 'ehmeldung.html', {'form': form, 'verein': verein})
343
344 @login_required(login_url=LOGIN_URL)
345 def vertragsliste(request, verein):
346     vconf = config.getInstance(verein)
347     data_path  = vconf.getConfig("data_path", "/var/ehapp")
348     ergebnis_datei = routines.vertragsliste_erstellen(verein, data_path)
349     response = FileResponse(open(os.path.join(data_path, "build",ergebnis_datei), 'rb'), as_attachment=True, filename=ergebnis_datei)
350     return response
351
352 def index(request, verein):
353     if request.user.is_authenticated:
354         print("index login ok")
355     else:
356         print("index not logged in")
357
358     datenquelle = config.getInstance(verein).getConfig("datenquelle")
359
360     template = loader.get_template('eh_app.html')
361     response = HttpResponse(template.render(
362         {"verein"      : verein,
363          "verein_name" : verein,
364          "datenquelle" : datenquelle,
365         }, request))
366     return response    
367
368 def login(request):
369     from django.contrib import auth
370     from .forms import LoginForm
371
372     fehlertext = ""
373     # if this is a POST request we need to process the form data
374     if request.method == 'POST':
375         # create a form instance and populate it with data from the request:
376         form = LoginForm(request.POST, request.FILES)
377         # check whether it's valid:
378         if form.is_valid():
379             user = auth.authenticate(
380                 username = request.POST["name"], 
381                 password = request.POST["password"],
382             )
383             verein = request.POST["verein"]
384         if user is not None:
385             
386             # check group
387             for group in user.groups.all():
388                 if group.name == verein:
389                     auth.login(request, user)
390                     if request.user.is_authenticated:
391                         print("auth login ok")
392                     else:
393                         print("auth not logged in")
394                     next = request.POST.get("next", None)
395                     if next:
396                         return HttpResponseRedirect(next)
397                     else:
398                         return HttpResponseRedirect(f'/eh-app/{verein}')
399         # login fehlgeschlagen
400         fehlertext = "Login fehlgeschlagen"
401
402     # if a GET (or any other method) we'll create a blank form
403     else:
404         next   = None
405         verein = ""
406         next = request.GET.get("next", None)
407         if next:
408             path_elems = next.split("/")
409             verein = path_elems[2]
410         form = LoginForm(initial={'next': next, 'verein': verein})
411
412     return render(request, 'login.html', {'form': form, 'fehlertext': fehlertext})
413