""" Pydantic models for organisation module Models follow the nomenclature of: - Sub-models: "Schema" - Models: "" ie "OrgPostOrgRequest" """ from typing import Optional from datetime import datetime from pydantic import EmailStr, ConfigDict from src.schemas import ( CustomBaseModel, OrgIDMixin, UserIDMixin, GroupSummary, OrgSummary, UserSummary, ) from src.contact.schemas import ContactModel from src.organisation.constants import Status, ContactType from src.organisation.schemas_questionnaires import QuestionnaireQuestionsVersion0 class QuestionnaireMetadata(CustomBaseModel): version: int submission_date: Optional[datetime] = None class Questionnaire(CustomBaseModel): metadata: QuestionnaireMetadata questions: QuestionnaireQuestionsVersion0 class ContactSummary(CustomBaseModel): id: int email: Optional[EmailStr] = None class OrgSchema(OrgIDMixin): name: str status: Status root_user_email: EmailStr intake_questionnaire: Optional[Questionnaire] = None billing_contact: ContactSummary owner_contact: ContactSummary security_contact: ContactSummary class OrgPostOrgRequest(CustomBaseModel): name: str intake_questionnaire: Optional[QuestionnaireQuestionsVersion0] = None class OrgPostOrgResponse(CustomBaseModel): id: int name: str status: Status class OrgPatchQuestionnaireRequest(OrgIDMixin): intake_questionnaire: QuestionnaireQuestionsVersion0 partial: bool class OrgPatchQuestionnaireResponse(CustomBaseModel): id: int name: str intake_questionnaire: Questionnaire status: Status class OrgPatchStatusRequest(OrgIDMixin): status: Status class OrgPatchStatusResponse(CustomBaseModel): id: int name: str status: Status class OrgPatchContactRequest(OrgIDMixin): contact_type: ContactType email: Optional[EmailStr] = None first_name: Optional[str] = None last_name: Optional[str] = None phonenumber: Optional[str] = None vat_number: Optional[str] = None post_office_box_number: Optional[str] = None street_address: Optional[str] = None street_address_line_2: Optional[str] = None locality: Optional[str] = None address_region: Optional[str] = None country_code: Optional[str] = None postal_code: Optional[str] = None class OrgPostUserRequest(OrgIDMixin, UserIDMixin): pass class OrgPostUserResponse(CustomBaseModel): organisation: OrgSummary users: list[UserSummary] class OrgPatchRootRequest(OrgIDMixin, UserIDMixin): pass class OrgPatchRootResponse(CustomBaseModel): name: str root_user_email: str class OrgGetUserResponse(CustomBaseModel): users: list[dict[str, str | int]] organisation: OrgSummary class OrgGetGroupResponse(CustomBaseModel): organisation: OrgSummary groups: list[GroupSummary] class OrgGetContactResponse(CustomBaseModel): model_config = ConfigDict(from_attributes=True, extra="ignore") contact: ContactModel organisation: OrgSummary class OrgPatchContactResponse(CustomBaseModel): model_config = ConfigDict(from_attributes=True, extra="ignore") contact: ContactModel organisation: OrgSummary class OrgGetOrgResponse(CustomBaseModel): organisations: list[OrgSchema]