]> wagnertech.de Git - SVBaL.git/blob - python/eh_app/AWK/routines.py
Bug 170 + check feature
[SVBaL.git] / python / eh_app / AWK / routines.py
1 import os
2 import time
3
4 from eh_app.AWK import config
5
6 '''
7 def handle_uploaded_file(csv_file):
8     csv_file_name = str(csv_file)
9     data_path = config.getInstance().requireConfig("data_path")
10     path = os.path.join(data_path, csv_file_name)
11     with open(path, 'wb+') as destination:
12         for chunk in csv_file.chunks():
13             destination.write(chunk)
14 '''
15 from django.utils.datetime_safe import strftime
16 def aktualisiere_config(config, vorlage, beitrag_data):
17     '''
18     if file:
19         uploaded_file = file.name
20         data_path = config.requireConfig("data_path")
21         # copy briefpapier into data_path
22         with open(os.path.join(data_path, uploaded_file), 'wb+') as destination:
23             for chunk in file.chunks():
24                 destination.write(chunk)
25         config.setConfig("briefpapier", uploaded_file)
26     '''
27     if vorlage:
28         config.setConfig("vorlage", vorlage)
29     if beitrag_data["basisbeitrag"]:
30         config.setConfig("beitrag_basis", beitrag_data["basisbeitrag"])
31
32     if beitrag_data["zusatzbeitrag"]:
33         config.setConfig("beitrag_zusatz", beitrag_data["zusatzbeitrag"])
34     
35 def erstelle_ehmeldung(data, verein):
36     from PyPDF2 import PdfFileWriter, PdfFileReader
37     from datetime import date
38     import io
39     from reportlab.pdfgen import canvas
40     from reportlab.lib.pagesizes import letter
41    
42     packet = io.BytesIO()
43     can = canvas.Canvas(packet, pagesize=letter)
44     
45     # Adressfeld
46     can.setFont("Helvetica", 14)
47     can.drawString(80, 770, "Siedlervereinigung Berg am Laim")
48     can.setFont("Helvetica", 12)
49     can.drawString(285, 705, data["Eintrittsdatum"])
50     can.drawString(205, 685, "Siedlervereinigung Berg am Laim")
51     can.drawString(205, 618, data["VorZuname"])
52     can.drawString(205, 600, data["VorZunamePartner"])
53     can.drawString(205, 583, data["Wohnanschrift"])
54     can.drawString(205, 566, data["Telefon"])
55     can.drawString(365, 566, data["Email"])
56     can.drawString(205, 549, data["Geburtsdatum"])
57     versichertes_object = data["VersichertesObjekt"]
58     if versichertes_object == "":
59         versichertes_object = data["Wohnanschrift"]
60     can.drawString(205, 500, versichertes_object)
61     can.drawString(193, 466, str(data["AnzahlWohnungen"]))
62     if data["Selbstgenutzt"]:
63         can.drawString(360, 466, "X")
64     if data["Eigentumswohnung"]:
65         can.drawString(192, 449, "X")
66     if data["Gewerblich"]:
67         can.drawString(360, 449, "X")
68     can.drawString(140, 376, date.today().strftime('%d.%m.%Y'))
69     can.drawString(350, 376, "Maschinell erstellt.")
70         
71     can.save()
72     
73     #move to the beginning of the StringIO buffer
74     packet.seek(0)
75     
76     # Dateipfade
77     pfad = config.getInstance(verein).requireConfig("data_path")
78     
79     # create a new PDF with Reportlab
80     new_pdf = PdfFileReader(packet)
81     # read your existing PDF
82     existing_pdf = PdfFileReader(open(os.path.join(pfad, "upload", "BeitrittserklarungSVBaL.pdf"), "rb"))
83     output = PdfFileWriter()
84     # add the "watermark" (which is the new pdf) on the existing page
85     page = existing_pdf.pages[0]
86     page.mergePage(new_pdf.pages[0])
87     output.addPage(page)
88     # finally, write "output" to a real file
89     output_stream = open(os.path.join(pfad, "build","meldung.pdf"), "wb")
90     output.write(output_stream)
91     output_stream.close()
92
93 def erstelle_ausweis(data, verein):
94     from PyPDF2 import PdfFileWriter, PdfFileReader
95     from datetime import date
96     import io
97     from reportlab.pdfgen import canvas
98     from reportlab.lib.pagesizes import letter
99
100     cf = config.getInstance(verein)
101     workdir   = cf.requireConfig("data_path")
102     #build_path  = os.path.join(workdir, "build")
103     #upload_path = os.path.join(workdir, "upload")
104     
105     packet = io.BytesIO()
106     can = canvas.Canvas(packet, pagesize=letter)
107     
108     # Adressfeld
109     can.setFont("Helvetica", 12)
110     can.drawString(70, 640, "Herr/Frau")
111     can.drawString(70, 625, data["VorZuname"])
112     can.drawString(70, 610, data["Wohnanschrift"])
113     #can.drawString(70, 590, "PLZ/Ort")
114
115     # Datum
116     can.setFont("Helvetica", 9)
117     can.drawString(350, 520, "München, "+date.today().strftime('%d.%m.%Y'))
118     
119     # Anschreiben
120     can.drawString(70, 500, "Sehr geehrte/r Herr/Frau "+data["VorZuname"]+",")
121     text = can.beginText(70, 480)
122     text.textLines("wir freuen uns, dass Sie der Siedlervereinigung Berg am Laim beigetreten sind.")
123     text.textLines("Im unteren Teil befindet sich Ihr Mitgliedsausweis.")
124     text.textLines(" ")
125     text.textLines("Viele Grüße")
126     text.textLines("Michael Wagner (Vorstand)")
127     can.drawText(text)
128     
129     
130     can.line(20, 180, 560, 180)
131     
132     # Ausweis
133     can.setFont("Helvetica", 12)
134     can.drawString(460, 100, "#0817654")
135     can.drawString(330, 80, data["VorZuname"])
136     can.setFont("Helvetica", 9)
137     can.drawString(400, 56, data["Geburtsdatum"])
138     can.drawString(400, 42, data["Eintrittsdatum"])
139     versichertes_object = data["VersichertesObjekt"]
140     if versichertes_object == "":
141         versichertes_object = data["Wohnanschrift"]
142     can.drawString(400, 20, versichertes_object)
143     
144     can.save()
145     
146     #move to the beginning of the StringIO buffer
147     packet.seek(0)
148     
149     # create a new PDF with Reportlab
150     new_pdf = PdfFileReader(packet)
151     # read your existing PDF
152     existing_pdf = PdfFileReader(open(os.path.join(workdir, "upload", "MitgliederausweisSVBaLVorlage_leer.pdf"), "rb"))
153     output = PdfFileWriter()
154     # add the "watermark" (which is the new pdf) on the existing page
155     page = existing_pdf.pages[0]
156     page.mergePage(new_pdf.pages[0])
157     output.addPage(page)
158     # finally, write "output" to a real file
159     output_stream = open(os.path.join(workdir, "build", "ausweis.pdf"), "wb")
160     output.write(output_stream)
161     output_stream.close()
162       
163 def pdfs_erstellen(request, verein, mitglieder, templ_name, data_path, build_name):
164     from django.template import loader
165     
166     # lese alle Miglieder
167     from eh_app.qmodels import Mitglied
168     if mitglieder == "alle":
169         mm = Mitglied.objects.all()
170     else:
171         mm = []
172         m_ids = mitglieder.split(",")
173         for m_id in m_ids:
174             o = Mitglied.objects
175             m = o.get(mitgliedsnr=m_id)
176             if not m:
177                 raise RuntimeError(f"Mitglied mit id {m_id} konnte nicht geladen werden.")
178             mm.append(m)
179     template = loader.get_template(f"{verein}/{templ_name}")
180
181     cf = config.getInstance()
182     ehappdir  = cf.getConfig("ehappdir", "/opt/eh_app")
183     pdfersteller = f"{ehappdir}/bin/pdfersteller.sh"
184     if not os.path.exists(pdfersteller):
185         raise RuntimeError("Install-Skript nicht gefunden: "+pdfersteller)
186     
187     from eh_app.AWK.pdf_ersteller import PdfErsteller
188     build_base      = os.path.join(data_path, "build")
189     build_path      = os.path.join(build_base, build_name)
190     result_path     = os.path.join(build_path, "ergebnis")
191     tpl_name_wo_ext = os.path.splitext(templ_name)[0]
192     template_path   = os.path.join(data_path, f"{tpl_name_wo_ext}")
193
194     # alte builds löschen
195     rc = os.system(f'cd {build_base}; rm -r *')
196     if rc != 0:
197         from eh_app.AWK import util
198         util.schreibe_log(f"Löschen alter builds fehlgeschlagen: {rc}")
199     
200     # lege Verzeichnis + Links auf Templatedateien an
201     os.makedirs(result_path)
202     rc = os.system(f'cd {build_path}; ln -s {template_path}/* .')
203     if rc != 0:
204         raise RuntimeError(f"Linkerstellung fehlgeschlagen: {rc}")
205     
206     basisbtr  = int(cf.requireConfig("beitrag_basis"))
207     zusatzbtr = int(cf.requireConfig("beitrag_zusatz"))
208
209     with PdfErsteller(request, template, basisbtr, zusatzbtr, build_path, pdfersteller) as pe:
210     
211         # Erstelle PDFs
212         for m in mm:
213             rc = pe.erstellepdf(m)
214             if rc != 0:
215                 return rc,0,0
216     
217     # Ergebnis packen
218     rc = os.system(f'cd {build_path}; tar czf ergebnis.tgz ergebnis')
219     if rc != 0:
220         raise RuntimeError(f"Packen (tar) fehlgeschlagen: {rc}")
221     
222     return 0, pe.anzahl, pe.gesamtbetrag
223     
224 def vertragsliste_erstellen(verein, data_path):
225     build_path     = os.path.join(data_path, "build")
226     ergebnis_datei = "vertragsliste_"+time.strftime("%Y%m%d%H%M%S", time.localtime())+".csv"
227
228     # lese alle Miglieder
229     from eh_app.qmodels import Mitglied
230     mm = Mitglied.objects.all()
231     
232     with open(os.path.join(build_path,ergebnis_datei), "w") as d:
233         print("Name", "Vorname", "Straße", "PLZ", "Ort", "Grundstück", "Eintrittsdatum", sep=";", file=d )
234         for m in mm:
235             gg = m.VersicherteGrundstucke()
236             for g in gg:
237                 print(m.nachname, 
238                       m.vorname, 
239                       m.strasse, 
240                       m.plz, 
241                       m.ort, 
242                       g, 
243                       m.eintrittsdatum.strftime("%d.%m.%Y"), 
244                       sep=";", file=d )
245     return ergebnis_datei
246
247 def vorlagen_verwalten(verein, zu_loschen, vorlage_neu):
248     import subprocess
249     cf = config.getInstance(verein)
250     ehappdir  = cf.getConfig("ehappdir", "/opt/eh_app")
251     workdir   = cf.getConfig("data_path", "/var/mysite/eh_app")
252     djangodir = cf.getConfig("djangodir", "/opt/mysite")
253     install_sh  = f"{ehappdir}/bin/install_vorlage.sh"
254     delete_sh   = f"{ehappdir}/bin/delete_vorlage.sh"
255     ehapp_check = f"{ehappdir}/bin/ehapp-verein-check.sh"
256     
257     # prüfe Existenz der Skripte
258     if not os.path.exists(install_sh):
259         raise RuntimeError("Install-Skript nicht gefunden: "+install_sh)
260     if not os.path.exists(delete_sh):
261         raise RuntimeError("Delete-Skript nicht gefunden: "+delete_sh)
262     if not os.path.exists(ehapp_check):
263         raise RuntimeError("Check-Skript nicht gefunden: "+ehapp_check)
264     
265     # prüfe Dateistruktur
266     rc = subprocess.call(["bash", ehapp_check, workdir, verein])
267     if rc != 0:
268         raise RuntimeError(f"install_sh failed: {rc}")
269     
270     
271     for vorlage in zu_loschen:
272         rc = os.system(f'{delete_sh} {verein} {vorlage} {ehappdir}')
273         if rc != 0:
274             raise RuntimeError(f"delete_sh fehlgeschlagen: {rc}")
275     if vorlage_neu:
276         vorlage_name = str(vorlage_neu)
277         path = os.path.join(workdir, "upload", vorlage_name)
278         with open(path, 'wb+') as destination:
279             for chunk in vorlage_neu.chunks():
280                 destination.write(chunk)
281         #raise RuntimeError(f"xxxxxxxx: {install_sh} {verein} {vorlage_name} {workdir} {ehappdir}")
282         rc = subprocess.call(["bash", install_sh, verein,  vorlage_name, workdir, ehappdir])
283         if rc != 0:
284             raise RuntimeError(f"install_sh failed: {rc}")
285
286 def datenquelle_andern(verein, pfad, zu_loschen, zu_verwenden, zu_install):
287     cf         = config.getInstance(verein)
288     akt_quelle = cf.getConfig("datenquelle", "")
289     
290     # Dateien löschen
291     for file in zu_loschen:
292         dpath = os.path.join(pfad, file)
293         os.unlink(dpath)
294         if akt_quelle == file:
295             # Datenquelle zurücksetzen
296             cf.setConfig("datenquelle")
297     
298     # Neue Datei verwenden
299     if zu_install:
300         datei_name = str(zu_install)
301         dpath = os.path.join(pfad, datei_name)
302         with open(dpath, 'wb+') as destination:
303             for chunk in zu_install.chunks():
304                 destination.write(chunk)
305         cf.setConfig("datenquelle", datei_name)
306     elif zu_verwenden:
307         cf.setConfig("datenquelle", zu_verwenden)