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

Merge branch 'master' into 219-students-are-listed-multiple-times-in-class-register-views

parents 703fdd62 81c129d5
No related branches found
No related tags found
1 merge request!294Resolve "Students are listed multiple times in class register views"
Pipeline #86371 failed
......@@ -12,6 +12,9 @@ Unreleased
Fixed
~~~~~
* 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.
* 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.
......
......@@ -113,7 +113,7 @@ class LessonDocumentationOnHolidaysDataCheck(DataCheck):
documentations = LessonDocumentation.objects.not_empty().annotate_date_range()
q = Q()
q = Q(pk__in=[])
for holiday in holidays:
q = q | Q(day_end__gte=holiday.date_start, day_start__lte=holiday.date_end)
documentations = documentations.filter(q)
......@@ -147,7 +147,7 @@ class PersonalNoteOnHolidaysDataCheck(DataCheck):
personal_notes = PersonalNote.objects.not_empty().annotate_date_range()
q = Q()
q = Q(pk__in=[])
for holiday in holidays:
q = q | Q(day_end__gte=holiday.date_start, day_start__lte=holiday.date_end)
personal_notes = personal_notes.filter(q)
......
......@@ -186,9 +186,11 @@ PersonalNoteFormSet = forms.modelformset_factory(
class RegisterAbsenceForm(forms.Form):
layout = Layout(
Fieldset("", "person"),
Fieldset("", Row("date_start", "date_end"), Row("from_period", "to_period")),
Fieldset("", Row("absent", "excused"), Row("excuse_type"), Row("remarks")),
)
person = forms.ModelChoiceField(label=_("Person"), queryset=None, widget=Select2Widget)
date_start = forms.DateField(label=_("Start date"), initial=datetime.today)
date_end = forms.DateField(label=_("End date"), initial=datetime.today)
from_period = forms.ChoiceField(label=_("Start period"))
......@@ -203,10 +205,30 @@ class RegisterAbsenceForm(forms.Form):
)
remarks = forms.CharField(label=_("Remarks"), max_length=30, required=False)
def __init__(self, *args, **kwargs):
def __init__(self, request, *args, **kwargs):
self.request = request
super().__init__(*args, **kwargs)
period_choices = TimePeriod.period_choices
if self.request.user.has_perm("alsijil.register_absence"):
self.fields["person"].queryset = Person.objects.all()
else:
persons_qs = Person.objects.filter(
Q(
pk__in=get_objects_for_user(
self.request.user, "core.register_absence_person", Person
)
)
| Q(primary_group__owners=self.request.user.person)
| Q(
member_of__in=get_objects_for_user(
self.request.user, "core.register_absence_group", Group
)
)
).distinct()
self.fields["person"].queryset = persons_qs
self.fields["from_period"].choices = period_choices
self.fields["to_period"].choices = period_choices
self.fields["from_period"].initial = TimePeriod.period_min
......
......@@ -89,6 +89,17 @@ MENUS = {
),
],
},
{
"name": _("Register absence"),
"url": "register_absence",
"icon": "rate_review",
"validators": [
(
"aleksis.core.util.predicates.permission_validator",
"alsijil.view_register_absence_rule",
),
],
},
{
"name": _("Excuse types"),
"url": "excuse_types",
......
......@@ -156,15 +156,20 @@ view_week_personal_notes_predicate = has_person & (
add_perm("alsijil.view_week_personalnote_rule", view_week_personal_notes_predicate)
# Register absence
register_absence_predicate = has_person & (
view_register_absence_predicate = has_person & (
(
is_person_group_owner
& is_site_preference_set("alsijil", "register_absence_as_primary_group_owner")
)
| has_global_perm("alsijil.register_absence")
)
register_absence_predicate = has_person & (
view_register_absence_predicate
| has_object_perm("core.register_absence_person")
| has_person_group_object_perm("core.register_absence_group")
)
add_perm("alsijil.view_register_absence_rule", view_register_absence_predicate)
add_perm("alsijil.register_absence_rule", register_absence_predicate)
# View full register for group
......
{# -*- engine:django -*- #}
{% extends "core/base.html" %}
{% load material_form i18n static %}
{% load material_form i18n static any_js %}
{% block browser_title %}{% blocktrans %}Register absence{% endblocktrans %}{% endblock %}
{% block page_title %}{% blocktrans %}Register absence{% endblocktrans %}{% endblock %}
{% block content %}
<h6>{% trans "Person" %}: {{ person }}</h6>
{% block extra_head %}
{{ form.media.css }}
{% include_css "select2-materialize" %}
{% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
{% form form=register_absence_form %}{% endform %}
......@@ -22,4 +25,7 @@
});
});
</script>
{% include_js "select2-materialize" %}
{{ form.media.js }}
{% endblock %}
......@@ -48,6 +48,7 @@ urlpatterns = [
name="delete_personal_note",
),
path("absence/new/<int:id_>/", views.register_absence, name="register_absence"),
path("absence/new/", views.register_absence, name="register_absence"),
path("extra_marks/", views.ExtraMarkListView.as_view(), name="extra_marks"),
path(
"extra_marks/create/",
......
......@@ -742,7 +742,7 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
prefetched_persons = []
for person in persons:
person.filtered_notes = sorted_personal_notes["person"][person.pk]
person.filtered_notes = sorted_personal_notes["person"].get(person.pk, [])
prefetched_persons.append(person)
context["school_term"] = group.school_term
......@@ -1070,18 +1070,27 @@ def overview_person(request: HttpRequest, id_: Optional[int] = None) -> HttpResp
@never_cache
@permission_required("alsijil.register_absence_rule", fn=objectgetter_optional(Person))
def register_absence(request: HttpRequest, id_: int) -> HttpResponse:
def register_absence(request: HttpRequest, id_: int = None) -> HttpResponse:
context = {}
person = get_object_or_404(Person, pk=id_)
if id_:
person = get_object_or_404(Person, pk=id_)
else:
person = None
register_absence_form = RegisterAbsenceForm(request.POST or None)
register_absence_form = RegisterAbsenceForm(
request, request.POST or None, initial={"person": person}
)
if request.method == "POST" and register_absence_form.is_valid():
if (
request.method == "POST"
and register_absence_form.is_valid()
and request.user.has_perm("alsijil.register_absence_rule", person)
):
confirmed = request.POST.get("confirmed", "0") == "1"
# Get data from form
# person = register_absence_form.cleaned_data["person"]
person = register_absence_form.cleaned_data["person"]
start_date = register_absence_form.cleaned_data["date_start"]
end_date = register_absence_form.cleaned_data["date_end"]
from_period = register_absence_form.cleaned_data["from_period"]
......
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