JET-Design-Wortmarke im Kopf und auf der Rechnung

Die Logos stammen aus der Shop-Webseite (assets/img/logo). Im Seitenkopf
stehen beide SVG-Varianten im Markup, CSS blendet die zum Theme passende
ein -- der Dark-Mode-Schalter laedt die Seite nicht neu.

Fuer den Rechnungsdruck liegt die Wortmarke zusaetzlich als JPEG bei,
weil fpdf2 kein SVG setzen kann. logo_datei() waehlt aus: hochgeladenes
Logo vor mitgelieferter Marke, Textkopf nur noch als Notnagel.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Erik Thiele
2026-09-08 14:25:52 +02:00
parent e1142ac904
commit b0e6b1b9f2
10 changed files with 91 additions and 13 deletions

26
app.py
View File

@@ -118,6 +118,20 @@ def as_stueckzahl(value):
return max(1, zahl)
def logo_datei(config):
"""Pfad des Rechnungslogos relativ zu static/.
Ein hochgeladenes Logo hat Vorrang, sonst greift die mitgelieferte
Wortmarke. Fehlen beide Dateien, kommt '' zurueck und der PDF-Kopf
setzt den Firmennamen als Text.
"""
for name in (config.get('logo', ''), STANDARD_LOGO):
if name and os.path.exists(os.path.join('static', name)):
return name
return ''
def pdf_text(value):
"""Macht beliebigen Text fuer die latin-1-Kernfonts von fpdf sicher.
@@ -147,6 +161,11 @@ MAX_PROJEKTE = 500
LOGO_EXTS = ('png', 'jpg', 'webp')
# Mitgelieferte JET-Design-Wortmarke fuer den Rechnungskopf. Aus der
# SVG-Vorlage des Shops gerastert, weil fpdf2 nur Pixelbilder setzt.
# Greift, solange kein eigenes Logo hochgeladen wurde.
STANDARD_LOGO = 'img/logo/jet-design.jpg'
# Obergrenze, damit ein fehlerhafter Client die Config nicht aufblaeht.
MAX_POSITIONEN = 50
@@ -589,7 +608,8 @@ def index():
def settings():
"""Einstellungsseite fuer Druckerabschreibung, Arbeitskosten und Marge."""
config = load_config()
return render_template('settings.html', config=config)
return render_template('settings.html', config=config,
logo_anzeige=logo_datei(config))
@app.route('/calculate', methods=['POST'])
@@ -843,9 +863,9 @@ def invoice_pdf():
col_w = 45
# Logo rechts oben
logo_name = config.get('logo', '')
logo_name = logo_datei(config)
logo_path = os.path.join('static', logo_name) if logo_name else ''
if logo_name and os.path.exists(logo_path):
if logo_name:
pdf.image(logo_path, x=175, y=12, w=20)
img_w, img_h = image_dimensions(logo_path)
if img_w and img_h: