diff --git a/cutt/player.py b/cutt/player.py index 51a58d9..197a1b9 100644 --- a/cutt/player.py +++ b/cutt/player.py @@ -19,12 +19,24 @@ P = Player player_router = APIRouter(prefix="/player", tags=["player"]) +def update_team_manager(scopes_str: str, team_id: int, state: bool = True): + scopes = set(scopes_str.split()) + if state: + scopes.add(f"team:{team_id}") + else: + scopes.remove(f"team:{team_id}") + + print("new scopestr", " ".join(scopes)) + return " ".join(sorted(scopes)) + + class PlayerRequest(BaseModel): display_name: str username: str gender: str | None number: str email: str | None + is_manager: bool | None class AddPlayerRequest(PlayerRequest): ... @@ -96,6 +108,10 @@ def modify_player( player.number = r.number.strip() player.gender = r.gender.strip() if r.gender else None player.email = r.email.strip() if r.email else None + if r.is_manager is not None: + player.scopes = update_team_manager( + player.scopes, request.team_id, r.is_manager + ) session.add(player) session.commit() return PlainTextResponse("modification successful") @@ -212,6 +228,8 @@ async def list_players( ] + demo_players allowed_scopes = set(user.scopes.split()) + team_manager_scope = f"team:{team_id}" + is_team_manager = team_manager_scope in allowed_scopes with Session(engine) as session: current_user = session.exec( @@ -220,7 +238,7 @@ async def list_players( .join(Team) .where(Team.id == team_id, P.disabled == False, P.id == user.id) ).one_or_none() - if not current_user and f"team:{team_id}" not in allowed_scopes: + if not current_user and not is_team_manager: raise HTTPException( status_code=status.HTTP_400_BAD_REQUEST, detail="you're not in this team", @@ -233,21 +251,26 @@ async def list_players( .where(Team.id == team_id, P.disabled == False) .order_by(P.display_name) ).all() + if players: - return [ - player.model_dump( - include={ - "id", - "display_name", - "username", - "gender", - "number", - "email", - } - ) - for player in players - if not player.disabled - ] + players_dump = [] + for player in players: + if not player.disabled: + player_dump = player.model_dump( + include={ + "id", + "display_name", + "username", + "gender", + "number", + } + ) + if is_team_manager: + player_dump["email"] = player.email + if team_manager_scope in player.scopes: + player_dump["is_manager"] = True + players_dump.append(player_dump) + return players_dump def read_teams_me(user: Annotated[P, Depends(get_current_active_user)]): diff --git a/frontend/src/TeamPanel.tsx b/frontend/src/TeamPanel.tsx index bcbba0a..23c0249 100644 --- a/frontend/src/TeamPanel.tsx +++ b/frontend/src/TeamPanel.tsx @@ -4,6 +4,7 @@ import { useSession } from "./Session"; import { ErrorState } from "./types"; import { useNavigate } from "react-router"; import Calendar from "./Calendar"; +import { Info, Star, StarHalf, StarOff, UserPen } from "lucide-react"; import Loading from "./Loading"; const TeamPanel = () => { @@ -21,6 +22,7 @@ const TeamPanel = () => { gender: undefined, number: "", email: "", + is_manager: false, } as User; const [error, setError] = useState(); const [player, setPlayer] = useState(newPlayerTemplate); @@ -96,7 +98,12 @@ const TeamPanel = () => { setError({ ok: true, message: "" }); }} > - {p.display_name} + {p.display_name} + {p.is_manager && ( + + + + )} ))} + -
+ {error?.message && ( +

+ {error.message} +

+ )} +