add Tournaments and Guest Page, add template for empty sites, extend user and db service

This commit is contained in:
David Rodenkirchen 2024-08-27 23:49:07 +02:00
parent 23070a4f69
commit 093f0d6a94
7 changed files with 186 additions and 3 deletions

View File

@ -69,12 +69,12 @@ if __name__ == "__main__":
Page(
name="Guests",
page_url="guests",
build=lambda: pages.PlaceholderPage(placeholder_name="Teilnehmer"),
build=pages.GuestsPage,
),
Page(
name="Tournaments",
page_url="tournaments",
build=lambda: pages.PlaceholderPage(placeholder_name="Turniere"),
build=pages.TournamentsPage,
),
Page(
name="FAQ",

View File

@ -0,0 +1,83 @@
from typing import Optional
from rio import Column, Component, event, TextStyle, Text, Button, Row, TextInput, Spacer, TextInputChangeEvent
from src.ez_lan_manager import ConfigurationService, UserService, TicketingService, SeatingService
from src.ez_lan_manager.components.MainViewContentBox import MainViewContentBox
from src.ez_lan_manager.pages import BasePage
from src.ez_lan_manager.types.User import User
class GuestsPage(Component):
table_elements: list[Button] = []
users_with_tickets: list[User] = []
user_filter: Optional[str] = None
def __post_init__(self) -> None:
user_service = self.session[UserService]
all_users = user_service.get_all_users()
ticketing_service = self.session[TicketingService]
self.users_with_tickets = list(filter(lambda user: ticketing_service.get_user_ticket(user.user_id) is not None, all_users))
@event.on_populate
async def on_populate(self) -> None:
await self.session.set_title(f"{self.session[ConfigurationService].get_lan_info().name} - Teilnehmer")
def on_searchbar_content_change(self, change_event: TextInputChangeEvent) -> None:
self.user_filter = change_event.text
def build(self) -> Component:
seating_service = self.session[SeatingService]
if self.user_filter:
users = [user for user in self.users_with_tickets if self.user_filter.lower() in user.user_name or self.user_filter.lower() in str(user.user_id)]
else:
users = self.users_with_tickets
self.table_elements.clear()
for idx, user in enumerate(users):
seat = seating_service.get_user_seat(user.user_id)
self.table_elements.append(
Button(
content=Row(Text(text=f"{user.user_id:0>4}", align_x=0, margin_right=1), Text(text=user.user_name, grow_x=True, wrap="ellipsize"), Text(text="-" if seat is None else seat.seat_id, align_x=1)),
shape="rectangle",
grow_x=True,
color=self.session.theme.hud_color if idx % 2 == 0 else self.session.theme.primary_color
)
)
return BasePage(
content=Column(
MainViewContentBox(
Column(
Text(
text="Teilnehmer",
style=TextStyle(
fill=self.session.theme.background_color,
font_size=1.2
),
margin_top=2,
margin_bottom=2,
align_x=0.5
),
TextInput(
label="Suche nach Name oder ID",
margin=1,
margin_left=3,
margin_right=3,
on_change=self.on_searchbar_content_change
),
Button(
content=Row(Text(text="ID ", align_x=0, margin_right=1), Text(text="Benutzername", grow_x=True), Text(text="Sitzplatz", align_x=1)),
shape="rectangle",
grow_x=True,
color=self.session.theme.primary_color,
style="plain",
is_sensitive=False
),
*self.table_elements,
Spacer(min_height=1)
)
),
align_y=0
)
)

View File

@ -0,0 +1,40 @@
from rio import Column, Component, event, TextStyle, Text
from src.ez_lan_manager import ConfigurationService
from src.ez_lan_manager.components.MainViewContentBox import MainViewContentBox
from src.ez_lan_manager.pages import BasePage
class PAGENAME(Component):
@event.on_populate
async def on_populate(self) -> None:
await self.session.set_title(f"{self.session[ConfigurationService].get_lan_info().name} - PAGENAME")
def build(self) -> Component:
return BasePage(
content=Column(
MainViewContentBox(
Column(
Text(
text="HEADER",
style=TextStyle(
fill=self.session.theme.background_color,
font_size=1.2
),
margin_top=2,
margin_bottom=0,
align_x=0.5
),
Text(
text="BASIC TEXT",
style=TextStyle(
fill=self.session.theme.background_color,
font_size=0.9
),
margin=1,
wrap=True
)
)
),
align_y=0
)
)

View File

@ -0,0 +1,40 @@
from rio import Column, Component, event, TextStyle, Text
from src.ez_lan_manager import ConfigurationService
from src.ez_lan_manager.components.MainViewContentBox import MainViewContentBox
from src.ez_lan_manager.pages import BasePage
class TournamentsPage(Component):
@event.on_populate
async def on_populate(self) -> None:
await self.session.set_title(f"{self.session[ConfigurationService].get_lan_info().name} - Turniere")
def build(self) -> Component:
return BasePage(
content=Column(
MainViewContentBox(
Column(
Text(
text="Turniere",
style=TextStyle(
fill=self.session.theme.background_color,
font_size=1.2
),
margin_top=2,
margin_bottom=0,
align_x=0.5
),
Text(
text="Aktuell ist noch kein Turnierplan hinterlegt.",
style=TextStyle(
fill=self.session.theme.background_color,
font_size=0.9
),
margin=1,
wrap=True
)
)
),
align_y=0
)
)

View File

@ -10,3 +10,5 @@ from .ImprintPage import ImprintPage
from .ContactPage import ContactPage
from .RulesPage import RulesPage
from .FaqPage import FaqPage
from .TournamentsPage import TournamentsPage
from .GuestsPage import GuestsPage

View File

@ -518,3 +518,18 @@ class DatabaseService:
except Exception as e:
logger.warning(f"Error setting user profile picture: {e}")
return None
def get_all_users(self) -> list[User]:
results = []
cursor = self._get_cursor()
try:
cursor.execute("SELECT * FROM users;")
self._connection.commit()
except Exception as e:
logger.warning(f"Error getting all users: {e}")
return results
for user_raw in cursor.fetchall():
results.append(self._map_db_result_to_user(user_raw))
return results

View File

@ -16,6 +16,9 @@ class UserService:
def __init__(self, db_service: DatabaseService) -> None:
self._db_service = db_service
def get_all_users(self) -> list[User]:
return self._db_service.get_all_users()
def get_user(self, accessor: Optional[Union[str, int]]) -> Optional[User]:
if accessor is None:
return