diff --git a/plugins/audit-log/__init__.py b/plugins/audit-log/__init__.py
index 177d63f..dcc0411 100644
--- a/plugins/audit-log/__init__.py
+++ b/plugins/audit-log/__init__.py
@@ -285,6 +285,7 @@ class AuditLogPlugin(BasePlugin):
"ende": offset + len(eintraege),
"url_zurueck": _seiten_url(seite - 1),
"url_weiter": _seiten_url(seite + 1),
+ "seiten_url": _seiten_url,
"url_ohne_seite": f"/audit-log?{basis}" if basis else "/audit-log",
"benutzer_auswahl": benutzer_auswahl,
"aktionen_auswahl": aktionen_auswahl,
diff --git a/plugins/audit-log/templates/audit-log/index.html b/plugins/audit-log/templates/audit-log/index.html
index 20a8fa1..6256029 100644
--- a/plugins/audit-log/templates/audit-log/index.html
+++ b/plugins/audit-log/templates/audit-log/index.html
@@ -117,16 +117,7 @@
0 Einträge
{% endif %}
- {% if gesamt_seiten > 1 %}
-
- {% if seite > 1 %}
-
← Zurück
- {% endif %}
-
Seite {{ seite }} von {{ gesamt_seiten }}
- {% if seite < gesamt_seiten %}
-
Weiter →
- {% endif %}
-
- {% endif %}
+{% from "seitennavigation.html" import seitennavigation %}
+{{ seitennavigation(seiten_url, seite, gesamt_seiten) }}
{% endblock %}
diff --git a/plugins/neuheiten/__init__.py b/plugins/neuheiten/__init__.py
index 9223c20..fef59e2 100644
--- a/plugins/neuheiten/__init__.py
+++ b/plugins/neuheiten/__init__.py
@@ -27,7 +27,8 @@ import logging
import os
import threading
from datetime import datetime, timedelta, timezone
-from urllib.parse import quote
+from math import ceil
+from urllib.parse import quote, urlencode
from fastapi import Depends, Form, HTTPException, Request
from fastapi.responses import RedirectResponse
@@ -113,6 +114,7 @@ class NeuheitenPlugin(BasePlugin):
abwaerts = richtung == "ab" if sort in SORTIERBAR else False
spalte_sortiert = spalte.desc() if abwaerts else spalte.asc()
pro_seite = 50
+ seite_aktuell = max(seite_nr, 1)
with self.context.session_factory() as db:
abfrage = select(Neuheit)
@@ -148,9 +150,11 @@ class NeuheitenPlugin(BasePlugin):
) if j is not None
]
gesamt = db.scalar(select(func.count()).select_from(abfrage.subquery())) or 0
+ gesamt_seiten = max(1, ceil(gesamt / pro_seite))
+ seite_aktuell = min(seite_aktuell, gesamt_seiten)
eintraege = db.scalars(
abfrage.order_by(spalte_sortiert, Neuheit.id.asc())
- .offset((max(seite_nr, 1) - 1) * pro_seite)
+ .offset((seite_aktuell - 1) * pro_seite)
.limit(pro_seite)
).all()
status_optionen = [
@@ -160,7 +164,18 @@ class NeuheitenPlugin(BasePlugin):
]
quellen_zeilen = self._quellen_uebersicht(db)
- hat_weitere = max(seite_nr, 1) * pro_seite < gesamt
+
+ def _seiten_url(nr: int) -> str:
+ parameter = {
+ "q": q,
+ "status": status,
+ "sort": sort if sort in SORTIERBAR else STANDARD_SORTIERUNG[0],
+ "richtung": "ab" if abwaerts else "auf",
+ "seite_nr": str(nr),
+ }
+ if jahr is not None:
+ parameter["jahr"] = str(jahr)
+ return f"/neuheiten?{urlencode(parameter)}"
kontext = {
"user": user,
"titel": self.title,
@@ -182,8 +197,9 @@ class NeuheitenPlugin(BasePlugin):
"suchbegriffe": ", ".join(self._suchbegriffe) or "—",
"sync_aktiv": self._scheduler is not None and self._scheduler.running,
"anzahl": gesamt,
- "hat_weitere": hat_weitere,
- "naechste_seite": max(seite_nr, 1) + 1,
+ "seite": seite_aktuell,
+ "gesamt_seiten": gesamt_seiten,
+ "seiten_url": _seiten_url,
"quellen_zeilen": quellen_zeilen,
"quellen_sync_aktiv": (
os.environ.get("SPIELE_NEUHEITEN_QUELLEN_SYNC_AKTIV", "1").strip()
diff --git a/plugins/neuheiten/templates/neuheiten/_liste.html b/plugins/neuheiten/templates/neuheiten/_liste.html
index f8a57a1..69b7926 100644
--- a/plugins/neuheiten/templates/neuheiten/_liste.html
+++ b/plugins/neuheiten/templates/neuheiten/_liste.html
@@ -122,11 +122,6 @@
+{% from "seitennavigation.html" import seitennavigation %}
+{{ seitennavigation(seiten_url, seite, gesamt_seiten) }}
-{% if hat_weitere %}
-
-
Lade weitere Einträge …
-
-{% endif %}
diff --git a/plugins/planung/__init__.py b/plugins/planung/__init__.py
index a163322..6587003 100644
--- a/plugins/planung/__init__.py
+++ b/plugins/planung/__init__.py
@@ -24,7 +24,8 @@ der Eintrage-Vorgang bricht.
from __future__ import annotations
import logging
-from urllib.parse import quote
+from math import ceil
+from urllib.parse import quote, urlencode
from fastapi import Depends, Form, Request
from fastapi.responses import RedirectResponse
@@ -299,13 +300,22 @@ class PlanungPlugin(BasePlugin):
gesamt = db.scalar(
select(func.count()).select_from(abfrage.subquery())
) or 0
+ gesamt_seiten = max(1, ceil(gesamt / pro_seite))
+ seite_aktuell = min(max(seite_nr, 1), gesamt_seiten)
eintraege = db.scalars(
abfrage.order_by(
Planungseintrag.aktualisiert_am.desc(), Planungseintrag.id.desc()
)
- .offset((max(seite_nr, 1) - 1) * pro_seite)
+ .offset((seite_aktuell - 1) * pro_seite)
.limit(pro_seite)
).all()
+
+ def _seiten_url(nr: int) -> str:
+ parameter = {"seite_nr": str(nr)}
+ if status in GUELTIGE_STATUS:
+ parameter["status"] = status
+ return f"/planung?{urlencode(parameter)}"
+
namen = {
benutzer.id: (benutzer.display_name or benutzer.username)
for benutzer in db.scalars(select(User)).all()
@@ -326,8 +336,9 @@ class PlanungPlugin(BasePlugin):
"meldung": meldung[:300],
"fehler": fehler[:300],
"anzahl": gesamt,
- "hat_weitere": max(seite_nr, 1) * pro_seite < gesamt,
- "naechste_seite": max(seite_nr, 1) + 1,
+ "seite": seite_aktuell,
+ "gesamt_seiten": gesamt_seiten,
+ "seiten_url": _seiten_url,
},
)
diff --git a/plugins/planung/templates/planung/index.html b/plugins/planung/templates/planung/index.html
index fe4cd6b..b665cd7 100644
--- a/plugins/planung/templates/planung/index.html
+++ b/plugins/planung/templates/planung/index.html
@@ -217,13 +217,8 @@
-{% if hat_weitere %}
-
-
Lade weitere Einträge …
-
-{% endif %}
+{% from "seitennavigation.html" import seitennavigation %}
+{{ seitennavigation(seiten_url, seite, gesamt_seiten) }}
1 %}
+
+{% endif %}
+{% endmacro %}