diff --git a/aleksis/apps/chronos/frontend/components/SubstitutionOverview.vue b/aleksis/apps/chronos/frontend/components/SubstitutionOverview.vue index 4f4d08bf1b8785692ee89a976fe912e7383cd394..04a20e632573d1656a3e87c7e57b74787ff43979 100644 --- a/aleksis/apps/chronos/frontend/components/SubstitutionOverview.vue +++ b/aleksis/apps/chronos/frontend/components/SubstitutionOverview.vue @@ -41,6 +41,16 @@ import { @input="changeSelection" @click:clear="changeSelection" /> + <v-switch + :loading="$apollo.queries.groups.loading" + :label="$t('chronos.substitutions.overview.filter.missing')" + v-model="incomplete" + dense + inset + hide-details + class="ml-6" + /> + <v-alert type="info" outlined dense class="full-width"> <v-row align="center" no-gutters> <v-col class="grow"> @@ -115,6 +125,7 @@ export default { gqlQuery: amendedLessonsFromAbsences, gqlPatchMutation: createOrUpdateSubstitutions, groups: [], + incomplete: false, }; }, methods: { @@ -136,6 +147,7 @@ export default { gqlQueryArgs() { return { objId: this.objId ? Number(this.objId) : null, + incomplete: !!this.incomplete, }; }, currentGroup() { diff --git a/aleksis/apps/chronos/frontend/components/amendLesson.graphql b/aleksis/apps/chronos/frontend/components/amendLesson.graphql index f36abe98063147008dbebd75dfe893a74bbdbb8f..608acfd86f3fbc4b5a40fcd58ee5e3939bcb9bef 100644 --- a/aleksis/apps/chronos/frontend/components/amendLesson.graphql +++ b/aleksis/apps/chronos/frontend/components/amendLesson.graphql @@ -172,11 +172,13 @@ query amendedLessonsFromAbsences( $objId: ID $dateStart: Date! $dateEnd: Date! + $incomplete: Boolean ) { items: amendedLessonsFromAbsences( objId: $objId dateStart: $dateStart dateEnd: $dateEnd + incomplete: $incomplete ) { id oldId diff --git a/aleksis/apps/chronos/frontend/messages/en.json b/aleksis/apps/chronos/frontend/messages/en.json index 689c68348c1becbd754cd5c7ff620fe29d1dbd53..87a05b7dfc9c6179987799c6ebc55a3ef07a8f8b 100644 --- a/aleksis/apps/chronos/frontend/messages/en.json +++ b/aleksis/apps/chronos/frontend/messages/en.json @@ -52,7 +52,8 @@ "button": "Manage absences" }, "filter": { - "groups": "Filter by groups" + "groups": "Filter by groups", + "missing": "Only show incomplete lessons" }, "cancel": { "cancelled": "Cancelled", diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py index 59b886de75fc7299f84e56231bc2bbe21645710f..685544c7eca3b9200bf34e8fc28b9485928f6f72 100644 --- a/aleksis/apps/chronos/models.py +++ b/aleksis/apps/chronos/models.py @@ -1584,6 +1584,7 @@ class LessonEvent(CalendarEvent): request: HttpRequest, obj_type: Optional[str], obj_id: Optional[str], + incomplete: Optional[bool] = False, ) -> list: """Get all the amended lessons for an object and a time frame. @@ -1638,6 +1639,8 @@ class LessonEvent(CalendarEvent): ) if existing_substitutions.exists(): + if incomplete: + continue substitution = existing_substitutions.first() substitutions.append(substitution) diff --git a/aleksis/apps/chronos/schema/__init__.py b/aleksis/apps/chronos/schema/__init__.py index d2f1c747cc39c591342f1a74d1dba71f61d3f610..05edad1b9e6dd58062da4bb1c14f7420738ccb6d 100644 --- a/aleksis/apps/chronos/schema/__init__.py +++ b/aleksis/apps/chronos/schema/__init__.py @@ -268,6 +268,7 @@ class Query(graphene.ObjectType): obj_id=graphene.ID(required=False), date_start=graphene.Date(required=True), date_end=graphene.Date(required=True), + incomplete=graphene.Boolean(required=False), ) def resolve_timetable_teachers(self, info, **kwargs): @@ -311,7 +312,7 @@ class Query(graphene.ObjectType): return all_timetables def resolve_amended_lessons_from_absences( - root, info, date_start, date_end, obj_type="GROUP", obj_id=None, **kwargs + root, info, date_start, date_end, obj_type="GROUP", obj_id=None, incomplete=False, **kwargs ): datetime_start = datetime.combine(date_start, datetime.min.time()) datetime_end = datetime.combine(date_end, datetime.max.time()) @@ -327,7 +328,7 @@ class Query(graphene.ObjectType): raise PermissionDenied() return LessonEvent.get_for_substitution_overview( - datetime_start, datetime_end, info.context, obj_type, obj_id + datetime_start, datetime_end, info.context, obj_type, obj_id, incomplete )