cloud-api/src/organisation/schemas.py

151 lines
3.1 KiB
Python
Raw Normal View History

2026-04-06 12:41:49 +01:00
"""
Pydantic models for organisation module
2026-05-28 14:23:36 +01:00
Models follow the nomenclature of:
- Sub-models: "<Resource><Opt:>Schema"
- Models: "<Module><Method><Resource><Opt:Resource><Direction>" ie "OrgPostOrgRequest"
2026-04-06 12:41:49 +01:00
"""
from typing import Optional
2026-06-11 12:24:36 +01:00
from datetime import datetime
2026-04-06 12:41:49 +01:00
2026-06-12 15:58:20 +01:00
from pydantic import EmailStr, ConfigDict, Field
from src.schemas import (
CustomBaseModel,
OrgIDMixin,
UserIDMixin,
GroupSummary,
OrgSummary,
UserSummary,
)
from src.contact.schemas import ContactModel
2026-04-06 12:41:49 +01:00
from src.organisation.constants import Status, ContactType
from src.organisation.schemas_questionnaires import (
QuestionnaireQuestionsVersion0 as CurrentQuestions,
questionnaire_union,
)
2026-06-11 12:24:36 +01:00
class QuestionnaireMetadata(CustomBaseModel):
version: int
submission_date: Optional[datetime] = None
2026-04-06 12:41:49 +01:00
2026-05-28 13:28:14 +01:00
class Questionnaire(CustomBaseModel):
2026-06-11 12:24:36 +01:00
metadata: QuestionnaireMetadata
questions: questionnaire_union
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):
2026-06-12 15:58:20 +01:00
name: str = Field(min_length=3)
intake_questionnaire: Optional[CurrentQuestions] = None
2026-04-06 12:41:49 +01:00
2026-05-29 09:44:24 +01:00
class OrgPostOrgResponse(CustomBaseModel):
id: int
2026-05-29 09:44:24 +01:00
name: str
status: Status
class OrgPatchQuestionnaireRequest(OrgIDMixin):
intake_questionnaire: CurrentQuestions
2026-04-06 12:41:49 +01:00
partial: bool
2026-05-29 09:44:24 +01:00
class OrgPatchQuestionnaireResponse(CustomBaseModel):
id: int
2026-05-29 09:44:24 +01:00
name: str
intake_questionnaire: Questionnaire
status: Status
class OrgPatchStatusRequest(OrgIDMixin):
2026-04-06 12:41:49 +01:00
status: Status
2026-05-29 09:44:24 +01:00
class OrgPatchStatusResponse(CustomBaseModel):
id: int
2026-05-29 09:44:24 +01:00
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
2026-04-06 12:41:49 +01:00
class OrgPostUserRequest(OrgIDMixin, UserIDMixin):
pass
2026-04-06 12:41:49 +01:00
2026-05-29 09:44:24 +01:00
class OrgPostUserResponse(CustomBaseModel):
organisation: OrgSummary
users: list[UserSummary]
2026-05-29 09:44:24 +01:00
class OrgPatchRootRequest(OrgIDMixin, UserIDMixin):
pass
2026-04-06 12:41:49 +01:00
2026-05-29 09:44:24 +01:00
class OrgPatchRootResponse(CustomBaseModel):
name: str
root_user_email: str
class OrgGetUserResponse(CustomBaseModel):
2026-06-09 14:21:32 +01:00
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]