diff --git a/aleksis/apps/chronos/frontend/components/SelectTimetable.vue b/aleksis/apps/chronos/frontend/components/SelectTimetable.vue index fb98d1f56c51d4261502df5d8ec2889e39e6445c..4f880bdc2bf7952017f7c92cd149e1cd5ad23c27 100644 --- a/aleksis/apps/chronos/frontend/components/SelectTimetable.vue +++ b/aleksis/apps/chronos/frontend/components/SelectTimetable.vue @@ -68,7 +68,7 @@ export default { class="flex-grow-1" :value="type.id" > - {{ type.name }} + {{ $t(type.name) }} </v-btn> </v-btn-toggle> </v-card-text> diff --git a/aleksis/apps/chronos/frontend/components/timetableTypes.js b/aleksis/apps/chronos/frontend/components/timetableTypes.js index 692854f18411cc2f3ed1abf35069d28c9b18e51c..2aa2ae17decbed87abea83e54627a9067db1d712 100644 --- a/aleksis/apps/chronos/frontend/components/timetableTypes.js +++ b/aleksis/apps/chronos/frontend/components/timetableTypes.js @@ -1,13 +1,13 @@ export default { GROUP: { - name: "Groups", + name: "chronos.timetable.types.groups", id: "GROUP", icon: "mdi-account-group-outline", }, TEACHER: { - name: "Teachers", + name: "chronos.timetable.types.teachers", id: "TEACHER", icon: "mdi-account-outline", }, - ROOM: { name: "Rooms", id: "ROOM", icon: "mdi-door" }, + ROOM: { name: "chronos.timetable.types.rooms", id: "ROOM", icon: "mdi-door" }, }; diff --git a/aleksis/apps/chronos/frontend/messages/de.json b/aleksis/apps/chronos/frontend/messages/de.json index 512498ccfae594033f7634e09bfba992233612fe..86148a7bac93fe2dfbd36568994a2c1af35e8dbe 100644 --- a/aleksis/apps/chronos/frontend/messages/de.json +++ b/aleksis/apps/chronos/frontend/messages/de.json @@ -12,7 +12,12 @@ "search": "Stundenpläne suchen", "prev": "Vorheriger Stundenplan", "next": "Nächster Stundenplan", - "select": "Stundenplan auswählen" + "select": "Stundenplan auswählen", + "types": { + "groups": "Gruppen", + "teachers": "Lehrkräfte", + "rooms": "Räume" + } }, "lessons": { "menu_title_daily": "Tagesstunden" diff --git a/aleksis/apps/chronos/frontend/messages/en.json b/aleksis/apps/chronos/frontend/messages/en.json index b995b749a1677cdfbdbfef9888f4bd427062717c..ee23c28f02b5b872222461653ea1e624eff54c5b 100644 --- a/aleksis/apps/chronos/frontend/messages/en.json +++ b/aleksis/apps/chronos/frontend/messages/en.json @@ -12,7 +12,12 @@ "search": "Search Timetables", "prev": "Previous Timetable", "next": "Next Timetable", - "select": "Select Timetable" + "select": "Select Timetable", + "types": { + "groups": "Groups", + "teachers": "Teachers", + "rooms": "Rooms" + } }, "lessons": { "menu_title_daily": "Daily lessons" diff --git a/aleksis/apps/chronos/managers.py b/aleksis/apps/chronos/managers.py index d26c4cbbc89fd4a1abd2b361e1380702f3bd30f5..12c52170720ac0eb0f7310380e6880c8e14b0000 100644 --- a/aleksis/apps/chronos/managers.py +++ b/aleksis/apps/chronos/managers.py @@ -916,6 +916,15 @@ class LessonEventQuerySet(PolymorphicQuerySet): & Q(amended_by__isnull=True) ) + def related_to_person(self, person: Union[int, Person]): + amended = self.filter( + Q(amended_by__isnull=False) + & (Q(teachers=person) | Q(groups__members=person) | Q(groups__owners=person)) + ).values_list("amended_by__pk", flat=True) + return self.filter( + Q(teachers=person) | Q(groups__members=person) | Q(groups__owners=person) + ).distinct() + def not_amended(self): return self.filter(amended_by__isnull=True) diff --git a/aleksis/apps/chronos/models.py b/aleksis/apps/chronos/models.py index 720da54ca3da9eca357d31b4e1b131a235118461..0ee5cfc92416c45339ea406e237e96590bb0da7e 100644 --- a/aleksis/apps/chronos/models.py +++ b/aleksis/apps/chronos/models.py @@ -8,7 +8,7 @@ from itertools import chain from typing import Any from django.contrib.contenttypes.models import ContentType -from django.core.exceptions import ValidationError +from django.core.exceptions import PermissionDenied, ValidationError from django.core.validators import MinValueValidator from django.db import models from django.db.models import F, Max, Min, Q @@ -1540,12 +1540,17 @@ class LessonEvent(CalendarEvent): def get_objects(cls, request, params=None) -> Iterable: """Return all objects that should be included in the calendar.""" objs = super().get_objects(request, params).not_instance_of(SupervisionEvent) + + if not has_person(request.user): + raise PermissionDenied() + if params: obj_id = int(params.get("id", 0)) type_ = params.get("type", None) prefetch_absences = params.get("prefetch_absences", False) not_amended = params.get("not_amended", False) not_amending = params.get("not_amending", False) + own = params.get("own", False) if prefetch_absences: objs = objs.prefetch_related("teachers__kolego_absences") @@ -1556,6 +1561,12 @@ class LessonEvent(CalendarEvent): if not_amending: objs = objs.not_amending() + if "own" in params: + if own: + objs = objs.for_person(request.user.person) + else: + objs = objs.related_to_person(request.user.person) + if type_ and obj_id: if type_ == "TEACHER": return objs.for_teacher(obj_id) @@ -1565,6 +1576,8 @@ class LessonEvent(CalendarEvent): return objs.for_room(obj_id) elif type_ == "COURSE": return objs.for_course(obj_id) + elif "own" in params: + return objs return objs.for_person(request.user.person) @classmethod diff --git a/aleksis/apps/chronos/schema/__init__.py b/aleksis/apps/chronos/schema/__init__.py index 9fb03afece38926a9c1653bb6d094535803f4fb8..d4251761a1ddcb8b0f6c0915a7bc7cdfd8b2c7e9 100644 --- a/aleksis/apps/chronos/schema/__init__.py +++ b/aleksis/apps/chronos/schema/__init__.py @@ -176,9 +176,7 @@ class TimetableObjectType(graphene.ObjectType): class LessonEventType(DjangoObjectType): class Meta: model = LessonEvent - fields = ( - "id", - ) + fields = ("id",) filter_fields = { "id": ["exact", "lte", "gte"], } diff --git a/aleksis/apps/chronos/util/chronos_helpers.py b/aleksis/apps/chronos/util/chronos_helpers.py index bc88a3b98874ffc3e0ddeebc3b01acd2fbbb4559..1f299424047084ceeec346a22b9e9c1aa00127ed 100644 --- a/aleksis/apps/chronos/util/chronos_helpers.py +++ b/aleksis/apps/chronos/util/chronos_helpers.py @@ -106,10 +106,7 @@ def get_classes(user: "User"): lessons_count=Count("lesson_events"), child_lessons_count=Count("child_groups__lesson_events"), ) - .filter( - Q(lessons_count__gt=0, parent_groups=None) - | Q(child_lessons_count__gt=0, parent_groups=None) - ) + .filter(Q(lessons_count__gt=0) | Q(child_lessons_count__gt=0)) .order_by("short_name", "name") ) diff --git a/pyproject.toml b/pyproject.toml index aa02408ec2a8205863904e845e1e5dcdcdd5e48e..338e3c2b90c45e6c0cc5a040a4dd9124bda0cfef 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [tool.poetry] name = "AlekSIS-App-Chronos" -version = "4.0.0.dev0" +version = "4.0.0.dev1" packages = [ { include = "aleksis" } ]