fix bugs, implement placing orders
This commit is contained in:
@@ -1,19 +1,24 @@
|
||||
from typing import Optional
|
||||
from asyncio import sleep, create_task
|
||||
|
||||
import rio
|
||||
from rio import Component, Column, Text, TextStyle, Button, Row, ScrollContainer, Spacer
|
||||
from rio import Component, Column, Text, TextStyle, Button, Row, ScrollContainer, Spacer, Popup, PopupOpenOrCloseEvent
|
||||
|
||||
from src.ez_lan_manager.components.CateringCartItem import CateringCartItem
|
||||
from src.ez_lan_manager.components.CateringOrderItem import CateringOrderItem
|
||||
from src.ez_lan_manager.services.AccountingService import AccountingService
|
||||
from src.ez_lan_manager.services.CateringService import CateringService
|
||||
from src.ez_lan_manager.types.CateringOrder import CateringOrder
|
||||
from src.ez_lan_manager.services.CateringService import CateringService, CateringError, CateringErrorType
|
||||
from src.ez_lan_manager.types.CateringOrder import CateringOrder, CateringMenuItemsWithAmount
|
||||
from src.ez_lan_manager.types.SessionStorage import SessionStorage
|
||||
|
||||
POPUP_CLOSE_TIMEOUT_SECONDS = 3
|
||||
|
||||
class ShoppingCartAndOrders(Component):
|
||||
show_cart: bool = True
|
||||
orders: list[CateringOrder] = []
|
||||
order_button_loading: bool = False
|
||||
popup_message: str = ""
|
||||
popup_is_shown: bool = False
|
||||
popup_is_error: bool = True
|
||||
|
||||
async def switch(self) -> None:
|
||||
self.show_cart = not self.show_cart
|
||||
@@ -40,15 +45,53 @@ class ShoppingCartAndOrders(Component):
|
||||
if not user_id:
|
||||
return
|
||||
cart = catering_service.get_cart(user_id)
|
||||
cart.append(await catering_service.get_menu_item_by_id(article_id))
|
||||
item_to_add = await catering_service.get_menu_item_by_id(article_id)
|
||||
cart.append(item_to_add)
|
||||
catering_service.save_cart(user_id, cart)
|
||||
await self.force_refresh()
|
||||
|
||||
async def show_popup(self, text: str, is_error: bool) -> None:
|
||||
self.popup_is_error = is_error
|
||||
self.popup_message = text
|
||||
self.popup_is_shown = True
|
||||
await self.force_refresh()
|
||||
await sleep(POPUP_CLOSE_TIMEOUT_SECONDS)
|
||||
self.popup_is_shown = False
|
||||
await self.force_refresh()
|
||||
|
||||
async def on_order_pressed(self) -> None:
|
||||
self.order_button_loading = True
|
||||
await self.force_refresh()
|
||||
|
||||
user_id = self.session[SessionStorage].user_id
|
||||
cart = self.session[CateringService].get_cart(user_id)
|
||||
if len(cart) < 1:
|
||||
_ = create_task(self.show_popup("Warenkorb leer", True))
|
||||
else:
|
||||
items_with_amounts: CateringMenuItemsWithAmount = {}
|
||||
for item in cart:
|
||||
try:
|
||||
items_with_amounts[item] += 1
|
||||
except KeyError:
|
||||
items_with_amounts[item] = 1
|
||||
try:
|
||||
await self.session[CateringService].place_order(items_with_amounts, user_id)
|
||||
except CateringError as catering_error:
|
||||
if catering_error.error_type == CateringErrorType.INCLUDES_DISABLED_ITEM:
|
||||
_ = create_task(self.show_popup("Warenkorb enthält gesperrte Artikel", True))
|
||||
elif catering_error.error_type == CateringErrorType.INSUFFICIENT_FUNDS:
|
||||
_ = create_task(self.show_popup("Guthaben nicht ausreichend", True))
|
||||
else:
|
||||
_ = create_task(self.show_popup("Unbekannter Fehler", True))
|
||||
self.session[CateringService].save_cart(self.session[SessionStorage].user_id, [])
|
||||
self.order_button_loading = False
|
||||
_ = create_task(self.show_popup("Bestellung erfolgreich aufgegeben!", False))
|
||||
|
||||
def build(self) -> rio.Component:
|
||||
user_id = self.session[SessionStorage].user_id
|
||||
catering_service = self.session[CateringService]
|
||||
cart = catering_service.get_cart(user_id)
|
||||
if self.show_cart:
|
||||
cart = catering_service.get_cart(user_id)
|
||||
cart_container = ScrollContainer(
|
||||
content=Column(
|
||||
*[CateringCartItem(
|
||||
@@ -66,6 +109,13 @@ class ShoppingCartAndOrders(Component):
|
||||
)
|
||||
return Column(
|
||||
cart_container,
|
||||
Popup(
|
||||
anchor=cart_container,
|
||||
content=Text(self.popup_message, style=TextStyle(fill=self.session.theme.danger_color if self.popup_is_error else self.session.theme.success_color), wrap=True, margin=2, justify="center", min_width=20),
|
||||
is_open=self.popup_is_shown,
|
||||
position="center",
|
||||
color=self.session.theme.primary_color
|
||||
),
|
||||
Row(
|
||||
Text(
|
||||
text=f"Preis: {AccountingService.make_euro_string_from_int(sum(cart_item.price for cart_item in cart))}",
|
||||
@@ -98,7 +148,9 @@ class ShoppingCartAndOrders(Component):
|
||||
margin_left=0,
|
||||
shape="rectangle",
|
||||
style="major",
|
||||
color="primary"
|
||||
color="primary",
|
||||
on_press=self.on_order_pressed,
|
||||
is_loading=self.order_button_loading
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user