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

Merge branch 'master' into 225-seating-plan-integration-uses-wrong-permission-names

parents 7ff5b9fd ed3002e7
No related branches found
No related tags found
1 merge request!302Resolve "Seating plan integration uses wrong permission names"
Pipeline #86763 passed
...@@ -15,6 +15,8 @@ Fixed ...@@ -15,6 +15,8 @@ Fixed
* Register absence form wasn't accessible without direct access to class register. * Register absence form wasn't accessible without direct access to class register.
* Printing the full group register failed when a person had no personal notes. * Printing the full group register failed when a person had no personal notes.
* Data checks reported all Lesson Documentations as being during Holidays if there was no Holiday object. * Data checks reported all Lesson Documentations as being during Holidays if there was no Holiday object.
* Students were displayed multiple times in class register views.
* Absences were counted multiple times in some class register views.
* Group owners couldn't create new seating plans. * Group owners couldn't create new seating plans.
`2.1`_ - 2022-06-25 `2.1`_ - 2022-06-25
......
...@@ -434,6 +434,7 @@ def generate_person_list_with_class_register_statistics( ...@@ -434,6 +434,7 @@ def generate_person_list_with_class_register_statistics(
"filtered_personal_notes", "filtered_personal_notes",
filter=Q(filtered_personal_notes__absent=True) filter=Q(filtered_personal_notes__absent=True)
& ~Q(filtered_personal_notes__excuse_type__count_as_absent=False), & ~Q(filtered_personal_notes__excuse_type__count_as_absent=False),
distinct=True,
), ),
excused=Count( excused=Count(
"filtered_personal_notes", "filtered_personal_notes",
...@@ -442,6 +443,7 @@ def generate_person_list_with_class_register_statistics( ...@@ -442,6 +443,7 @@ def generate_person_list_with_class_register_statistics(
filtered_personal_notes__excused=True, filtered_personal_notes__excused=True,
) )
& ~Q(filtered_personal_notes__excuse_type__count_as_absent=False), & ~Q(filtered_personal_notes__excuse_type__count_as_absent=False),
distinct=True,
), ),
excused_without_excuse_type=Count( excused_without_excuse_type=Count(
"filtered_personal_notes", "filtered_personal_notes",
...@@ -450,15 +452,16 @@ def generate_person_list_with_class_register_statistics( ...@@ -450,15 +452,16 @@ def generate_person_list_with_class_register_statistics(
filtered_personal_notes__excused=True, filtered_personal_notes__excused=True,
filtered_personal_notes__excuse_type__isnull=True, filtered_personal_notes__excuse_type__isnull=True,
), ),
distinct=True,
), ),
unexcused=Count( unexcused=Count(
"filtered_personal_notes", "filtered_personal_notes",
filter=Q(filtered_personal_notes__absent=True, filtered_personal_notes__excused=False), filter=Q(filtered_personal_notes__absent=True, filtered_personal_notes__excused=False),
distinct=True,
), ),
tardiness=Sum("filtered_personal_notes__late"), tardiness=Sum("filtered_personal_notes__late"),
tardiness_count=Count( tardiness_count=Count(
"filtered_personal_notes", "filtered_personal_notes", filter=Q(filtered_personal_notes__late__gt=0), distinct=True
filter=Q(filtered_personal_notes__late__gt=0),
), ),
) )
......
...@@ -240,8 +240,10 @@ def register_object( ...@@ -240,8 +240,10 @@ def register_object(
else: else:
persons = Person.objects.all() persons = Person.objects.all()
persons_qs = register_object.get_personal_notes(persons, wanted_week).filter( persons_qs = (
person__member_of__in=request.user.person.owner_of.all() register_object.get_personal_notes(persons, wanted_week)
.filter(person__member_of__in=request.user.person.owner_of.all())
.distinct()
) )
# Annotate group roles # Annotate group roles
...@@ -476,12 +478,16 @@ def week_view( ...@@ -476,12 +478,16 @@ def week_view(
if not request.user.has_perm("alsijil.view_week_personalnote_rule", instance): if not request.user.has_perm("alsijil.view_week_personalnote_rule", instance):
persons_qs = persons_qs.filter(pk=request.user.person.pk) persons_qs = persons_qs.filter(pk=request.user.person.pk)
elif group: elif group:
persons_qs = persons_qs.filter(member_of=group).filter( persons_qs = (
member_of__in=request.user.person.owner_of.all() persons_qs.filter(member_of=group)
.filter(member_of__in=request.user.person.owner_of.all())
.distinct()
) )
else: else:
persons_qs = persons_qs.filter(member_of__in=groups).filter( persons_qs = (
member_of__in=request.user.person.owner_of.all() persons_qs.filter(member_of__in=groups)
.filter(member_of__in=request.user.person.owner_of.all())
.distinct()
) )
# Prefetch object permissions for persons and groups the persons are members of # Prefetch object permissions for persons and groups the persons are members of
...@@ -792,12 +798,16 @@ def my_students(request: HttpRequest) -> HttpResponse: ...@@ -792,12 +798,16 @@ def my_students(request: HttpRequest) -> HttpResponse:
new_groups = [] new_groups = []
for group in relevant_groups: for group in relevant_groups:
persons = group.generate_person_list_with_class_register_statistics( persons = (
group.members.prefetch_related( group.generate_person_list_with_class_register_statistics(
"primary_group__owners", group.members.prefetch_related(
Prefetch("member_of", queryset=relevant_groups, to_attr="member_of_prefetched"), "primary_group__owners",
Prefetch("member_of", queryset=relevant_groups, to_attr="member_of_prefetched"),
)
) )
).filter(member_of__in=request.user.person.owner_of.all()) .filter(member_of__in=request.user.person.owner_of.all())
.distinct()
)
persons_for_group = [] persons_for_group = []
for person in persons: for person in persons:
person.set_object_permission_checker(checker) person.set_object_permission_checker(checker)
...@@ -830,10 +840,10 @@ class StudentsList(PermissionRequiredMixin, DetailView): ...@@ -830,10 +840,10 @@ class StudentsList(PermissionRequiredMixin, DetailView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
context["group"] = self.object context["group"] = self.object
context[ context["persons"] = (
"persons" self.object.generate_person_list_with_class_register_statistics()
] = self.object.generate_person_list_with_class_register_statistics().filter( .filter(member_of__in=self.request.user.person.owner_of.all())
member_of__in=self.request.user.person.owner_of.all() .distinct()
) )
context["extra_marks"] = ExtraMark.objects.all() context["extra_marks"] = ExtraMark.objects.all()
context["excuse_types"] = ExcuseType.objects.filter(count_as_absent=True) context["excuse_types"] = ExcuseType.objects.filter(count_as_absent=True)
......
...@@ -48,7 +48,7 @@ secondary = true ...@@ -48,7 +48,7 @@ secondary = true
[tool.poetry.dependencies] [tool.poetry.dependencies]
python = "^3.9" python = "^3.9"
aleksis-core = "^2.7" aleksis-core = "^2.11"
aleksis-app-chronos = "^2.2" aleksis-app-chronos = "^2.2"
aleksis-app-stoelindeling = { version = "^1.0", optional = true } aleksis-app-stoelindeling = { version = "^1.0", optional = true }
......
...@@ -10,7 +10,7 @@ skip_install = true ...@@ -10,7 +10,7 @@ skip_install = true
envdir = {toxworkdir}/globalenv envdir = {toxworkdir}/globalenv
commands_pre = commands_pre =
poetry install poetry install
poetry run aleksis-admin yarn install poetry run aleksis-admin webpack_bundle
poetry run aleksis-admin collectstatic --no-input poetry run aleksis-admin collectstatic --no-input
commands = commands =
poetry run pytest --cov=. {posargs} aleksis/ poetry run pytest --cov=. {posargs} aleksis/
......
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