4 from eh_app.AWK import config
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)
15 from django.utils.datetime_safe import strftime
16 def aktualisiere_config(config, vorlage, beitrag_data):
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)
28 config.setConfig("vorlage", vorlage)
29 if beitrag_data["basisbeitrag"]:
30 config.setConfig("beitrag_basis", beitrag_data["basisbeitrag"])
32 if beitrag_data["zusatzbeitrag"]:
33 config.setConfig("beitrag_zusatz", beitrag_data["zusatzbeitrag"])
35 def erstelle_ehmeldung(data, verein):
36 from PyPDF2 import PdfFileWriter, PdfFileReader
37 from datetime import date
39 from reportlab.pdfgen import canvas
40 from reportlab.lib.pagesizes import letter
43 can = canvas.Canvas(packet, pagesize=letter)
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.")
73 #move to the beginning of the StringIO buffer
77 pfad = config.getInstance(verein).requireConfig("data_path")
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])
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)
93 def erstelle_ausweis(data, verein):
94 from PyPDF2 import PdfFileWriter, PdfFileReader
95 from datetime import date
97 from reportlab.pdfgen import canvas
98 from reportlab.lib.pagesizes import letter
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")
105 packet = io.BytesIO()
106 can = canvas.Canvas(packet, pagesize=letter)
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")
116 can.setFont("Helvetica", 9)
117 can.drawString(350, 520, "München, "+date.today().strftime('%d.%m.%Y'))
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.")
125 text.textLines("Viele Grüße")
126 text.textLines("Michael Wagner (Vorstand)")
130 can.line(20, 180, 560, 180)
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)
146 #move to the beginning of the StringIO buffer
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])
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()
163 def pdfs_erstellen(request, verein, mitglieder, templ_name, data_path, build_name):
164 from django.template import loader
166 # lese alle Miglieder
167 from eh_app.qmodels import Mitglied
168 if mitglieder == "alle":
169 mm = Mitglied.objects.all()
172 m_ids = mitglieder.split(",")
175 m = o.get(mitgliedsnr=m_id)
177 raise RuntimeError(f"Mitglied mit id {m_id} konnte nicht geladen werden.")
179 template = loader.get_template(f"{verein}/{templ_name}")
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)
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}")
194 # alte builds löschen
195 rc = os.system(f'cd {build_base}; rm -r *')
197 from eh_app.AWK import util
198 util.schreibe_log(f"Löschen alter builds fehlgeschlagen: {rc}")
200 # lege Verzeichnis + Links auf Templatedateien an
201 os.makedirs(result_path)
202 rc = os.system(f'cd {build_path}; ln -s {template_path}/* .')
204 raise RuntimeError(f"Linkerstellung fehlgeschlagen: {rc}")
206 basisbtr = int(cf.requireConfig("beitrag_basis"))
207 zusatzbtr = int(cf.requireConfig("beitrag_zusatz"))
209 with PdfErsteller(request, template, basisbtr, zusatzbtr, build_path, pdfersteller) as pe:
213 rc = pe.erstellepdf(m)
218 rc = os.system(f'cd {build_path}; tar czf ergebnis.tgz ergebnis')
220 raise RuntimeError(f"Packen (tar) fehlgeschlagen: {rc}")
222 return 0, pe.anzahl, pe.gesamtbetrag
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"
228 # lese alle Miglieder
229 from eh_app.qmodels import Mitglied
230 mm = Mitglied.objects.all()
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 )
235 gg = m.VersicherteGrundstucke()
243 m.eintrittsdatum.strftime("%d.%m.%Y"),
245 return ergebnis_datei
247 def vorlagen_verwalten(verein, zu_loschen, vorlage_neu):
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"
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)
265 # prüfe Dateistruktur
266 rc = subprocess.call(["bash", ehapp_check, workdir, verein])
268 raise RuntimeError(f"install_sh failed: {rc}")
271 for vorlage in zu_loschen:
272 rc = os.system(f'{delete_sh} {verein} {vorlage} {ehappdir}')
274 raise RuntimeError(f"delete_sh fehlgeschlagen: {rc}")
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])
284 raise RuntimeError(f"install_sh failed: {rc}")
286 def datenquelle_andern(verein, pfad, zu_loschen, zu_verwenden, zu_install):
287 cf = config.getInstance(verein)
288 akt_quelle = cf.getConfig("datenquelle", "")
291 for file in zu_loschen:
292 dpath = os.path.join(pfad, file)
294 if akt_quelle == file:
295 # Datenquelle zurücksetzen
296 cf.setConfig("datenquelle")
298 # Neue Datei verwenden
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)
307 cf.setConfig("datenquelle", zu_verwenden)