diff --git a/apps/tesm-license/pyproject.toml b/apps/tesm-license/pyproject.toml index bcf7f8e..b028cee 100644 --- a/apps/tesm-license/pyproject.toml +++ b/apps/tesm-license/pyproject.toml @@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta" [project] name = "tesm-license" -version = "2.8.13" +version = "2.8.14" description = "TESM-Lizenzserver -- Kunden, Tickets, Lizenzen, Aktivierung" requires-python = ">=3.11" dependencies = [ diff --git a/apps/tesm-license/src/tesm_license/schema.py b/apps/tesm-license/src/tesm_license/schema.py index d4eb61c..34bb93f 100644 --- a/apps/tesm-license/src/tesm_license/schema.py +++ b/apps/tesm-license/src/tesm_license/schema.py @@ -315,7 +315,18 @@ CREATE UNIQUE INDEX IF NOT EXISTS idx_one_open_license_per_ticket_art """ LICENSE_MIGRATIONS: tuple[Migration, ...] = ( - Migration(version=1, name="baseline", sql=V1, allow_integrity_error=True), + Migration( + version=1, + name="baseline", + sql=V1, + allow_integrity_error=True, + geaendert_weil=( + "Der eindeutige Index ueber offene Lizenzen zaehlt seit 2.8.12 die Art mit " + "(Testlizenz neben Volllizenz). Eine frische Installation soll ihn gleich " + "richtig anlegen und nicht erst ueber tesm_license/5 umbauen; auf " + "bestehenden Installationen erledigt das die Migration 5." + ), + ), Migration(version=2, name="revision-timestamp", sql=V2), Migration(version=3, name="funktionsgruppe-fuer-admins", fn=uebergang_funktionsgruppe), Migration(version=4, name="standardgruppen-aufraeumen", fn=uebergang_standardgruppen), diff --git a/apps/tesm-license/src/tesm_license/services/issuance.py b/apps/tesm-license/src/tesm_license/services/issuance.py index 9dc834d..7487a6e 100644 --- a/apps/tesm-license/src/tesm_license/services/issuance.py +++ b/apps/tesm-license/src/tesm_license/services/issuance.py @@ -663,9 +663,16 @@ def ticket_grenze(conn: sqlite3.Connection, license_id: str) -> str | None: # Eine Testlizenz lebt nach ihren eigenen Regeln und nicht nach dem Ticket. if str(row["type"]) == "trial": return None - document = json.loads(str(row["license_document"])) + # Die Spalte, nicht das Dokument. ``resign_license`` setzt im Dokument bei + # **jeder** Revision ein neues ``issued_at`` -- eine Grenze, die darauf + # rechnet, wandert also mit jeder Neusignatur nach vorn. Wer oft genug neu + # signiert, verlaengert damit den Anspruch, ohne das Ticket anzufassen: + # genau die Luecke, die diese Funktion schliessen soll. Live gemessen -- + # Zeile 12.09. 17:45, Dokument nach zwei Revisionen 16.09. 20:20. + # + # Die Spalte ``issued_at`` bleibt bei der ersten Ausstellung stehen. return lic.iso( - lic.parse_iso(str(document["issued_at"])) + timedelta(days=int(ticket["valid_days"])) + lic.parse_iso(str(row["issued_at"])) + timedelta(days=int(ticket["valid_days"])) )