feat: User Tooltip (#4319)

This commit is contained in:
Michael Genson
2024-10-11 19:36:26 -05:00
committed by GitHub
parent a2bdb02a7f
commit e06572b7ca
23 changed files with 164 additions and 80 deletions

View File

@@ -1,6 +1,7 @@
from functools import cached_property
from uuid import UUID
from fastapi import Query
from fastapi import Depends, HTTPException
from pydantic import UUID4
from mealie.routes._base.base_controllers import BaseUserController
@@ -8,7 +9,7 @@ from mealie.routes._base.controller import controller
from mealie.routes._base.routers import UserAPIRouter
from mealie.schema.group.group_preferences import ReadGroupPreferences, UpdateGroupPreferences
from mealie.schema.group.group_statistics import GroupStorage
from mealie.schema.response.pagination import PaginationQuery
from mealie.schema.response.pagination import PaginationBase, PaginationQuery
from mealie.schema.user.user import GroupSummary, UserSummary
from mealie.services.group_services.group_service import GroupService
@@ -26,13 +27,29 @@ class GroupSelfServiceController(BaseUserController):
"""Returns the Group Data for the Current User"""
return self.group.cast(GroupSummary)
@router.get("/members", response_model=list[UserSummary])
def get_group_members(self, household_id: UUID4 | None = Query(None, alias="householdId")):
"""Returns all users belonging to the current group, optionally filtered by household_id"""
@router.get("/members", response_model=PaginationBase[UserSummary])
def get_group_members(self, q: PaginationQuery = Depends()):
"""Returns all users belonging to the current group"""
query_filter = f"household_id={household_id}" if household_id else None
private_users = self.repos.users.page_all(PaginationQuery(page=1, per_page=-1, query_filter=query_filter)).items
return [user.cast(UserSummary) for user in private_users]
response = self.repos.users.page_all(q, override=UserSummary)
response.set_pagination_guides(router.url_path_for("get_group_members"), q.model_dump())
return response
@router.get("/members/{username_or_id}", response_model=UserSummary)
def get_group_member(self, username_or_id: str | UUID4):
"""Returns a single user belonging to the current group"""
try:
UUID(username_or_id)
key = "id"
except ValueError:
key = "username"
private_user = self.repos.users.get_one(username_or_id, key)
if not private_user:
raise HTTPException(status_code=404, detail="User Not Found")
return private_user.cast(UserSummary)
@router.get("/preferences", response_model=ReadGroupPreferences)
def get_group_preferences(self):

View File

@@ -1,6 +1,6 @@
from functools import cached_property
from fastapi import HTTPException, status
from fastapi import Depends, HTTPException, status
from mealie.routes._base.base_controllers import BaseUserController
from mealie.routes._base.controller import controller
@@ -9,7 +9,7 @@ from mealie.schema.household.household import HouseholdInDB
from mealie.schema.household.household_permissions import SetPermissions
from mealie.schema.household.household_preferences import ReadHouseholdPreferences, UpdateHouseholdPreferences
from mealie.schema.household.household_statistics import HouseholdStatistics
from mealie.schema.response.pagination import PaginationQuery
from mealie.schema.response.pagination import PaginationBase, PaginationQuery
from mealie.schema.user.user import UserOut
from mealie.services.household_services.household_service import HouseholdService
@@ -27,13 +27,20 @@ class HouseholdSelfServiceController(BaseUserController):
"""Returns the Household Data for the Current User"""
return self.household
@router.get("/members", response_model=list[UserOut])
def get_household_members(self):
@router.get("/members", response_model=PaginationBase[UserOut])
def get_household_members(self, q: PaginationQuery = Depends()):
"""Returns all users belonging to the current household"""
private_users = self.repos.users.page_all(
PaginationQuery(page=1, per_page=-1, query_filter=f"household_id={self.household_id}")
).items
return [user.cast(UserOut) for user in private_users]
qf_part = f"household_id={self.household_id}"
if q.query_filter:
q.query_filter = f"({q.query_filter}) AND {qf_part}"
else:
q.query_filter = qf_part
response = self.repos.users.page_all(q, override=UserOut)
response.set_pagination_guides(router.url_path_for("get_household_members"), q.model_dump())
return response
@router.get("/preferences", response_model=ReadHouseholdPreferences)
def get_household_preferences(self):

View File

@@ -180,6 +180,7 @@ class UserOut(UserBase):
class UserSummary(MealieModel):
id: UUID4
username: str
full_name: str
model_config = ConfigDict(from_attributes=True)