diff --git a/aleksis/apps/chronos/frontend/components/Timetable.vue b/aleksis/apps/chronos/frontend/components/Timetable.vue index 78947059bd524bcd829077d790dec3581bfe42a2..794883d3d420a3ca4bd837d31575da07918c1fe5 100644 --- a/aleksis/apps/chronos/frontend/components/Timetable.vue +++ b/aleksis/apps/chronos/frontend/components/Timetable.vue @@ -4,6 +4,7 @@ import TimetableWrapper from "./TimetableWrapper.vue"; <script> import { DateTime } from "luxon"; +import { gqlTimetableDays } from "./timetables.graphql"; export default { name: "Timetable", @@ -12,6 +13,7 @@ export default { calendarFocus: "", calendarType: "week", initialRouteFocusSet: false, + timetableDays: [1, 2, 3, 4, 5], }; }, methods: { @@ -79,6 +81,11 @@ export default { }); }, }, + apollo: { + timetableDays: { + query: gqlTimetableDays, + }, + }, }; </script> @@ -93,6 +100,7 @@ export default { ]" :params="{ type: selected.type, id: selected.objId }" ref="calendarWithControls" + :calendar-days-of-week="timetableDays" @changeCalendarFocus="setCalendarFocus" @changeCalendarType="setCalendarType" @calendarReady="setInnerFocusAndType" diff --git a/aleksis/apps/chronos/frontend/components/timetables.graphql b/aleksis/apps/chronos/frontend/components/timetables.graphql index 5bbe46f734f1981ad1c2648d50a8a6e8d7bd04fc..6e575f2726e920e31656c2470495b12399532132 100644 --- a/aleksis/apps/chronos/frontend/components/timetables.graphql +++ b/aleksis/apps/chronos/frontend/components/timetables.graphql @@ -7,3 +7,7 @@ query gqlAvailableTimetables { shortName } } + +query gqlTimetableDays { + timetableDays +} diff --git a/aleksis/apps/chronos/preferences.py b/aleksis/apps/chronos/preferences.py index a2bd26ef9eac55d0ddca38091619b3d008279803..c883bbbf418cf626cc2c7634cefb21d04b3ee847 100644 --- a/aleksis/apps/chronos/preferences.py +++ b/aleksis/apps/chronos/preferences.py @@ -122,3 +122,26 @@ class SupervisionEventFeedColor(StringPreference): verbose_name = _("Supervision calendar feed color") widget = ColorWidget required = True + + +@site_preferences_registry.register +class DaysInCalendar(MultipleChoicePreference): + section = chronos + name = "days_in_calendar" + default = ["1", "2", "3", "4", "5"] + verbose_name = _("Days of the week that appear in the timetable") + choices = [ + ("0", _("Sunday")), + ("1", _("Monday")), + ("2", _("Tuesday")), + ("3", _("Wednesday")), + ("4", _("Thursday")), + ("5", _("Friday")), + ("6", _("Saturday")), + ] + required = True + + def validate(self, value): + for v in value: + if int(v) not in self.get_choice_values(): + raise ValidationError(f"{v} is not a valid choice") diff --git a/aleksis/apps/chronos/schema/__init__.py b/aleksis/apps/chronos/schema/__init__.py index d23eb0c7c8bf056b66f3b7c074f2a73e6b6f1182..ab1d00255b430ecc67275a4710aebcc0f63ddd51 100644 --- a/aleksis/apps/chronos/schema/__init__.py +++ b/aleksis/apps/chronos/schema/__init__.py @@ -10,6 +10,7 @@ from aleksis.core.schema.base import ( from aleksis.core.schema.group import GroupType from aleksis.core.schema.person import PersonType from aleksis.core.schema.room import RoomType +from aleksis.core.util.core_helpers import get_site_preferences, has_person from ..models import LessonEvent from ..util.build import build_substitutions_list @@ -234,6 +235,7 @@ class Query(graphene.ObjectType): SubstitutionsForDateType, date=graphene.Date(), ) + timetable_days = graphene.List(graphene.Int) def resolve_timetable_teachers(self, info, **kwargs): return get_teachers(info.context.user) @@ -285,6 +287,25 @@ class Query(graphene.ObjectType): substitutions=[sub["el"] for sub in substitutions], ) + @staticmethod + def resolve_timetable_days(root, info, **kwargs): + first_day = "default" + + if has_person(info.context): + first_day = info.context.user.person.preferences["calendar__first_day_of_the_week"] + + if first_day == "default": + first_day = get_site_preferences()["calendar__first_day_of_the_week"] + + first_day = int(first_day) + + days = list(map(str, range(7))) + sorted_days = days[first_day:] + days[:first_day] + + allowed_days = get_site_preferences()["chronos__days_in_calendar"] + + return list(map(int, filter(lambda d: d in allowed_days, sorted_days))) + class Mutation(graphene.ObjectType): create_amend_lessons = AmendLessonBatchCreateMutation.Field()