diff --git a/ezgg_website/__init__.py b/ezgg_website/__init__.py index f3b5ece..7ce617e 100644 --- a/ezgg_website/__init__.py +++ b/ezgg_website/__init__.py @@ -6,6 +6,7 @@ import rio from . import pages from . import components as comps +from . import services themes = [ # Grey/Purple @@ -113,6 +114,11 @@ app = rio.App( page_url='about', build=pages.About, ), + rio.Page( + name="Member", + page_url='member', + build=lambda: pages.Member(services.DatabaseService()), + ) ], theme=themes[6], assets_dir=Path(__file__).parent / "assets", diff --git a/ezgg_website/assets/member_pictures/anon.png b/ezgg_website/assets/member_pictures/anon.png new file mode 100644 index 0000000..265d8b5 Binary files /dev/null and b/ezgg_website/assets/member_pictures/anon.png differ diff --git a/ezgg_website/components/__init__.py b/ezgg_website/components/__init__.py index 44d9816..d8102b5 100644 --- a/ezgg_website/components/__init__.py +++ b/ezgg_website/components/__init__.py @@ -1,3 +1,4 @@ from .navigation import Navigation from .header import Header from .news_post import NewsPost +from .member_card import MemberInfo, MemberCard diff --git a/ezgg_website/components/member_card.py b/ezgg_website/components/member_card.py new file mode 100644 index 0000000..b56234c --- /dev/null +++ b/ezgg_website/components/member_card.py @@ -0,0 +1,36 @@ +from pathlib import Path +from dataclasses import dataclass + +import rio + +@dataclass +class MemberInfo: + picture_path: Path + name: str + position: str + entry_date: str + + +class MemberCard(rio.Component): + def __init__(self, info: MemberInfo) -> None: + super().__init__() + self._info = info + self.align_y = 0 + self.margin_top = 0 + self.margin_bottom = 2 + self.margin_right = 1 + + def build(self) -> rio.Component: + return rio.Rectangle( + content=rio.Column( + rio.Image(self._info.picture_path, height=9, margin_bottom=1.3), + rio.Text(self._info.name, margin_bottom=0.4, style=rio.TextStyle(font_weight="bold")), + rio.Text(self._info.position, margin_bottom=0.4, style=rio.TextStyle(italic=True)), + rio.Text(f"Mitglied seit {self._info.entry_date}", style=rio.TextStyle(italic=True), margin_bottom=0.4) + ), + fill=self.session.theme.neutral_color, + corner_radius=self.session.theme.corner_radius_medium, + shadow_radius=0.5, + shadow_color=self.session.theme.hud_color, + shadow_offset_y=0 + ) diff --git a/ezgg_website/pages/__init__.py b/ezgg_website/pages/__init__.py index d79b468..6383461 100644 --- a/ezgg_website/pages/__init__.py +++ b/ezgg_website/pages/__init__.py @@ -1,3 +1,4 @@ from .home import Home from .about import About +from .member import Member from .page_builder import build_page diff --git a/ezgg_website/pages/member.py b/ezgg_website/pages/member.py new file mode 100644 index 0000000..890592a --- /dev/null +++ b/ezgg_website/pages/member.py @@ -0,0 +1,25 @@ +from __future__ import annotations + +from typing import * # type: ignore + +import rio + +from .page_builder import build_page +from .. import components as comps +from .. import services + + +class Member(rio.Component): + def __init__(self, database_service: services.database_service.DatabaseService) -> None: + super().__init__() + self._database_service = database_service + + def build(self) -> rio.Component: + grid = rio.Grid() + for i, member in enumerate(self._database_service.get_members()): + grid.add( + comps.MemberCard(member), + row=i // 2, + column=i % 2, + ) + return build_page(grid) diff --git a/ezgg_website/services/__init__.py b/ezgg_website/services/__init__.py new file mode 100644 index 0000000..9b61a58 --- /dev/null +++ b/ezgg_website/services/__init__.py @@ -0,0 +1 @@ +from .database_service import DatabaseService diff --git a/ezgg_website/services/database_service.py b/ezgg_website/services/database_service.py new file mode 100644 index 0000000..841ed76 --- /dev/null +++ b/ezgg_website/services/database_service.py @@ -0,0 +1,51 @@ +from from_root import from_root + +from ezgg_website.components import MemberInfo + +from ezgg_website.components.member_card import MemberInfo + + +# @ToDo: Make real database service at some point +class DatabaseService: + def __init__(self): + pass + + def get_members(self) -> list[MemberInfo]: + return [ + MemberInfo( + picture_path=from_root("ezgg_website/assets/member_pictures/anon.png"), + name="David \"Typhus\" R.", + position="1. Vorsitzender", + entry_date="29.10.2023" + ), MemberInfo( + picture_path=from_root("ezgg_website/assets/member_pictures/anon.png"), + name="Julia \"Ravenchild\" A.", + position="2. Vorsitzende", + entry_date="29.10.2023" + ), MemberInfo( + picture_path=from_root("ezgg_website/assets/member_pictures/anon.png"), + name="Jessy \"JessySixx\" R.", + position="Schatzmeisterin", + entry_date="29.10.2023" + ), MemberInfo( + picture_path=from_root("ezgg_website/assets/member_pictures/anon.png"), + name="Tim \"Matschwicht\" B.", + position="Mitglied", + entry_date="29.10.2023" + ), MemberInfo( + picture_path=from_root("ezgg_website/assets/member_pictures/anon.png"), + name="Dennis \"Goodman\" P.", + position="Mitglied", + entry_date="29.10.2023" + ), MemberInfo( + picture_path=from_root("ezgg_website/assets/member_pictures/anon.png"), + name="Tom \"Tcprod\" C.", + position="Mitglied", + entry_date="29.10.2023" + ), MemberInfo( + picture_path=from_root("ezgg_website/assets/member_pictures/anon.png"), + name="Chris \"Meliodas\" K.", + position="Mitglied", + entry_date="29.10.2023" + ) + ]