implementation of the Email add on
Release Inventarsystem / release-docker (push) Successful in 2m24s

This commit is contained in:
2026-09-15 20:53:18 +02:00
parent 00d45a9d1b
commit e9aea7e039
7 changed files with 174 additions and 31 deletions
+77 -7
View File
@@ -48,7 +48,7 @@ import Web.modules.log.audit_log as al
import push_notifications as pn
import Web.modules.inventarsystem.pdf_export as pdf_export
import Web.modules.inventarsystem.excel_export as excel_export
from Web.modules.emailservice.email import send
from Web.modules.emailservice.email import send, send_pdf
import datetime
from apscheduler.schedulers.background import BackgroundScheduler
from bson.objectid import ObjectId, InvalidId
@@ -4892,7 +4892,8 @@ def student_cards_admin():
edit_mode=edit_mode,
form_data=form_data,
available_classes=available_classes, # Enthält nun die lesbaren Klassen
config=cfg.get_school_info()
config=cfg.get_school_info(),
email_service_enabled=cfg.MODULES.is_enabled('mail')
)
@@ -5353,7 +5354,7 @@ def student_card_class_barcode_download():
flash('Fehler beim PDF-Download', 'error')
return redirect(url_for('student_cards_admin'))
@app.route('/student_card_single_barcode_download/<card_id>', methods=['GET'])
@app.route('/student_card_single_barcode_download/<card_id>', methods=['GET', 'POST'])
def student_card_single_barcode_download(card_id):
"""
Download PDF with single student card barcode.
@@ -5533,11 +5534,34 @@ def student_card_single_barcode_download(card_id):
c.save()
pdf_buffer.seek(0)
pdf_filename = f'ausweis_{card["AusweisId"]}.pdf'
if request.method == 'POST':
recipient_email = (request.form.get('recipient_email') or '').strip()
if not recipient_email:
flash('Bitte eine Empfänger-E-Mail-Adresse eingeben oder nur PDF auswählen.', 'error')
return redirect(url_for('student_cards_admin'))
if not cfg.MODULES.is_enabled('mail'):
flash('Das E-Mail-Add-on ist deaktiviert. Der Ausweis kann weiterhin als PDF heruntergeladen werden.', 'warning')
return redirect(url_for('student_cards_admin'))
sent = send_pdf(
recipient_email,
f'Bibliotheksausweis {card["AusweisId"]}',
f'Anbei erhalten Sie den Bibliotheksausweis für {card.get("SchülerName", "")} als PDF.',
'Bibliotheksverwaltung',
pdf_buffer.getvalue(),
pdf_filename,
)
flash(
'Bibliotheksausweis wurde per E-Mail versendet.' if sent else 'Bibliotheksausweis konnte nicht per E-Mail versendet werden.',
'success' if sent else 'error',
)
return redirect(url_for('student_cards_admin'))
return send_file(
pdf_buffer,
mimetype='application/pdf',
as_attachment=True,
download_name=f'ausweis_{card["AusweisId"]}.pdf'
download_name=pdf_filename
)
except Exception as e:
app.logger.error(f"Error occurred while generating PDF for card {card['AusweisId']}: {e}")
@@ -8959,7 +8983,8 @@ def admin_borrowings():
entries=entries,
library_module_enabled=cfg.MODULES.is_enabled('library'),
student_cards_module_enabled=cfg.MODULES.is_enabled('student_cards'),
mail_module_enabled=cfg.MODULES.is_enabled('mail')
mail_module_enabled=cfg.MODULES.is_enabled('mail'),
email_service_enabled=cfg.MODULES.is_enabled('mail')
)
"""-----------------------------------------------------------Audit Routes-------------------------------------------------------"""
@@ -9051,7 +9076,7 @@ def admin_audit_dashboard():
if client:
client.close()
@app.route('/admin/audit/export/pdf/official', methods=['GET'])
@app.route('/admin/audit/export/pdf/official', methods=['GET', 'POST'])
def admin_audit_export_pdf_official():
"""Export audit report as professional PDF (Official Report - full DIN 5008 compliant)."""
if 'username' not in session:
@@ -9118,6 +9143,29 @@ def admin_audit_export_pdf_official():
export_type='official',
school_info=school_info
)
if request.method == 'POST':
recipient_email = (request.form.get('recipient_email') or '').strip()
if not recipient_email:
flash('Bitte eine Empfänger-E-Mail-Adresse eingeben oder nur PDF auswählen.', 'error')
return redirect(url_for('admin_audit_dashboard'))
if not cfg.MODULES.is_enabled('mail'):
flash('Das E-Mail-Add-on ist deaktiviert. Der Auditbericht kann weiterhin als PDF heruntergeladen werden.', 'warning')
return redirect(url_for('admin_audit_dashboard'))
filename = f'audit-official-report-{datetime.datetime.now(ZoneInfo("Europe/Berlin")).strftime("%Y%m%d-%H%M%S")}.pdf'
sent = send_pdf(
recipient_email,
'Amtlicher Auditbericht',
'Anbei erhalten Sie den aktuellen amtlichen Auditbericht des Inventarsystems als PDF.',
'Inventarsystem',
pdf_content,
filename,
)
flash(
'Auditbericht wurde per E-Mail versendet.' if sent else 'Auditbericht konnte nicht per E-Mail versendet werden.',
'success' if sent else 'error',
)
return redirect(url_for('admin_audit_dashboard'))
response = make_response(pdf_content)
response.headers['Content-Type'] = 'application/pdf'
@@ -9492,11 +9540,33 @@ def admin_create_invoice(borrow_id):
)
pdf_buffer = pdf_export._build_invoice_pdf(invoice_data)
pdf_filename = f'rechnung_{invoice_number}.pdf'
if request.form.get('delivery') == 'email':
recipient_email = (request.form.get('recipient_email') or '').strip()
if not recipient_email:
flash('Bitte eine Empfänger-E-Mail-Adresse eingeben oder nur PDF auswählen.', 'error')
return redirect(url_for('admin_borrowings'))
if not cfg.MODULES.is_enabled('mail'):
flash('Das E-Mail-Add-on ist deaktiviert. Die PDF-Rechnung kann weiterhin heruntergeladen werden.', 'warning')
return redirect(url_for('admin_borrowings'))
sent = send_pdf(
recipient_email,
f'Rechnung {invoice_number} - {item_name}',
f'Anbei erhalten Sie die Rechnung {invoice_number} zum Element {item_name}.',
'Bibliotheksverwaltung',
pdf_buffer.getvalue(),
pdf_filename,
)
flash(
'PDF-Rechnung wurde per E-Mail versendet.' if sent else 'PDF-Rechnung konnte nicht per E-Mail versendet werden.',
'success' if sent else 'error',
)
return redirect(url_for('admin_borrowings'))
return send_file(
pdf_buffer,
mimetype='application/pdf',
as_attachment=True,
download_name=f'rechnung_{invoice_number}.pdf'
download_name=pdf_filename
)
except Exception as e:
app.logger.error(f"Error creating damage invoice for borrow {borrow_id}: {e}")