From 85619feed5ff6c2291521b26e8612596d2629977 Mon Sep 17 00:00:00 2001 From: David Rodenkirchen Date: Wed, 20 May 2026 22:51:52 +0200 Subject: [PATCH] initial commit --- 502.html | 22 ++ config.example.toml | 53 +++++ src/elm/__init__.py | 100 +++++++++ src/elm/assets/PixelOperatorMono8-Bold.ttf | Bin 0 -> 18624 bytes src/elm/assets/PixelOperatorMono8.ttf | Bin 0 -> 19872 bytes src/elm/assets/custom_icons/ts3.svg | 1 + src/elm/assets/img/anon.png | Bin 0 -> 102500 bytes src/elm/assets/img/crackz.png | Bin 0 -> 58443 bytes src/elm/assets/img/favicon.png | Bin 0 -> 1247 bytes src/elm/assets/img/news_image.jpg | Bin 0 -> 59125 bytes src/elm/assets/img/rio.png | Bin 0 -> 9429 bytes src/elm/components/AccountInfoBox.py | 125 ++++++++++++ src/elm/components/AvatarEditBox.py | 87 ++++++++ src/elm/components/ElmButton.py | 63 ++++++ src/elm/components/HeaderBar.py | 186 +++++++++++++++++ src/elm/components/LanCountdownBox.py | 135 +++++++++++++ src/elm/components/LanInfoBox.py | 97 +++++++++ src/elm/components/LandingPageBox.py | 77 +++++++ src/elm/components/NavigationBar.py | 143 +++++++++++++ src/elm/components/PersonalInfoBox.py | 76 +++++++ src/elm/components/RootComponent.py | 24 +++ src/elm/components/UserNavigation.py | 80 ++++++++ src/elm/components/__init__.py | 8 + src/elm/pages/ForgotPasswordPage.py | 84 ++++++++ src/elm/pages/LandingPage.py | 81 ++++++++ src/elm/pages/LoginPage.py | 106 ++++++++++ src/elm/pages/LogoutPage.py | 25 +++ src/elm/pages/MyBalancePage.py | 224 +++++++++++++++++++++ src/elm/pages/MyProfilePage.py | 54 +++++ src/elm/pages/RegisterPage.py | 147 ++++++++++++++ src/elm/services/AccountingService.py | 150 ++++++++++++++ src/elm/services/ConfigurationService.py | 119 +++++++++++ src/elm/services/DatabaseService.py | 37 ++++ src/elm/services/LocalDataService.py | 26 +++ src/elm/services/MailingService.py | 55 +++++ src/elm/services/UserService.py | 84 ++++++++ src/elm/services/__init__.py | 6 + src/elm/types/ConfigurationTypes.py | 46 +++++ src/elm/types/Transaction.py | 25 +++ src/elm/types/User.py | 29 +++ src/elm/types/UserSession.py | 11 + src/elm/types/__init__.py | 4 + src/elm/types/helpers.py | 2 + 43 files changed, 2592 insertions(+) create mode 100644 502.html create mode 100644 config.example.toml create mode 100644 src/elm/__init__.py create mode 100644 src/elm/assets/PixelOperatorMono8-Bold.ttf create mode 100644 src/elm/assets/PixelOperatorMono8.ttf create mode 100644 src/elm/assets/custom_icons/ts3.svg create mode 100644 src/elm/assets/img/anon.png create mode 100644 src/elm/assets/img/crackz.png create mode 100644 src/elm/assets/img/favicon.png create mode 100644 src/elm/assets/img/news_image.jpg create mode 100644 src/elm/assets/img/rio.png create mode 100644 src/elm/components/AccountInfoBox.py create mode 100644 src/elm/components/AvatarEditBox.py create mode 100644 src/elm/components/ElmButton.py create mode 100644 src/elm/components/HeaderBar.py create mode 100644 src/elm/components/LanCountdownBox.py create mode 100644 src/elm/components/LanInfoBox.py create mode 100644 src/elm/components/LandingPageBox.py create mode 100644 src/elm/components/NavigationBar.py create mode 100644 src/elm/components/PersonalInfoBox.py create mode 100644 src/elm/components/RootComponent.py create mode 100644 src/elm/components/UserNavigation.py create mode 100644 src/elm/components/__init__.py create mode 100644 src/elm/pages/ForgotPasswordPage.py create mode 100644 src/elm/pages/LandingPage.py create mode 100644 src/elm/pages/LoginPage.py create mode 100644 src/elm/pages/LogoutPage.py create mode 100644 src/elm/pages/MyBalancePage.py create mode 100644 src/elm/pages/MyProfilePage.py create mode 100644 src/elm/pages/RegisterPage.py create mode 100644 src/elm/services/AccountingService.py create mode 100644 src/elm/services/ConfigurationService.py create mode 100644 src/elm/services/DatabaseService.py create mode 100644 src/elm/services/LocalDataService.py create mode 100644 src/elm/services/MailingService.py create mode 100644 src/elm/services/UserService.py create mode 100644 src/elm/services/__init__.py create mode 100644 src/elm/types/ConfigurationTypes.py create mode 100644 src/elm/types/Transaction.py create mode 100644 src/elm/types/User.py create mode 100644 src/elm/types/UserSession.py create mode 100644 src/elm/types/__init__.py create mode 100644 src/elm/types/helpers.py diff --git a/502.html b/502.html new file mode 100644 index 0000000..9867746 --- /dev/null +++ b/502.html @@ -0,0 +1,22 @@ + + + EZGG LAN Manager - Wartungsmodus + + + +
+

Wir sind bald wieder da!

+
+

Wir führen zurzeit Wartungsarbeiten durch und sind in kürze wieder für euch da.

+

— Euer EZGG LAN Team

+
+
+ + \ No newline at end of file diff --git a/config.example.toml b/config.example.toml new file mode 100644 index 0000000..a7ab78b --- /dev/null +++ b/config.example.toml @@ -0,0 +1,53 @@ +[lan] + name="EZGG LAN" + iteration="Edition 2.0" + date_from="2026-05-08 16:00:00" + date_till="2026-05-10 14:00:00" + organizer_mail="tech@ezgg-ev.de" + internet_speed_mbs=400 + has_wifi=true + has_showers=false + ts3_address="" + discord_invite_link="" + +[database] + db_address="mongodb://localhost:27017" + database_name="elm" + +[mailing] + smtp_server="smtp.protonmail.ch" + smtp_port=587 + sender="EZGG LAN Manager " + username="no-reply@ezgg-ev.de" + password="some_password" + +[tickets] + [tickets."NORMAL"] + total_tickets=24 + price="20.00" + description="Normales Ticket" + additional_info="Berechtigt zur Nutzung eines regulären Platzes für die gesamte Dauer der LAN" + is_default=true + + [tickets."DELUXE"] + total_tickets=30 + price="25.00" + description="Deluxe Ticket" + additional_info="Wie das normale Ticket, aber mit doppelt so breitem Tisch (160cm)" + is_default=false + +[receipt_printing] + host="10.0.0.103" + port="5000" + order_print_endpoint="print_order" + password="Alkohol1" + +[misc] + default_profile_picture="src/elm/assets/img/anon.png" + dev_mode_active=true # Supresses E-Mail sending + +[paypal] + client_id_sandbox="" + secret_sandbox="" + client_id="" + secret="" diff --git a/src/elm/__init__.py b/src/elm/__init__.py new file mode 100644 index 0000000..2765df8 --- /dev/null +++ b/src/elm/__init__.py @@ -0,0 +1,100 @@ +from __future__ import annotations + +import logging +from pathlib import Path +from uuid import uuid4 + +from from_root import from_root +from rio import App, Theme, Color, Font, Icon, Session + +from elm.components.RootComponent import RootComponent +from elm.services import ConfigurationService, DatabaseService, UserService, LocalData, LocalDataService, MailingService, AccountingService +from elm.types import UserSession + +logger = logging.getLogger("ELM") +logger.setLevel(logging.DEBUG) + +theme = Theme.from_colors( + primary_color=Color.from_hex("02DAC5"), + secondary_color=Color.from_hex("018786"), + neutral_color=Color.from_hex("0D1117"), + background_color=Color.from_hex("0D1117"), + hud_color=Color.from_hex("003736"), + text_color=Color.from_hex("b9ccb2"), + mode="dark", + corner_radius_small=0, + corner_radius_medium=0, + corner_radius_large=0, + font=Font( + regular=from_root("src/elm/assets/PixelOperatorMono8.ttf"), + bold=from_root("src/elm/assets/PixelOperatorMono8-Bold.ttf") + ) +) + +theme.primary_color_darker = Color.from_hex("008679") +theme.primary_color_dark = Color.from_hex("003731") +theme.danger_color_dark = Color.from_hex("7f1b15") +theme.box_color = Color.from_hex("181c22") +theme.box_border_color = Color.from_hex("354333") +theme.header_box_background_color = Color.from_hex("30343b") +theme.text_color = Color.from_hex("b9ccb2") +theme.MAX_MOBILE_SCREEN_WIDTH = 28 + +Icon.register_single_icon( + icon_source=from_root("src/elm/assets/custom_icons/ts3.svg"), + set_name="custom", + icon_name="ts3" +) + +configuration_service = ConfigurationService(from_root("config.toml")) +database_service = DatabaseService(configuration_service.get_database_configuration()) +lan_info = configuration_service.get_lan_info() + +def is_mobile(self: Session) -> bool: + return self.screen_width < self.theme.MAX_MOBILE_SCREEN_WIDTH + +Session.is_mobile = is_mobile + +async def on_session_start(session: Session) -> None: + # Use this line to fake being any user without having to log in + if configuration_service.DEV_MODE_ACTIVE: + dev_user = await session[UserService].get_user("Typhus") + if not dev_user: + logger.fatal("DEV MODE USER DOES NOT EXIST") + exit(1) + session.attach(UserSession(id=uuid4(), user_name=dev_user.user_name, is_team_member=True, profile_picture=dev_user.user_picture)) + await session.set_title(f"{lan_info.name} - {lan_info.iteration}") + if session[LocalData].stored_session_token: + user_session = session[LocalDataService].verify_token(session[LocalData].stored_session_token) + if user_session is not None: + session.attach(user_session) + +async def on_app_start(a: App) -> None: + logger.info("Initializing mongodb...") + await a.default_attachments[2].initialize() + +app = App( + name="elm", + theme=theme, + assets_dir=Path(__file__).parent / "assets", + build=RootComponent, + default_attachments=[LocalData(), configuration_service, database_service, UserService(), LocalDataService(), MailingService(configuration_service), AccountingService(configuration_service.get_paypal_configuration())], + on_app_start=on_app_start, + on_session_start=on_session_start, + icon=from_root("src/elm/assets/img/favicon.png"), + meta_tags={ + "robots": "INDEX,FOLLOW", + "description": f"Info und Verwaltungs-Seite der LAN Party '{lan_info.name} - {lan_info.iteration}'.", + "og:description": f"Info und Verwaltungs-Seite der LAN Party '{lan_info.name} - {lan_info.iteration}'.", + "keywords": "Gaming, Clan, Guild, Verein, Club, Einfach, Zocken, Gesellschaft, Videospiele, " + "Videogames, LAN, Party, EZ, EZGG, LAN, Manager", + "author": "David Rodenkirchen", + "publisher": "EZ GG e.V.", + "copyright": "EZ GG e.V.", + "audience": "Alle", + "page-type": "Management Application", + "page-topic": "LAN Party", + "expires": "", + "revisit-after": "2 days" + } +) diff --git a/src/elm/assets/PixelOperatorMono8-Bold.ttf b/src/elm/assets/PixelOperatorMono8-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..fc5b82b1b012632271a30dacffe0df847c67cb59 GIT binary patch literal 18624 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
n_A29){oBjp$#DJAx-N)jONtb?cSb9 zx7LF`#|!PCuNlkFla-X7b9};@BlQ>79<4qms()AsfnlEfad2*SL~{r13;Aee z9o0iysI1|Jp>S?s56T?c$7;RxR~Wy!D(rKq`MJ(q9lQc4qhR!sOW@vsUtJ&cb2t*k z$otZq(a<-2Y!=zZMbWpMD0t{M)WODYw3^Y4)Z8*Zql1~8)_T=l^9_;JEJjmPLMsNO ztV24EW&yOX2ynujyncR*Iniun)ivzr)l|-}C@hVI9s#bd&2@aXS&9OU-VYU8nY^ zk?z!GH=2&v$79@{i#QIfeaxRkH{~?X)d$sCt%O>o_SekKC(aCTE;v7p-RKiG!^(`L zcB^-@?64cofNSU#mgqnTNcl-%Hrsi0ef;F;QeJ(tJOzrZ2E^X^0<8sv!34hLpF5lR z$Ou<~d@Sex04EMwZx}C8E;!blKrbYAQ+eTxilBy8UBOe8rlxtke+b^WKF&0y*MoBI zEfVqq4MIZ_SXp1F9`~I-AjEkSyeB=*kiv71bM(p7)Y!67ipCbPBX!1BSXDLYxNNC7 zYQ6*`GZLE{`dJLaA5V*+jfRwy$BX%{KFZA^7}RaC5iA3t7bphJ{!RGL_j&|A}F@#Ty?%XkTWQS*2hkQ`Y!O8J- zL1_Zy`N7ZB4-j49^D{gh^Lh}oP-tHb=r?)S!*9ZfaGJGBSz(qj}FJ|jg>UWE(r%oN9aa(|zLyYU3i z-h`1f{ogk+&tG+ltuII=7d3$yU8qXRH%J1qSY!!`JAFKN26&~6Gjoh`U7Iv-k9aJ<{ zHN8h8oWo2)$OGc2?>f-Z`gcsY7bx)Q2Gb^e`7|T206)vcOvi6UZ7?oF_oKh|}>jxMhrTjnLq( z0DuwpFYt~{IJ46`Q20{TXU+RO+uC@hsRq$o5a!z~1XAx7KMK04oxPD(on zcHZQKtYY;TT@T)>K?XF{!vv{0%P7JdK&%-4V86oPXXyFYlZ&K7=L)sPhqTp-W>ca; zyRyo;cg^rE&v<$L7N(*MQQc@oOKAQgev3Ybo&V@O5Eo5lQNHD(6Y#%>EzjNKPBbK54in8nVI~i+b@yX1;uW^ zT#hZc+U-}!;RP?a{TZ?#H302`0=|ie84tG~$T5laZa*P25;wX1q^wWe;r0vUnB*~T zKP3&xKDS>eM1vKM30WIJ*UM@cSM;%PYFE*Doi?eC+q(`)B_7g?(G`cvb{I6da%ELaA0fZ zyx!r#%-q$h+va5!EocMjk&&UTD;6&7b{B#UuUjxUylJ7Mwsqm(9_YD)5P22jqu#=;lPuEjD4wj=Y4uBuGv`;V2| zu@~T~Bq~!1Rk;XVLkWI0sZ7c-$2|j2u&U5M&O~*t#f)7Yp1wDriZ)_Q-;8>F7@oyv z@Eq+3Jdra}eTKQnPsgCon2-2afV{=*v>3nGumpX_Qdx$mT@DX89y$K?$Z2no zRq{qT5ms4)8nISRMqPLl{P4|kDkA+Yi2pO>t%&C{@moA+$=Py_bjrEN!{^Hdr~wzr z+vH;D!tcj?POg#n%O~VHxdHS2Uy|G8I(eUbO#V$iiRT6XEl4u<7&izw#lu6cPM( z_;Mfe!>#b-cW4dTicB+tit$c4fV_1%BIsT6Zn*-#6ZBbm4}Lr7DtWK`QT`;~3X=Fm zt}K4gDist4Mfk0slAtsw3(Do^K}9eFzb8~BcgfvBbucri32J4({5D7jbwPd55X=f1 z@%uo(li$k|@@x5}{0hGwbC3L|+$Ud`@8P$D?v?M$)v{MUh+h+WQ0~Vs2{i@H_Qx_irT_qP6xeZ4!%x^w%5Yr4CJ2L}p!Y;%%rdUaEFa_+jaO_BX| zk^Rk){Zk_Qm*(~h-(pk;Y_r}r!^Y#x+;wGJbNhuG?5YvloOQ`?@AlrpZMsRFHN0hD vQ)(MO3r^ZLJV+%Mx1G4iZI|hG(IO0IxC9s%F%kkE?ECA=Teamspeak SVG Icon \ No newline at end of file diff --git a/src/elm/assets/img/anon.png b/src/elm/assets/img/anon.png new file mode 100644 index 0000000000000000000000000000000000000000..265d8b5385935d8d609105677d26372694329700 GIT binary patch literal 102500 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 X+J3j2(HM9VKLdlOtDnm{r-UW|pRk$0 literal 0 HcmV?d00001 diff --git a/src/elm/assets/img/favicon.png b/src/elm/assets/img/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..b6a50039b8db55d3c556db19ad49bbfada3e6102 GIT binary patch literal 1247 zcmV<51R(o~P)EX>4Tx04R}tkv&MmKpe$iQ>8^J9Sl^&AwzYti;6hbDionYs1;guFdzMbCJjl7 zi=*ILaPVWX>fqw6tAnc`2!4P#J2)x2NQwVT3N2zhIPS;0dyl(!0N1K1n$?#CG~G6{ z>6DN!tO}u5gb@ReC}NUg8FQkTf$#XbM}Vz&36|x5?$0r(7A*w`2*gRnFm2)u;+aj` zV7yPvD-}s4J|~_q>4LZ+&~7@;_p#%&Pk`VvaHV(s^%gMuNqV!Z z#gBmKHgIv>)#N?kat9cGG9*)Sr65hNR07`5=$i__&@C{q=JnRu$LRx*qpmVHz`-Ff zUZ(7IpLd6Qd;9lHr@tS3SaPcC(mQDY000JJOGiWi{{a60|De66lK=n!32;bRa{vG? zBLDy{BLR4&KXw2B00(qQO+^Rj2p9(#5DER6MgRZ+8FWQhbVF}#ZDnqB07G(RVRU6= zAa`kWXdp*PO;A^X4i^9b0=P*;K~y-)Ws}QmRaX?oe|zt9&OM%7V+_}TR&0F5H}R2y zRZ|+Yf&;;dg8zdP<0xt-qT~vSSI2@nbEKelQmLe=L~P@uZG40(7!hm@5%0}S&U>Hj zAUDy(Z?ssfz1FwZ{yxDhsDFA_V5y@RvkgnN0+8yz$xJ_(lHSnq>dSgL9i2I2tHIt9 zuJe*4{my)>K0%0+z$r5}@d#tKk#kpx z&!Cp1eZ*-mj&&G6e5>z1X``#l2mtl0uLSJFwk`st84Tm35yu{#&KQo8rk!Njb-kgZ zQ>ce`R#RX1g7SEghWxQvCy_OldPdd{yYbx9z*3=}{&of1QY5+^$7;q88!#rLZq69+ z4KNoNqUtvyu*rMx38GrdizM3QCg_|Z6y)l8BO>y0}rC^a=}6nF!GZJ{^+ID*cG znUiZKjNW0Zc8Qx?Zpzh_lZ53aQS7m?RHa6B9e%i`)?h>wi;`4t0x%z|i&3(5@;mh8 zisrx3idfPlu#^D6b02>eh_uMN4oMo2vms6kNQop)o{5EpzW~I7hNaot{{bp|jk5Vr ziLg}$AeJrqoj4tozyN+&04n61yL5GDwd2jkIvg8vPAgC*h!!LGLmEFk%Uo|CslEa< ztASrSbj$V$lC&N_TtyJoF&@~uW&1m|XKN!cKonoabN3TO=cj~p0b{-;P736`9b{RX z87)80cI*uRWZz9C7R*0_rOpvVcTh3_UhDNgbXow}t^RJgYs)?I-Vjy)DxUjLG&Q3B z?f<+$s=*I0<2o)?e{J^bqeIhPsQIB@{?vXFAr3G$aRX4y%TG$UGG4$KLw(&rQhhDE zegA|xcHE!QU|PHVKevi``6D&=wEz&sLnw6*KP>6C-7mhZ{{$w88sinmuTcO1002ov JPDHLkV1oUYIXD0S literal 0 HcmV?d00001 diff --git a/src/elm/assets/img/news_image.jpg b/src/elm/assets/img/news_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..01f23ba099bf9b75ed8837a283db76c347318893 GIT binary patch literal 59125 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 literal 0 HcmV?d00001 diff --git a/src/elm/assets/img/rio.png b/src/elm/assets/img/rio.png new file mode 100644 index 0000000000000000000000000000000000000000..5ceaebb32e622ec62feaf526422da89b3e29c0ca GIT binary patch literal 9429 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 JmtJ)Y`7c)cJU9RV literal 0 HcmV?d00001 diff --git a/src/elm/components/AccountInfoBox.py b/src/elm/components/AccountInfoBox.py new file mode 100644 index 0000000..372d673 --- /dev/null +++ b/src/elm/components/AccountInfoBox.py @@ -0,0 +1,125 @@ +from rio import Component, Rectangle, Column, Text, Row, PointerEventListener, TextInput +from rio.event import on_populate + +from elm.types import UserSession +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 + + @on_populate + async def on_populate(self) -> None: + user = await self.session[UserService].get_user(self.session[UserSession].user_name) + if user: + self.mail = user.user_mail + else: + 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 + 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("-", margin=1, overflow="wrap", justify="right")), + fill=self.session.theme.danger_color_dark, + stroke_width=0.1, + stroke_color=self.session.theme.danger_color, + hover_fill=self.session.theme.danger_color, + hover_stroke_width=0.1, + hover_stroke_color=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("-", margin=1, overflow="wrap", justify="right")), + fill=self.session.theme.danger_color_dark, + stroke_width=0.1, + stroke_color=self.session.theme.danger_color, + hover_fill=self.session.theme.danger_color, + hover_stroke_width=0.1, + hover_stroke_color=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 + ) diff --git a/src/elm/components/AvatarEditBox.py b/src/elm/components/AvatarEditBox.py new file mode 100644 index 0000000..0b71a51 --- /dev/null +++ b/src/elm/components/AvatarEditBox.py @@ -0,0 +1,87 @@ +from rio import Component, Rectangle, Color, Column, Image, Text, Spacer, NoFileSelectedError + +from elm.components import ElmButton +from elm.types import UserSession +from elm.services import ConfigurationService, UserService + + +class AvatarEditBox(Component): + avatar_info_text: str = "" + avatar_info_text_is_error: bool = False + + async def upload_new_pfp(self) -> None: + try: + new_pfp = await self.session.pick_file(file_types=("png", "jpg", "jpeg"), multiple=False) + except NoFileSelectedError: + self.avatar_info_text = "Keine Datei ausgewählt!" + self.avatar_info_text_is_error = True + return + + if new_pfp.size_in_bytes > 2 * 1_000_000: + self.avatar_info_text = "Bild zu groß! (> 2MB)" + self.avatar_info_text_is_error = True + return + + image_data = await new_pfp.read_bytes() + user = await self.session[UserService].get_user(self.session[UserSession].user_name) + if user is not None: + user.user_picture = image_data + await user.save() + self.session[UserSession].profile_picture = image_data + self.avatar_info_text = "Erfolgreich aktualisiert" + self.avatar_info_text_is_error = False + else: + self.avatar_info_text = "Unbekannter Fehler" + self.avatar_info_text_is_error = True + + async def delete_current_pfp(self) -> None: + user = await self.session[UserService].get_user(self.session[UserSession].user_name) + if user is not None: + user.user_picture = None + await user.save() + self.session[UserSession].profile_picture = None + self.avatar_info_text = "Erfolgreich gelöscht" + self.avatar_info_text_is_error = False + else: + self.avatar_info_text = "Unbekannter Fehler" + self.avatar_info_text_is_error = True + + def build(self) -> Component: + return Rectangle( + content=Column( + Rectangle( + content=Rectangle( + content=Text("Avatar", 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( + Image( + image=self.session[UserSession].profile_picture if self.session[UserSession].profile_picture is not None else self.session[ConfigurationService].DEFAULT_PROFILE_PICTURE, + min_width=10, + min_height=10, + grow_x=False, + grow_y=False, + corner_radius=0.3 + ), + Text( + text=self.avatar_info_text, + overflow="wrap", + justify="center", + fill=self.session.theme.danger_color if self.avatar_info_text_is_error else self.session.theme.success_color + ), + ElmButton(text="Bild hochladen", style="small" if self.session.is_mobile() else "normal", on_press=self.upload_new_pfp), + ElmButton(text="Bild löschen", style="small" if self.session.is_mobile() else "normal", on_press=self.delete_current_pfp), + Spacer(), + margin=1, + spacing=1 + ) + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + min_height=15 + ) \ No newline at end of file diff --git a/src/elm/components/ElmButton.py b/src/elm/components/ElmButton.py new file mode 100644 index 0000000..36379c3 --- /dev/null +++ b/src/elm/components/ElmButton.py @@ -0,0 +1,63 @@ +from inspect import iscoroutinefunction +from typing import Callable, Awaitable, Literal + +from rio import Component, PointerEventListener, Rectangle, Text, Color, Row, Icon, PointerEvent + +from elm.types.helpers import async_noop + + +class ElmButton(Component): + icon_name: str = "" + text: str = "" + on_press: ( + Callable[[], None] + | Callable[[], Awaitable[None]] + ) = async_noop + is_active: bool = False + style: Literal["small", "normal"] = "normal" + wrap: bool = False + is_loading: bool = False + + async def _on_press(self, event: PointerEvent) -> None: + if iscoroutinefunction(self.on_press): + await self.on_press() + else: + self.on_press() + + def build(self) -> Component: + button_contents = [] + if self.is_loading: + txt_len = len(self.text) + loading = "Lade" + missing_space = txt_len - len(loading) + loading = loading + "." * missing_space + button_contents.append( + Text(loading, fill=Color.WHITE, selectable=False, overflow="wrap" if self.wrap else "nowrap", justify="center") + ) + else: + if self.icon_name: + button_contents.append( + Icon(icon=self.icon_name, margin_right=0.5) + ) + if self.text: + button_contents.append( + Text(self.text, fill=Color.WHITE, selectable=False, overflow="wrap" if self.wrap else "nowrap", justify="center") + ) + + return PointerEventListener( + content=Rectangle( + content=Row( + *button_contents, + margin=1 if self.style == "normal" else 0.5, + ), + fill=self.session.theme.hud_color if self.is_active else Color.TRANSPARENT, + stroke_width=0.1, + stroke_color=self.session.theme.secondary_color, + hover_stroke_width=0.1, + hover_stroke_color=self.session.theme.hud_color, + hover_fill=self.session.theme.hud_color, + transition_time=0, + cursor="pointer" + ), + on_press=self._on_press + ) \ No newline at end of file diff --git a/src/elm/components/HeaderBar.py b/src/elm/components/HeaderBar.py new file mode 100644 index 0000000..835f966 --- /dev/null +++ b/src/elm/components/HeaderBar.py @@ -0,0 +1,186 @@ +from from_root import from_root +from rio import Component, Row, Rectangle, Text, Color, Spacer, PointerEventListener, Column, Image, TextStyle, Icon, Popup, PointerEvent, Link + +from elm.services import ConfigurationService, UserService +from elm.components.UserNavigation import UserNavigation +from elm.types import UserSession + +class HeaderBar(Component): + is_user_navigation_open: bool = False + + async def user_navigation_pressed(self, _: PointerEvent): + self.is_user_navigation_open = not self.is_user_navigation_open + + async def close_navigation(self) -> None: + self.is_user_navigation_open = False + + def is_logged_in(self) -> bool: + try: + return bool(self.session[UserSession].user_name) + except KeyError: + return False + + def build(self) -> Component: + lan_info = self.session[ConfigurationService].get_lan_info() + if self.session.is_mobile(): + return Rectangle( + content=Row( + Column( + Text("EZGG LAN", style=TextStyle(fill=self.session.theme.primary_color, font_size=1.4), justify="center", margin_bottom=0.5), + Text("Edition 2.0", style=TextStyle(fill=self.session.theme.primary_color_darker, font_size=1.1), justify="center"), + min_width=(self.session.screen_width // 3) * 2 + ), + Spacer(), + Popup( + anchor=PointerEventListener( + content=Rectangle( + content=Image( + image=self.session[UserSession].profile_picture if self.session[UserSession].profile_picture is not None else self.session[ConfigurationService].DEFAULT_PROFILE_PICTURE, + min_width=3.5, + min_height=3.5, + grow_x=False, + grow_y=False, + corner_radius=0.3 + ), + stroke_width=0.1, + stroke_color=self.session.theme.primary_color, + corner_radius=0.3, + margin_right=1.1, + cursor="pointer" + ), + on_press=self.user_navigation_pressed + ), + content=UserNavigation(self.close_navigation), + position="bottom", + is_open=self.is_user_navigation_open, + alignment=1 + ) if self.is_logged_in() else PointerEventListener( + content=Rectangle( + content=Icon( + icon="material/login", + min_width=3.5, + min_height=3.5, + grow_x=False, + grow_y=False + ), + stroke_width=0.1, + stroke_color=self.session.theme.primary_color, + corner_radius=0.3, + margin_right=1.1, + cursor="pointer" + ), + on_press=lambda _: self.session.navigate_to("./login") + ), + margin=0.5, + margin_right=1.1, + margin_left=1.1 + ), + fill=Color.from_hex("0a0e14"), + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + min_width=self.session.screen_width + ) + else: # Tablet & Desktop + return Rectangle( + content=Row( + Text(lan_info.name, style=TextStyle(fill=self.session.theme.primary_color, font_size=1.4), margin_right=1), + Text("|", style=TextStyle(fill=Color.GRAY, font_size=1.1), margin_right=1), + Text(lan_info.iteration, style=TextStyle(fill=self.session.theme.primary_color_darker, font_size=1.1), margin_right=1), + Spacer(grow_y=True), + Spacer(grow_y=True), + Link( + content=Rectangle( + content=Row( + Icon( + "brand/discord", + min_width=1.3, + min_height=1.3, + margin_right=1, + fill=self.session.theme.primary_color_darker + ), + Text("Discord", selectable=False), + margin=0.3, + margin_left=0.8, + margin_right=0.8 + ), + cursor="pointer", + hover_shadow_color=self.session.theme.primary_color, + hover_shadow_radius=1, + margin_right=3, + corner_radius=0.3 + ), + target_url=lan_info.discord_invite_link, + open_in_new_tab=True + ) if lan_info.discord_invite_link else Spacer(), + Link( + content=Rectangle( + content=Row( + Icon( + "custom/ts3", + min_width=1.5, + min_height=1.5, + margin_right=1 + ), + Text("Teamspeak", selectable=False), + margin=0.3, + margin_left=0.8, + margin_right=0.8 + ), + cursor="pointer", + hover_shadow_color=self.session.theme.primary_color, + hover_shadow_radius=1, + margin_right=3, + corner_radius=0.3 + ), + target_url=lan_info.ts3_address, + open_in_new_tab=True + ) if lan_info.ts3_address else Spacer(), + Spacer(grow_y=True), + Popup( + anchor=PointerEventListener( + content=Rectangle( + content=Image( + image=self.session[UserSession].profile_picture if self.session[UserSession].profile_picture is not None else self.session[ConfigurationService].DEFAULT_PROFILE_PICTURE, + min_width=3.5, + min_height=3.5, + grow_x=False, + grow_y=False, + corner_radius=0.3 + ), + stroke_width=0.1, + stroke_color=self.session.theme.primary_color, + corner_radius=0.3, + margin_right=1.1, + cursor="pointer" + ), + on_press=self.user_navigation_pressed + ), + content=UserNavigation(self.close_navigation), + position="bottom", + is_open=self.is_user_navigation_open, + alignment=1 + ) if self.is_logged_in() else PointerEventListener( + content=Rectangle( + content=Icon( + icon="material/login", + min_width=3.5, + min_height=3.5, + grow_x=False, + grow_y=False + ), + stroke_width=0.1, + stroke_color=self.session.theme.primary_color, + corner_radius=0.3, + margin_right=1.1, + cursor="pointer" + ), + on_press=lambda _: self.session.navigate_to("./login") + ), + margin=0.5, + margin_right=2, + margin_left=2 + ), + fill=Color.from_hex("0a0e14"), + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color + ) diff --git a/src/elm/components/LanCountdownBox.py b/src/elm/components/LanCountdownBox.py new file mode 100644 index 0000000..1df48bf --- /dev/null +++ b/src/elm/components/LanCountdownBox.py @@ -0,0 +1,135 @@ +from datetime import datetime + +from rio import Component, Rectangle, Row, Text, Spacer, Column, Color, TextStyle +from rio.event import on_populate, periodic + +from elm.services import ConfigurationService + + +class LanCountdownBox(Component): + days_until_lan: str = "0" + hours_until_lan: str = "0" + minutes_until_lan: str = "0" + + @on_populate + async def on_populate(self) -> None: + await self.update_time_until_lan() + + @periodic(60) + async def update_time_until_lan(self) -> None: + td = self.session[ConfigurationService].get_lan_info().date_from - datetime.now() + total_seconds = int(td.total_seconds()) + + days = total_seconds // (24 * 3600) + remainder = total_seconds % (24 * 3600) + + hours = remainder // 3600 + remainder %= 3600 + + minutes = remainder // 60 + + self.days_until_lan = f"{days:02}" + self.hours_until_lan = f"{hours:02}" + self.minutes_until_lan = f"{minutes:02}" + + def build(self) -> Component: + if self.session.is_mobile(): + return Rectangle( + content=Column( + Rectangle( + content=Rectangle( + content=Row( + Text("■", margin=0.5, margin_top=0.2, style=TextStyle(font_size=1.2, fill=self.session.theme.primary_color_darker)), + Text("LAN Countdown", margin=0.5, margin_top=0.6, selectable=False, justify="left", grow_x=True, fill=Color.WHITE), + ), + fill=self.session.theme.header_box_background_color, + margin=0 + ), + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + ), + Column( + Column( + Rectangle( + content=Column(Text(self.days_until_lan, justify="center", font_size=2, fill=self.session.theme.primary_color, font_weight="bold"), + Text("Tage", justify="center"), margin=1, spacing=0.5), + fill=self.session.theme.background_color, + stroke_width=0.1, + stroke_color=self.session.theme.primary_color + ), + Rectangle( + content=Column(Text(self.hours_until_lan, justify="center", font_size=2, fill=self.session.theme.primary_color, font_weight="bold"), + Text("Stunden", justify="center"), margin=1, spacing=0.5), + fill=self.session.theme.background_color, + stroke_width=0.1, + stroke_color=self.session.theme.primary_color + ), + Rectangle( + content=Column(Text(self.minutes_until_lan, justify="center", font_size=2, fill=self.session.theme.primary_color, font_weight="bold"), + Text("Minuten", justify="center"), margin=1, spacing=0.5), + fill=self.session.theme.background_color, + stroke_width=0.1, + stroke_color=self.session.theme.primary_color + ), + spacing=1, + proportions=[1, 1, 1] + ), + Spacer(), + margin=2, + spacing=1, + grow_y=True + ) + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + ) + else: # Desktop & Tablet + return Rectangle( + content=Column( + Rectangle( + content=Rectangle( + content=Row( + Text("■", margin=0.5, margin_top=0.2, style=TextStyle(font_size=1.2, fill=self.session.theme.primary_color_darker)), + Text("LAN Countdown", margin=0.5, margin_top=0.6, selectable=False, justify="left", grow_x=True, fill=Color.WHITE), + ), + fill=self.session.theme.header_box_background_color, + margin=0 + ), + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + ), + Column( + Row( + Rectangle( + content=Column(Text(self.days_until_lan, justify="center", font_size=2, fill=self.session.theme.primary_color, font_weight="bold"), Text("Tage", justify="center", font_size=0.7), margin=1, spacing=0.5), + fill=self.session.theme.background_color, + stroke_width=0.1, + stroke_color=self.session.theme.primary_color + ), + Rectangle( + content=Column(Text(self.hours_until_lan, justify="center", font_size=2, fill=self.session.theme.primary_color, font_weight="bold"), Text("Stunden", justify="center", font_size=0.7), margin=1, spacing=0.5), + fill=self.session.theme.background_color, + stroke_width=0.1, + stroke_color=self.session.theme.primary_color + ), + Rectangle( + content=Column(Text(self.minutes_until_lan, justify="center", font_size=2, fill=self.session.theme.primary_color, font_weight="bold"), Text("Minuten", justify="center", font_size=0.7), margin=1, spacing=0.5), + fill=self.session.theme.background_color, + stroke_width=0.1, + stroke_color=self.session.theme.primary_color, + margin_right=0.1 + ), + spacing=1, + proportions=[1, 1, 1] + ), + Spacer(), + margin=2, + spacing=1, + grow_y=True + ) + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + ) \ No newline at end of file diff --git a/src/elm/components/LanInfoBox.py b/src/elm/components/LanInfoBox.py new file mode 100644 index 0000000..8e31e8b --- /dev/null +++ b/src/elm/components/LanInfoBox.py @@ -0,0 +1,97 @@ +from rio import Component, Rectangle, Row, Text, Spacer, ProgressBar, Column, Color, TextStyle + +from elm.services import ConfigurationService + + +class LanInfoBox(Component): + def build(self) -> Component: + lan_info = self.session[ConfigurationService].get_lan_info() + if self.session.is_mobile(): + return Rectangle( + content=Column( + Rectangle( + content=Rectangle( + content=Row( + Text("■", margin=0.5, margin_top=0.2, style=TextStyle(font_size=1.2, fill=self.session.theme.primary_color_darker)), + Text("LAN Info", margin=0.5, margin_top=0.6, selectable=False, justify="left", grow_x=True, fill=Color.WHITE), + ), + fill=self.session.theme.header_box_background_color, + margin=0 + ), + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + ), + Column( + Row(Text("Start:", font_size=0.7), Spacer(), Text(lan_info.date_from.strftime("%d.%m.%Y"), fill=self.session.theme.primary_color, font_size=0.8, overflow="nowrap")), + Row(Text("Ende:", font_size=0.7), Spacer(), Text(lan_info.date_till.strftime("%d.%m.%Y"), fill=self.session.theme.primary_color, font_size=0.8, overflow="nowrap")), + Row(Text("Einlass:", font_size=0.7), Spacer(), Text(lan_info.date_from.strftime("%H:%M Uhr"), fill=self.session.theme.primary_color, font_size=0.8, overflow="nowrap")), + Row(Text("Abbau:", font_size=0.7), Spacer(), Text(lan_info.date_till.strftime("%H:%M Uhr"), fill=self.session.theme.primary_color, font_size=0.8, overflow="nowrap")), + Row(Text("Internet:", font_size=0.7), Spacer(), Text(f"{lan_info.internet_speed_mbs} MBit/s", fill=self.session.theme.primary_color, font_size=0.8, overflow="nowrap")), + Row(Text("Turniere:", font_size=0.7), Spacer(), Text("n/A", fill=self.session.theme.primary_color, font_size=0.8, overflow="nowrap")), + Row(Text("WLAN:", font_size=0.7), Spacer(), Text("Ja" if lan_info.has_wifi else "Nein", fill=self.session.theme.primary_color, font_size=0.8, overflow="nowrap")), + Row(Text("Duschen:", font_size=0.7), Spacer(), Text("Ja" if lan_info.has_showers else "Nein", fill=self.session.theme.primary_color, font_size=0.8, overflow="nowrap")), + Spacer(), + Column( + Row(Text("Verfügbare Tickets", font_size=0.7, overflow="wrap"), Spacer(), Text("22 / 60", fill=self.session.theme.primary_color, font_size=0.8), + margin_bottom=0.4), + ProgressBar( + progress=22 / 60, + margin=0.5, + rounded=False, + min_height=0.4, + color=self.session.theme.primary_color + ) + ), + margin=2, + spacing=1, + grow_y=True + ) + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + ) + else: # Tablet & Desktop + return Rectangle( + content=Column( + Rectangle( + content=Rectangle( + content=Row( + Text("■", margin=0.5, margin_top=0.2, style=TextStyle(font_size=1.2, fill=self.session.theme.primary_color_darker)), + Text("LAN Info", margin=0.5, margin_top=0.6, selectable=False, justify="left", grow_x=True, fill=Color.WHITE), + ), + fill=self.session.theme.header_box_background_color, + margin=0 + ), + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + ), + Column( + Row(Text("Start:", font_size=0.9), Spacer(), Text(lan_info.date_from.strftime("%d.%m.%Y"), fill=self.session.theme.primary_color, font_size=0.9, overflow="nowrap")), + Row(Text("Ende:", font_size=0.9), Spacer(), Text(lan_info.date_till.strftime("%d.%m.%Y"), fill=self.session.theme.primary_color, font_size=0.9, overflow="nowrap")), + Row(Text("Einlass:", font_size=0.9), Spacer(), Text(lan_info.date_from.strftime("%H:%M Uhr"), fill=self.session.theme.primary_color, font_size=0.9, overflow="nowrap")), + Row(Text("Abbau:", font_size=0.9), Spacer(), Text(lan_info.date_till.strftime("%H:%M Uhr"), fill=self.session.theme.primary_color, font_size=0.9, overflow="nowrap")), + Row(Text("Internet:", font_size=0.9), Spacer(), Text(f"{lan_info.internet_speed_mbs} MBit/s", fill=self.session.theme.primary_color, font_size=0.9, overflow="nowrap")), + Row(Text("Turniere:", font_size=0.9), Spacer(), Text("n/A", fill=self.session.theme.primary_color, font_size=0.9, overflow="nowrap")), # ToDo: Grab from DB + Row(Text("WLAN:", font_size=0.9), Spacer(), Text("Ja" if lan_info.has_wifi else "Nein", fill=self.session.theme.primary_color, font_size=0.9, overflow="nowrap")), + Row(Text("Duschen:", font_size=0.9), Spacer(), Text("Ja" if lan_info.has_showers else "Nein", fill=self.session.theme.primary_color, font_size=0.9, overflow="nowrap")), + Spacer(), + Column( + Row(Text("Verfügbare Tickets", font_size=0.9, overflow="wrap"), Spacer(), Text("22 / 60", fill=self.session.theme.primary_color, font_size=0.9), margin_bottom=0.4), + ProgressBar( + progress=22 / 60, + margin=0.5, + rounded=False, + min_height=0.4, + color=self.session.theme.primary_color + ) + ), + margin=2, + spacing=1, + grow_y=True + ) + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + ) diff --git a/src/elm/components/LandingPageBox.py b/src/elm/components/LandingPageBox.py new file mode 100644 index 0000000..07d2dc5 --- /dev/null +++ b/src/elm/components/LandingPageBox.py @@ -0,0 +1,77 @@ +from rio import Component, Rectangle, Color, Column, Text, Image, Row, PointerEventListener, Spacer + +from from_root import from_root + +class LandingPageBoxFull(Component): + image_name: str + heading_text: str + article_text: str + date: str + + def build(self) -> Component: + return Rectangle( + content=Column( + Image(from_root(f"src/elm/assets/img/{self.image_name}"), fill_mode="zoom"), + Column( + Text(self.heading_text, style="heading3", fill=Color.from_hex("51ffef"), overflow="wrap" if self.session.is_mobile() else "ellipsize", margin_bottom=1.5), + Text(self.article_text, overflow="wrap", margin_bottom=1.5), + Rectangle(content=Row(), shadow_color=self.session.theme.text_color, shadow_radius=0.1, min_height=0.1, margin_bottom=1.5), + Text(self.date, overflow="wrap", justify="right"), + margin=2 + ), + proportions=[0.8, 1] + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + min_height=20 + ) + +class LandingPageBoxHalf(Component): + image_name: str + heading_text: str + article_text: str + link: str + + def build(self) -> Component: + return PointerEventListener( + content=Rectangle( + content=Column( + Rectangle( + content=Rectangle( + content=Text(self.heading_text, 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, + ), + Row( + Rectangle( + content=Image( + from_root(f"src/elm/assets/img/{self.image_name}") + ), + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + margin_right=1, + min_width=4 if self.session.is_mobile() else 10 + ), + Text( + self.article_text, + overflow="wrap", + grow_x=True, + selectable=False, + font_size=0.8 + ), + margin=1 + ), + Spacer() + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + min_height=12, + cursor="pointer" + ), + on_press=lambda _: self.session.open_url_in_browser(self.link) + ) diff --git a/src/elm/components/NavigationBar.py b/src/elm/components/NavigationBar.py new file mode 100644 index 0000000..6083df9 --- /dev/null +++ b/src/elm/components/NavigationBar.py @@ -0,0 +1,143 @@ +from functools import partial +from typing import Optional, Callable + +import rio +from from_root import from_root +from rio import Component, Row, Rectangle, Text, Color, Spacer, PointerEventListener, Column, Image, TextStyle, Icon, PointerEvent, EventHandler + +from elm.services import ConfigurationService + + +class NavigationButton(Component): + icon: str + text: str + target_url: str + extension_state_changed: Optional[Callable] + new_tab: bool = False + current_rectangle_fill_color = Color.TRANSPARENT + current_text_fill_color = Color.from_hex("b9ccb2") + COLOR_ACTIVE_RECTANGLE = Color.from_hex("4EFBE5") + COLOR_ACTIVE_TEXT = Color.from_hex("4EFBE5") + COLOR_INACTIVE_RECTANGLE = Color.TRANSPARENT + COLOR_INACTIVE_TEXT = Color.from_hex("b9ccb2") + + async def on_pointer_enter(self, _: PointerEvent) -> None: + self.current_rectangle_fill_color = self.COLOR_ACTIVE_RECTANGLE + self.current_text_fill_color = self.COLOR_ACTIVE_TEXT + self.force_refresh() + + async def on_pointer_leave(self, _: PointerEvent) -> None: + self.current_rectangle_fill_color = self.COLOR_INACTIVE_RECTANGLE + self.current_text_fill_color = self.COLOR_INACTIVE_TEXT + self.force_refresh() + + async def on_press(self, _: PointerEvent) -> None: + if self.new_tab: + self.session.open_url_in_browser(self.target_url) + else: + self.session.navigate_to(self.target_url) + + await self.extension_state_changed(None) + + + def is_active(self) -> bool: + return self.session.active_page_url.path == self.target_url + + def build(self) -> Component: + return PointerEventListener( + Rectangle( + content=Row( + Rectangle(fill=self.COLOR_ACTIVE_RECTANGLE if self.is_active() else self.current_rectangle_fill_color, min_width=0.3, margin_right=1.7, transition_time=0.2), + Icon( + self.icon, + min_width=1.9, + min_height=1.9, + fill=self.COLOR_ACTIVE_TEXT if self.is_active() else self.current_text_fill_color + ), + Text( + self.text, + style=TextStyle(fill=self.COLOR_ACTIVE_TEXT if self.is_active() else self.current_text_fill_color, font_weight="normal", font_size=1.1), + margin_left=1, + margin_top=1.3, + margin_bottom=1.3, + grow_x=True, + selectable=False + ), + ), + hover_shadow_radius=1, + hover_shadow_color=self.session.theme.primary_color_darker , + hover_fill=self.session.theme.primary_color_darker , + corner_radius=0.1, + cursor="pointer", + transition_time=0.2 + ), + on_pointer_enter=self.on_pointer_enter, + on_pointer_leave=self.on_pointer_leave, + on_press=self.on_press + ) + + +class NavigationBar(Component): + extension_state_changed: EventHandler[bool] + is_extended: bool = False + + async def on_extension_pressed(self, _: PointerEvent) -> None: + if self.session.is_mobile(): + self.is_extended = not self.is_extended + await self.call_event_handler(partial(self.extension_state_changed, self.is_extended)) + self.force_refresh() + + def build(self) -> Component: + navigation = Column( + Column( + NavigationButton("material/house", "Startseite", "/", extension_state_changed=self.on_extension_pressed), + NavigationButton("material/local_activity", "Tickets", "/tickets", extension_state_changed=self.on_extension_pressed), + NavigationButton("material/chair_alt", "Sitzplan", "/seating", extension_state_changed=self.on_extension_pressed), + NavigationButton("material/local_dining", "Catering", "/catering", extension_state_changed=self.on_extension_pressed), + NavigationButton("material/trophy", "Turniere", "/tournaments", extension_state_changed=self.on_extension_pressed), + margin_bottom=6 + ), + Column( + NavigationButton("material/help", "FAQ", "/faq", extension_state_changed=self.on_extension_pressed), + NavigationButton("material/contact_page", "Kontakt", "/contact", extension_state_changed=self.on_extension_pressed), + NavigationButton("material/sports_bar", "EZ GG e.V.", "https://ezgg-ev.de", new_tab=True, extension_state_changed=None), + NavigationButton("material/article", "Impressum", "/imprint", extension_state_changed=self.on_extension_pressed), + NavigationButton("material/balance", "Regeln & AGB", "/rules", extension_state_changed=self.on_extension_pressed), + ), + Spacer(), + Text(f"ELM v{self.session[ConfigurationService].APP_VERSION}", font_size=0.5, fill=self.session.theme.primary_color_darker), + margin=1 + ) + + if self.session.is_mobile(): + return Rectangle( + content=Column( + Row( + PointerEventListener( + Rectangle( + content=Icon("material/keyboard_double_arrow_left" if self.is_extended else "material/view_headline"), + cursor="pointer", + margin=0.5, + min_height=1.5, + min_width=1.5 + ), + on_press=self.on_extension_pressed + ), + Spacer() + ), + Spacer() if not self.is_extended else navigation, + Spacer() + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + min_width=self.session.screen_width if self.is_extended else 2 + ) + else: # Tablet % Desktop + return Rectangle( + content=navigation, + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + min_width=20 + ) diff --git a/src/elm/components/PersonalInfoBox.py b/src/elm/components/PersonalInfoBox.py new file mode 100644 index 0000000..8b40fe3 --- /dev/null +++ b/src/elm/components/PersonalInfoBox.py @@ -0,0 +1,76 @@ +from datetime import date + +from rio import Component, Rectangle, Column, Text, DateInput, TextInput, Row +from rio.event import on_populate + +from elm.components import ElmButton +from elm.services import UserService +from elm.types import UserSession + + +class PersonalInfoBox(Component): + first_name: str = "" + last_name: str = "" + birthday: date = date(1900, 1, 1) + update_in_progress: bool = False + info_text: str = " " + + @on_populate + async def on_populate(self) -> None: + user = await self.session[UserService].get_user(self.session[UserSession].user_name) + if not user: + self.session.navigate_to("./login") + return + + self.first_name = user.user_first_name + self.last_name = user.user_last_name + if user.user_birth_day is not None: + self.birthday = user.user_birth_day + + async def update(self) -> None: + self.update_in_progress = True + first_name = self.first_name[:30] + last_name = self.last_name[:30] + birthday = self.birthday if self.birthday != date(1900, 1, 1) else None + user = await self.session[UserService].get_user(self.session[UserSession].user_name) + if user: + user.user_first_name = first_name + user.user_last_name = last_name + user.user_birth_day = birthday + await user.save() + self.info_text = "Aktualisiert!" + self.update_in_progress = False + + def build(self) -> Component: + return Rectangle( + content=Column( + Rectangle( + content=Rectangle( + content=Text("Persönliche 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( + Column( + TextInput(text=self.bind().first_name, label="Vorname"), + TextInput(text=self.bind().last_name, label="Nachname"), + spacing=1 + ) if self.session.is_mobile() else Row( + TextInput(text=self.bind().first_name, label="Vorname"), + TextInput(text=self.bind().last_name, label="Nachname"), + spacing=1 + ), + DateInput(label="Geburtstag", value=self.bind().birthday), + ElmButton(text="Speichern", is_loading=self.update_in_progress, on_press=self.update), + Text(text=self.info_text, fill=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 + ) diff --git a/src/elm/components/RootComponent.py b/src/elm/components/RootComponent.py new file mode 100644 index 0000000..a9d5a5d --- /dev/null +++ b/src/elm/components/RootComponent.py @@ -0,0 +1,24 @@ +from __future__ import annotations + +from rio import Component, event, Spacer, Card, Container, Column, Row, TextStyle, Color, Text, PageView, Button, Link, Rectangle + +from elm.components.HeaderBar import HeaderBar +from elm.components.NavigationBar import NavigationBar + + +class RootComponent(Component): + is_navigation_bar_extended: bool = False + + def on_extension_state_changed(self, is_extended: bool) -> None: + self.is_navigation_bar_extended = is_extended + + def build(self) -> Component: + return Column( + HeaderBar(), + Row( + NavigationBar(extension_state_changed=self.on_extension_state_changed), + Spacer() if self.is_navigation_bar_extended else PageView(grow_x=True, grow_y=True), # actual pages + grow_y=True, + grow_x=True + ), + ) diff --git a/src/elm/components/UserNavigation.py b/src/elm/components/UserNavigation.py new file mode 100644 index 0000000..6953ba5 --- /dev/null +++ b/src/elm/components/UserNavigation.py @@ -0,0 +1,80 @@ +from typing import Optional, Callable + +from rio import Component, Row, Column, Color, PointerEventListener, PointerEvent, Rectangle, Text, TextStyle, Icon, event + + +class UserNavigationButton(Component): + text: str + target_url: str + close_navigation: Callable + new_tab: bool = False + current_rectangle_fill_color = Color.TRANSPARENT + current_text_fill_color = Color.from_hex("b9ccb2") + COLOR_ACTIVE_RECTANGLE = Color.from_hex("4EFBE5") + COLOR_ACTIVE_TEXT = Color.from_hex("4EFBE5") + COLOR_INACTIVE_RECTANGLE = Color.TRANSPARENT + COLOR_INACTIVE_TEXT = Color.from_hex("b9ccb2") + + async def on_pointer_enter(self, _: PointerEvent) -> None: + self.current_rectangle_fill_color = self.COLOR_ACTIVE_RECTANGLE + self.current_text_fill_color = self.COLOR_ACTIVE_TEXT + self.force_refresh() + + async def on_pointer_leave(self, _: PointerEvent) -> None: + self.current_rectangle_fill_color = self.COLOR_INACTIVE_RECTANGLE + self.current_text_fill_color = self.COLOR_INACTIVE_TEXT + self.force_refresh() + + async def on_press(self, _: PointerEvent) -> None: + if self.new_tab: + self.session.open_url_in_browser(self.target_url) + else: + self.session.navigate_to(self.target_url) + + await self.close_navigation() + await self.on_pointer_leave(None) + + def build(self) -> Component: + return PointerEventListener( + Rectangle( + content=Row( + Rectangle(fill=self.current_rectangle_fill_color, min_width=0.2, margin_right=0.5, transition_time=0.2), + Text( + self.text, + style=TextStyle(fill=self.current_text_fill_color, font_weight="normal", font_size=0.9), + margin=0.5, + grow_x=True, + selectable=False + ), + ), + hover_fill=self.session.theme.primary_color_darker , + corner_radius=0.1, + cursor="pointer", + transition_time=0.2 + ), + on_pointer_enter=self.on_pointer_enter, + on_pointer_leave=self.on_pointer_leave, + on_press=self.on_press + ) + + + +class UserNavigation(Component): + close_navigation: Callable + + @event.on_page_change + async def on_page_change(self) -> None: + await self.close_navigation() + + def build(self) -> Component: + return Rectangle( + content=Column( + UserNavigationButton("Guthaben: 0,00 €", "/balance", self.close_navigation), + UserNavigationButton("Mein Profil", "/my-profile", self.close_navigation), + UserNavigationButton("Mein Clan", "/my-clans", self.close_navigation), + UserNavigationButton("Ausloggen", "/logout", self.close_navigation) + ), + min_width=3.5, + min_height=3.5, + fill=self.session.theme.background_color + ) \ No newline at end of file diff --git a/src/elm/components/__init__.py b/src/elm/components/__init__.py new file mode 100644 index 0000000..7a62a81 --- /dev/null +++ b/src/elm/components/__init__.py @@ -0,0 +1,8 @@ +from .LanCountdownBox import LanCountdownBox +from .LanInfoBox import LanInfoBox +from .LandingPageBox import LandingPageBoxFull, LandingPageBoxHalf +from .UserNavigation import UserNavigationButton, UserNavigation +from .ElmButton import ElmButton +from .AvatarEditBox import AvatarEditBox +from .AccountInfoBox import AccountInfoBox +from .PersonalInfoBox import PersonalInfoBox diff --git a/src/elm/pages/ForgotPasswordPage.py b/src/elm/pages/ForgotPasswordPage.py new file mode 100644 index 0000000..094a771 --- /dev/null +++ b/src/elm/pages/ForgotPasswordPage.py @@ -0,0 +1,84 @@ +from __future__ import annotations + +from _sha2 import sha256 +from random import choices +from typing import Any, Optional + +from rio import Component, Column, Row, Text, Spacer, page, Color, Rectangle, TextInput, GuardEvent, ProgressCircle + +from elm.types import UserSession, User +from elm.services import UserService, ConfigurationService, MailingService +from elm.components import ElmButton + +def forgot_password_page_guard(event: GuardEvent) -> Optional[str]: + try: + _ = event.session[UserSession].user_name + return "/" + except KeyError: + return None + +@page(name="Forgot password", url_segment="lost-pw", guard=forgot_password_page_guard) +class ForgotPasswordPage(Component): + mail: str = "" + success: bool = False + is_loading: bool = False + + async def on_confirm(self, _: Any = None) -> None: + self.is_loading = True + + lan_info = self.session[ConfigurationService].get_lan_info() + user_service = self.session[UserService] + mailing_service = self.session[MailingService] + user = await user_service.get_user_by_mail(self.mail.strip()) + if user is not None: + new_password = "".join(choices(user_service.ALLOWED_USER_NAME_SYMBOLS, k=16)) + user.user_fallback_password = sha256(new_password.encode(encoding="utf-8")).hexdigest() + await User.save(user) + await mailing_service.send_email( + subject=f"Dein neues Passwort für {lan_info.name}", + body=f"Du hast für den EZGG LAN Manager der {lan_info.name} ein neues Passwort angefragt. " + f"Und hier ist es schon:\n\n{new_password}\n\nSolltest du kein neues Passwort angefordert haben, " + f"ignoriere diese E-Mail.\n\nLiebe Grüße\nDein {lan_info.name} - Team", + receiver=self.mail.strip() + ) + + self.success = True + self.is_loading = False + + def build(self) -> Component: + return Row( + Rectangle( + content=Column( + Rectangle( + content=Rectangle( + content=Row( + Text("Passwort vergessen", margin=0.5, selectable=False, overflow="wrap", grow_x=True), + ProgressCircle(min_size=1, margin=0.5, color="primary", progress=None if self.is_loading else 0) + ), + 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.bind().mail, + label="Mail Adresse", + on_confirm=self.on_confirm + ), + Text("Prüfe deine Mails!", fill=self.session.theme.success_color, overflow="wrap", justify="center") if self.success else Spacer(grow_x=False, grow_y=False), + ElmButton(text="Neues Passwort anfordern", style="small" if self.session.is_mobile() else "normal", on_press=self.on_confirm, wrap=self.session.is_mobile()), + margin=1, + spacing=1 + ), + Spacer() + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + min_height=15 + ), + align_x=0.5, + align_y=0.5 + ) diff --git a/src/elm/pages/LandingPage.py b/src/elm/pages/LandingPage.py new file mode 100644 index 0000000..cbb7dad --- /dev/null +++ b/src/elm/pages/LandingPage.py @@ -0,0 +1,81 @@ +from __future__ import annotations + +from rio import Component, Column, Row, Text, Spacer, page, Color, TextStyle + +from elm.components import LanCountdownBox, LanInfoBox, LandingPageBoxFull, LandingPageBoxHalf + + +@page(name="Landing", url_segment="") +class LandingPage(Component): + def build(self) -> Component: + full_box = LandingPageBoxFull( + image_name="news_image.jpg", + heading_text="EZGG LAN geht in die 2. Runde", + article_text="Am 23.04.2027 ist es soweit. Dann findet die EZGG LAN in der zweiten Edition statt. Es erwarten euch viele Verbesserungen zur letzten Edition und wir hoffen euch auch dieses mal begrüßen zu dürfen.", + date="15.05.26" + ) + half_box_1 = LandingPageBoxHalf( + heading_text="Sponsored by Crackz", + image_name="crackz.png", + article_text="CRACKZ ist dein Co-Op-Partner für verboten guten Geschmack und der Snack, der mit dir durchzockt.\n\n\n\nMehr auf crackz.gg", + link="https://www.crackz.gg" + ) + half_box_2 = LandingPageBoxHalf( + heading_text="Made with rio", + image_name="rio.png", + article_text="Unsere Webseite ist mit rio umgesetzt.\n\nEinem einfach zu bedienenden Framework um ganze Webapps in reinem Python zu entwickeln.\n\n\nMehr auf rio.dev", + link="https://rio.dev" + ) + + if self.session.is_mobile(): + return Column( + Column( + Row( + Text("//", style=TextStyle(font_size=1.7, fill=self.session.theme.primary_color), margin_right=2), + Text("Neuigkeiten", style=TextStyle(font_size=1.2, fill=Color.WHITE, font_weight="bold")), + Spacer(), + margin_bottom=0.5 + ), + Row(full_box, margin_bottom=2), + Column(half_box_1, half_box_2, spacing=1, margin_bottom=1), + Spacer() + ), + Column( + LanInfoBox(), + LanCountdownBox(), + Spacer(), + spacing=2, + ), + margin=0.5 + ) + + else: # Tablet & Desktop + return Row( + Column( + Row( + Text("//", style=TextStyle(font_size=1.7, fill=self.session.theme.primary_color), margin_right=2), + Text("Neuigkeiten", style=TextStyle(font_size=1.2, fill=Color.WHITE, font_weight="bold")), + Spacer(), + Text("■", margin_right=0.5, style=TextStyle(font_size=1.2, fill=self.session.theme.primary_color)), + Text("■", margin_right=0.5, style=TextStyle(font_size=1.2, fill=self.session.theme.primary_color_darker)), + Text("■", margin_right=0.5, style=TextStyle(font_size=1.2, fill=self.session.theme.primary_color_dark)), + margin_bottom=0.5 + ), + Row(full_box, margin_bottom=2), + Row( + Row(half_box_1, half_box_2, spacing=1, margin_bottom=1), + spacing=1, + margin_bottom=2 + ), + Spacer(), + grow_x=True + ), + Column( + LanInfoBox(), + LanCountdownBox(), + Spacer(), + spacing=2, + ), + spacing=2, + margin=2 + ) diff --git a/src/elm/pages/LoginPage.py b/src/elm/pages/LoginPage.py new file mode 100644 index 0000000..0d2df31 --- /dev/null +++ b/src/elm/pages/LoginPage.py @@ -0,0 +1,106 @@ +from __future__ import annotations + +from copy import copy +from typing import Any, Optional +from uuid import uuid4 + +from rio import Component, Column, Row, Text, Spacer, page, Color, Rectangle, TextInput, GuardEvent + +from elm.types import UserSession, User +from elm.services import UserService, LocalData, LocalDataService, ConfigurationService +from elm.components import ElmButton + +def login_page_guard(event: GuardEvent) -> Optional[str]: + try: + _ = event.session[UserSession].user_name + return "/" + except KeyError: + return None + +@page(name="Login", url_segment="login", guard=login_page_guard) +class LoginPage(Component): + user_name: str = "" + password: str = "" + error_on_last_attempt: bool = False + login_in_progress: bool = False + + async def on_login_confirmed(self, _: Any) -> None: + """ Handler for pressing ENTER inside the text inputs """ + await self.on_login_pressed() + + async def on_login_pressed(self) -> None: + self.login_in_progress = True + user_name = copy(self.user_name) # Prevents race condition name swap + is_valid = await self.session[UserService].is_login_valid(user_name, self.password) + if is_valid: + user: User = await self.session[UserService].get_user(user_name) + self.error_on_last_attempt = False + user_session = UserSession(id=uuid4(), user_name=user.user_name, is_team_member=user.is_team_member) + self.session.attach(user_session) + token = self.session[LocalDataService].set_session(user_session) + self.session[LocalData].stored_session_token = token + self.session[UserSession].profile_picture = await self.load_user_picture() + self.session.attach(self.session[LocalData]) + self.login_in_progress = False + self.session.navigate_to("./") + else: + self.login_in_progress = False + self.error_on_last_attempt = True + + async def load_user_picture(self) -> bytes: + try: + user_picture = await self.session[UserService].get_user_picture(self.session[UserSession].user_name) + if user_picture is not None and len(user_picture) > 0: + return user_picture + except KeyError: + return self.session[ConfigurationService].DEFAULT_PROFILE_PICTURE + return self.session[ConfigurationService].DEFAULT_PROFILE_PICTURE + + def on_register_pressed(self) -> None: + self.session.navigate_to("./register") + + def on_lost_password_pressed(self) -> None: + self.session.navigate_to("./lost-pw") + + def build(self) -> Component: + return Row( + Rectangle( + content=Column( + Rectangle( + content=Rectangle( + content=Text("Login", 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.bind().user_name, + label="Nutzername", + on_confirm=self.on_login_confirmed + ), + TextInput( + text=self.bind().password, + label="Passwort", + is_secret=True, + on_confirm=self.on_login_confirmed + ), + Text("Falscher Nutzername oder Passwort", fill=self.session.theme.danger_color, overflow="wrap", justify="center") if self.error_on_last_attempt else Spacer(grow_x=False, grow_y=False), + ElmButton(text="Login", style="small" if self.session.is_mobile() else "normal", on_press=self.on_login_pressed, is_loading=self.login_in_progress), + ElmButton(text="Passwort\nvergessen" if self.session.is_mobile() else "Passwort vergessen", style="small" if self.session.is_mobile() else "normal", on_press=self.on_lost_password_pressed), + ElmButton(text="Account anlegen", style="small" if self.session.is_mobile() else "normal", on_press=self.on_register_pressed), + margin=1, + spacing=1 + ), + Spacer() + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + min_height=15 + ), + align_x=0.5, + align_y=0.5 + ) diff --git a/src/elm/pages/LogoutPage.py b/src/elm/pages/LogoutPage.py new file mode 100644 index 0000000..db11ae9 --- /dev/null +++ b/src/elm/pages/LogoutPage.py @@ -0,0 +1,25 @@ +from __future__ import annotations + + +from rio import Component, Row, page +from rio.event import on_populate + +from elm.types import UserSession +from elm.services import LocalData, LocalDataService + +@page(name="Logout", url_segment="logout") +class LandingPage(Component): + + @on_populate + def on_populate(self) -> None: + try: + self.session.detach(UserSession) + except KeyError: + pass + self.session[LocalDataService].del_session(self.session[LocalData].stored_session_token) + self.session[LocalData].stored_session_token = None + self.session.attach(self.session[LocalData]) + self.session.navigate_to("/") + + def build(self) -> Component: + return Row() diff --git a/src/elm/pages/MyBalancePage.py b/src/elm/pages/MyBalancePage.py new file mode 100644 index 0000000..7d19046 --- /dev/null +++ b/src/elm/pages/MyBalancePage.py @@ -0,0 +1,224 @@ +from __future__ import annotations + +import logging +from datetime import date, datetime +from decimal import Decimal, ROUND_DOWN +from typing import Optional + +from rio import Component, Column, Row, Text, Spacer, page, Rectangle, TextInput, GuardEvent, DateInput, PointerEventListener, Revealer, Image, NumberInput +from rio.event import on_populate + +from elm.types import UserSession, Transaction +from elm.services import UserService, AccountingService +from elm.components import ElmButton, AvatarEditBox, AccountInfoBox + +logger = logging.getLogger(__name__.split(".")[-1]) + +class TransactionRow(Component): + transaction_time: datetime + transaction_title: str + transaction_amount: Decimal + is_debit: bool + + def build(self) -> Component: + color = self.session.theme.danger_color if self.is_debit else self.session.theme.success_color + return Rectangle( + content=Row( + Text( + f"{self.transaction_time.strftime("%d.%m.%y")} /", + justify="left", + font_size=0.8, + margin_left=0.5, + fill=color + ), + Text( + self.transaction_title, + justify="left", + font_size=0.8, + margin_left=0.5, + fill=color, + overflow="ellipsize", + grow_x=True + ), + Text( + f"{'-' if self.is_debit else '+'}{str(self.transaction_amount.quantize(Decimal('.01'), rounding=ROUND_DOWN))} €", + justify="right", + font_size=0.8, + margin_right=0.5, + fill=color + ), + margin_bottom=0.5, + margin_top=0.5 + ), + hover_fill=self.session.theme.background_color, + transition_time=0.2 + ) + +def my_balance_page_guard(event: GuardEvent) -> Optional[str]: + try: + _ = event.session[UserSession].user_name + return None + except KeyError: + return "/" + +@page(name="My Balance", url_segment="balance", guard=my_balance_page_guard) +class MyBalancePage(Component): + current_balance: str = "-" + last_20_transactions: list[Transaction] = [] + bank_revealer_open: bool = False + paypal_revealer_open: bool = False + payment_qr_image: bytes = bytes() + paypal_charge_amount: float = 0.00 + paypal_charge_in_progress: bool = False + + @on_populate + async def async_init(self) -> None: + self.current_balance = self.session[AccountingService].make_euro_string_from_decimal( + await self.session[AccountingService].get_balance(self.session[UserSession].user_name) + ) + + self.last_20_transactions = (await self.session[AccountingService].get_transaction_history(self.session[UserSession].user_name))[:20] + self.payment_qr_image = self.session[AccountingService].make_payment_qr_image( + "Einfach Zocken Gaming Gesellschaft", + "GENODE51BIK", + "DE47517624340019856607", + f"AUFLADUNG - {self.session[UserSession].user_name}") + + async def pay_with_paypal(self) -> None: + self.paypal_charge_in_progress = True + logger.info("Starting PayPal transaction over %s for user %s", f"{self.paypal_charge_amount} €", self.session[UserSession].user_name) + amount = Decimal(self.paypal_charge_amount) + approval_url = await self.session[AccountingService].start_paypal_process(self.session[UserSession].user_name, amount) + self.session.open_url_in_browser(approval_url) + # ToDo: Catch return URL somehow and notify user + + async def toggle_bank_revealer(self) -> None: + self.bank_revealer_open = not self.bank_revealer_open + + async def toggle_paypal_revealer(self) -> None: + self.paypal_revealer_open = not self.paypal_revealer_open + + def build(self) -> Component: + col_row = Column if self.session.is_mobile() else Row + + transaction_rows = [] + for transaction in sorted(self.last_20_transactions, key=lambda t: t.transaction_date, reverse=True): + transaction_rows.append( + TransactionRow( + transaction_time=transaction.transaction_date, + transaction_title=transaction.title, + transaction_amount=transaction.value, + is_debit=transaction.is_debit + ) + ) + + return col_row( + Column( + Rectangle( + content=Column( + Rectangle( + content=Rectangle( + content=Text("Guthaben", 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( + Text( + text=self.current_balance, + justify="center", + font_size=2, + grow_x=True, + grow_y=True, + margin_top=2, + margin_bottom=1 + ), + Spacer(), + margin=1, + spacing=1 + ) + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color + ), + Rectangle( + content=Column( + Rectangle( + content=Rectangle( + content=Text("Guthaben aufladen", 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( + ElmButton(text="Banküberweißung", style="small" if self.session.is_mobile() else "normal", on_press=self.toggle_bank_revealer), + Revealer(header=None, is_open=self.bank_revealer_open, content=Column( + Text("QR Code", justify="center"), + Image(self.payment_qr_image, min_width=14, min_height=14, margin_bottom=1), + Text("Bankverbindung", justify="center"), + Text("Empfänger: Einfach Zocken Gaming Gesellschaft", justify="left", overflow="wrap", font_size=0.7), + Text("IBAN: DE47517624340019856607", justify="left", overflow="wrap", font_size=0.7), + Text("BIC: GENODE51BIK", justify="left", overflow="wrap", font_size=0.7), + Text(f"Verwendungszweck: AUFLADUNG - {self.session[UserSession].user_name}", justify="left", overflow="wrap", font_size=0.7), + spacing=1 + )), + ElmButton(text="Paypal", style="small" if self.session.is_mobile() else "normal", on_press=self.toggle_paypal_revealer), + Revealer(header=None, is_open=self.paypal_revealer_open, content=Column( + NumberInput(label="Summe", decimals=2, value=self.bind().paypal_charge_amount, suffix_text="€"), + ElmButton(text="Jetzt aufladen", style="small" if self.session.is_mobile() else "normal", on_press=self.pay_with_paypal, is_loading=self.paypal_charge_in_progress), + spacing=1 + )), + margin=1, + spacing=1 + ) + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color + ), + Spacer(), + spacing=1 + ), + Column( + Rectangle( + content=Column( + Rectangle( + content=Rectangle( + content=Text("Letzte Transaktionen", 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( + Rectangle( + content=Row( + Text("Datum / Titel", justify="left", font_size=0.8, margin_left=0.5), + Text("Betrag", justify="right", font_size=0.8, margin_right=0.5), + margin_bottom=0.5, + margin_top=0.5 + ) + ), + *transaction_rows, + spacing=0.5, + margin=1 + ) + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color + ), + Spacer(), + spacing=1, + grow_x=True + ), + spacing=1, + margin=1, + margin_right=2 + ) diff --git a/src/elm/pages/MyProfilePage.py b/src/elm/pages/MyProfilePage.py new file mode 100644 index 0000000..fa8b9b9 --- /dev/null +++ b/src/elm/pages/MyProfilePage.py @@ -0,0 +1,54 @@ +from __future__ import annotations + +from typing import Optional + +from rio import Component, Column, Row, Spacer, page, GuardEvent + +from elm.types import UserSession +from elm.components import AvatarEditBox, AccountInfoBox, PersonalInfoBox + +def my_profile_page_guard(event: GuardEvent) -> Optional[str]: + try: + _ = event.session[UserSession].user_name + return None + except KeyError: + return "/" + +@page(name="My Profile", url_segment="my-profile", guard=my_profile_page_guard) +class MyProfilePage(Component): + def build(self) -> Component: + if self.session.is_mobile(): + return Column( + Column( + AvatarEditBox(), + Spacer(), + spacing=1 + ), + Column( + AccountInfoBox(), + PersonalInfoBox(), + Spacer(), + spacing=1, + grow_x=True + ), + spacing=1, + margin=0.5 + ) + else: + return Row( + Column( + AvatarEditBox(), + Spacer(), + spacing=1 + ), + Column( + AccountInfoBox(), + PersonalInfoBox(), + Spacer(), + spacing=1, + grow_x=True + ), + spacing=1, + margin=1, + margin_right=2 + ) diff --git a/src/elm/pages/RegisterPage.py b/src/elm/pages/RegisterPage.py new file mode 100644 index 0000000..d0ce1a3 --- /dev/null +++ b/src/elm/pages/RegisterPage.py @@ -0,0 +1,147 @@ +from __future__ import annotations + +from copy import copy +from typing import Any, Optional + +from rio import Component, Column, Row, Text, Spacer, page, Color, Rectangle, TextInput, GuardEvent, ProgressCircle + +from email_validator import validate_email, EmailNotValidError + +from elm.types import UserSession +from elm.services import UserService, NameNotAllowedError, MailAlreadyInUseError +from elm.components import ElmButton + + +def register_page_guard(event: GuardEvent) -> Optional[str]: + try: + _ = event.session[UserSession].user_name + return "/" + except KeyError: + return None + +@page(name="Register", url_segment="register", guard=register_page_guard) +class RegisterPage(Component): + user_name: str = "" + password_1: str = "" + password_2: str = "" + mail: str = "" + error_message: str = "" + success_message: str = "" + input_blocked: bool = False + + async def on_register_confirmed(self, _: Any) -> None: + """ Handler for pressing ENTER inside the text inputs """ + await self.on_register_pressed() + + async def on_register_pressed(self) -> None: + self.input_blocked = True + user_name = copy(self.user_name) # Prevents race condition name swap + + if len(user_name) < 3: + self.error_message = f"Nutzername muss mindestens 3 Zeichen haben" + self.input_blocked = False + return + + if len(self.password_1) == 0 or len(self.password_2) == 0: + self.error_message = "Kein Passwort gesetzt" + self.input_blocked = False + return + + if self.password_1 != self.password_2: + self.error_message = "Passwörter stimmen nicht überein" + self.input_blocked = False + return + + try: + validate_email(self.mail, check_deliverability=False) + except EmailNotValidError: + self.error_message = "Ungültige Mail Adresse" + self.input_blocked = False + return + + existing_user = await self.session[UserService].get_user(user_name) + if existing_user: + self.error_message = "Nutzer exisitiert bereits" + self.input_blocked = False + return + + try: + await self.session[UserService].create_user(user_name, self.mail, self.password_1) + except NameNotAllowedError as e: + self.error_message = f"Nutzername enthält unerlaubte Zeichen: {e.disallowed_char}" + self.input_blocked = False + return + except MailAlreadyInUseError: + self.error_message = "Mail Adresse bereits in Nutzung" + self.input_blocked = False + return + + self.error_message = "" + self.user_name, self.password_1, self.password_2, self.mail = "", "", "", "" + self.success_message = "Registrierung erfolgreich" + self.input_blocked = False + + def build(self) -> Component: + return Row( + Rectangle( + content=Column( + Rectangle( + content=Rectangle( + content=Row( + Text("Registrierung", margin=0.5, selectable=False, overflow="wrap", grow_x=True), + ProgressCircle(min_size=1, margin=0.5, color="primary", progress=None if self.input_blocked else 0) + ), + 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.bind().user_name, + label="Nutzername", + on_confirm=self.on_register_confirmed, + is_sensitive=not self.input_blocked + ), + TextInput( + text=self.bind().mail, + label="E-Mail", + on_confirm=self.on_register_confirmed, + is_sensitive=not self.input_blocked + ), + TextInput( + text=self.bind().password_1, + label="Passwort", + is_secret=True, + on_confirm=self.on_register_confirmed, + is_sensitive=not self.input_blocked + ), + TextInput( + text=self.bind().password_2, + label="wiederholen" if self.session.is_mobile() else "Passwort wiederholen", + is_secret=True, + on_confirm=self.on_register_confirmed, + is_sensitive=not self.input_blocked + ), + Text(self.error_message, fill=self.session.theme.danger_color, overflow="wrap", justify="center") if self.error_message else Spacer(grow_x=False, grow_y=False), + Text(self.success_message, fill=self.session.theme.success_color, overflow="wrap", justify="center") if self.success_message else Spacer(grow_x=False, grow_y=False), + ElmButton( + text="Registrieren", + style="small" if self.session.is_mobile() else "normal", + on_press=self.on_register_pressed + ) if not self.success_message else Spacer(grow_x=False, grow_y=False), + ElmButton(text="Jetzt einloggen", style="small" if self.session.is_mobile() else "normal", on_press=lambda: self.session.navigate_to("./login")) if self.success_message else Spacer(grow_x=False, grow_y=False), + margin=1, + spacing=1 + ), + Spacer() + ), + fill=self.session.theme.box_color, + stroke_width=0.1, + stroke_color=self.session.theme.box_border_color, + min_height=15 + ), + align_x=0.5, + align_y=0.5 + ) diff --git a/src/elm/services/AccountingService.py b/src/elm/services/AccountingService.py new file mode 100644 index 0000000..2dada8d --- /dev/null +++ b/src/elm/services/AccountingService.py @@ -0,0 +1,150 @@ +import io +import logging +from decimal import Decimal, ROUND_DOWN +from typing import Optional + +import httpx +import qrcode + +from elm.types import Transaction, User, PayPalConfiguration + +logger = logging.getLogger(__name__.split(".")[-1]) + + +class InsufficientFundsError(Exception): + pass + + +class AccountingService: + def __init__(self, paypal_config: PayPalConfiguration) -> None: + self._paypal_config = paypal_config + + async def get_paypal_access_token(self) -> str: + async with httpx.AsyncClient() as client: + response = await client.post( + "https://api-m.sandbox.paypal.com/v1/oauth2/token", + auth=( + self._paypal_config.client_id_sandbox, + self._paypal_config.secret_sandbox, + ), + headers={ + "Content-Type": "application/x-www-form-urlencoded", + }, + data={ + "grant_type": "client_credentials" + } + ) + + response.raise_for_status() + + data = response.json() + return data["access_token"] + + async def start_paypal_process(self, user_name: str, amount: Decimal) -> str: + async with httpx.AsyncClient() as client: + access_token = await self.get_paypal_access_token() + response = await client.post( + url="https://api-m.sandbox.paypal.com/v2/checkout/orders/", + headers={ + "Authorization": f"Bearer {access_token}" + }, + json={ + "intent": "CAPTURE", + "purchase_units": [ + { + "custom_id": user_name, + "amount": { + "currency_code": "EUR", + "value": str(amount) + } + } + ] + } + ) + approval_url = next( + link["href"] + for link in response.json()["links"] + if link["rel"] == "approve" + ) + return approval_url + + + async def add_balance(self, user_name: str, balance_to_add: Decimal, title: str) -> Decimal: + user = await User.find_one(User.user_name == user_name) + if not user: + raise KeyError("User does not exist") + await Transaction( + user_name=user_name, + value=balance_to_add, + is_debit=False, + title=title + ).save() + logger.debug(f"Added balance of {self.make_euro_string_from_decimal(balance_to_add)} to user '{user_name}'") + return await self.get_balance(user_name) + + async def remove_balance(self, user_name: str, balance_to_remove: Decimal, title: str) -> Decimal: + current_balance = await self.get_balance(user_name) + if (current_balance - balance_to_remove) < 0: + raise InsufficientFundsError + + await Transaction( + user_name=user_name, + value=balance_to_remove, + is_debit=True, + title=title + ).save() + logger.debug( + f"Removed balance of {self.make_euro_string_from_decimal(balance_to_remove)} from user '{user_name}'") + return await self.get_balance(user_name) + + async def get_balance(self, user_name: str) -> Decimal: + balance_buffer = Decimal("0") + for transaction in await self.get_transaction_history(user_name): + if transaction.is_debit: + balance_buffer -= transaction.value + else: + balance_buffer += transaction.value + return balance_buffer + + @staticmethod + async def get_transaction_history(user_name: str) -> list[Transaction]: + user = await User.find_one(User.user_name == user_name) + if not user: + raise KeyError("User does not exist") + return await Transaction.find_many(Transaction.user_name == user_name).to_list() + + @staticmethod + def make_euro_string_from_decimal(euros: Optional[Decimal]) -> str: + """ + Internally, all money values are euros as decimal. Only when showing them to the user we generate a string. + """ + if euros is None: + return "0.00 €" + rounded_decimal = str(euros.quantize(Decimal(".01"), rounding=ROUND_DOWN)) + return f"{rounded_decimal} €" + + @staticmethod + def make_payment_qr_image(beneficiary_name, beneficiary_bic, beneficiary_iban, text, amount_euros=None) -> bytes: + text = text.replace("\n", ";") + amount_formatted = "EUR{:.2f}".format(amount_euros) if amount_euros else "" + epc_text = f"""BCD +002 +1 +SCT +{beneficiary_bic} +{beneficiary_name} +{beneficiary_iban} +{amount_formatted} + + +{text} +""" + qr = qrcode.QRCode( + version=6, + error_correction=qrcode.constants.ERROR_CORRECT_M, + ) + qr.add_data(epc_text) + img = qr.make_image() + img_bytes = io.BytesIO() + img.save(img_bytes) + return img_bytes.getvalue() diff --git a/src/elm/services/ConfigurationService.py b/src/elm/services/ConfigurationService.py new file mode 100644 index 0000000..a7f5c26 --- /dev/null +++ b/src/elm/services/ConfigurationService.py @@ -0,0 +1,119 @@ +import sys +from datetime import datetime +from pathlib import Path +import logging +import tomllib + +from from_root import from_root + +from elm.types.ConfigurationTypes import MailingServiceConfiguration, LanInfo, ReceiptPrintingConfiguration, DatabaseConfiguration, PayPalConfiguration + +logger = logging.getLogger(__name__.split(".")[-1]) +logger.setLevel(logging.DEBUG) + + +class ConfigurationService: + def __init__(self, config_file_path: Path) -> None: + try: + with open(from_root("VERSION"), "r") as version_file: + self._version = version_file.read().strip() + except FileNotFoundError: + logger.warning("Could not find VERSION file, defaulting to '0.0.0'") + self._version = "0.0.0" + + try: + with open(config_file_path, "rb") as config_file: + self._config = tomllib.load(config_file) + except FileNotFoundError: + logger.fatal(f"Could not find config file at \"{config_file_path}\", exiting...") + exit(1) + + try: + self._DEFAULT_PROFILE_PICTURE = self._preload_default_profile_picture() + except FileNotFoundError: + logger.fatal("Could not find default profile picture, exiting...") + exit(1) + + def get_paypal_configuration(self) -> PayPalConfiguration: + try: + return PayPalConfiguration( + client_id_sandbox=self._config["paypal"]["client_id_sandbox"], + secret_sandbox=self._config["paypal"]["secret_sandbox"], + client_id=self._config["paypal"]["client_id"], + secret=self._config["paypal"]["secret"] + ) + except KeyError: + logger.fatal("Error loading DatabaseConfiguration, exiting...") + sys.exit(1) + + def get_database_configuration(self) -> DatabaseConfiguration: + try: + return DatabaseConfiguration( + database_address=self._config["database"]["database_address"], + database_name=self._config["database"]["database_name"], + ) + except KeyError: + logger.fatal("Error loading DatabaseConfiguration, exiting...") + sys.exit(1) + + def get_mailing_service_configuration(self) -> MailingServiceConfiguration: + try: + mailing_configuration = self._config["mailing"] + return MailingServiceConfiguration( + smtp_server=mailing_configuration["smtp_server"], + smtp_port=mailing_configuration["smtp_port"], + sender=mailing_configuration["sender"], + username=mailing_configuration["username"], + password=mailing_configuration["password"] + ) + except KeyError: + logger.fatal("Error loading MailingServiceConfiguration, exiting...") + sys.exit(1) + + def get_lan_info(self) -> LanInfo: + try: + lan_info = self._config["lan"] + return LanInfo( + name=lan_info["name"], + iteration=lan_info["iteration"], + date_from=datetime.strptime(lan_info["date_from"], "%Y-%m-%d %H:%M:%S"), + date_till=datetime.strptime(lan_info["date_till"], "%Y-%m-%d %H:%M:%S"), + organizer_mail=lan_info["organizer_mail"], + internet_speed_mbs=lan_info["internet_speed_mbs"], + has_wifi=lan_info["has_wifi"], + has_showers=lan_info["has_showers"], + ts3_address=lan_info["ts3_address"], + discord_invite_link=lan_info["discord_invite_link"] + ) + except KeyError: + logger.fatal("Error loading LAN Info, exiting...") + sys.exit(1) + + def get_receipt_printing_configuration(self) -> ReceiptPrintingConfiguration: + try: + receipt_printing_configuration = self._config["receipt_printing"] + return ReceiptPrintingConfiguration( + host=receipt_printing_configuration["host"], + port=receipt_printing_configuration["port"], + order_print_endpoint=receipt_printing_configuration["order_print_endpoint"], + password=receipt_printing_configuration["password"] + ) + except KeyError: + logger.fatal("Error loading Receipt Printing Configuration, exiting...") + sys.exit(1) + + def _preload_default_profile_picture(self) -> bytes: + with open(from_root(self._config["misc"]["default_profile_picture"]), "rb") as file: + return file.read() + + @property + def APP_VERSION(self) -> str: + return self._version + + @property + def DEV_MODE_ACTIVE(self) -> bool: + return self._config["misc"]["dev_mode_active"] + + @property + def DEFAULT_PROFILE_PICTURE(self) -> bytes: + return self._DEFAULT_PROFILE_PICTURE diff --git a/src/elm/services/DatabaseService.py b/src/elm/services/DatabaseService.py new file mode 100644 index 0000000..94d24bf --- /dev/null +++ b/src/elm/services/DatabaseService.py @@ -0,0 +1,37 @@ +import logging + +from beanie import init_beanie +from pymongo import AsyncMongoClient +from pymongo.asynchronous.collection import AsyncCollection + +from elm.types import User, Transaction +from elm.types.ConfigurationTypes import DatabaseConfiguration + +logger = logging.getLogger(__name__.split(".")[-1]) +logger.setLevel(logging.DEBUG) + + +class DuplicationError(Exception): + pass + + +class NoDatabaseConnectionError(Exception): + pass + + +class DatabaseService: + def __init__(self, db_config: DatabaseConfiguration) -> None: + self._db_config = db_config + self._client = None + self._database = None + self._users = None + + async def initialize(self) -> None: + if self._client is None: + self._client = AsyncMongoClient(self._db_config.database_address) + self._database = self._client[self._db_config.database_name] + self._users: AsyncCollection = self._database["users"] + await init_beanie( + database=self._database, + document_models=[User, Transaction] + ) diff --git a/src/elm/services/LocalDataService.py b/src/elm/services/LocalDataService.py new file mode 100644 index 0000000..b954008 --- /dev/null +++ b/src/elm/services/LocalDataService.py @@ -0,0 +1,26 @@ +import secrets +from typing import Optional + +from rio import UserSettings + +from elm.types.UserSession import UserSession + + +class LocalData(UserSettings): + stored_session_token: Optional[str] = None + +class LocalDataService: + def __init__(self) -> None: + self._session: dict[str, UserSession] = {} + + def verify_token(self, token: str) -> Optional[UserSession]: + return self._session.get(token) + + def set_session(self, session: UserSession) -> str: + key = secrets.token_hex(32) + self._session[key] = session + return key + + def del_session(self, token: Optional[str]) -> None: + if token is not None: + self._session.pop(token, None) diff --git a/src/elm/services/MailingService.py b/src/elm/services/MailingService.py new file mode 100644 index 0000000..9eb7ca5 --- /dev/null +++ b/src/elm/services/MailingService.py @@ -0,0 +1,55 @@ +import logging +from decimal import Decimal +from email.message import EmailMessage +from asyncio import sleep + +import aiosmtplib + +from elm.services.ConfigurationService import ConfigurationService +from elm.types.User import User + +logger = logging.getLogger(__name__.split(".")[-1]) +logger.setLevel(logging.DEBUG) + +class MailingService: + def __init__(self, configuration_service: ConfigurationService): + self._configuration_service = configuration_service + self._config = self._configuration_service.get_mailing_service_configuration() + + async def send_email(self, subject: str, body: str, receiver: str) -> None: + if self._configuration_service.DEV_MODE_ACTIVE: + logger.info(f"Skipped sending mail to {receiver} because demo mode is active.") + logger.info(f"Subject: {subject}") + logger.info(f"Receiver: {receiver}") + logger.info(f"Body: {body}") + await sleep(1) + return + + try: + message = EmailMessage() + message["From"] = self._config.sender + message["To"] = receiver + message["Subject"] = subject + message.set_content(body) + + await aiosmtplib.send( + message, + hostname=self._config.smtp_server, + port=self._config.smtp_port, + username=self._config.username, + password=self._config.password + ) + except Exception as e: + logger.error(f"Failed to send email: {e}") + + def generate_account_balance_added_mail_body(self, user: User, added_balance: Decimal, total_balance: Decimal) -> str: + return f""" + Hallo {user.user_name}, + + deinem Account wurden {added_balance:.2f} € hinzugefügt. Dein neues Guthaben beträgt nun {total_balance:.2f} €. + + Wenn du zu dieser Aufladung Fragen hast, stehen wir dir in unserem Discord Server oder per Mail an {self._configuration_service.get_lan_info().organizer_mail} zur Verfügung. + + Liebe Grüße + Dein {self._configuration_service.get_lan_info().name} Team + """ diff --git a/src/elm/services/UserService.py b/src/elm/services/UserService.py new file mode 100644 index 0000000..3dc3d4a --- /dev/null +++ b/src/elm/services/UserService.py @@ -0,0 +1,84 @@ +from asyncio import sleep +from hashlib import sha256 +from typing import Optional +from string import ascii_letters, digits + +from pymongo.errors import DuplicateKeyError + +from elm.types.User import User + + +class NameNotAllowedError(Exception): + def __init__(self, disallowed_char: str) -> None: + self.disallowed_char = disallowed_char + + +class MailAlreadyInUseError(Exception): + pass + + +class UserService: + ALLOWED_USER_NAME_SYMBOLS = ascii_letters + digits + "!#$%&*+,-./:;<=>?[]^_{|}~" + MAX_USERNAME_LENGTH = 14 + + def __init__(self) -> None: + pass + + @staticmethod + async def get_all_users() -> list[User]: + return await User.find_all().to_list() + + @staticmethod + async def get_user(user_name: str) -> Optional[User]: + return await User.find_one(User.user_name == user_name) + + @staticmethod + async def get_user_by_mail(mail: str) -> Optional[User]: + return await User.find_one(User.user_mail == mail.lower()) + + @staticmethod + async def get_user_picture(user_name: str) -> Optional[bytes]: + user = await User.find_one(User.user_name == user_name) + if user: + return user.user_picture + return None + + @staticmethod + async def change_user_password(user_name: str, new_password: str) -> bool: + user = await User.find_one(User.user_name == user_name) + if not user: + return False + user.user_password = sha256(new_password.encode(encoding="utf-8")).hexdigest() + await user.save() + return True + + async def create_user(self, user_name: str, user_mail: str, password_clear_text: str) -> User: + disallowed_char = self._check_for_disallowed_char(user_name) + if disallowed_char: + raise NameNotAllowedError(disallowed_char) + + try: + return await User( + user_name=user_name, + user_mail=user_mail.lower(), + user_password=sha256(password_clear_text.encode(encoding="utf-8")).hexdigest() + ).insert() + except DuplicateKeyError: + raise MailAlreadyInUseError + + + async def is_login_valid(self, user_name: str, password_clear_text: str) -> bool: + user = await self.get_user(user_name) + user_password_hash = sha256(password_clear_text.encode(encoding="utf-8")).hexdigest() + if not user: + return False + if user.user_fallback_password and user.user_fallback_password == user_password_hash: + return True + return user.user_password == user_password_hash + + + def _check_for_disallowed_char(self, name: str) -> Optional[str]: + for c in name: + if c not in self.ALLOWED_USER_NAME_SYMBOLS: + return c + return None diff --git a/src/elm/services/__init__.py b/src/elm/services/__init__.py new file mode 100644 index 0000000..54bbe95 --- /dev/null +++ b/src/elm/services/__init__.py @@ -0,0 +1,6 @@ +from .ConfigurationService import ConfigurationService +from .DatabaseService import DatabaseService +from .UserService import UserService, NameNotAllowedError, MailAlreadyInUseError +from .LocalDataService import LocalData, LocalDataService +from .MailingService import MailingService +from .AccountingService import AccountingService diff --git a/src/elm/types/ConfigurationTypes.py b/src/elm/types/ConfigurationTypes.py new file mode 100644 index 0000000..665041d --- /dev/null +++ b/src/elm/types/ConfigurationTypes.py @@ -0,0 +1,46 @@ +from dataclasses import dataclass +from datetime import datetime + +class NoSuchCategoryError(Exception): + pass + +@dataclass(frozen=True) +class MailingServiceConfiguration: + smtp_server: str + smtp_port: int + sender: str + username: str + password: str + +@dataclass(frozen=True) +class DatabaseConfiguration: + database_address: str + database_name: str + +@dataclass(frozen=True) +class LanInfo: + name: str + iteration: str + date_from: datetime + date_till: datetime + organizer_mail: str + internet_speed_mbs: int + has_wifi: bool + has_showers: bool + ts3_address: str + discord_invite_link: str + + +@dataclass(frozen=True) +class ReceiptPrintingConfiguration: + host: str + port: int + order_print_endpoint: str + password: str + +@dataclass(frozen=True) +class PayPalConfiguration: + client_id_sandbox: str + secret_sandbox: str + client_id: str + secret: str diff --git a/src/elm/types/Transaction.py b/src/elm/types/Transaction.py new file mode 100644 index 0000000..3406368 --- /dev/null +++ b/src/elm/types/Transaction.py @@ -0,0 +1,25 @@ +from datetime import datetime, UTC +from decimal import Decimal +from typing import Annotated + +from beanie import Document, Indexed +from bson import Decimal128 +from pydantic import field_validator + + +class Transaction(Document): + user_name: Annotated[str, Indexed()] + value: Decimal + is_debit: bool + title: str + transaction_date: datetime = datetime.now(UTC) + + class Settings: + name = "transactions" + + @field_validator("value", mode="before") + @classmethod + def convert_decimal128(cls, v): + if isinstance(v, Decimal128): + return v.to_decimal() + return v diff --git a/src/elm/types/User.py b/src/elm/types/User.py new file mode 100644 index 0000000..e0d552e --- /dev/null +++ b/src/elm/types/User.py @@ -0,0 +1,29 @@ +from datetime import date, datetime +from typing import Optional, Annotated + +from beanie import Document, Indexed + + +class User(Document): + user_name: Annotated[str, Indexed(unique=True)] + user_mail: Annotated[str, Indexed(unique=True)] + user_password: str + user_picture: Optional[bytes] = None + user_fallback_password: Optional[str] = "" + user_first_name: Optional[str] = "" + user_last_name: Optional[str] = "" + user_birth_day: Optional[date] = None + is_active: bool = True + is_team_member: bool = False + created_at: datetime = datetime.now() + + class Settings: + name = "users" + + def __hash__(self) -> int: + return hash(self.user_name) + + def __eq__(self, other): + if not isinstance(other, User): + return NotImplemented + return self.user_name == other.user_name diff --git a/src/elm/types/UserSession.py b/src/elm/types/UserSession.py new file mode 100644 index 0000000..3cdb49e --- /dev/null +++ b/src/elm/types/UserSession.py @@ -0,0 +1,11 @@ +from typing import Optional +from uuid import UUID + +from rio import Dataclass + + +class UserSession(Dataclass): + id: UUID + user_name: str + is_team_member: bool + profile_picture: Optional[bytes] = None diff --git a/src/elm/types/__init__.py b/src/elm/types/__init__.py new file mode 100644 index 0000000..e4ae08a --- /dev/null +++ b/src/elm/types/__init__.py @@ -0,0 +1,4 @@ +from .User import User +from .UserSession import UserSession +from .ConfigurationTypes import * +from .Transaction import Transaction diff --git a/src/elm/types/helpers.py b/src/elm/types/helpers.py new file mode 100644 index 0000000..0bba704 --- /dev/null +++ b/src/elm/types/helpers.py @@ -0,0 +1,2 @@ +async def async_noop(*args, **kwargs) -> None: + pass