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:
- Sub-models: "<Resource><Opt:>Schema"
- Mixins: "<Attribute>Mixin"
- 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 src.service.schemas import ServiceIDMixin
from src.organisation.schemas import OrgIDMixin
from src.schemas import CustomBaseModel
from src.user.schemas import UserIDMixin
from src.schemas import (
CustomBaseModel,
ServiceIDMixin,
OrgIDMixin,
UserIDMixin,
PermIDMixin,
GroupIDMixin,
)
class UserSchema(CustomBaseModel):
@ -39,14 +42,6 @@ class GroupSchema(CustomBaseModel):
name: str
class GroupIDMixin(CustomBaseModel):
group_id: int = Field(gt=0)
class PermIDMixin(CustomBaseModel):
permission_id: int = Field(gt=0)
class IAMGetGroupPermissionsResponse(CustomBaseModel):
permissions: list[PermissionSchema]

View file

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

View file

@ -6,7 +6,7 @@ Exports:
- ResourceName
"""
from pydantic import BaseModel
from pydantic import BaseModel, Field
from typing import Optional
@ -19,3 +19,24 @@ class ResourceName(CustomBaseModel):
organisation: str
resource: str
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:
- Sub-models: "<Resource><Opt:>Schema"
- Mixins: "<Attribute>Mixin"
- Models: "<Module><Method><Resource><Opt:Resource><Direction>" ie "ServiceGetServiceResponse"
"""
from pydantic import ConfigDict, Field
from pydantic import ConfigDict
from src.schemas import CustomBaseModel
class ServiceIDMixin(CustomBaseModel):
service_id: int = Field(gt=0)
from src.schemas import CustomBaseModel, ServiceIDMixin
class ServiceSchema(CustomBaseModel):

View file

@ -15,7 +15,7 @@ from src.user.models import User
from src.auth.service import claims_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):

View file

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