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 @login_required(login_url=LOGIN_URL)
67 def vorlagen_verwalten(request, verein):
68 vorlagen_liste = erstelle_vorlagen_liste(verein)
70 if request.method == 'POST':
72 form = VorlagenVerwaltungForm(request.POST, request.FILES, vorlagen=vorlagen_liste)
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)
78 raise RuntimeError(f"Form not valid: {form.errors}")
79 # Verarbeitung in routines.py aufrufen
81 # Wenn alles gut gegangen, zurück zum Kassenbrief
82 return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
84 vorlagen_form = VorlagenVerwaltungForm(vorlagen=vorlagen_liste)
86 template = loader.get_template("vorlagen_verwalten.html")
87 return HttpResponse(template.render(
90 "vorlagen_form" : vorlagen_form },
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)
102 rc = os.system(f'{vereinchecker} {data_path}')
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)
108 if request.method == 'POST':
110 form = DatenfileVerwaltungForm(
113 datenquellen=datenquellen_liste)
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)
120 raise RuntimeError(f"Form not valid: {form.errors}")
121 # Verarbeitung in routines.py aufrufen
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}')
127 form = DatenfileVerwaltungForm(datenquellen=datenquellen_liste)
129 letzte_seite = request.GET.get("letzte_seite") or ""
130 template = loader.get_template("datenquelle_andern.html")
131 return HttpResponse(template.render(
134 "datenquelle_form" : form,
135 "letzte_seite" : letzte_seite },
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 = []
146 mitglieder_liste.append((m.mitgliedsnr, m.nachname+" "+m.vorname))
148 if request.method == 'POST':
150 form = MitgliederAuswahlForm(
153 mitglieder=mitglieder_liste)
155 mg_ausw = form.cleaned_data['mg_auswahl']
157 raise RuntimeError(f"Form not valid: {form.errors}")
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)
165 mausw_form = MitgliederAuswahlForm(mitglieder=mitglieder_liste, initial={"mg_auswahl":mitglieder})
167 template = loader.get_template("mitglieder_auswahlen.html")
168 return HttpResponse(template.render(
171 "mausw_form" : mausw_form },
174 @login_required(login_url=LOGIN_URL)
175 def kassenbrief(request, verein):
178 Diese Methode liest aus der Config die Einstellungen und zeigt sie an.
181 Diese Methode lädt die Zusammenfassung
183 ---------------------------------------------------------------
186 Ausgewähltes Template: <Wert aus Config>
187 Link -> Neue Templates installieren
188 ---------------------------------------------------------------
191 mg_ausw = request.COOKIES.get('mausw1') or "leer"
192 mg_zul = request.COOKIES.get('mausw2') or "leer"
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(
205 initial={"mg_auswahl" : mg_ausw,}
207 if request.method == 'POST':
210 fehlertext_quelle = "Datenquelle auswählen"
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"]
219 fehlertext_vorlage = "Bitte Kassenbriefvorlage auswählen"
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"
232 routines.aktualisiere_config(vconf, vorlage, beitrag_form.cleaned_data)
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"]
242 response = HttpResponseRedirect('zusammenfassung')
243 response.set_cookie("mausw1", mausw)
246 # GET request / POST mit Fehlern
247 vorlagen_form = VorlagenForm(
248 templates=vorlagen_liste,
249 initial={'vorlagen' : vorlage } )
250 beitrag_form = BeitragForm(
252 "basisbeitrag" : beitrag_basis,
253 "zusatzbeitrag" : beitrag_zusatz,
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,
261 'fehler_quelle': fehlertext_quelle
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':
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())
280 rc, anzahl, gesamtbetrag = routines.pdfs_erstellen(request, verein, mitglieder, vorlage, data_path, build_name)
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)
289 return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
292 tpl_name_wo_ext = os.path.splitext(vorlage)[0]
293 return render(request, 'kassenbrief_zusammenfassung.html', {
295 'datenquelle' : datenquelle,
296 'vorlage' : tpl_name_wo_ext,
297 'basisbeitrag' : beitrag_basis,
298 'zusatzbeitrag' : beitrag_zusatz,
299 'miglieder' : mitglieder })
301 @login_required(login_url=LOGIN_URL)
302 def kassenbrief_erfolg(request, verein):
303 return render(request, 'kassenbrief_erfolg.html', {
305 'anzahl' : request.COOKIES.get('anzahl'),
306 'gesamtbetrag' : request.COOKIES.get('gesamtbetrag'),
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>")
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')
319 ergebnis_datei = os.path.join(data_path, "build", build_name, "ergebnis.tgz")
321 response = FileResponse(open(ergebnis_datei, 'rb'), as_attachment=True, filename=f"{build_name}.tgz")
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:
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/')
338 # if a GET (or any other method) we'll create a blank form
340 form = EhmeldungForm()
342 return render(request, 'ehmeldung.html', {'form': form, 'verein': verein})
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)
352 def index(request, verein):
353 if request.user.is_authenticated:
354 print("index login ok")
356 print("index not logged in")
358 datenquelle = config.getInstance(verein).getConfig("datenquelle")
360 template = loader.get_template('eh_app.html')
361 response = HttpResponse(template.render(
363 "verein_name" : verein,
364 "datenquelle" : datenquelle,
369 from django.contrib import auth
370 from .forms import LoginForm
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:
379 user = auth.authenticate(
380 username = request.POST["name"],
381 password = request.POST["password"],
383 verein = request.POST["verein"]
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")
393 print("auth not logged in")
394 next = request.POST.get("next", None)
396 return HttpResponseRedirect(next)
398 return HttpResponseRedirect(f'/eh-app/{verein}')
399 # login fehlgeschlagen
400 fehlertext = "Login fehlgeschlagen"
402 # if a GET (or any other method) we'll create a blank form
406 next = request.GET.get("next", None)
408 path_elems = next.split("/")
409 verein = path_elems[2]
410 form = LoginForm(initial={'next': next, 'verein': verein})
412 return render(request, 'login.html', {'form': form, 'fehlertext': fehlertext})