"biscuit/apps/git@edugit.org:katharineum/AlekSIS-App-FiBu.git" did not exist on "7bb3ebcb4d26d04ce862fe14b4cd085b265b3ec4"
Newer
Older
from datetime import datetime, timedelta
from django import forms
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from django_select2.forms import ModelSelect2MultipleWidget, ModelSelect2Widget, Select2Widget
from guardian.shortcuts import get_objects_for_user

Jonathan Weth
committed
from material import Fieldset, Layout, Row
from aleksis.apps.chronos.managers import TimetableType
from aleksis.apps.chronos.models import Subject, TimePeriod
from aleksis.core.models import Group, Person, SchoolTerm
from aleksis.core.util.core_helpers import get_site_preferences
from aleksis.core.util.predicates import check_global_permission
from .models import (
ExcuseType,
ExtraMark,
GroupRole,
GroupRoleAssignment,
LessonDocumentation,
PersonalNote,
)
class LessonDocumentationForm(forms.ModelForm):
class Meta:
model = LessonDocumentation

Jonathan Weth
committed
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields["homework"].label = _("Homework for the next lesson")
class PersonalNoteForm(forms.ModelForm):
class Meta:
model = PersonalNote

Jonathan Weth
committed
fields = ["absent", "late", "excused", "excuse_type", "extra_marks", "remarks"]
person_name = forms.CharField(disabled=True)
def __init__(self, *args, **kwargs):
self.fields["person_name"].widget.attrs.update(
{"class": "alsijil-lesson-personal-note-name"}
)
self.fields["person_name"].widget = forms.HiddenInput()
if self.instance and getattr(self.instance, "person", None):
self.fields["person_name"].initial = str(self.instance.person)
class SelectForm(forms.Form):
group = forms.ModelChoiceField(
queryset=None, label=_("Group"), required=False, widget=Select2Widget,
teacher = forms.ModelChoiceField(
queryset=None, label=_("Teacher"), required=False, widget=Select2Widget,
if data.get("group") and not data.get("teacher"):
type_ = TimetableType.GROUP
instance = data["group"]
elif data.get("teacher") and not data.get("group"):
type_ = TimetableType.TEACHER
instance = data["teacher"]
elif not data.get("teacher") and not data.get("group"):
return data
else:
raise ValidationError(_("You can't select a group and a teacher both."))
data["type_"] = type_
data["instance"] = instance
return data
def __init__(self, request, *args, **kwargs):
self.request = request
super().__init__(*args, **kwargs)
group_qs = Group.get_groups_with_lessons()
# Filter selectable groups by permissions
if not check_global_permission(self.request.user, "alsijil.view_week"):
# 1) All groups the user is allowed to see the week view by object permissions
# 2) All groups the user is a member of an owner of
group_qs.filter(
pk__in=get_objects_for_user(
self.request.user, "core.view_week_class_register_group", Group
).values_list("pk", flat=True)
).union(group_qs.filter(Q(members=person) | Q(owners=person)))
# Flatten query by filtering groups by pk
self.fields["group"].queryset = Group.objects.filter(
pk__in=list(group_qs.values_list("pk", flat=True))
)
teacher_qs = Person.objects.annotate(lessons_count=Count("lessons_as_teacher")).filter(
lessons_count__gt=0
)
# Filter selectable teachers by permissions
if not check_global_permission(self.request.user, "alsijil.view_week"):
# If the user hasn't the global permission,
# the user is only allowed to see his own person
teacher_qs = teacher_qs.filter(pk=person.pk)
self.fields["teacher"].queryset = teacher_qs
PersonalNoteFormSet = forms.modelformset_factory(
PersonalNote, form=PersonalNoteForm, max_num=0, extra=0
)
class RegisterAbsenceForm(forms.Form):

Jonathan Weth
committed
Fieldset("", Row("date_start", "date_end"), Row("from_period", "to_period")),
Fieldset("", Row("absent", "excused"), Row("excuse_type"), Row("remarks")),
date_start = forms.DateField(label=_("Start date"), initial=datetime.today)
date_end = forms.DateField(label=_("End date"), initial=datetime.today)

Jonathan Weth
committed
from_period = forms.ChoiceField(label=_("Start period"))
to_period = forms.ChoiceField(label=_("End period"))
absent = forms.BooleanField(label=_("Absent"), initial=True, required=False)
excused = forms.BooleanField(label=_("Excused"), initial=True, required=False)

Jonathan Weth
committed
excuse_type = forms.ModelChoiceField(
label=_("Excuse type"),
queryset=ExcuseType.objects.all(),
widget=Select2Widget,
required=False,
)
remarks = forms.CharField(label=_("Remarks"), max_length=30, required=False)
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

Jonathan Weth
committed
period_choices = TimePeriod.period_choices

Jonathan Weth
committed
self.fields["from_period"].choices = period_choices
self.fields["to_period"].choices = period_choices
self.fields["from_period"].initial = TimePeriod.period_min
self.fields["to_period"].initial = TimePeriod.period_max
class ExtraMarkForm(forms.ModelForm):
layout = Layout("short_name", "name")
model = ExtraMark
fields = ["short_name", "name"]
class ExcuseTypeForm(forms.ModelForm):
layout = Layout("short_name", "name")
class Meta:
model = ExcuseType
fields = ["short_name", "name"]
layout = Layout("name", "icon", "colour")
class Meta:
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
class AssignGroupRoleForm(forms.ModelForm):
layout_base = ["groups", "person", "role", Row("date_start", "date_end")]
groups = forms.ModelMultipleChoiceField(
label=_("Group"),
required=True,
queryset=Group.objects.all(),
widget=ModelSelect2MultipleWidget(
model=Group,
search_fields=["name__icontains", "short_name__icontains"],
attrs={"data-minimum-input-length": 0, "class": "browser-default",},
),
)
person = forms.ModelChoiceField(
label=_("Person"),
required=True,
queryset=Person.objects.all(),
widget=ModelSelect2Widget(
model=Person,
search_fields=[
"first_name__icontains",
"last_name__icontains",
"short_name__icontains",
],
attrs={"data-minimum-input-length": 0, "class": "browser-default"},
),
)
def __init__(self, request, *args, **kwargs):
self.request = request
initial = kwargs.get("initial", {})
# Build layout with or without groups field
base_layout = self.layout_base[:]
if "groups" in initial:
base_layout.remove("groups")
self.layout = Layout(*base_layout)
super().__init__(*args, **kwargs)
if "groups" in initial:
self.fields["groups"].required = False
# Filter persons and groups by permissions
if not self.request.user.has_perm("alsijil.assign_grouprole"): # Global permission
persons = Person.objects
if initial.get("groups"):
persons = persons.filter(member_of__in=initial["groups"])
if get_site_preferences()["alsijil__group_owners_can_assign_roles_to_parents"]:
persons = persons.filter(
Q(member_of__owners=self.request.user.person)
| Q(children__member_of__owners=self.request.user.person)
)
else:
persons = persons.filter(member_of__owners=self.request.user.person)
self.fields["person"].queryset = persons
if "groups" not in initial:
groups = Group.objects.for_current_school_term_or_all().filter(
owners=self.request.user.person
)
self.fields["groups"].queryset = groups
def clean_groups(self):
"""Ensure that only permitted groups are used."""
return self.initial["groups"] if "groups" in self.initial else self.cleaned_data["groups"]
class Meta:
model = GroupRoleAssignment
fields = ["groups", "person", "role", "date_start", "date_end"]
class GroupRoleAssignmentEditForm(forms.ModelForm):
class Meta:
model = GroupRoleAssignment
fields = ["date_start", "date_end"]
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
class FilterRegisterObjectForm(forms.Form):
layout = Layout(
Row("school_term", "date_start", "date_end"), Row("has_documentation", "group", "subject")
)
school_term = forms.ModelChoiceField(queryset=None, label=_("School term"))
has_documentation = forms.NullBooleanField(label=_("Has lesson documentation"))
group = forms.ModelChoiceField(queryset=None, label=_("Group"), required=False)
subject = forms.ModelChoiceField(queryset=None, label=_("Subject"), required=False)
date_start = forms.DateField(label=_("Start date"))
date_end = forms.DateField(label=_("End date"))
@classmethod
def get_initial(cls):
date_end = timezone.now().date()
date_start = date_end - timedelta(days=30)
return {
"school_term": SchoolTerm.current,
"date_start": date_start,
"date_end": date_end,
}
def __init__(self, request, for_person=True, *args, **kwargs):
self.request = request
person = self.request.user.person
# Fill in initial data
kwargs["initial"] = self.get_initial()
super().__init__(*args, **kwargs)
# Build querysets
self.fields["school_term"].queryset = SchoolTerm.objects.all()
# Filter selectable groups by permissions
group_qs = Group.objects.all()
if for_person:
group_qs = group_qs.filter(
Q(lessons__teachers=person)
| Q(lessons__lesson_periods__substitutions__teachers=person)
| Q(events__teachers=person)
| Q(extra_lessons__teachers=person)
)
elif not check_global_permission(self.request.user, "alsijil.view_full_register"):
group_qs = group_qs.union(
group_qs.filter(
pk__in=get_objects_for_user(
self.request.user, "core.view_full_register_group", Group
).values_list("pk", flat=True)
)
)
# Flatten query by filtering groups by pk
groups_flat = Group.objects.filter(pk__in=list(group_qs.values_list("pk", flat=True)))
self.fields["group"].queryset = groups_flat
# Filter subjects by selectable groups
subject_qs = Subject.objects.filter(
Q(lessons__groups__in=groups_flat) | Q(extra_lessons__groups__in=groups_flat)
).distinct()
self.fields["subject"].queryset = subject_qs