Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • AlekSIS/official/AlekSIS-App-Alsijil
  • sunweaver/AlekSIS-App-Alsijil
  • 8tincsoVluke/AlekSIS-App-Alsijil
  • perfreicpo/AlekSIS-App-Alsijil
  • noifobarep/AlekSIS-App-Alsijil
  • 7ingannisdo/AlekSIS-App-Alsijil
  • unmruntartpa/AlekSIS-App-Alsijil
  • balrorebta/AlekSIS-App-Alsijil
  • comliFdifwa/AlekSIS-App-Alsijil
  • 3ranaadza/AlekSIS-App-Alsijil
10 results
Show changes
Commits on Source (24)
......@@ -4,6 +4,11 @@ Changelog
`1.0a3`_
--------
New features
~~~~~~~~~~~~
* Allow to register absences and excuses centrally
Bugfixes
~~~~~~~~
......
......@@ -2,6 +2,7 @@ from django import forms
from django.db.models import Count
from django.utils.translation import ugettext_lazy as _
from django_select2.forms import Select2Widget
from datetime import datetime
from biscuit.apps.chronos.models import Room
from biscuit.core.models import Group, Person
......@@ -47,3 +48,13 @@ class SelectForm(forms.Form):
PersonalNoteFormSet = forms.modelformset_factory(
PersonalNote, form=PersonalNoteForm, max_num=0, extra=0)
class RegisterAbsenceForm(forms.Form):
date_start = forms.DateField(label=_('Start date'), widget=forms.SelectDateWidget, initial=datetime.today)
date_end = forms.DateField(label=_('End date'), widget=forms.SelectDateWidget, initial=datetime.today)
starting_lesson = forms.IntegerField(label=_('Starting lesson'), initial=0, min_value=0)
person = forms.ModelChoiceField(label=_('Person'), queryset=Person.objects.all(), widget=Select2Widget)
absent = forms.BooleanField(label=_('Absent'), initial=True, required=False)
excused = forms.BooleanField(label=_('Excused'), initial=True, required=False)
remarks = forms.CharField(label=_('Remarks'), max_length=30, required=False)
......@@ -17,6 +17,11 @@ MENUS = {
'name': _('Current week'),
'url': 'week_view',
'validators': ['menu_generator.validators.is_authenticated']
},
{
'name': _('Register absence'),
'url': 'register_absence',
'validators': ['menu_generator.validators.is_superuser']
}
]
}
......
from datetime import date
from typing import Optional
from django.db.models import Exists, OuterRef
from django.db.models import Exists, F, OuterRef
from biscuit.apps.chronos.models import LessonPeriod
from biscuit.apps.chronos.util import CalendarWeek
......@@ -11,7 +10,7 @@ from .models import PersonalNote
@Person.method
def mark_absent(self, day: date, starting_period: Optional[int] = 0, absent=True, excused=False):
def mark_absent(self, day: date, starting_period: int = 0, absent: bool = True, bool = False, remarks: str = ''):
""" Mark a person absent for all lessons in a day, optionally starting with
a selected period number.
......@@ -36,7 +35,7 @@ def mark_absent(self, day: date, starting_period: Optional[int] = 0, absent=True
# Create and update all personal notes for the discovered lesson periods
for lesson_period in lesson_periods:
PersonalNote.objects.update_or_create(
personal_note, created = PersonalNote.objects.update_or_create(
person=self,
lesson_period=lesson_period,
week=wanted_week.week,
......@@ -46,6 +45,13 @@ def mark_absent(self, day: date, starting_period: Optional[int] = 0, absent=True
}
)
if remarks:
if personal_note.remarks:
personal_note.remarks += '; %s' % remarks
else:
personal_note.remarks = remarks
personal_note.save()
@LessonPeriod.method
def get_personal_notes(self, wanted_week: CalendarWeek):
......
{# -*- engine:django -*- #}
{% extends "core/base.html" %}
{% load bootstrap4 i18n static %}
{% block bootstrap4_extra_head %}
{{ block.super }}
{{ register_absence_form.media.css }}
{% endblock %}
{% block bootstrap4_extra_script %}
{{ block.super }}
{{ register_absence_form.media.js }}
{% endblock %}
{% block bootstrap4_title %}{% blocktrans%}Manage absence{% endblocktrans %} - {{ block.super }}{% endblock %}
{% block page_title %}Manage absences{% endblock %}
{% block content %}
<form method="post">
{% csrf_token %}
{% bootstrap_form register_absence_form %}
<button type="submit" class="btn btn-dark">
{% blocktrans %}Save{% endblocktrans %}
</button>
</form>
{% endblock %}
......@@ -11,5 +11,7 @@ urlpatterns = [
path('week/<int:year>/<int:week>', views.week_view,
name='week_view_by_week'),
path('print/group/<int:id_>', views.full_register_group,
name='full_register_group')
name='full_register_group'),
path('absence/new', views.register_absence,
name='register_absence'),
]
from datetime import date, datetime
from datetime import date, datetime, timedelta
from typing import Optional
from django.contrib.auth.decorators import login_required
......@@ -12,8 +12,10 @@ from django.utils.translation import ugettext as _
from biscuit.apps.chronos.models import LessonPeriod
from biscuit.apps.chronos.util import CalendarWeek
from biscuit.core.models import Group, Person
from biscuit.core.decorators import admin_required
from biscuit.core.util import messages
from .forms import LessonDocumentationForm, PersonalNoteFormSet, SelectForm
from .forms import RegisterAbsenceFormLessonDocumentationForm, PersonalNoteFormSet, RegisterAbsenceForm, SelectForm
from .models import LessonDocumentation
......@@ -202,3 +204,35 @@ def full_register_group(request: HttpRequest, id_: int) -> HttpResponse:
context['today'] = date.today()
return render(request, 'alsijil/print/full_register.html', context)
@admin_required
def register_absence(request: HttpRequest) -> HttpResponse:
context = {}
register_absence_form = RegisterAbsenceForm(request.POST or None)
if request.method == 'POST':
if register_absence_form.is_valid():
# Get data from form
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']
starting_lesson = register_absence_form.cleaned_data['starting_lesson']
absent = register_absence_form.cleaned_data['absent']
excused = register_absence_form.cleaned_data['excused']
remarks = register_absence_form.cleaned_data['remarks']
# Mark person as absent
delta = end_date - start_date
for i in range(delta.days+1):
starting_period = starting_lesson if i == 0 else 0
day = start_date + timedelta(days=i)
person.mark_absent(day, starting_period, absent, excused, remarks)
messages.success(request, _('The absence has been saved.'))
return redirect('index')
context['register_absence_form'] = register_absence_form
return render(request, 'alsijil/register_absence.html', context)