Loading poolpay/admin/PoolPayAdminApp.py +21 −0 Original line number Diff line number Diff line from datetime import UTC, datetime from io import StringIO from textual.app import App, ComposeResult from textual.containers import VerticalScroll from textual.events import DeliveryComplete from textual.widgets import Footer, Header from poolpay import db from poolpay.admin.AddPerson import AddPerson from poolpay.admin.PersonsTable import PersonsTable, to_row from poolpay.csv.get_persons_csv import get_persons_csv from poolpay.model.Card import Card from poolpay.model.Person import Person Loading @@ -14,6 +19,7 @@ class PoolPayAdminApp(App): BINDINGS = [ ("n", "add_person", "Neue Person hinzufügen"), ("d", "toggle_dark", "Dark Mode umschalten"), ("e", "export_csv", "CSV exportieren"), ("f5", "reload", "Neu laden"), ] Loading @@ -26,6 +32,12 @@ class PoolPayAdminApp(App): self.title = "PoolPay" self.sub_title = "Administration" def on_delivery_complete(self, delivery_complete: DeliveryComplete) -> None: self.notify(f"Gespeichert unter {delivery_complete.path}") def on_delivery_failed(self) -> None: self.notify("Speichern fehlgeschlagen", severity="error") def action_reload(self) -> None: table = self.query_one(PersonsTable) table.reload() Loading @@ -43,3 +55,12 @@ class PoolPayAdminApp(App): self.query_one(PersonsTable).add_rows((to_row(p),)) self.push_screen(AddPerson(), callback=add_person) def action_export_csv(self) -> None: persons_csv = get_persons_csv() # Timestamp in the form "2025-06-04T190207Z" (UTC date, only second-level precision) now = datetime.now(tz=UTC).isoformat()[:19].replace(":", "") + "Z" filename = f"{now}_poolpay.csv" self.deliver_text(StringIO(persons_csv), save_filename=filename) Loading
poolpay/admin/PoolPayAdminApp.py +21 −0 Original line number Diff line number Diff line from datetime import UTC, datetime from io import StringIO from textual.app import App, ComposeResult from textual.containers import VerticalScroll from textual.events import DeliveryComplete from textual.widgets import Footer, Header from poolpay import db from poolpay.admin.AddPerson import AddPerson from poolpay.admin.PersonsTable import PersonsTable, to_row from poolpay.csv.get_persons_csv import get_persons_csv from poolpay.model.Card import Card from poolpay.model.Person import Person Loading @@ -14,6 +19,7 @@ class PoolPayAdminApp(App): BINDINGS = [ ("n", "add_person", "Neue Person hinzufügen"), ("d", "toggle_dark", "Dark Mode umschalten"), ("e", "export_csv", "CSV exportieren"), ("f5", "reload", "Neu laden"), ] Loading @@ -26,6 +32,12 @@ class PoolPayAdminApp(App): self.title = "PoolPay" self.sub_title = "Administration" def on_delivery_complete(self, delivery_complete: DeliveryComplete) -> None: self.notify(f"Gespeichert unter {delivery_complete.path}") def on_delivery_failed(self) -> None: self.notify("Speichern fehlgeschlagen", severity="error") def action_reload(self) -> None: table = self.query_one(PersonsTable) table.reload() Loading @@ -43,3 +55,12 @@ class PoolPayAdminApp(App): self.query_one(PersonsTable).add_rows((to_row(p),)) self.push_screen(AddPerson(), callback=add_person) def action_export_csv(self) -> None: persons_csv = get_persons_csv() # Timestamp in the form "2025-06-04T190207Z" (UTC date, only second-level precision) now = datetime.now(tz=UTC).isoformat()[:19].replace(":", "") + "Z" filename = f"{now}_poolpay.csv" self.deliver_text(StringIO(persons_csv), save_filename=filename)