]> wagnertech.de Git - SVBaL.git/blob - python/eh_app/views.py
Erste Version
[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             anzahl, gesamtbetrag = routines.pdfs_erstellen(request, verein, mitglieder, vorlage, data_path, build_name)
281             response = HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief/erfolg')
282             response.set_cookie("build_name", build_name)
283             response.set_cookie("anzahl", anzahl)
284             response.set_cookie("gesamtbetrag", gesamtbetrag)
285             return response
286         else:
287             return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
288         
289     else:
290         tpl_name_wo_ext = os.path.splitext(vorlage)[0]
291         return render(request, 'kassenbrief_zusammenfassung.html', {
292             'verein'        : verein,
293             'datenquelle'   : datenquelle,
294             'vorlage'       : tpl_name_wo_ext,
295             'basisbeitrag'  : beitrag_basis,
296             'zusatzbeitrag' : beitrag_zusatz,
297             'miglieder'     : mitglieder        })
298
299 @login_required(login_url=LOGIN_URL)
300 def kassenbrief_erfolg(request, verein):
301     return render(request, 'kassenbrief_erfolg.html', {
302             'verein'       : verein,
303             'anzahl'       : request.COOKIES.get('anzahl'),
304             'gesamtbetrag' : request.COOKIES.get('gesamtbetrag'),
305         })
306
307 @login_required(login_url=LOGIN_URL)
308 def kassenbrief_download(request, verein):
309     vconf = config.getInstance(verein)
310     data_path  = vconf.getConfig("data_path", "/var/ehapp")
311     build_name = request.COOKIES.get('build_name')
312     
313     ergebnis_datei = os.path.join(data_path, "build", build_name, "ergebnis.tgz")
314
315     response = FileResponse(open(ergebnis_datei, 'rb'), as_attachment=True, filename=f"{build_name}.tgz")
316     return response
317
318 @login_required(login_url=LOGIN_URL)
319 def ehmeldung(request, verein):
320     # if this is a POST request we need to process the form data
321     if request.method == 'POST':
322         # create a form instance and populate it with data from the request:
323         form = EhmeldungForm(request.POST, request.FILES)
324         # check whether it's valid:
325         if form.is_valid():
326             # bei Änderungen Konfiguration aktualisieren
327             routines.erstelle_ehmeldung(form.cleaned_data)
328             routines.erstelle_ausweis(form.cleaned_data)
329             # redirect to a new URL:
330             return HttpResponseRedirect('/thanks/')
331
332     # if a GET (or any other method) we'll create a blank form
333     else:
334         form = EhmeldungForm()
335
336     return render(request, 'ehmeldung.html', {'form': form, 'verein': verein})
337
338 @login_required(login_url=LOGIN_URL)
339 def vertragsliste(request, verein):
340     vconf = config.getInstance(verein)
341     data_path  = vconf.getConfig("data_path", "/var/ehapp")
342     ergebnis_datei = routines.vertragsliste_erstellen(verein, data_path)
343     response = FileResponse(open(os.path.join(data_path, "build",ergebnis_datei), 'rb'), as_attachment=True, filename=ergebnis_datei)
344     return response
345
346 def index(request, verein):
347     if request.user.is_authenticated:
348         print("index login ok")
349     else:
350         print("index not logged in")
351
352     datenquelle = config.getInstance(verein).getConfig("datenquelle")
353
354     template = loader.get_template('eh_app.html')
355     response = HttpResponse(template.render(
356         {"verein"      : verein,
357          "verein_name" : verein,
358          "datenquelle" : datenquelle,
359         }, request))
360     return response    
361
362 def login(request):
363     from django.contrib import auth
364     from .forms import LoginForm
365
366     fehlertext = ""
367     # if this is a POST request we need to process the form data
368     if request.method == 'POST':
369         # create a form instance and populate it with data from the request:
370         form = LoginForm(request.POST, request.FILES)
371         # check whether it's valid:
372         if form.is_valid():
373             user = auth.authenticate(
374                 username = request.POST["name"], 
375                 password = request.POST["password"],
376             )
377             verein = request.POST["verein"]
378         if user is not None:
379             
380             # check group
381             for group in user.groups.all():
382                 if group.name == verein:
383                     auth.login(request, user)
384                     if request.user.is_authenticated:
385                         print("auth login ok")
386                     else:
387                         print("auth not logged in")
388                     next = request.POST.get("next", None)
389                     if next:
390                         return HttpResponseRedirect(next)
391                     else:
392                         return HttpResponseRedirect(f'/eh-app/{verein}')
393         # login fehlgeschlagen
394         fehlertext = "Login fehlgeschlagen"
395
396     # if a GET (or any other method) we'll create a blank form
397     else:
398         next   = None
399         verein = ""
400         next = request.GET.get("next", None)
401         if next:
402             path_elems = next.split("/")
403             verein = path_elems[2]
404         form = LoginForm(initial={'next': next, 'verein': verein})
405
406     return render(request, 'login.html', {'form': form, 'fehlertext': fehlertext})
407