142 lines
6.7 KiB
Python
142 lines
6.7 KiB
Python
from typing import Optional
|
|
|
|
from bson import ObjectId
|
|
from rio import Component, Rectangle, Column, Text, Row, PointerEventListener, TextInput
|
|
from rio.event import on_populate
|
|
|
|
from elm.types import UserSession, Ticket, Seat
|
|
from elm.components import ElmButton
|
|
from elm.services import UserService
|
|
|
|
|
|
class AccountInfoBox(Component):
|
|
mail: str = ""
|
|
new_password: str = ""
|
|
account_info_text: str = " "
|
|
account_info_is_error: bool = False
|
|
password_input_blocked: bool = False
|
|
password_change_in_progress: bool = False
|
|
ticket: Optional[Ticket] = None
|
|
seat: Optional[Seat] = None
|
|
|
|
@on_populate
|
|
async def on_populate(self) -> None:
|
|
try:
|
|
user = await self.session[UserService].get_user(self.session[UserSession].user_name)
|
|
if user:
|
|
self.mail = user.user_mail
|
|
self.ticket = await Ticket.find_one({"owner.$id": user.id})
|
|
self.seat = await Seat.find_one({"user.$id": ObjectId(user.id)})
|
|
else:
|
|
self.session.navigate_to("./login")
|
|
except KeyError:
|
|
self.session.navigate_to("./login")
|
|
|
|
async def set_new_password(self) -> None:
|
|
self.password_change_in_progress = True
|
|
self.password_input_blocked = True
|
|
|
|
if len(self.new_password) == 0:
|
|
self.account_info_is_error = True
|
|
self.account_info_text = "Kein Passwort gesetzt"
|
|
self.password_input_blocked = False
|
|
self.password_change_in_progress = False
|
|
return
|
|
|
|
user = await self.session[UserService].get_user(self.session[UserSession].user_name)
|
|
if not user:
|
|
self.account_info_is_error = True
|
|
self.account_info_text = "Unbekannter Fehler"
|
|
self.password_input_blocked = False
|
|
self.password_change_in_progress = False
|
|
return
|
|
|
|
result = await self.session[UserService].change_user_password(user.user_name, self.new_password)
|
|
if result:
|
|
self.account_info_is_error = False
|
|
self.account_info_text = "Passwort geändert"
|
|
self.password_input_blocked = False
|
|
self.password_change_in_progress = False
|
|
else:
|
|
self.account_info_is_error = True
|
|
self.account_info_text = "Unbekannter Fehler"
|
|
self.password_input_blocked = False
|
|
self.password_change_in_progress = False
|
|
|
|
def build(self) -> Component:
|
|
row_col = Row
|
|
ticket_text = "-"
|
|
seat_text = "-"
|
|
if self.ticket:
|
|
ticket_text = self.ticket.category
|
|
if self.seat:
|
|
seat_text = self.seat.seat_id
|
|
if self.session.is_mobile():
|
|
row_col = Column
|
|
|
|
return Rectangle(
|
|
content=Column(
|
|
Rectangle(
|
|
content=Rectangle(
|
|
content=Text("Account Informationen", margin=0.5, selectable=False, overflow="wrap"),
|
|
fill=self.session.theme.header_box_background_color,
|
|
margin=0.4
|
|
),
|
|
stroke_width=0.1,
|
|
stroke_color=self.session.theme.box_border_color,
|
|
),
|
|
Column(
|
|
TextInput(text=self.session[UserSession].user_name, label="Nutzername", is_sensitive=False),
|
|
TextInput(text=self.mail, label="E-Mail Adresse", is_sensitive=False),
|
|
row_col(
|
|
PointerEventListener(
|
|
Rectangle(
|
|
content=Row(Text("Ticket:", margin=1, overflow="wrap", justify="left"), Text(ticket_text, margin=1, overflow="wrap", justify="right")),
|
|
fill=self.session.theme.success_color if self.ticket else self.session.theme.danger_color_dark,
|
|
stroke_width=0.1,
|
|
stroke_color=self.session.theme.success_color if self.ticket else self.session.theme.danger_color,
|
|
hover_fill=self.session.theme.success_color if self.ticket else self.session.theme.danger_color,
|
|
hover_stroke_width=0.1,
|
|
hover_stroke_color=self.session.theme.success_color if self.ticket else self.session.theme.danger_color_dark,
|
|
transition_time=0.2,
|
|
cursor="pointer"
|
|
),
|
|
on_press=lambda _: self.session.navigate_to("./tickets")
|
|
),
|
|
PointerEventListener(
|
|
Rectangle(
|
|
content=Row(Text("Sitzplatz:", margin=1, overflow="wrap", justify="left"), Text(seat_text, margin=1, overflow="wrap", justify="right")),
|
|
fill=self.session.theme.success_color if self.seat else self.session.theme.danger_color_dark,
|
|
stroke_width=0.1,
|
|
stroke_color=self.session.theme.success_color if self.seat else self.session.theme.danger_color,
|
|
hover_fill=self.session.theme.success_color if self.seat else self.session.theme.danger_color,
|
|
hover_stroke_width=0.1,
|
|
hover_stroke_color=self.session.theme.success_color if self.seat else self.session.theme.danger_color_dark,
|
|
transition_time=0.2,
|
|
cursor="pointer"
|
|
),
|
|
on_press=lambda _: self.session.navigate_to("./seating")
|
|
),
|
|
spacing=1
|
|
),
|
|
row_col(
|
|
TextInput(text=self.bind().new_password, label="Neues Passwort", is_secret=True, is_sensitive=not self.password_input_blocked, grow_x=True),
|
|
ElmButton(
|
|
text="Speichern",
|
|
style="normal",
|
|
wrap=self.session.is_mobile(),
|
|
on_press=self.set_new_password,
|
|
is_loading=self.password_change_in_progress
|
|
),
|
|
spacing=1
|
|
),
|
|
Text(text=self.account_info_text, fill=self.session.theme.danger_color if self.account_info_is_error else self.session.theme.success_color),
|
|
spacing=1,
|
|
margin=1
|
|
)
|
|
),
|
|
fill=self.session.theme.box_color,
|
|
stroke_width=0.1,
|
|
stroke_color=self.session.theme.box_border_color
|
|
)
|