import datetime from typing import Literal from pydantic import UUID4, BaseModel, EmailStr, Field from app.models import OrgRole class BaseRequest(BaseModel): # may define additional fields or config shared across requests pass class RefreshTokenRequest(BaseRequest): refresh_token: str class UserCreateRequest(BaseRequest): email: EmailStr password: str name: str class UserUpdatePasswordRequest(BaseRequest): password: str class UserProfileUpdateRequest(BaseRequest): name: str | None = None phone_number: str | None = None class OrganizationRequest(BaseRequest): name: str class OrganizationMembershipCreateRequest(BaseRequest): """Adds an EXISTING user (by email) to an organization with a role. Does not create user accounts — see note below.""" user_id: UUID4 role: OrgRole class OrganizationMembershipUpdateRequest(BaseRequest): role: OrgRole class SmsCreateRequest(BaseRequest): volunteer_id: UUID4 | None = None phone_number: str content: str sending_time: datetime.datetime | None = None class SmsUpdateRequest(BaseRequest): volunteer_id: UUID4 | None = None phone_number: str | None = None content: str | None = None sending_time: datetime.datetime | None = None class ProjectCreateRequest(BaseRequest): organization_id: UUID4 name: str is_public: bool = Field( default=False, description="Allow anyone to access the information about this project without login", ) class ProjectUpdateRequest(BaseRequest): name: str is_public: bool = Field( default=False, description="Allow anyone to access the information about this project without login", ) class ProjectImportGsheetRequest(BaseRequest): sheet_url: str satursday_date: datetime.datetime erase_data: bool | None = Field(default=False) class ProjectSMSBatchRequest(BaseRequest): template: str = Field( description="""Template to be use to create the SMS The placeholder that can be used in the template are - {titre} slot.title - {description} slot.description - {debut} slot.starting_time - {fin} slot.ending_ting - {respo} slot.responsible_contact - {prenom} volunteer.name - {nom} volunteer.surname""", examples=["Bonjour {prenom},\nTon créneau {titre} commence à {debut}.\nla com bénévole"], ) delta_t: int = Field( default=10, description="Time in minutes that the sms need to be sent before the slot start", ) class CommissionCreateRequest(BaseModel): name: str class CommissionUpdateRequest(BaseModel): name: str class CommissionMembershipRequest(BaseModel): user_ids: list[UUID4] class VolunteerCreateRequest(BaseRequest): name: str surname: str | None = Field(default="") email: EmailStr phone_number: str automatic_sms: bool = Field(default=True) slots: list[UUID4] | None = None comment: str | None = None class VolunteerUpdateRequest(BaseRequest): name: str | None = None surname: str | None = None email: str | None = None phone_number: str | None = None automatic_sms: bool | None = None slots: list[UUID4] | None = None comment: str | None = None class VolunteerGroupCreateRequest(BaseRequest): name: str color: str | None = None class VolunteerGroupUpdateRequest(BaseRequest): name: str color: str | None = None class GroupMembershipRequest(BaseRequest): volunteer_ids: list[UUID4] class GroupSmsRequest(BaseRequest): content: str class SlotCreateRequest(BaseRequest): title: str starting_time: datetime.datetime ending_time: datetime.datetime required_volunteers: int | None = 0 volunteers: list[UUID4] | None = None template_id: UUID4 | None = None class SlotUpdateRequest(BaseRequest): title: str | None = None starting_time: datetime.datetime | None = None ending_time: datetime.datetime | None = None required_volunteers: int | None = None volunteers: list[UUID4] | None = None template_id: UUID4 | Literal[""] | None = None class TemplateCreateRequest(BaseRequest): title: str description: str | None = None place: str | None = None responsible_override: str | None = None tags: list[UUID4] | None = None comment: str | None = None commission_id: UUID4 | None = None class TemplateUpdateRequest(BaseRequest): title: str | None = None description: str | None = None place: str | None = None responsible_override: str | None = None # slots: Optional[list[UUID4]] = None tags: list[UUID4] | None = None comment: str | None = None commission_id: UUID4 | None = None class TagCreateRequest(BaseRequest): title: str templates: list[UUID4] | None = None class TagUpdateRequest(BaseRequest): title: str | None = None templates: list[UUID4] | None = None