Skip to content
Snippets Groups Projects
Commit 7274012b authored by Jonathan Weth's avatar Jonathan Weth :keyboard:
Browse files

Merge branch '216-add-preference-for-group-type-to-show-in-timetable-view' into 'master'

Resolve "Add preference for group type to show in timetable view"

Closes #216

See merge request !343
parents 272d3276 8b0fbc16
No related tags found
1 merge request!343Resolve "Add preference for group type to show in timetable view"
Pipeline #182903 failed
......@@ -7,10 +7,12 @@ from dynamic_preferences.preferences import Section
from dynamic_preferences.types import (
BooleanPreference,
IntegerPreference,
ModelMultipleChoicePreference,
StringPreference,
TimePreference,
)
from aleksis.core.models import GroupType
from aleksis.core.registries import person_preferences_registry, site_preferences_registry
chronos = Section("chronos", verbose_name=_("Timetables"))
......@@ -115,6 +117,20 @@ class SendNotificationsPerson(BooleanPreference):
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
class LessonEventFeedColor(StringPreference):
"""Color for the lesson calendar feed."""
......
......@@ -11,7 +11,7 @@ from graphene_django_cud.mutations import (
from aleksis.core.models import Group, Person, Room
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):
......@@ -149,14 +149,14 @@ class Query(graphene.ObjectType):
return get_teachers(info.context.user)
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):
return get_rooms(info.context.user)
def resolve_available_timetables(self, info, **kwargs):
all_timetables = []
for group in get_classes(info.context.user):
for group in get_groups(info.context.user):
all_timetables.append(
TimetableObjectType(
id=group.id,
......@@ -167,7 +167,6 @@ class Query(graphene.ObjectType):
)
for teacher in get_teachers(info.context.user):
print(teacher.full_name)
all_timetables.append(
TimetableObjectType(
id=teacher.id,
......
......@@ -96,38 +96,44 @@ def get_teachers(user: "User"):
return teachers
def get_classes(user: "User"):
"""Get the classes whose timetables are allowed to be seen by current user."""
def get_groups(user: "User"):
"""Get the groups whose timetables are allowed to be seen by current user."""
checker = ObjectPermissionChecker(user)
classes = (
groups = (
Group.objects.for_current_school_term_or_all()
.annotate(
lessons_count=Count("lesson_events"),
child_lessons_count=Count("child_groups__lesson_events"),
)
.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"):
checker.prefetch_perms(classes)
checker.prefetch_perms(groups)
wanted_classes = set()
for _class in classes:
for _class in groups:
if checker.has_perm("core.view_group_timetable", _class):
wanted_classes.add(_class.pk)
classes = classes.filter(
groups = groups.filter(
Q(pk__in=wanted_classes) | Q(members=user.person) | Q(owners=user.person)
)
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"):
......
......@@ -6,7 +6,7 @@ from rules import predicate
from aleksis.core.models import Group, Person, Room
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
......@@ -75,4 +75,4 @@ def has_room_timetable_perm(user: User, obj: Room) -> bool:
@predicate
def has_any_timetable_object(user: User) -> bool:
"""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