Initial commit

This commit is contained in:
2025-07-11 13:52:19 +00:00
commit e0c489f625
362 changed files with 27286 additions and 0 deletions
@@ -0,0 +1,29 @@
import modules.database.schemas.nodes.calendars as calendar_schemas
from modules.database.tools.neontology.baserelationship import BaseRelationship
from typing import ClassVar
# Sequenced Relationships for Calendar
class YearFollowsYear(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'YEAR_FOLLOWS_YEAR'
source: calendar_schemas.CalendarYearNode
target: calendar_schemas.CalendarYearNode
class MonthFollowsMonth(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'MONTH_FOLLOWS_MONTH'
source: calendar_schemas.CalendarMonthNode
target: calendar_schemas.CalendarMonthNode
class WeekFollowsWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'WEEK_FOLLOWS_WEEK'
source: calendar_schemas.CalendarWeekNode
target: calendar_schemas.CalendarWeekNode
class DayFollowsDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'DAY_FOLLOWS_DAY'
source: calendar_schemas.CalendarDayNode
target: calendar_schemas.CalendarDayNode
class TimeChunkFollowsTimeChunk(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'TIME_CHUNK_FOLLOWS_TIME_CHUNK'
source: calendar_schemas.CalendarTimeChunkNode
target: calendar_schemas.CalendarTimeChunkNode
@@ -0,0 +1,96 @@
import modules.database.schemas.nodes.schools.timetable as neo_timetable
import modules.database.schemas.nodes.calendars as neo_calendar
import modules.database.schemas.nodes.workers.timetable as neo_teacher_timetable
from modules.database.tools.neontology.baserelationship import BaseRelationship
from typing import ClassVar
class CalendarYearIsAcademicYear(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_ACADEMIC_YEAR'
source: neo_calendar.CalendarYearNode
target: neo_timetable.AcademicYearNode
class AcademicYearIsCalendarYear(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_CALENDAR_YEAR'
source: neo_timetable.AcademicYearNode
target: neo_calendar.CalendarYearNode
class CalendarWeekIsAcademicWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_ACADEMIC_WEEK'
source: neo_calendar.CalendarWeekNode
target: neo_timetable.AcademicWeekNode
class AcademicWeekIsCalendarWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_CALENDAR_WEEK'
source: neo_timetable.AcademicWeekNode
target: neo_calendar.CalendarWeekNode
class CalendarWeekIsHolidayWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_HOLIDAY_WEEK'
source: neo_calendar.CalendarWeekNode
target: neo_timetable.HolidayWeekNode
class HolidayWeekIsCalendarWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_CALENDAR_WEEK'
source: neo_timetable.HolidayWeekNode
target: neo_calendar.CalendarWeekNode
class CalendarDayIsAcademicDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_ACADEMIC_DAY'
source: neo_calendar.CalendarDayNode
target: neo_timetable.AcademicDayNode
class AcademicDayIsCalendarDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_CALENDAR_DAY'
source: neo_timetable.AcademicDayNode
target: neo_calendar.CalendarDayNode
class CalendarDayIsHolidayDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_HOLIDAY_DAY'
source: neo_calendar.CalendarDayNode
target: neo_timetable.HolidayDayNode
class HolidayDayIsCalendarDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_CALENDAR_DAY'
source: neo_timetable.HolidayDayNode
target: neo_calendar.CalendarDayNode
class CalendarDayIsOffTimetableDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_OFF_TIMETABLE_DAY'
source: neo_calendar.CalendarDayNode
target: neo_timetable.OffTimetableDayNode
class OffTimetableDayIsCalendarDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_CALENDAR_DAY'
source: neo_timetable.OffTimetableDayNode
target: neo_calendar.CalendarDayNode
class CalendarDayIsStaffDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_STAFF_DAY'
source: neo_calendar.CalendarDayNode
target: neo_timetable.StaffDayNode
class StaffDayIsCalendarDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_CALENDAR_DAY'
source: neo_timetable.StaffDayNode
target: neo_calendar.CalendarDayNode
# New relationships for user timetable
class CalendarDayHasTimetableLesson(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HAS_TIMETABLE_LESSON'
source: neo_calendar.CalendarDayNode
target: neo_teacher_timetable.TimetableLessonNode
class TimetableLessonBelongsToCalendarDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'BELONGS_TO_CALENDAR_DAY'
source: neo_teacher_timetable.TimetableLessonNode
target: neo_calendar.CalendarDayNode
class CalendarDayHasPlannedLesson(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HAS_PLANNED_LESSON'
source: neo_calendar.CalendarDayNode
target: neo_teacher_timetable.PlannedLessonNode
class PlannedLessonBelongsToCalendarDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'BELONGS_TO_CALENDAR_DAY'
source: neo_teacher_timetable.PlannedLessonNode
target: neo_calendar.CalendarDayNode
@@ -0,0 +1,34 @@
import modules.database.schemas.nodes.calendars as calendar_schemas
from modules.database.tools.neontology.baserelationship import BaseRelationship
from typing import ClassVar
## Calendar layer relationships
class CalendarIncludesYear(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'CALENDAR_INCLUDES_YEAR'
source: calendar_schemas.CalendarNode
target: calendar_schemas.CalendarYearNode
class YearIncludesMonth(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'YEAR_INCLUDES_MONTH'
source: calendar_schemas.CalendarYearNode
target: calendar_schemas.CalendarMonthNode
class YearIncludesWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'YEAR_INCLUDES_WEEK'
source: calendar_schemas.CalendarYearNode
target: calendar_schemas.CalendarWeekNode
class MonthIncludesDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'MONTH_INCLUDES_DAY'
source: calendar_schemas.CalendarMonthNode
target: calendar_schemas.CalendarDayNode
class WeekIncludesDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'WEEK_INCLUDES_DAY'
source: calendar_schemas.CalendarWeekNode
target: calendar_schemas.CalendarDayNode
class DayIncludesTimeChunk(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'DAY_INCLUDES_TIME_CHUNK'
source: calendar_schemas.CalendarDayNode
target: calendar_schemas.CalendarTimeChunkNode
@@ -0,0 +1,119 @@
from typing import ClassVar
from modules.database.tools.neontology.baserelationship import BaseRelationship
import modules.database.schemas.nodes.schools.pastoral as pastoral_nodes
import modules.database.schemas.nodes.schools.curriculum as curriculum_nodes
import modules.database.schemas.nodes.structures.schools as school_structures
# Structure layer relationships
class CurriculumStructureIncludesKeyStage(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'CURRICULUM_STRUCTURE_INCLUDES_KEY_STAGE'
source: school_structures.CurriculumStructureNode
target: curriculum_nodes.KeyStageNode
class PastoralStructureIncludesYearGroup(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'PASTORAL_STRUCTURE_INCLUDES_YEAR_GROUP'
source: school_structures.PastoralStructureNode
target: pastoral_nodes.YearGroupNode
## Curriculum layer relationships
class SubjectForKeyStage(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'SUBJECT_FOR_KEY_STAGE'
source: curriculum_nodes.SubjectNode
target: curriculum_nodes.KeyStageNode
class SubjectHasYearGroupSyllabus(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'SUBJECT_HAS_YEAR_GROUP_SYLLABUS'
source: curriculum_nodes.SubjectNode
target: pastoral_nodes.YearGroupSyllabusNode
class SubjectHasKeyStageSyllabus(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'SUBJECT_HAS_KEY_STAGE_SYLLABUS'
source: curriculum_nodes.SubjectNode
target: curriculum_nodes.KeyStageSyllabusNode
class TopicPartOfYearGroupSyllabus(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'YEAR_SYLLABUS_INCLUDES_TOPIC'
source: pastoral_nodes.YearGroupSyllabusNode
target: curriculum_nodes.TopicNode
class KeyStageSyllabusIncludesTopic(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'KEY_STAGE_SYLLABUS_INCLUDES_TOPIC'
source: curriculum_nodes.KeyStageSyllabusNode
target: curriculum_nodes.TopicNode
class YearGroupHasYearGroupSyllabus(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'YEAR_GROUP_HAS_YEAR_GROUP_SYLLABUS'
source: pastoral_nodes.YearGroupNode
target: pastoral_nodes.YearGroupSyllabusNode
class KeyStageSyllabusIncludesYearGroupSyllabus(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'KEY_STAGE_SYLLABUS_INCLUDES_YEAR_GROUP_SYLLABUS'
source: curriculum_nodes.KeyStageSyllabusNode
target: pastoral_nodes.YearGroupSyllabusNode
class KeyStageIncludesKeyStageSyllabus(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'KEY_STAGE_INCLUDES_KEY_STAGE_SYLLABUS'
source: curriculum_nodes.KeyStageNode
target: curriculum_nodes.KeyStageSyllabusNode
class KeyStageIncludesTopic(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'KEY_STAGE_INCLUDES_TOPIC'
source: curriculum_nodes.KeyStageNode
target: curriculum_nodes.TopicNode
class SubjectIncludesTopic(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'SUBJECT_INCLUDES_TOPIC'
source: curriculum_nodes.SubjectNode
target: curriculum_nodes.TopicNode
class TopicIncludesTopicLesson(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'TOPIC_INCLUDES_LESSON'
source: curriculum_nodes.TopicNode
target: curriculum_nodes.TopicLessonNode
class TopicIncludesLearningStatement(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'TOPIC_INCLUDES_LEARNING_STATEMENT'
source: curriculum_nodes.TopicNode
target: curriculum_nodes.LearningStatementNode
class LessonIncludesLearningStatement(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'LESSON_INCLUDES_LEARNING_STATEMENT'
source: curriculum_nodes.TopicLessonNode
target: curriculum_nodes.LearningStatementNode
# Science-specific curriculum layer relationships
class TopicLessonIncludesScienceLab(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'LESSON_INCLUDES_SCIENCE_LAB'
source: curriculum_nodes.TopicLessonNode
target: curriculum_nodes.ScienceLabNode
class KeyStageFollowsKeyStage(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'KEY_STAGE_FOLLOWS_KEY_STAGE'
source: curriculum_nodes.KeyStageNode
target: curriculum_nodes.KeyStageNode
class YearGroupFollowsYearGroup(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'YEAR_GROUP_FOLLOWS_YEAR_GROUP'
source: pastoral_nodes.YearGroupNode
target: pastoral_nodes.YearGroupNode
class KeyStageSyllabusFollowsKeyStageSyllabus(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'KEY_STAGE_SYLLABUS_FOLLOWS_KEY_STAGE_SYLLABUS'
source: curriculum_nodes.KeyStageSyllabusNode
target: curriculum_nodes.KeyStageSyllabusNode
class YearGroupSyllabusFollowsYearGroupSyllabus(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'YEAR_GROUP_SYLLABUS_FOLLOWS_YEAR_GROUP_SYLLABUS'
source: pastoral_nodes.YearGroupSyllabusNode
target: pastoral_nodes.YearGroupSyllabusNode
class TopicLessonFollowsTopicLesson(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'LESSON_FOLLOWS_LESSON'
source: curriculum_nodes.TopicLessonNode
target: curriculum_nodes.TopicLessonNode
class YearGroupSyllabusIncludesTopic(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'YEAR_GROUP_SYLLABUS_INCLUDES_TOPIC'
source: pastoral_nodes.YearGroupSyllabusNode
target: curriculum_nodes.TopicNode
@@ -0,0 +1,15 @@
from typing import ClassVar
from modules.database.tools.neontology.baserelationship import BaseRelationship
import modules.database.schemas.nodes.schools.schools as school_nodes
import modules.database.schemas.nodes.structures.schools as school_structures
class SchoolHasCurriculumStructure(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HAS_CURRICULUM_STRUCTURE'
source: school_nodes.SchoolNode
target: school_structures.CurriculumStructureNode
class SchoolHasPastoralStructure(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HAS_PASTORAL_STRUCTURE'
source: school_nodes.SchoolNode
target: school_structures.PastoralStructureNode
@@ -0,0 +1,49 @@
from typing import ClassVar, Union
import modules.database.schemas.entities as entities
import modules.database.schemas.nodes.users as user_nodes
import modules.database.schemas.nodes.workers.workers as worker_nodes
import modules.database.schemas.nodes.schools.schools as school_nodes
import modules.database.schemas.nodes.schools.curriculum as curriculum_nodes
import modules.database.schemas.nodes.structures.schools as school_structures
from modules.database.tools.neontology.baserelationship import BaseRelationship
class UserIsSchoolWorker(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_SCHOOL_WORKER'
source: user_nodes.UserNode
target: Union[worker_nodes.SchoolAdminNode, worker_nodes.TeacherNode, worker_nodes.StudentNode]
class UserIsSystemWorker(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'IS_SYSTEM_WORKER'
source: user_nodes.UserNode
target: Union[worker_nodes.DeveloperNode, worker_nodes.SuperAdminNode]
class EntityBelongsToSchool(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'BELONGS_TO'
source: Union[entities.worker_entities, entities.school_entities]
target: entities.school_entities
class EntityBelongsToDepartment(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'BELONGS_TO'
source: entities.worker_entities
target: school_nodes.DepartmentNode
class SchoolHasDepartmentStructure(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HAS_DEPARTMENT_STRUCTURE'
source: school_nodes.SchoolNode
target: school_structures.DepartmentStructureNode
class DepartmentStructureHasDepartment(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HAS_DEPARTMENT'
source: school_structures.DepartmentStructureNode
target: school_nodes.DepartmentNode
class DepartmentManagesKeyStageSyllabus(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'MANAGES_KEY_STAGE_SYLLABUS'
source: school_nodes.DepartmentNode
target: curriculum_nodes.KeyStageSyllabusNode
class DepartmentManagesSubject(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'MANAGES_SUBJECT'
source: school_nodes.DepartmentNode
target: curriculum_nodes.SubjectNode
@@ -0,0 +1,18 @@
from typing import ClassVar, Union
from modules.database.tools.neontology.baserelationship import BaseRelationship
import modules.database.schemas.nodes.users as user_nodes
import modules.database.schemas.nodes.workers.workers as worker_nodes
import modules.database.schemas.nodes.schools.schools as school_nodes
import modules.database.schemas.nodes.workers.timetable as worker_timetable
import modules.database.schemas.nodes.schools.timetable as school_timetable
class EntityHasTimetable(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HAS_TIMETABLE'
source: Union[user_nodes.UserNode, worker_nodes.TeacherNode, worker_nodes.StudentNode, school_nodes.SubjectClassNode]
target: worker_timetable.WorkerTimetableNode
class SchoolHasTimetable(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HAS_TIMETABLE'
source: school_nodes.SchoolNode
target: school_timetable.SchoolTimetableNode
@@ -0,0 +1,9 @@
from typing import ClassVar, Union
import modules.database.schemas.nodes.calendars as calendar_schemas
import modules.database.schemas.owners as owner_schemas
from modules.database.tools.neontology.baserelationship import BaseRelationship
class OwnerHasCalendar(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HAS_CALENDAR'
source: owner_schemas.owners
target: calendar_schemas.CalendarNode
@@ -0,0 +1,48 @@
from typing import ClassVar, Union
from modules.database.tools.neontology.baserelationship import BaseRelationship
from modules.database.schemas.nodes.schools.timetable import AcademicPeriodNode, RegistrationPeriodNode
from modules.database.schemas.nodes.workers.timetable import TeacherTimetableNode, TimetableLessonNode, PlannedLessonNode
from modules.database.schemas.nodes.workers.workers import TeacherNode
from modules.database.schemas.nodes.schools.schools import SubjectClassNode
from modules.database.schemas.nodes.schools.pastoral import YearGroupSyllabusNode
class TimetableLessonBelongsToPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'LESSON_BELONGS_TO_PERIOD'
source: TimetableLessonNode
target: Union[AcademicPeriodNode, RegistrationPeriodNode]
class TimetableLessonHasPlannedLesson(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'TIMETABLE_LESSON_HAS_PLANNED_LESSON'
source: TimetableLessonNode
target: PlannedLessonNode
class TeacherHasTimetable(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'TEACHER_HAS_TIMETABLE'
source: TeacherNode
target: TeacherTimetableNode
class TimetableHasClass(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'TIMETABLE_HAS_CLASS'
source: TeacherTimetableNode
target: SubjectClassNode
class ClassHasLesson(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'CLASS_HAS_LESSON'
source: SubjectClassNode
target: TimetableLessonNode
class TimetableLessonFollowsTimetableLesson(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'TIMETABLE_LESSON_FOLLOWS_TIMETABLE_LESSON'
source: Union[TimetableLessonNode, PlannedLessonNode]
target: Union[TimetableLessonNode, PlannedLessonNode]
class PlannedLessonFollowsPlannedLesson(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'PLANNED_LESSON_FOLLOWS_PLANNED_LESSON'
source: PlannedLessonNode
target: PlannedLessonNode
class SubjectClassBelongsToYearGroupSyllabus(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'SUBJECT_CLASS_BELONGS_TO_YEAR_GROUP_SYLLABUS'
source: SubjectClassNode
target: YearGroupSyllabusNode
@@ -0,0 +1,11 @@
from neontology import BaseRelationship
class CalendarYearHasNextCalendarYear(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'CALENDAR_YEAR_HAS_NEXT_CALENDAR_YEAR'
source: CalendarYearNode
target: CalendarYearNode
class CalendarYearHasPreviousCalendarYear(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'CALENDAR_YEAR_HAS_PREVIOUS_CALENDAR_YEAR'
source: CalendarYearNode
target: CalendarYearNode
@@ -0,0 +1,2 @@
from neontology import BaseRelationship
@@ -0,0 +1,11 @@
from neontology import BaseRelationship
class PlannedLessonHasNextPlannedLesson(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'PLANNED_LESSON_HAS_NEXT_PLANNED_LESSON'
source: PlannedLessonNode
target: PlannedLessonNode
class PlannedLessonHasPreviousPlannedLesson(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'PLANNED_LESSON_HAS_PREVIOUS_PLANNED_LESSON'
source: PlannedLessonNode
target: PlannedLessonNode
@@ -0,0 +1,41 @@
from neontology import BaseRelationship
class AcademicTermHasNextTerm(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'TERM_HAS_NEXT_TERM'
source: TermNode
target: TermNode
class AcademicTermHasPreviousTerm(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'TERM_HAS_PREVIOUS_TERM'
source: TermNode
target: TermNode
class AcademicWeekHasNextWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'WEEK_HAS_NEXT_WEEK'
source: WeekNode
target: WeekNode
class AcademicWeekHasPreviousWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'WEEK_HAS_PREVIOUS_WEEK'
source: WeekNode
target: WeekNode
class AcademicDayHasNextDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'DAY_HAS_NEXT_DAY'
source: DayNode
target: DayNode
class AcademicDayHasPreviousDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'DAY_HAS_PREVIOUS_DAY'
source: DayNode
target: DayNode
class AcademicPeriodHasNextPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'PERIOD_HAS_NEXT_PERIOD'
source: PeriodNode
target: PeriodNode
class AcademicPeriodHasPreviousPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'PERIOD_HAS_PREVIOUS_PERIOD'
source: PeriodNode
target: PeriodNode
@@ -0,0 +1,65 @@
#!/usr/bin/env python3
"""
ClassroomCopilot Structure Relationships
This module defines the relationships between schools and structure nodes,
as well as between entities and structure nodes.
"""
from typing import ClassVar
from modules.database.tools.neontology.baserelationship import BaseRelationship
import modules.database.schemas.nodes.schools.schools as school_nodes
import modules.database.schemas.nodes.structures.schools as school_structures
import modules.database.schemas.nodes.workers.workers as worker_nodes
class SchoolHasStaffStructure(BaseRelationship):
"""Relationship between a school and its staff structure node."""
__relationshiptype__: ClassVar[str] = 'HAS_STAFF_STRUCTURE'
source: school_nodes.SchoolNode
target: school_structures.StaffStructureNode
class SchoolHasStudentStructure(BaseRelationship):
"""Relationship between a school and its student structure node."""
__relationshiptype__: ClassVar[str] = 'HAS_STUDENT_STRUCTURE'
source: school_nodes.SchoolNode
target: school_structures.StudentStructureNode
class SchoolHasITAdminStructure(BaseRelationship):
"""Relationship between a school and its IT admin structure node."""
__relationshiptype__: ClassVar[str] = 'HAS_IT_ADMIN_STRUCTURE'
source: school_nodes.SchoolNode
target: school_structures.ITAdminStructureNode
class EntityBelongsToStructure(BaseRelationship):
"""
Relationship between an entity (worker, student, etc.) and a structure node.
This is a generic relationship that can be used for any entity type.
"""
__relationshiptype__: ClassVar[str] = 'BELONGS_TO_STRUCTURE'
source: object # Generic source type to allow any entity
target: object # Generic target type to allow any structure
# Specific entity-to-structure relationships
class SuperAdminBelongsToITAdminStructure(BaseRelationship):
"""Relationship between a super admin and the IT admin structure."""
__relationshiptype__: ClassVar[str] = 'BELONGS_TO_STRUCTURE'
source: worker_nodes.SuperAdminNode
target: school_structures.ITAdminStructureNode
class TeacherBelongsToStaffStructure(BaseRelationship):
"""Relationship between a teacher and the staff structure."""
__relationshiptype__: ClassVar[str] = 'BELONGS_TO_STRUCTURE'
source: worker_nodes.TeacherNode
target: school_structures.StaffStructureNode
class StudentBelongsToStudentStructure(BaseRelationship):
"""Relationship between a student and the student structure."""
__relationshiptype__: ClassVar[str] = 'BELONGS_TO_STRUCTURE'
source: worker_nodes.StudentNode
target: school_structures.StudentStructureNode
@@ -0,0 +1,305 @@
import modules.database.schemas.nodes.schools.timetable as neo_timetable
from modules.database.tools.neontology.baserelationship import BaseRelationship
from typing import ClassVar
# Timetable hierarchy structure relationships
class AcademicTimetableHasAcademicYear(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_TIMETABLE_HAS_ACADEMIC_YEAR'
source: neo_timetable.SchoolTimetableNode
target: neo_timetable.AcademicYearNode
class AcademicYearHasAcademicTerm(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_YEAR_HAS_ACADEMIC_TERM'
source: neo_timetable.AcademicYearNode
target: neo_timetable.AcademicTermNode
class AcademicYearHasAcademicTermBreak(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_YEAR_HAS_ACADEMIC_TERM_BREAK'
source: neo_timetable.AcademicYearNode
target: neo_timetable.AcademicTermBreakNode
class AcademicYearHasAcademicWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_YEAR_HAS_ACADEMIC_WEEK'
source: neo_timetable.AcademicYearNode
target: neo_timetable.AcademicWeekNode
class AcademicYearHasHolidayWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_YEAR_HAS_HOLIDAY_WEEK'
source: neo_timetable.AcademicYearNode
target: neo_timetable.HolidayWeekNode
class AcademicTermHasAcademicWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_HAS_ACADEMIC_WEEK'
source: neo_timetable.AcademicTermNode
target: neo_timetable.AcademicWeekNode
class AcademicTermBreakHasHolidayWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_BREAK_HAS_HOLIDAY_WEEK'
source: neo_timetable.AcademicTermBreakNode
target: neo_timetable.HolidayWeekNode
class AcademicTermBreakHasHolidayDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_BREAK_HAS_HOLIDAY_DAY'
source: neo_timetable.AcademicTermBreakNode
target: neo_timetable.HolidayDayNode
class AcademicTermHasAcademicDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_HAS_ACADEMIC_DAY'
source: neo_timetable.AcademicTermNode
target: neo_timetable.AcademicDayNode
class AcademicTermHasHolidayDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_HAS_HOLIDAY_DAY'
source: neo_timetable.AcademicTermNode
target: neo_timetable.HolidayDayNode
class AcademicTermHasOffTimetableDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_HAS_OFF_TIMETABLE_DAY'
source: neo_timetable.AcademicTermNode
target: neo_timetable.OffTimetableDayNode
class AcademicTermHasStaffDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_HAS_STAFF_DAY'
source: neo_timetable.AcademicTermNode
target: neo_timetable.StaffDayNode
class AcademicWeekHasAcademicDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_WEEK_HAS_ACADEMIC_DAY'
source: neo_timetable.AcademicWeekNode
target: neo_timetable.AcademicDayNode
class AcademicWeekHasHolidayDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_WEEK_HAS_HOLIDAY_DAY'
source: neo_timetable.AcademicWeekNode
target: neo_timetable.HolidayDayNode
class AcademicWeekHasOffTimetableDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_WEEK_HAS_OFF_TIMETABLE_DAY'
source: neo_timetable.AcademicWeekNode
target: neo_timetable.OffTimetableDayNode
class AcademicWeekHasStaffDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_WEEK_HAS_STAFF_DAY'
source: neo_timetable.AcademicWeekNode
target: neo_timetable.StaffDayNode
class HolidayWeekHasHolidayDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HOLIDAY_WEEK_HAS_HOLIDAY_DAY'
source: neo_timetable.HolidayWeekNode
target: neo_timetable.HolidayDayNode
class AcademicDayHasAcademicPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_HAS_ACADEMIC_PERIOD'
source: neo_timetable.AcademicDayNode
target: neo_timetable.AcademicPeriodNode
class AcademicDayHasRegistrationPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_HAS_REGISTRATION_PERIOD'
source: neo_timetable.AcademicDayNode
target: neo_timetable.RegistrationPeriodNode
class AcademicDayHasBreakPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_HAS_BREAK_PERIOD'
source: neo_timetable.AcademicDayNode
target: neo_timetable.BreakPeriodNode
class AcademicDayHasOffTimetablePeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_HAS_OFF_TIMETABLE_PERIOD'
source: neo_timetable.AcademicDayNode
target: neo_timetable.OffTimetablePeriodNode
# Timetable sequence relationships
class AcademicYearFollowsAcademicYear(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_YEAR_FOLLOWS_ACADEMIC_YEAR'
source: neo_timetable.AcademicYearNode
target: neo_timetable.AcademicYearNode
class AcademicTermFollowsAcademicTermBreak(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_FOLLOWS_ACADEMIC_TERM_BREAK'
source: neo_timetable.AcademicTermBreakNode # Term break ends
target: neo_timetable.AcademicTermNode # New term starts
class AcademicTermBreakFollowsAcademicTerm(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_TERM_BREAK_FOLLOWS_ACADEMIC_TERM'
source: neo_timetable.AcademicTermNode # Term ends
target: neo_timetable.AcademicTermBreakNode # Term break starts
class AcademicWeekFollowsAcademicWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_WEEK_FOLLOWS_ACADEMIC_WEEK'
source: neo_timetable.AcademicWeekNode
target: neo_timetable.AcademicWeekNode
class HolidayWeekFollowsHolidayWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HOLIDAY_WEEK_FOLLOWS_HOLIDAY_WEEK'
source: neo_timetable.HolidayWeekNode
target: neo_timetable.HolidayWeekNode
class AcademicWeekFollowsHolidayWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_WEEK_FOLLOWS_HOLIDAY_WEEK'
source: neo_timetable.HolidayWeekNode
target: neo_timetable.AcademicWeekNode
class HolidayWeekFollowsAcademicWeek(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HOLIDAY_WEEK_FOLLOWS_ACADEMIC_WEEK'
source: neo_timetable.AcademicWeekNode
target: neo_timetable.HolidayWeekNode
class AcademicDayFollowsAcademicDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_FOLLOWS_ACADEMIC_DAY'
source: neo_timetable.AcademicDayNode
target: neo_timetable.AcademicDayNode
class AcademicDayFollowsHolidayDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_FOLLOWS_HOLIDAY_DAY'
source: neo_timetable.HolidayDayNode
target: neo_timetable.AcademicDayNode
class AcademicDayFollowsOffTimetableDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_FOLLOWS_OFF_TIMETABLE_DAY'
source: neo_timetable.OffTimetableDayNode
target: neo_timetable.AcademicDayNode
class AcademicDayFollowsStaffDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_DAY_FOLLOWS_STAFF_DAY'
source: neo_timetable.StaffDayNode
target: neo_timetable.AcademicDayNode
class HolidayDayFollowsHolidayDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HOLIDAY_DAY_FOLLOWS_HOLIDAY_DAY'
source: neo_timetable.HolidayDayNode
target: neo_timetable.HolidayDayNode
class HolidayDayFollowsAcademicDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HOLIDAY_DAY_FOLLOWS_ACADEMIC_DAY'
source: neo_timetable.AcademicDayNode
target: neo_timetable.HolidayDayNode
class HolidayDayFollowsOffTimetableDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HOLIDAY_DAY_FOLLOWS_OFF_TIMETABLE_DAY'
source: neo_timetable.OffTimetableDayNode
target: neo_timetable.HolidayDayNode
class HolidayDayFollowsStaffDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'HOLIDAY_DAY_FOLLOWS_STAFF_DAY'
source: neo_timetable.StaffDayNode
target: neo_timetable.HolidayDayNode
class OffTimetableDayFollowsOffTimetableDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_DAY_FOLLOWS_OFF_TIMETABLE_DAY'
source: neo_timetable.OffTimetableDayNode
target: neo_timetable.OffTimetableDayNode
class OffTimetableDayFollowsAcademicDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_DAY_FOLLOWS_ACADEMIC_DAY'
source: neo_timetable.AcademicDayNode
target: neo_timetable.OffTimetableDayNode
class OffTimetableDayFollowsHolidayDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_DAY_FOLLOWS_HOLIDAY_DAY'
source: neo_timetable.HolidayDayNode
target: neo_timetable.OffTimetableDayNode
class OffTimetableDayFollowsStaffDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_DAY_FOLLOWS_STAFF_DAY'
source: neo_timetable.StaffDayNode
target: neo_timetable.OffTimetableDayNode
class StaffDayFollowsStaffDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'STAFF_DAY_FOLLOWS_STAFF_DAY'
source: neo_timetable.StaffDayNode
target: neo_timetable.StaffDayNode
class StaffDayFollowsAcademicDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'STAFF_DAY_FOLLOWS_ACADEMIC_DAY'
source: neo_timetable.AcademicDayNode
target: neo_timetable.StaffDayNode
class StaffDayFollowsHolidayDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'STAFF_DAY_FOLLOWS_HOLIDAY_DAY'
source: neo_timetable.HolidayDayNode
target: neo_timetable.StaffDayNode
class StaffDayFollowsOffTimetableDay(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'STAFF_DAY_FOLLOWS_OFF_TIMETABLE_DAY'
source: neo_timetable.OffTimetableDayNode
target: neo_timetable.StaffDayNode
class AcademicPeriodFollowsAcademicPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_PERIOD_FOLLOWS_ACADEMIC_PERIOD'
source: neo_timetable.AcademicPeriodNode
target: neo_timetable.AcademicPeriodNode
class AcademicPeriodFollowsBreakPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_PERIOD_FOLLOWS_BREAK_PERIOD'
source: neo_timetable.BreakPeriodNode
target: neo_timetable.AcademicPeriodNode
class AcademicPeriodFollowsRegistrationPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_PERIOD_FOLLOWS_REGISTRATION_PERIOD'
source: neo_timetable.RegistrationPeriodNode
target: neo_timetable.AcademicPeriodNode
class AcademicPeriodFollowsOffTimetablePeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'ACADEMIC_PERIOD_FOLLOWS_OFF_TIMETABLE_PERIOD'
source: neo_timetable.OffTimetablePeriodNode
target: neo_timetable.AcademicPeriodNode
class BreakPeriodFollowsAcademicPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'BREAK_PERIOD_FOLLOWS_ACADEMIC_PERIOD'
source: neo_timetable.AcademicPeriodNode
target: neo_timetable.BreakPeriodNode
class RegistrationPeriodFollowsAcademicPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'REGISTRATION_PERIOD_FOLLOWS_ACADEMIC_PERIOD'
source: neo_timetable.AcademicPeriodNode
target: neo_timetable.RegistrationPeriodNode
class RegistrationPeriodFollowsOffTimetablePeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'REGISTRATION_PERIOD_FOLLOWS_OFF_TIMETABLE_PERIOD'
source: neo_timetable.OffTimetablePeriodNode
target: neo_timetable.RegistrationPeriodNode
class OffTimetablePeriodFollowsAcademicPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_PERIOD_FOLLOWS_ACADEMIC_PERIOD'
source: neo_timetable.AcademicPeriodNode
target: neo_timetable.OffTimetablePeriodNode
class OffTimetablePeriodFollowsRegistrationPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_PERIOD_FOLLOWS_REGISTRATION_PERIOD'
source: neo_timetable.RegistrationPeriodNode
target: neo_timetable.OffTimetablePeriodNode
class OffTimetablePeriodFollowsOffTimetablePeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_PERIOD_FOLLOWS_OFF_TIMETABLE_PERIOD'
source: neo_timetable.OffTimetablePeriodNode
target: neo_timetable.OffTimetablePeriodNode
class BreakPeriodFollowsBreakPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'BREAK_PERIOD_FOLLOWS_BREAK_PERIOD'
source: neo_timetable.BreakPeriodNode
target: neo_timetable.BreakPeriodNode
class BreakPeriodFollowsRegistrationPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'BREAK_PERIOD_FOLLOWS_REGISTRATION_PERIOD'
source: neo_timetable.RegistrationPeriodNode
target: neo_timetable.BreakPeriodNode
class BreakPeriodFollowsOffTimetablePeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'BREAK_PERIOD_FOLLOWS_OFF_TIMETABLE_PERIOD'
source: neo_timetable.OffTimetablePeriodNode
target: neo_timetable.BreakPeriodNode
class RegistrationPeriodFollowsBreakPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'REGISTRATION_PERIOD_FOLLOWS_BREAK_PERIOD'
source: neo_timetable.BreakPeriodNode
target: neo_timetable.RegistrationPeriodNode
class OffTimetablePeriodFollowsBreakPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'OFF_TIMETABLE_PERIOD_FOLLOWS_BREAK_PERIOD'
source: neo_timetable.BreakPeriodNode
target: neo_timetable.OffTimetablePeriodNode
class RegistrationPeriodFollowsRegistrationPeriod(BaseRelationship):
__relationshiptype__: ClassVar[str] = 'REGISTRATION_PERIOD_FOLLOWS_REGISTRATION_PERIOD'
source: neo_timetable.RegistrationPeriodNode
target: neo_timetable.RegistrationPeriodNode