Private
Public Access
Room info panel is now user-resizable (fixing a layout clip at narrow widths), and every user-selection spot (room membership, admin ownership transfer) uses a new searchable UserPicker instead of raw text input or prompt(). Member rows fold role + actions into a single inline dropdown instead of a row of buttons, so the member list stays usable as rooms grow. Room invites (the accept/decline flow) are replaced by adding a user to a room directly -- an admin/owner picks someone and they're a member immediately, with a "you've been added" notification email instead of an invite email. Drops the now-unused room_invites table.
42 lines
1.0 KiB
Python
42 lines
1.0 KiB
Python
import uuid
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, ConfigDict, EmailStr, Field
|
|
|
|
|
|
class UserCreate(BaseModel):
|
|
username: str = Field(min_length=3, max_length=50)
|
|
email: EmailStr
|
|
password: str = Field(min_length=8, max_length=200)
|
|
|
|
|
|
class UserRead(BaseModel):
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: uuid.UUID
|
|
username: str
|
|
email: EmailStr
|
|
is_bot: bool
|
|
is_site_admin: bool
|
|
display_name: str | None
|
|
avatar_filename: str | None
|
|
created_at: datetime
|
|
|
|
|
|
class ProfileUpdate(BaseModel):
|
|
display_name: str | None = Field(default=None, max_length=50)
|
|
|
|
|
|
class UserDirectoryRead(BaseModel):
|
|
"""Lightweight entry for user-picker UIs (room invites, admin ownership
|
|
transfer) -- same visibility level as an avatar: any authenticated user
|
|
can see this much about anyone (excludes bots, which aren't invited
|
|
through these flows)."""
|
|
|
|
model_config = ConfigDict(from_attributes=True)
|
|
|
|
id: uuid.UUID
|
|
username: str
|
|
display_name: str | None
|
|
avatar_filename: str | None
|