diff --git a/backend/database.py b/backend/database.py index ab82594..5147c95 100644 --- a/backend/database.py +++ b/backend/database.py @@ -580,6 +580,8 @@ def _migrate(conn_factory): ("users", "password_reset_expires", "TEXT"), # Fell-Typ für personalisierte Wetter-Hinweise ("dogs", "fell_typ", "TEXT"), # kurz|mittel|lang|drahtaar|doppel|nackt + # Widerristhöhe in cm (höchster Punkt Schulterblatt → Boden) + ("dogs", "widerrist_cm", "REAL"), # Tierarzt-Bewertungen: Durchschnitt + Anzahl am Tierarzt-Datensatz ("tieraerzte", "avg_rating", "REAL DEFAULT 0"), ("tieraerzte", "anz_bewertungen", "INTEGER DEFAULT 0"), diff --git a/backend/main.py b/backend/main.py index 00027f4..23bd67c 100644 --- a/backend/main.py +++ b/backend/main.py @@ -376,7 +376,7 @@ if STAGING and os.path.isdir(PROD_MEDIA_DIR): else: app.mount("/media", StaticFiles(directory=MEDIA_DIR), name="media") -APP_VER = "872" # muss mit APP_VER in app.js übereinstimmen +APP_VER = "873" # muss mit APP_VER in app.js übereinstimmen @app.get("/.well-known/assetlinks.json") async def assetlinks(): @@ -1407,6 +1407,7 @@ async def ausweis_page(dog_id: int, request: Request):
Geschlecht
{geschlecht}
Gewicht
{f'{dog["gewicht_kg"]} kg' if dog.get("gewicht_kg") else "–"}
Transponder
{esc(dog.get("chip_nr")) or "–"}
+ {f'
Widerrist
{dog["widerrist_cm"]} cm
' if dog.get("widerrist_cm") else ''}
Besitzer
{esc(owner["name"]) if owner else "–"}
diff --git a/backend/routes/dogs.py b/backend/routes/dogs.py index e2985dd..cc86caf 100644 --- a/backend/routes/dogs.py +++ b/backend/routes/dogs.py @@ -15,26 +15,28 @@ MEDIA_DIR = os.getenv("MEDIA_DIR", "/data/media") class DogCreate(BaseModel): - name: str - rasse: Optional[str] = None - geburtstag: Optional[str] = None - geschlecht: Optional[str] = None - gewicht_kg: Optional[float] = None - chip_nr: Optional[str] = None - bio: Optional[str] = None - is_public: bool = False + name: str + rasse: Optional[str] = None + geburtstag: Optional[str] = None + geschlecht: Optional[str] = None + gewicht_kg: Optional[float] = None + widerrist_cm: Optional[float] = None + chip_nr: Optional[str] = None + bio: Optional[str] = None + is_public: bool = False class DogUpdate(BaseModel): - name: Optional[str] = None - rasse: Optional[str] = None - rasse_id: Optional[int] = None - geburtstag: Optional[str] = None - geschlecht: Optional[str] = None - gewicht_kg: Optional[float] = None - chip_nr: Optional[str] = None - bio: Optional[str] = None - is_public: Optional[bool] = None + name: Optional[str] = None + rasse: Optional[str] = None + rasse_id: Optional[int] = None + geburtstag: Optional[str] = None + geschlecht: Optional[str] = None + gewicht_kg: Optional[float] = None + widerrist_cm: Optional[float] = None + chip_nr: Optional[str] = None + bio: Optional[str] = None + is_public: Optional[bool] = None @router.get("") @@ -141,11 +143,11 @@ async def create_dog(data: DogCreate, user=Depends(get_current_user)): ) conn.execute( """INSERT INTO dogs (user_id, name, rasse, geburtstag, geschlecht, - gewicht_kg, chip_nr, bio, is_public) - VALUES (?,?,?,?,?,?,?,?,?)""", + gewicht_kg, widerrist_cm, chip_nr, bio, is_public) + VALUES (?,?,?,?,?,?,?,?,?,?)""", (user["id"], data.name, data.rasse, data.geburtstag, - data.geschlecht, data.gewicht_kg, data.chip_nr, - data.bio, int(data.is_public)) + data.geschlecht, data.gewicht_kg, data.widerrist_cm, + data.chip_nr, data.bio, int(data.is_public)) ) dog = conn.execute( "SELECT * FROM dogs WHERE user_id=? ORDER BY id DESC LIMIT 1", diff --git a/backend/static/index.html b/backend/static/index.html index f616f14..21bc8d6 100644 --- a/backend/static/index.html +++ b/backend/static/index.html @@ -101,9 +101,9 @@ - - - + + + @@ -583,10 +583,10 @@ - - - - + + + + diff --git a/backend/static/js/app.js b/backend/static/js/app.js index e732f44..bb6051a 100644 --- a/backend/static/js/app.js +++ b/backend/static/js/app.js @@ -3,7 +3,7 @@ Router, State-Management, Navigation, Initialisierung. ============================================================ */ -const APP_VER = '872'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen +const APP_VER = '873'; // ← bei jedem Deploy mit Frontend-Änderungen erhöhen const APP_VERSION = '1.5.1'; // ← semantische Version, wird bei make release gesetzt const IS_STAGING = location.hostname === 'staging.banyaro.app'; // Cache-Bust-Parameter nach Update-Reload sofort entfernen diff --git a/backend/static/js/pages/dog-profile.js b/backend/static/js/pages/dog-profile.js index 6de34d5..9399085 100644 --- a/backend/static/js/pages/dog-profile.js +++ b/backend/static/js/pages/dog-profile.js @@ -129,6 +129,12 @@ window.Page_dog_profile = (() => {
${dog.gewicht_kg} kg
` : ''} + ${dog.widerrist_cm ? ` +
+
Widerrist
+
${dog.widerrist_cm} cm
+
+ ` : ''}
@@ -1133,6 +1139,18 @@ window.Page_dog_profile = (() => { value="${dog?.gewicht_kg || ''}" min="0.1" max="120" step="0.1" placeholder="z. B. 28.5">
+
+ + +
+
+ +
+
@@ -1327,8 +1346,9 @@ window.Page_dog_profile = (() => { rasse_id: fd.rasse_id ? parseInt(fd.rasse_id) : null, geburtstag: fd.geburtstag || null, geschlecht: fd.geschlecht || null, - gewicht_kg: fd.gewicht_kg ? parseFloat(fd.gewicht_kg) : null, - chip_nr: fd.chip_nr || null, + gewicht_kg: fd.gewicht_kg ? parseFloat(fd.gewicht_kg) : null, + widerrist_cm: fd.widerrist_cm ? parseFloat(fd.widerrist_cm) : null, + chip_nr: fd.chip_nr || null, bio: fd.bio || null, is_public: 'is_public' in fd, fell_typ: fd.fell_typ || null, diff --git a/backend/static/sw.js b/backend/static/sw.js index e9b1388..afcf8f7 100644 --- a/backend/static/sw.js +++ b/backend/static/sw.js @@ -3,7 +3,7 @@ Offline-Cache + Push Notifications + Tile-Cache ============================================================ */ -const CACHE_VERSION = 'by-v872'; +const CACHE_VERSION = 'by-v873'; const CACHE_STATIC = `${CACHE_VERSION}-static`; const CACHE_TILES = 'ban-yaro-tiles-v1'; // bleibt über SW-Updates erhalten const CACHE_API = 'ban-yaro-api-v1'; // API-Response-Cache