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

@ -9,4 +9,6 @@ from .RegisterPage import RegisterPage
from .ImprintPage import ImprintPage
from .ContactPage import ContactPage
from .RulesPage import RulesPage
from .FaqPage import FaqPage
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