improve news and news manager

This commit is contained in:
David Rodenkirchen 2024-11-29 20:16:12 +01:00
parent 947a05ad14
commit a1fb68c976
3 changed files with 55 additions and 51 deletions

View File

@ -2,7 +2,7 @@ from datetime import datetime
from functools import partial from functools import partial
from typing import Optional, Callable from typing import Optional, Callable
from rio import Component, Rectangle, Text, TextStyle, Column, Row, TextInput, DateInput, MultiLineTextInput, IconButton, Color, Button from rio import Component, Rectangle, Text, TextStyle, Column, Row, TextInput, DateInput, MultiLineTextInput, IconButton, Color, Button, ThemeContextSwitcher
class NewsPost(Component): class NewsPost(Component):
@ -94,56 +94,59 @@ class EditableNewsPost(NewsPost):
self.__setattr__(prop, value) self.__setattr__(prop, value)
def build(self) -> Component: def build(self) -> Component:
return Rectangle( return ThemeContextSwitcher(
content=Column( content=Rectangle(
Row( content=Column(
TextInput( Row(
text=self.title, TextInput(
label="Titel", text=self.title,
style="rounded", label="Titel",
min_width=15, style="rounded",
on_change=lambda e: self.set_prop("title", e.text) min_width=15,
on_change=lambda e: self.set_prop("title", e.text)
),
DateInput(
value=datetime.strptime(self.date, "%d.%m.%Y"),
style="rounded",
on_change=lambda e: self.set_prop("date", e.value.strftime("%d.%m.%Y"))
)
), ),
DateInput(
value=datetime.strptime(self.date, "%d.%m.%Y"),
style="rounded",
on_change=lambda e: self.set_prop("date", e.value.strftime("%d.%m.%Y"))
)
),
TextInput(
text=self.subtitle,
label="Untertitel",
style="rounded",
grow_x=True,
on_change=lambda e: self.set_prop("subtitle", e.text)
),
MultiLineTextInput(
text=self.text,
label="Text",
style="rounded",
grow_x=True,
min_height=12,
on_change=lambda e: self.set_prop("text", e.text)
),
Row(
TextInput( TextInput(
text=self.author, text=self.subtitle,
label="Autor", label="Untertitel",
style="rounded", style="rounded",
grow_x=True, grow_x=True,
on_change=lambda e: self.set_prop("author", e.text) on_change=lambda e: self.set_prop("subtitle", e.text)
), ),
Rectangle(content=Button(icon="material/delete", style="major", color="danger", shape="rectangle", on_press=partial(self.delete_cb, self.news_id)), fill=Color.from_hex("0b7372")), MultiLineTextInput(
Rectangle(content=Button(icon="material/save", style="major", color="success", shape="rectangle", on_press=partial(self.save_cb, self)), fill=Color.from_hex("0b7372")) text=self.text,
) label="Text",
style="rounded",
grow_x=True,
min_height=12,
on_change=lambda e: self.set_prop("text", e.text)
),
Row(
TextInput(
text=self.author,
label="Autor",
style="rounded",
grow_x=True,
on_change=lambda e: self.set_prop("author", e.text)
),
Rectangle(content=Button(icon="material/delete", style="major", color="danger", shape="rectangle", on_press=partial(self.delete_cb, self.news_id)), fill=Color.from_hex("0b7372")),
Rectangle(content=Button(icon="material/save", style="major", color="success", shape="rectangle", on_press=partial(self.save_cb, self)), fill=Color.from_hex("0b7372"))
)
),
fill=self.session.theme.primary_color,
margin_left=1,
margin_right=1,
margin_top=2,
margin_bottom=1,
shadow_radius=0.2,
shadow_color=self.session.theme.background_color,
shadow_offset_y=0,
corner_radius=0.2
), ),
fill=self.session.theme.primary_color, color="primary"
margin_left=1,
margin_right=1,
margin_top=2,
margin_bottom=1,
shadow_radius=0.2,
shadow_color=self.session.theme.background_color,
shadow_offset_y=0,
corner_radius=0.2
) )

View File

@ -63,7 +63,7 @@ class ManageNewsPage(Component):
self.news_posts = (await self.session[NewsService].get_news())[:8] self.news_posts = (await self.session[NewsService].get_news())[:8]
def build(self) -> Component: def build(self) -> Component:
posts = sorted([EditableNewsPost( posts = [EditableNewsPost(
news_id=news.news_id, news_id=news.news_id,
title=news.title, title=news.title,
subtitle=news.subtitle, subtitle=news.subtitle,
@ -72,7 +72,7 @@ class ManageNewsPage(Component):
author=news.author.user_name, author=news.author.user_name,
save_cb=self.on_news_post_changed, save_cb=self.on_news_post_changed,
delete_cb=self.on_news_post_deleted delete_cb=self.on_news_post_deleted
) for news in self.news_posts], key=lambda p: p.date) ) for news in self.news_posts]
return Column( return Column(
MainViewContentBox( MainViewContentBox(
Column( Column(

View File

@ -17,12 +17,13 @@ class NewsService:
return return
await self._db_service.add_news(news) await self._db_service.add_news(news)
async def get_news(self, dt_start: Optional[date] = None, dt_end: Optional[date] = None) -> list[News]: async def get_news(self, dt_start: Optional[date] = None, dt_end: Optional[date] = None, newest_first: bool = True) -> list[News]:
if not dt_end: if not dt_end:
dt_end = date.today() dt_end = date.today()
if not dt_start: if not dt_start:
dt_start = date(1900, 1, 1) dt_start = date(1900, 1, 1)
return await self._db_service.get_news(dt_start, dt_end) fetched_news = await self._db_service.get_news(dt_start, dt_end)
return sorted(fetched_news, key=lambda news: news.news_date, reverse=newest_first)
async def update_news(self, news: News) -> None: async def update_news(self, news: News) -> None:
return await self._db_service.update_news(news) return await self._db_service.update_news(news)