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
5 changes: 5 additions & 0 deletions funidata_utils/schemas/sisu/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,16 @@
StudyRightCancellation,
StudyRightCourseUnitSelection,
StudyRightMinorSelection,
InternationalContractualDegree,
AttainableDegree,
)
from .common import LocalizedString
from .attainment import (
CourseUnitAttainment,
CustomCourseUnitAttainment,
CustomModuleAttainment,
DegreeProgrammeAttainment,
StudyModuleAttainment,
)
from .mobility_period import MobilityPeriod
from .thesis import Thesis
Expand Down Expand Up @@ -46,3 +49,5 @@
from .term_registration import (TermRegistration, StudyRightTermRegistrations)
from .enrolment_calculation_config import EnrolmentCalculationConfig
from .code_book import CodeBook
from .study_right_cooperation_network_status import CooperationNetworkStatus
from .attained_qualification import AttainedQualification
39 changes: 39 additions & 0 deletions funidata_utils/schemas/sisu/attained_qualification.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import datetime
from pydantic import BaseModel, Field, field_serializer, conset
from typing import Annotated, Literal

from .base import SisBase
from .common import OTM_ID_REGEX_VALIDATED_STR, STRIPPED_STR, SIS_MAX_MEDIUM_SET_SIZE, sis_code_urn_pattern
from ..common_serializers import serialize_as_list


class AssociatedStudy(BaseModel):
description: str
credits: int
attainmentLocation: Annotated[STRIPPED_STR, Field(pattern=sis_code_urn_pattern('educational-institution'))]
associatedDegree: str
attainmentDate: datetime.date


class AttainedQualification(SisBase):
id: OTM_ID_REGEX_VALIDATED_STR
documentState: Literal['ACTIVE', 'DRAFT', 'DELETED']
qualificationId: OTM_ID_REGEX_VALIDATED_STR
personId: str = Field(description='PrivatePersonId')
studyRightId: str
moduleGroupId: OTM_ID_REGEX_VALIDATED_STR | None = None
associatedStudies: list[AssociatedStudy] | None = None
additionalInformation: str | None = None
attainmentDate: datetime.date | None = None
studyFieldUrn: Annotated[STRIPPED_STR | None, Field(pattern=sis_code_urn_pattern('study-field'))] = None
attainmentMethod: Literal['AUTOMATIC', 'MANUAL'] = 'MANUAL'
credits: int | None = None
attainmentIds: conset(OTM_ID_REGEX_VALIDATED_STR, max_length=SIS_MAX_MEDIUM_SET_SIZE) | None = None # noqa
childAttainedQualificationIds: conset(OTM_ID_REGEX_VALIDATED_STR, max_length=SIS_MAX_MEDIUM_SET_SIZE) | None = None # noqa
registrationDate: datetime.date | None = None
verifierPersonId: OTM_ID_REGEX_VALIDATED_STR | None = None

@field_serializer("attainmentIds", "childAttainedQualificationIds")
def serialize_set_as_list_str(self, v, _info) -> list[str] | None:
serialized_list = serialize_as_list(v)
return serialized_list
12 changes: 11 additions & 1 deletion funidata_utils/schemas/sisu/attainment.py
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,7 @@ class Attainment(ObjectWithDocumentState):
'DegreeProgrammeAttainment'
]
attainmentDate: datetime.date
s2r2Classification: str | None = None

@field_serializer('organisations')
def organisations_as_list(self, v, _info) -> list[dict]:
Expand Down Expand Up @@ -223,7 +224,16 @@ class DegreeProgrammeAttainment(Attainment):


class AssessmentItemAttainment(Attainment):
type: Literal['AssessmentItemAttainment'] = 'AssessmentItemAttainment'
courseUnitId: str
courseUnitGroupId: str
assessmentItemId: str
courseUnitRealisationId: str | None
courseUnitRealisationId: str | None


class StudyModuleAttainment(Attainment):
type: Literal['ModuleAttainment'] = 'ModuleAttainment'
moduleId: str
moduleGroupId: str
nodes: list[Union[AttainmentGroupNode, AttainmentReferenceNode]] | None = None
embeddedModules: list[dict] | None = None
6 changes: 3 additions & 3 deletions funidata_utils/schemas/sisu/course_unit_realisation.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

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 (
from ..common_serializers import serialize_as_list
from .base import SisBase, HashableBaseModel
from .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, SIS_MAX_TWEET_LENGTH,
Expand Down
6 changes: 3 additions & 3 deletions funidata_utils/schemas/sisu/enrolment_calculation_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@

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 (
from ..common_serializers import serialize_as_list
from .base import SisBase
from .common import (
OTM_ID_REGEX_VALIDATED_STR, LocalizedString, STRIPPED_STR, sis_code_urn_pattern, CreditRange,
SIS_MAX_SMALL_SET_SIZE,
)
Expand Down
15 changes: 13 additions & 2 deletions funidata_utils/schemas/sisu/study_right.py
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,17 @@ def serialize_date_fields(self, _date: datetime.date | None, _info):
return _date.isoformat()


class AttainableDegree(BaseModel):
degreeName: str | None = None
internationalInstitutionUrn: Annotated[STRIPPED_STR, Field(pattern=sis_code_urn_pattern('international-institution'))]


class InternationalContractualDegree(BaseModel):
localId: str
internationalContractualDegreeAgreementId: str
attainableDegrees: list[AttainableDegree]


class StudyRight(BaseModel):
id: OTM_ID_REGEX_VALIDATED_STR
documentState: Literal['ACTIVE', 'DRAFT', 'DELETED']
Expand Down Expand Up @@ -176,8 +187,8 @@ class StudyRight(BaseModel):
phase2QualificationUrns: Optional[list] = None
phase1EducationLocationUrn: Annotated[STRIPPED_STR, Field(..., pattern=sis_code_urn_pattern('municipality'))]
phase2EducationLocationUrn: Annotated[STRIPPED_STR | None, Field(pattern=sis_code_urn_pattern('municipality'))] = None
phase1InternationalContractualDegree: Optional[dict] = None
phase2InternationalContractualDegree: Optional[dict] = None
phase1InternationalContractualDegree: InternationalContractualDegree | None = None
phase2InternationalContractualDegree: InternationalContractualDegree | None = None
admissionTypeUrn: Annotated[STRIPPED_STR | None, Field(pattern=sis_code_urn_pattern('admission-type'))] = None
codeUrns: list[CodeUrnsStr]
additionalInformation: Optional[dict] = None
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from typing import Literal

from pydantic import BaseModel

from .common import LocalDateRange, LocalizedString


class CooperationNetworkStatus(BaseModel):
direction: Literal["INBOUND", "OUTBOUND", "NONE"]
organisationTkCode: str | None = None
outboundStatus: Literal["NOT_VALID", "FORWARDED", "RECORDED", "REJECTED"] | None = None
rejectionReason: LocalizedString | None = None
outboundStatusMessage: str | None = None
cooperationNetworkId: str | None = None
universityOrgId: str | None = None
homeStudyRightId: str | None = None
inboundStatus: Literal["ACCEPTED", "PROCESSING", "REJECTED"] | None = None
homeStudyRightValidity: LocalDateRange | None = None
Loading