Skip to content
Snippets Groups Projects
Verified Commit 8b0fbc16 authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Add preference for selecting group types to be shown in timetables

parent 665933c0
No related branches found
No related tags found
1 merge request!343Resolve "Add preference for group type to show in timetable view"
Pipeline #179495 passed with warnings
...@@ -7,10 +7,12 @@ from dynamic_preferences.preferences import Section ...@@ -7,10 +7,12 @@ from dynamic_preferences.preferences import Section
from dynamic_preferences.types import ( from dynamic_preferences.types import (
BooleanPreference, BooleanPreference,
IntegerPreference, IntegerPreference,
ModelMultipleChoicePreference,
StringPreference, StringPreference,
TimePreference, TimePreference,
) )
from aleksis.core.models import GroupType
from aleksis.core.registries import person_preferences_registry, site_preferences_registry from aleksis.core.registries import person_preferences_registry, site_preferences_registry
chronos = Section("chronos", verbose_name=_("Timetables")) chronos = Section("chronos", verbose_name=_("Timetables"))
...@@ -115,6 +117,20 @@ class SendNotificationsPerson(BooleanPreference): ...@@ -115,6 +117,20 @@ class SendNotificationsPerson(BooleanPreference):
verbose_name = _("Send notifications for current timetable changes") verbose_name = _("Send notifications for current timetable changes")
@site_preferences_registry.register
class GroupTypesTimetables(ModelMultipleChoicePreference):
section = chronos
name = "group_types_timetables"
required = False
default = []
model = GroupType
verbose_name = _("Group types to show in timetables")
help_text = _("If you leave it empty, all groups will be shown.")
def get_queryset(self):
return GroupType.objects.managed_and_unmanaged()
@site_preferences_registry.register @site_preferences_registry.register
class LessonEventFeedColor(StringPreference): class LessonEventFeedColor(StringPreference):
"""Color for the lesson calendar feed.""" """Color for the lesson calendar feed."""
......
...@@ -11,7 +11,7 @@ from graphene_django_cud.mutations import ( ...@@ -11,7 +11,7 @@ from graphene_django_cud.mutations import (
from aleksis.core.models import Group, Person, Room from aleksis.core.models import Group, Person, Room
from ..models import LessonEvent from ..models import LessonEvent
from ..util.chronos_helpers import get_classes, get_rooms, get_teachers from ..util.chronos_helpers import get_groups, get_rooms, get_teachers
class TimetablePersonType(DjangoObjectType): class TimetablePersonType(DjangoObjectType):
...@@ -149,14 +149,14 @@ class Query(graphene.ObjectType): ...@@ -149,14 +149,14 @@ class Query(graphene.ObjectType):
return get_teachers(info.context.user) return get_teachers(info.context.user)
def resolve_timetable_groups(self, info, **kwargs): def resolve_timetable_groups(self, info, **kwargs):
return get_classes(info.context.user) return get_groups(info.context.user)
def resolve_timetable_rooms(self, info, **kwargs): def resolve_timetable_rooms(self, info, **kwargs):
return get_rooms(info.context.user) return get_rooms(info.context.user)
def resolve_available_timetables(self, info, **kwargs): def resolve_available_timetables(self, info, **kwargs):
all_timetables = [] all_timetables = []
for group in get_classes(info.context.user): for group in get_groups(info.context.user):
all_timetables.append( all_timetables.append(
TimetableObjectType( TimetableObjectType(
id=group.id, id=group.id,
...@@ -167,7 +167,6 @@ class Query(graphene.ObjectType): ...@@ -167,7 +167,6 @@ class Query(graphene.ObjectType):
) )
for teacher in get_teachers(info.context.user): for teacher in get_teachers(info.context.user):
print(teacher.full_name)
all_timetables.append( all_timetables.append(
TimetableObjectType( TimetableObjectType(
id=teacher.id, id=teacher.id,
......
...@@ -96,38 +96,44 @@ def get_teachers(user: "User"): ...@@ -96,38 +96,44 @@ def get_teachers(user: "User"):
return teachers return teachers
def get_classes(user: "User"): def get_groups(user: "User"):
"""Get the classes whose timetables are allowed to be seen by current user.""" """Get the groups whose timetables are allowed to be seen by current user."""
checker = ObjectPermissionChecker(user) checker = ObjectPermissionChecker(user)
classes = ( groups = (
Group.objects.for_current_school_term_or_all() Group.objects.for_current_school_term_or_all()
.annotate( .annotate(
lessons_count=Count("lesson_events"), lessons_count=Count("lesson_events"),
child_lessons_count=Count("child_groups__lesson_events"), child_lessons_count=Count("child_groups__lesson_events"),
) )
.filter(Q(lessons_count__gt=0) | Q(child_lessons_count__gt=0)) .filter(Q(lessons_count__gt=0) | Q(child_lessons_count__gt=0))
.order_by("short_name", "name")
) )
group_types = get_site_preferences()["chronos__group_types_timetables"]
if group_types:
groups = groups.filter(group_type__in=group_types)
groups = groups.order_by("short_name", "name")
if not check_global_permission(user, "chronos.view_all_group_timetables"): if not check_global_permission(user, "chronos.view_all_group_timetables"):
checker.prefetch_perms(classes) checker.prefetch_perms(groups)
wanted_classes = set() wanted_classes = set()
for _class in classes: for _class in groups:
if checker.has_perm("core.view_group_timetable", _class): if checker.has_perm("core.view_group_timetable", _class):
wanted_classes.add(_class.pk) wanted_classes.add(_class.pk)
classes = classes.filter( groups = groups.filter(
Q(pk__in=wanted_classes) | Q(members=user.person) | Q(owners=user.person) Q(pk__in=wanted_classes) | Q(members=user.person) | Q(owners=user.person)
) )
if user.person.primary_group: if user.person.primary_group:
classes = classes.filter(Q(pk=user.person.primary_group.pk)) groups = groups.filter(Q(pk=user.person.primary_group.pk))
classes = classes.distinct() groups = groups.distinct()
return classes return groups
def get_rooms(user: "User"): def get_rooms(user: "User"):
......
...@@ -6,7 +6,7 @@ from rules import predicate ...@@ -6,7 +6,7 @@ from rules import predicate
from aleksis.core.models import Group, Person, Room from aleksis.core.models import Group, Person, Room
from aleksis.core.util.predicates import has_global_perm, has_object_perm from aleksis.core.util.predicates import has_global_perm, has_object_perm
from .chronos_helpers import get_classes, get_rooms, get_teachers from .chronos_helpers import get_groups, get_rooms, get_teachers
@predicate @predicate
...@@ -75,4 +75,4 @@ def has_room_timetable_perm(user: User, obj: Room) -> bool: ...@@ -75,4 +75,4 @@ def has_room_timetable_perm(user: User, obj: Room) -> bool:
@predicate @predicate
def has_any_timetable_object(user: User) -> bool: def has_any_timetable_object(user: User) -> bool:
"""Predicate which checks whether there are any timetables the user is allowed to access.""" """Predicate which checks whether there are any timetables the user is allowed to access."""
return get_classes(user).exists() or get_rooms(user).exists() or get_teachers(user).exists() return get_groups(user).exists() or get_rooms(user).exists() or get_teachers(user).exists()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment