aiomysql refactor

This commit is contained in:
David Rodenkirchen
2024-09-03 14:30:32 +02:00
parent a9597b5c4f
commit 30b32a4c02
24 changed files with 901 additions and 755 deletions
@@ -1,10 +1,8 @@
from datetime import datetime
from typing import Callable
import rio
from rio import Component, Row, Text, IconButton, TextStyle, Color
from rio import Component, Row, Text, TextStyle, Color
from src.ez_lan_manager import AccountingService
from src.ez_lan_manager.types.CateringOrder import CateringOrderStatus
MAX_LEN = 24
@@ -6,19 +6,13 @@ from src.ez_lan_manager.components.UserInfoAndLoginBox import UserInfoAndLoginBo
from src.ez_lan_manager.types.SessionStorage import SessionStorage
class DesktopNavigation(Component):
def __post_init__(self) -> None:
self.session[SessionStorage].subscribe_to_logged_in_or_out_event(self.__class__.__name__, self.refresh_cb)
async def refresh_cb(self) -> None:
await self.force_refresh()
def build(self) -> Component:
lan_info = self.session[ConfigurationService].get_lan_info()
return Card(
Column(
Text(lan_info.name, align_x=0.5, margin_top=0.3, style=TextStyle(fill=self.session.theme.hud_color, font_size=2.5)),
Text(f"Edition {lan_info.iteration}", align_x=0.5, style=TextStyle(fill=self.session.theme.hud_color, font_size=1.2), margin_top=0.3, margin_bottom=2),
UserInfoAndLoginBox(refresh_cb=self.refresh_cb),
UserInfoAndLoginBox(),
DesktopNavigationButton("News", "./news"),
Spacer(min_height=1),
DesktopNavigationButton(f"Über {lan_info.name} {lan_info.iteration}", "./overview"),
@@ -1,3 +1,5 @@
from typing import Optional
import rio
from rio import Component, Column, Text, TextStyle, Button, Row, ScrollContainer, Spacer
@@ -11,9 +13,11 @@ from src.ez_lan_manager.types.SessionStorage import SessionStorage
class ShoppingCartAndOrders(Component):
show_cart: bool = True
orders: list[CateringOrder] = []
async def switch(self) -> None:
self.show_cart = not self.show_cart
self.orders = await self.session[CateringService].get_orders_for_user(self.session[SessionStorage].user_id)
async def on_remove_item(self, list_id: int) -> None:
catering_service = self.session[CateringService]
@@ -36,7 +40,7 @@ class ShoppingCartAndOrders(Component):
if not user_id:
return
cart = catering_service.get_cart(user_id)
cart.append(catering_service.get_menu_item_by_id(article_id))
cart.append(await catering_service.get_menu_item_by_id(article_id))
catering_service.save_cart(user_id, cart)
await self.force_refresh()
@@ -99,14 +103,13 @@ class ShoppingCartAndOrders(Component):
)
)
else:
orders = catering_service.get_orders_for_user(user_id)
orders_container = ScrollContainer(
content=Column(
*[CateringOrderItem(
order_id=order_item.order_id,
order_datetime=order_item.order_date,
order_status=order_item.status,
) for order_item in orders],
) for order_item in self.orders],
Spacer(grow_y=True)
),
min_height=8,
@@ -1,15 +1,17 @@
import logging
from random import choice
from typing import Callable
from typing import Optional
from rio import Component, Column, Text, Row, Rectangle, Button, TextStyle, Color, Spacer, TextInput, Link
from rio import Component, Column, Text, Row, Rectangle, Button, TextStyle, Color, Spacer, TextInput, Link, event
from src.ez_lan_manager import UserService
from src.ez_lan_manager.components.UserInfoBoxButton import UserInfoBoxButton
from src.ez_lan_manager.services.AccountingService import AccountingService
from src.ez_lan_manager.services.DatabaseService import NoDatabaseConnectionError, DatabaseService
from src.ez_lan_manager.services.TicketingService import TicketingService
from src.ez_lan_manager.services.SeatingService import SeatingService
from src.ez_lan_manager.types.Seat import Seat
from src.ez_lan_manager.types.Ticket import Ticket
from src.ez_lan_manager.types.User import User
from src.ez_lan_manager.types.SessionStorage import SessionStorage
logger = logging.getLogger(__name__.split(".")[-1])
@@ -39,9 +41,20 @@ class StatusButton(Component):
class UserInfoAndLoginBox(Component):
refresh_cb: Callable
TEXT_STYLE = TextStyle(fill=Color.from_hex("02dac5"), font_size=0.9)
show_login: bool = True
user: Optional[User] = None
user_balance: Optional[int] = 0
user_ticket: Optional[Ticket] = None
user_seat: Optional[Seat] = None
@event.on_populate
async def async_init(self) -> None:
if self.session[SessionStorage].user_id:
self.user = await self.session[UserService].get_user(self.session[SessionStorage].user_id)
self.user_balance = await self.session[AccountingService].get_balance(self.user.user_id)
self.user_ticket = await self.session[TicketingService].get_user_ticket(self.user.user_id)
self.user_seat = await self.session[SeatingService].get_user_seat(self.user.user_id)
@staticmethod
def get_greeting() -> str:
@@ -64,13 +77,13 @@ class UserInfoAndLoginBox(Component):
async def _on_login_pressed(self) -> None:
user_name = self.user_name_input.text.lower()
if self.session[UserService].is_login_valid(user_name, self.password_input.text):
if await self.session[UserService].is_login_valid(user_name, self.password_input.text):
self.user_name_input.is_valid = True
self.password_input.is_valid = True
self.login_button.is_loading = False
await self.session[SessionStorage].set_user_id(self.session[UserService].get_user(user_name).user_id)
await self.session[SessionStorage].set_user_id((await self.session[UserService].get_user(user_name)).user_id)
await self.async_init()
self.show_login = False
await self.refresh_cb()
else:
self.user_name_input.is_valid = False
self.password_input.is_valid = False
@@ -114,7 +127,7 @@ class UserInfoAndLoginBox(Component):
on_press=lambda: self.session.navigate_to("./forgot-password")
)
if self.show_login and self.session[SessionStorage].user_id is None:
if self.user is None and self.session[SessionStorage].user_id is None:
return Rectangle(
content=Column(
self.user_name_input,
@@ -139,25 +152,31 @@ class UserInfoAndLoginBox(Component):
margin_top=0.3,
margin_bottom=2
)
elif self.user is None and self.session[SessionStorage].user_id is not None:
return Rectangle(
content=Column(),
fill=Color.TRANSPARENT,
min_height=8,
min_width=12,
align_x=0.5,
margin_top=0.3,
margin_bottom=2
)
else:
user = self.session[UserService].get_user(self.session[SessionStorage].user_id)
if user is None:
logger.warning("User could not be found, this should not have happend.")
a_s = self.session[AccountingService]
return Rectangle(
content=Column(
Text(f"{self.get_greeting()},", style=TextStyle(fill=Color.from_hex("02dac5"), font_size=0.9), justify="center"),
Text(f"{user.user_name}", style=TextStyle(fill=Color.from_hex("02dac5"), font_size=1.2), justify="center"),
Text(f"{self.user.user_name}", style=TextStyle(fill=Color.from_hex("02dac5"), font_size=1.2), justify="center"),
Row(
StatusButton(label="TICKET", target_url="./buy_ticket",
enabled=self.session[TicketingService].get_user_ticket(user.user_id) is not None),
enabled=self.user_ticket is not None),
StatusButton(label="SITZPLATZ", target_url="./seating",
enabled=self.session[SeatingService].get_user_seat(user.user_id) is not None),
enabled=self.user_seat is not None),
proportions=(50, 50),
grow_y=False
),
UserInfoBoxButton("Profil bearbeiten", "./edit-profile"),
UserInfoBoxButton(f"Guthaben: {a_s.make_euro_string_from_int(a_s.get_balance(user.user_id))}", "./account"),
UserInfoBoxButton(f"Guthaben: {self.session[AccountingService].make_euro_string_from_int(self.user_balance)}", "./account"),
Button(
content=Text("Ausloggen", style=TextStyle(fill=Color.from_hex("02dac5"), font_size=0.6)),
shape="rectangle",