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 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)
287 return HttpResponseRedirect(f'/eh-app/{verein}/kassenbrief')
290 tpl_name_wo_ext = os.path.splitext(vorlage)[0]
291 return render(request, 'kassenbrief_zusammenfassung.html', {
293 'datenquelle' : datenquelle,
294 'vorlage' : tpl_name_wo_ext,
295 'basisbeitrag' : beitrag_basis,
296 'zusatzbeitrag' : beitrag_zusatz,
297 'miglieder' : mitglieder })
299 @login_required(login_url=LOGIN_URL)
300 def kassenbrief_erfolg(request, verein):
301 return render(request, 'kassenbrief_erfolg.html', {
303 'anzahl' : request.COOKIES.get('anzahl'),
304 'gesamtbetrag' : request.COOKIES.get('gesamtbetrag'),
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')
313 ergebnis_datei = os.path.join(data_path, "build", build_name, "ergebnis.tgz")
315 response = FileResponse(open(ergebnis_datei, 'rb'), as_attachment=True, filename=f"{build_name}.tgz")
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:
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/')
332 # if a GET (or any other method) we'll create a blank form
334 form = EhmeldungForm()
336 return render(request, 'ehmeldung.html', {'form': form, 'verein': verein})
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)
346 def index(request, verein):
347 if request.user.is_authenticated:
348 print("index login ok")
350 print("index not logged in")
352 datenquelle = config.getInstance(verein).getConfig("datenquelle")
354 template = loader.get_template('eh_app.html')
355 response = HttpResponse(template.render(
357 "verein_name" : verein,
358 "datenquelle" : datenquelle,
363 from django.contrib import auth
364 from .forms import LoginForm
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:
373 user = auth.authenticate(
374 username = request.POST["name"],
375 password = request.POST["password"],
377 verein = request.POST["verein"]
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")
387 print("auth not logged in")
388 next = request.POST.get("next", None)
390 return HttpResponseRedirect(next)
392 return HttpResponseRedirect(f'/eh-app/{verein}')
393 # login fehlgeschlagen
394 fehlertext = "Login fehlgeschlagen"
396 # if a GET (or any other method) we'll create a blank form
400 next = request.GET.get("next", None)
402 path_elems = next.split("/")
403 verein = path_elems[2]
404 form = LoginForm(initial={'next': next, 'verein': verein})
406 return render(request, 'login.html', {'form': form, 'fehlertext': fehlertext})