ezgg-lan-manager/src/ez_lan_manager/pages/ManageNewsPage.py
2025-05-13 07:10:24 +02:00

132 lines
5.1 KiB
Python

import logging
from asyncio import sleep
from datetime import datetime
from time import strptime
from rio import Column, Component, event, TextStyle, Text
from src.ez_lan_manager import ConfigurationService, UserService
from src.ez_lan_manager.components.MainViewContentBox import MainViewContentBox
from src.ez_lan_manager.components.NewsPost import EditableNewsPost
from src.ez_lan_manager.services.NewsService import NewsService
from src.ez_lan_manager.types.News import News
logger = logging.getLogger(__name__.split(".")[-1])
class ManageNewsPage(Component):
news_posts: list[News] = []
show_success_message = False
@event.on_populate
async def on_populate(self) -> None:
await self.session.set_title(f"{self.session[ConfigurationService].get_lan_info().name} - News Verwaltung")
self.news_posts = (await self.session[NewsService].get_news())[:8]
async def on_new_news_post(self, post: EditableNewsPost) -> None:
# @todo: For some reason, new posts do not appear through a force_refresh, only after visiting the page again
author = await self.session[UserService].get_user(post.author)
if author is None:
logger.warning(f"Tried to set news post author to '{post.author}', which does not exist.")
return
await self.session[NewsService].add_news(News(
news_id=None,
title=post.title,
subtitle=post.subtitle,
content=post.text,
author=author,
news_date=strptime(post.date, "%d.%m.%Y"),
))
self.news_posts = (await self.session[NewsService].get_news())[:8]
self.show_success_message = True
self.force_refresh()
await sleep(3)
self.show_success_message = False
self.force_refresh()
async def on_news_post_changed(self, post: EditableNewsPost) -> None:
author = await self.session[UserService].get_user(post.author)
if author is None:
logger.warning(f"Tried to set news post author to '{post.author}', which does not exist.")
return
await self.session[NewsService].update_news(News(
news_id=post.news_id,
title=post.title,
subtitle=post.subtitle,
content=post.text,
author=author,
news_date=strptime(post.date, "%d.%m.%Y"),
))
self.news_posts = (await self.session[NewsService].get_news())[:8]
async def on_news_post_deleted(self, news_id: int) -> None:
await self.session[NewsService].delete_news(news_id)
self.news_posts = (await self.session[NewsService].get_news())[:8]
def build(self) -> Component:
posts = [EditableNewsPost(
news_id=news.news_id,
title=news.title,
subtitle=news.subtitle,
text=news.content,
date=news.news_date.strftime("%d.%m.%Y"),
author=news.author.user_name,
save_cb=self.on_news_post_changed,
delete_cb=self.on_news_post_deleted
) for news in self.news_posts]
return Column(
MainViewContentBox(
Column(
Text(
text="News Verwaltung",
fill=self.session.theme.background_color,
style=TextStyle(
font_size=1.2
),
margin_top=2,
margin_bottom=0,
align_x=0.5
),
Text(
text="Neuen News Post erstellen",
fill=self.session.theme.background_color,
style=TextStyle(
font_size=1.1
),
margin_top=2,
margin_bottom=0,
align_x=0.5
),
EditableNewsPost(
title="",
subtitle="",
text="",
date=datetime.now().strftime("%d.%m.%Y"),
author="",
save_cb=self.on_new_news_post
),
Text(
text="Post erfolgreich erstellt",
fill=self.session.theme.success_color,
style=TextStyle(
font_size=0.7 if self.show_success_message else 0
),
margin_top=0.1,
margin_bottom=0,
align_x=0.5
),
Text(
text="Bisherige Posts",
fill=self.session.theme.background_color,
style=TextStyle(
font_size=1.1
),
margin_top=2,
margin_bottom=0,
align_x=0.5
),
*posts
)
),
align_y=0
)