From 8515fa1bbe99ea2f8aff267f508ecf55d18631eb Mon Sep 17 00:00:00 2001
From: Hangzhi Yu <hangzhi@protonmail.com>
Date: Tue, 30 Jan 2024 17:54:41 +0100
Subject: [PATCH] Allow accessing coursebook for different object types
 (courses, groups, ...)

---
 .../apps/alsijil/frontend/components/Coursebook.vue    | 10 ++++++++--
 .../alsijil/frontend/components/coursebook.graphql     |  4 ++--
 aleksis/apps/alsijil/frontend/index.js                 |  9 +++++----
 aleksis/apps/alsijil/schema/__init__.py                |  8 ++++----
 4 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/aleksis/apps/alsijil/frontend/components/Coursebook.vue b/aleksis/apps/alsijil/frontend/components/Coursebook.vue
index 9efbcfa07..961367a41 100644
--- a/aleksis/apps/alsijil/frontend/components/Coursebook.vue
+++ b/aleksis/apps/alsijil/frontend/components/Coursebook.vue
@@ -43,11 +43,16 @@ export default {
   props: {
     // Either as props OR route params
     // TODO: Remove default?
-    courseId: {
+    objId: {
       type: [Number, String],
       required: false,
       default: 0,
     },
+    objType: {
+      type: String,
+      required: false,
+      default: "group",
+    },
     // Next two in ISODate
     dateStart: {
       type: String,
@@ -69,7 +74,8 @@ export default {
     gqlQueryArgs() {
       return {
         // Assure courseId is a number
-        courseId: Number(this.courseId),
+        objId: Number(this.objId),
+        objType: this.objType.toUpperCase(),
         dateStart: this.dateStart,
         dateEnd: this.dateEnd,
       };
diff --git a/aleksis/apps/alsijil/frontend/components/coursebook.graphql b/aleksis/apps/alsijil/frontend/components/coursebook.graphql
index 2986bf96b..e2fb931a3 100644
--- a/aleksis/apps/alsijil/frontend/components/coursebook.graphql
+++ b/aleksis/apps/alsijil/frontend/components/coursebook.graphql
@@ -1,5 +1,5 @@
-query gqlDocumentationsForCoursebook($courseId: ID!, $dateStart: Date!, $dateEnd: Date!) {
-  items: documentationsForCoursebook(courseId: $courseId, dateStart: $dateStart, dateEnd: $dateEnd) {
+query gqlDocumentationsForCoursebook($objId: ID!, $objType: String!, $dateStart: Date!, $dateEnd: Date!) {
+  items: documentationsForCoursebook(objId: $objId, objType: $objType, dateStart: $dateStart, dateEnd: $dateEnd) {
     id
     course {
       id
diff --git a/aleksis/apps/alsijil/frontend/index.js b/aleksis/apps/alsijil/frontend/index.js
index fe62f3a33..aff43c39a 100644
--- a/aleksis/apps/alsijil/frontend/index.js
+++ b/aleksis/apps/alsijil/frontend/index.js
@@ -394,19 +394,20 @@ export default {
       },
     },
     {
-      path: "coursebook/:courseId(\\d+)/",
+      path: "coursebook/:objType(group|course|teacher)/:objId(\\d+)/",
       component: () => import("./components/Coursebook.vue"),
       redirect: to => {
         console.log('redirect to', to);
-        return { name: "alsijil.coursebook_by_course_id_and_date",
+        return { name: "alsijil.coursebook_by_obj_id_and_date",
                  params: {
-                   courseId: to.params.courseId,
+                   objType: to.params.objType,
+                   objId: to.params.objId,
                    dateStart: DateTime.now().toISODate(),
                    dateEnd: DateTime.now().plus({ weeks: 1 }).toISODate(),
                  },
                };
       },
-      name: "alsijil.coursebook_by_course_id",
+      name: "alsijil.coursebook_by_obj_id",
       props: true,
       meta: {
         inMenu: true,
diff --git a/aleksis/apps/alsijil/schema/__init__.py b/aleksis/apps/alsijil/schema/__init__.py
index e325627b6..c407a6eff 100644
--- a/aleksis/apps/alsijil/schema/__init__.py
+++ b/aleksis/apps/alsijil/schema/__init__.py
@@ -23,7 +23,8 @@ class Query(graphene.ObjectType):
     )
     documentations_for_coursebook = FilterOrderList(
         DocumentationType,
-        course_id = graphene.ID(required=True),
+        obj_type = graphene.String(required=True),
+        obj_id = graphene.ID(required=True),
         date_start=graphene.Date(required=True),
         date_end=graphene.Date(required=True),
     )
@@ -34,12 +35,11 @@ class Query(graphene.ObjectType):
         )
         return documentations
 
-    def resolve_documentations_for_coursebook(root, info, course_id, date_start, date_end, **kwargs):
+    def resolve_documentations_for_coursebook(root, info, obj_type, obj_id, date_start, date_end, **kwargs):
         datetime_start = datetime.combine(date_start, datetime.min.time())
         datetime_end = datetime.combine(date_end, datetime.max.time())
 
-        # TODO: later on, allow getting documentations for other types than courses, e.g. groups or persons
-        return Documentation.get_for_coursebook("COURSE", course_id, datetime_start, datetime_end, info.context)
+        return Documentation.get_for_coursebook(obj_type, obj_id, datetime_start, datetime_end, info.context)
 
 
 class Mutation(graphene.ObjectType):
-- 
GitLab