Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions funidata_utils/schemas/sisu/course_unit_realisation.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,17 @@
from datetime import date, datetime
from typing import Annotated, Literal, Union

from pydantic import BaseModel, Field, conset, conlist, field_serializer
from pydantic import BaseModel, Field, conset, conlist, field_serializer, field_validator

from funidata_utils.schemas.common_serializers import serialize_as_list
from funidata_utils.schemas.sisu.base import SisBase, HashableBaseModel
from funidata_utils.schemas.sisu.common import (
LocalDateRange, LocalDateTimeRange, OTM_ID_REGEX_VALIDATED_STR, sis_code_urn_pattern,
STRIPPED_STR, IntRange, SIS_MAX_MEDIUM_SET_SIZE, OrganisationRoleShare, SIS_MAX_SMALL_SET_SIZE,
LocalizedString,
LocalizedString, SIS_MAX_TWEET_LENGTH,
)
from funidata_utils.schemas.sisu.course_unit import CooperationNetworkDetails


class LiteratureName(HashableBaseModel):
localId: str
type: Literal["LiteratureName"]
Expand Down Expand Up @@ -124,6 +123,14 @@ class CourseUnitRealisation(SisBase):
cooperationNetworkDetails: CooperationNetworkDetails | None = None
copyDetails: CopyDetails | None = None

@field_validator('tweetText')
def tweet_text_max_len(cls, val: LocalizedString | None) -> LocalizedString | None:
if val is None:
return None
if len(val.fi or '') > SIS_MAX_TWEET_LENGTH or len(val.sv or '') > SIS_MAX_TWEET_LENGTH or len(val.en or '') > SIS_MAX_TWEET_LENGTH:
raise ValueError('Tweet text exceeds max length')
return val

@field_serializer("literature", "learningEnvironments")
def serialize_set_as_list(self, v, _info) -> list[dict] | None:
serialized_list = serialize_as_list(v)
Expand Down
28 changes: 27 additions & 1 deletion funidata_utils/schemas/sisu/enrolment_calculation_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@
# ------------------------------------------------------------------------------
from typing import Annotated, Literal, Union

from pydantic import BaseModel, Field, conset
from pydantic import BaseModel, Field, conset, field_serializer

from funidata_utils.schemas.common_serializers import serialize_as_list
from funidata_utils.schemas.sisu.base import SisBase
from funidata_utils.schemas.sisu.common import (
OTM_ID_REGEX_VALIDATED_STR, LocalizedString, STRIPPED_STR, sis_code_urn_pattern, CreditRange,
Expand All @@ -19,6 +20,11 @@ class AttainedCreditRangeRule(BaseModel):
creditRange: CreditRange | None = None
creditOrder: Literal['NONE', 'ASCENDING', 'DESCENDING']

@field_serializer("educationIds")
def serialize_set_as_list(self, v, _info) -> list[str] | None:
serialized_list = serialize_as_list(v)
return serialized_list


class CompulsoryFormalPrerequisitesRule(BaseModel):
type: Literal['CompulsoryFormalPrerequisites'] = 'CompulsoryFormalPrerequisites'
Expand All @@ -32,16 +38,31 @@ class EducationRule(BaseModel):
type: Literal['Education'] = 'Education'
educationGroupIds: conset(OTM_ID_REGEX_VALIDATED_STR, min_length=1) # noqa

@field_serializer("educationGroupIds")
def serialize_set_as_list(self, v, _info) -> list[str] | None:
serialized_list = serialize_as_list(v)
return serialized_list


class EducationTypeRule(BaseModel):
type: Literal['EducationType'] = 'EducationType'
educationTypeUrns: conset(Annotated[STRIPPED_STR, Field(pattern=sis_code_urn_pattern('education-type'))], min_length=1) # noqa

@field_serializer("educationTypeUrns")
def serialize_set_as_list(self, v, _info) -> list[str] | None:
serialized_list = serialize_as_list(v)
return serialized_list


class EnrolmentForCourseUnitRealisationRule(BaseModel):
type: Literal['EnrolmentForCourseUnitRealisation'] = 'EnrolmentForCourseUnitRealisation'
courseUnitRealisationIds: conset(OTM_ID_REGEX_VALIDATED_STR, min_length=1) # noqa

@field_serializer("courseUnitRealisationIds")
def serialize_set_as_list(self, v, _info) -> list[str] | None:
serialized_list = serialize_as_list(v)
return serialized_list


class NotAlreadyEnrolledToAssessmentItemRule(BaseModel):
type: Literal['NotAlreadyEnrolledToAssessmentItemRule'] = 'NotAlreadyEnrolledToAssessmentItemRule'
Expand All @@ -51,6 +72,11 @@ class PersonGroupMembershipRule(BaseModel):
type: Literal['PersonGroupMembership'] = 'PersonGroupMembership'
personGroupIds: conset(OTM_ID_REGEX_VALIDATED_STR, min_length=1) # noqa

@field_serializer("personGroupIds")
def serialize_set_as_list(self, v, _info) -> list[str] | None:
serialized_list = serialize_as_list(v)
return serialized_list


class RecommendedFormalPrerequisitesRule(BaseModel):
type: Literal['RecommendedFormalPrerequisites'] = 'RecommendedFormalPrerequisites'
Expand Down