diff --git a/aleksis/apps/chronos/util/predicates.py b/aleksis/apps/chronos/util/predicates.py index f68f508943eef3bb9e0e39e96ecec3e4251dde5d..18190d3fbdae1279799643f42aa19909a39d4feb 100644 --- a/aleksis/apps/chronos/util/predicates.py +++ b/aleksis/apps/chronos/util/predicates.py @@ -13,28 +13,46 @@ from .chronos_helpers import get_classes, get_rooms, get_teachers @predicate def has_timetable_perm(user: User, obj: Model) -> bool: """Predicate which checks whether the user is allowed to access the requested timetable.""" - if type(obj) is Group: - return ( - obj in user.person.member_of.all() - or user.person.primary_group == obj - or obj in user.person.owner_of.all() - or has_global_perm("chronos.view_all_group_timetables")(user) - or has_object_perm("core.view_group_timetable")(user, obj) - ) - elif type(obj) is Person: - return ( - user.person == obj - or has_global_perm("chronos.view_all_person_timetables")(user) - or has_object_perm("core.view_person_timetable")(user, obj) - ) - elif type(obj) is Room: - return has_global_perm("chronos.view_all_room_timetables")(user) or has_object_perm( - "chronos.view_room_timetable" - )(user, obj) + if isinstance(obj, Group): + return has_group_timetable_perm(user, obj) + elif isinstance(obj, Person): + return has_person_timetable_perm(user, obj) + elif isinstance(obj, Room): + return has_room_timetable_perm(user, obj) else: return False +@predicate +def has_group_timetable_perm(user: User, obj: Group) -> bool: + """Predicate which checks whether the user is allowed to access the requested group timetable.""" + return ( + obj in user.person.member_of.all() + or user.person.primary_group == obj + or obj in user.person.owner_of.all() + or has_global_perm("chronos.view_all_group_timetables")(user) + or has_object_perm("core.view_group_timetable")(user, obj) + ) + + +@predicate +def has_person_timetable_perm(user: User, obj: Person) -> bool: + """Predicate which checks whether the user is allowed to access the requested person timetable.""" + return ( + user.person == obj + or has_global_perm("chronos.view_all_person_timetables")(user) + or has_object_perm("core.view_person_timetable")(user, obj) + ) + + +@predicate +def has_room_timetable_perm(user: User, obj: Room) -> bool: + """Predicate which checks whether the user is allowed to access the requested room timetable.""" + return has_global_perm("chronos.view_all_room_timetables")(user) or has_object_perm( + "chronos.view_room_timetable" + )(user, obj) + + @predicate def has_any_timetable_object(user: User) -> bool: """Predicate which checks whether there exists a timetable that the user is allowed to access."""