Gebinde verwalten - mit Einzahl und Mehrzahl

Bisher war die Auswahl eine fest im Frontend verdrahtete Liste und es gab nur
eine Form: ueberall stand "3 Glas".

Neu unter Verwaltung > Gebinde: anlegen, umbenennen, loeschen, jeweils mit
Einzahl und Mehrzahl. Die eingebauten Gebinde lassen sich in der Schreibweise
aendern, aber nicht loeschen; ein Gebinde, das ein Artikel verwendet, ebenfalls
nicht.

Der Artikel speichert weiterhin nur die Einzahl als Text - so bleiben
vorhandene Artikel, Sicherungen und CSV-Dateien gueltig, und eine unbekannte
Bezeichnung faellt schlicht auf die Einzahl zurueck. Deshalb zieht ein
Umbenennen die Artikel mit; sonst zeigten sie auf eine Bezeichnung, die es
nicht mehr gibt.

Die Mehrzahl greift jetzt in Artikelliste, Artikelseite (Chargen und Gebinde-
Auswahl), Auslagern und in allen Ablauf- und Einkaufslisten samt Startseite.
Einheiten wie Gramm oder Liter bleiben unveraendert - die haben im Deutschen
keine Mehrzahl.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Scarriffle
2026-07-23 14:24:42 +02:00
parent 0ba968985f
commit fd9045226b
14 changed files with 511 additions and 22 deletions

View File

@@ -0,0 +1,79 @@
import pytest
from fastapi import HTTPException
from app.models import BaseUnit, PackageType, Product, Role, User
from app.routers import package_types
from app.schemas import PackageTypeCreate, PackageTypeUpdate
from app.seed import ensure_builtin_package_types
@pytest.fixture()
def admin(db):
person = User(username="chef", password_hash="x", role=Role.admin)
db.add(person)
db.commit()
db.refresh(person)
return person
def test_eingebaute_gebinde_werden_angelegt(db):
ensure_builtin_package_types(db)
glas = db.query(PackageType).filter(PackageType.singular == "Glas").one()
assert glas.plural == "Gläser"
assert glas.is_builtin is True
# Zweiter Durchlauf darf nichts verdoppeln.
vorher = db.query(PackageType).count()
ensure_builtin_package_types(db)
assert db.query(PackageType).count() == vorher
def test_umbenennen_zieht_die_artikel_mit(db, admin):
"""Artikel verweisen ueber den Text, nicht ueber eine ID.
Ohne das Mitziehen zeigte ein Artikel nach dem Umbenennen auf eine
Bezeichnung, die es nicht mehr gibt - und verloere still seine Mehrzahl.
"""
art = package_types.create_package_type(
PackageTypeCreate(singular="Kanister", plural="Kanister"), db=db, _=admin
)
pesto = Product(name="Öl", base_unit=BaseUnit.milliliter, package_label="Kanister")
db.add(pesto)
db.commit()
package_types.update_package_type(
art.id, PackageTypeUpdate(singular="Kanne", plural="Kannen"), db=db, _=admin
)
db.refresh(pesto)
assert pesto.package_label == "Kanne"
def test_benutztes_gebinde_laesst_sich_nicht_loeschen(db, admin):
art = package_types.create_package_type(
PackageTypeCreate(singular="Kanister", plural="Kanister"), db=db, _=admin
)
db.add(Product(name="Öl", base_unit=BaseUnit.milliliter, package_label="Kanister"))
db.commit()
with pytest.raises(HTTPException) as fehler:
package_types.delete_package_type(art.id, db=db, _=admin)
assert fehler.value.status_code == 409
def test_eingebaute_gebinde_sind_nicht_loeschbar(db, admin):
ensure_builtin_package_types(db)
glas = db.query(PackageType).filter(PackageType.singular == "Glas").one()
with pytest.raises(HTTPException) as fehler:
package_types.delete_package_type(glas.id, db=db, _=admin)
assert fehler.value.status_code == 400
def test_doppelte_bezeichnung_wird_abgelehnt(db, admin):
package_types.create_package_type(
PackageTypeCreate(singular="Kanister", plural="Kanister"), db=db, _=admin
)
with pytest.raises(HTTPException) as fehler:
package_types.create_package_type(
PackageTypeCreate(singular="kanister", plural="Kanister"), db=db, _=admin
)
assert fehler.value.status_code == 409