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

Make register absence form usable with menu item

parent 346bd83a
No related branches found
No related tags found
1 merge request!295Resolve "Register absence isn't usable without direct access to class register"
Pipeline #84541 failed
......@@ -9,6 +9,11 @@ and this project adheres to `Semantic Versioning`_.
Unreleased
----------
Fixed
~~~~~
* Register absence form wasn't accessible without direct access to class register.
`2.1`_ - 2022-06-25
-------------------
......
......@@ -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.register_absence_rule",
),
],
},
{
"name": _("Excuse types"),
"url": "excuse_types",
......
{# -*- 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/",
......
......@@ -1060,18 +1060,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