feat: schema mixins moved to project level

Resolves circular dependency issues.
This commit is contained in:
Chris Milne 2026-06-09 13:17:31 +01:00
parent e9fe405e06
commit 4ff9edf6d1
6 changed files with 38 additions and 43 deletions

View file

@ -3,7 +3,6 @@ Pydantic models for the IAM module
Models follow the nomenclature of: Models follow the nomenclature of:
- Sub-models: "<Resource><Opt:>Schema" - Sub-models: "<Resource><Opt:>Schema"
- Mixins: "<Attribute>Mixin"
- Models: "<Module><Method><Resource><Opt:Resource><Direction>" ie "IAMGetGroupPermissionsResponse" - Models: "<Module><Method><Resource><Opt:Resource><Direction>" ie "IAMGetGroupPermissionsResponse"
""" """
@ -11,10 +10,14 @@ from typing import Optional, Annotated
from pydantic import EmailStr, ConfigDict, Field from pydantic import EmailStr, ConfigDict, Field
from src.service.schemas import ServiceIDMixin from src.schemas import (
from src.organisation.schemas import OrgIDMixin CustomBaseModel,
from src.schemas import CustomBaseModel ServiceIDMixin,
from src.user.schemas import UserIDMixin OrgIDMixin,
UserIDMixin,
PermIDMixin,
GroupIDMixin,
)
class UserSchema(CustomBaseModel): class UserSchema(CustomBaseModel):
@ -39,14 +42,6 @@ class GroupSchema(CustomBaseModel):
name: str name: str
class GroupIDMixin(CustomBaseModel):
group_id: int = Field(gt=0)
class PermIDMixin(CustomBaseModel):
permission_id: int = Field(gt=0)
class IAMGetGroupPermissionsResponse(CustomBaseModel): class IAMGetGroupPermissionsResponse(CustomBaseModel):
permissions: list[PermissionSchema] permissions: list[PermissionSchema]

View file

@ -3,25 +3,19 @@ Pydantic models for organisation module
Models follow the nomenclature of: Models follow the nomenclature of:
- Sub-models: "<Resource><Opt:>Schema" - Sub-models: "<Resource><Opt:>Schema"
- Mixins: "<Attribute>Mixin"
- Models: "<Module><Method><Resource><Opt:Resource><Direction>" ie "OrgPostOrgRequest" - Models: "<Module><Method><Resource><Opt:Resource><Direction>" ie "OrgPostOrgRequest"
""" """
from typing import Optional from typing import Optional
from pydantic import EmailStr, ConfigDict, Field from pydantic import EmailStr, ConfigDict
from src.schemas import CustomBaseModel from src.schemas import CustomBaseModel, OrgIDMixin, UserIDMixin
from src.contact.schemas import ContactModel from src.contact.schemas import ContactModel
from src.user.schemas import UserIDMixin
from src.organisation.constants import Status, ContactType from src.organisation.constants import Status, ContactType
class OrgIDMixin(CustomBaseModel):
organisation_id: int = Field(gt=0)
class Questionnaire(CustomBaseModel): class Questionnaire(CustomBaseModel):
question_one: Optional[str] = None question_one: Optional[str] = None
question_two: Optional[str] = None question_two: Optional[str] = None

View file

@ -6,7 +6,7 @@ Exports:
- ResourceName - ResourceName
""" """
from pydantic import BaseModel from pydantic import BaseModel, Field
from typing import Optional from typing import Optional
@ -19,3 +19,24 @@ class ResourceName(CustomBaseModel):
organisation: str organisation: str
resource: str resource: str
instance: Optional[str] = None instance: Optional[str] = None
### Mixins ###
class OrgIDMixin(CustomBaseModel):
organisation_id: int = Field(gt=0)
class GroupIDMixin(CustomBaseModel):
group_id: int = Field(gt=0)
class PermIDMixin(CustomBaseModel):
permission_id: int = Field(gt=0)
class ServiceIDMixin(CustomBaseModel):
service_id: int = Field(gt=0)
class UserIDMixin(CustomBaseModel):
user_id: int = Field(gt=0)

View file

@ -3,17 +3,12 @@ Pydantic models for service module
Models follow the nomenclature of: Models follow the nomenclature of:
- Sub-models: "<Resource><Opt:>Schema" - Sub-models: "<Resource><Opt:>Schema"
- Mixins: "<Attribute>Mixin"
- Models: "<Module><Method><Resource><Opt:Resource><Direction>" ie "ServiceGetServiceResponse" - Models: "<Module><Method><Resource><Opt:Resource><Direction>" ie "ServiceGetServiceResponse"
""" """
from pydantic import ConfigDict, Field from pydantic import ConfigDict
from src.schemas import CustomBaseModel from src.schemas import CustomBaseModel, ServiceIDMixin
class ServiceIDMixin(CustomBaseModel):
service_id: int = Field(gt=0)
class ServiceSchema(CustomBaseModel): class ServiceSchema(CustomBaseModel):

View file

@ -15,7 +15,7 @@ from src.user.models import User
from src.auth.service import claims_dependency from src.auth.service import claims_dependency
from src.database import db_dependency from src.database import db_dependency
from src.user.schemas import UserIDMixin from src.schemas import UserIDMixin
async def get_user_model_claims(claims: claims_dependency, db: db_dependency): async def get_user_model_claims(claims: claims_dependency, db: db_dependency):

View file

@ -3,13 +3,9 @@ Pydantic models for the user module
""" """
from typing import Optional from typing import Optional
from pydantic import Field, EmailStr from pydantic import EmailStr
from src.schemas import CustomBaseModel from src.schemas import CustomBaseModel, OrgIDMixin
class UserIDMixin(CustomBaseModel):
user_id: int = Field(gt=0)
class OIDCClaims(CustomBaseModel): class OIDCClaims(CustomBaseModel):
@ -52,13 +48,7 @@ class UserResponse(CustomBaseModel):
groups: Optional[dict[str, list[dict[str, str | int]]]] = None groups: Optional[dict[str, list[dict[str, str | int]]]] = None
class OrgResponse(CustomBaseModel): class UserPostInvitationRequest(OrgIDMixin):
org_id: int
name: str
class UserPostInvitationRequest(CustomBaseModel):
organisation_id: int
user_email: EmailStr user_email: EmailStr