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