diff --git a/CHANGELOG.rst b/CHANGELOG.rst index e7b741e41e60bc878f460e32b1c9b336997d7c21..7056bc0866de0e44b466a08c1eccf0f0262d0f44 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,15 @@ Changelog ========= +`1.0a2`_ +-------- + +New features +~~~~~~~~~~~~ + +* Add list of all future substitutions + + `1.0a2`_ -------- @@ -37,3 +46,4 @@ Minor changes _`1.0a1`: https://edugit.org/Teckids/BiscuIT/BiscuIT-App-Chronos/-/tags/1.0a1 _`1.0a2`: https://edugit.org/Teckids/BiscuIT/BiscuIT-App-Chronos/-/tags/1.0a2 +_`1.0a3`: https://edugit.org/Teckids/BiscuIT/BiscuIT-App-Chronos/-/tags/1.0a3 diff --git a/biscuit/apps/chronos/menus.py b/biscuit/apps/chronos/menus.py index 109bbb85d9fe5d431d5ca2ebf40d6a85dcacae47..11851fe6cc21a3c84404b76b99a3663745486cd5 100644 --- a/biscuit/apps/chronos/menus.py +++ b/biscuit/apps/chronos/menus.py @@ -17,6 +17,11 @@ MENUS = { 'name': _('Daily lessons'), 'url': 'lessons_day', 'validators': ['menu_generator.validators.is_authenticated'] + }, + { + 'name': _('Substitutions'), + 'url': 'substitutions', + 'validators': ['menu_generator.validators.is_authenticated'] } ] } diff --git a/biscuit/apps/chronos/tables.py b/biscuit/apps/chronos/tables.py index ad0408e0c762d41ab5b771640eece34a738a48c4..f05d6aa13cbae38d939b7b038a62132ab571a599 100644 --- a/biscuit/apps/chronos/tables.py +++ b/biscuit/apps/chronos/tables.py @@ -31,3 +31,15 @@ class LessonsTable(tables.Table): room = tables.Column(accessor='room') edit_substitution = tables.LinkColumn( 'edit_substitution', args=[A('id'), A('_week')], text=_('Substitution')) + + +class SubstitutionsTable(tables.Table): + class Meta: + attrs = {'class': 'table table-striped table-bordered table-hover table-responsive-xl'} + + lesson_period = tables.Column(verbose_name=_('Lesson')) + lesson__groups = tables.Column(accessor='lesson_period.lesson.group_names', verbose_name=_('Groups')) + lesson__teachers = tables.Column(accessor='lesson_period.get_teacher_names', verbose_name=_('Teachers')) + lesson__subject = tables.Column(accessor='subject') + room = tables.Column(accessor='room') + cancelled = tables.BooleanColumn(accessor='cancelled', verbose_name=_('Cancelled')) diff --git a/biscuit/apps/chronos/templates/chronos/substitutions.html b/biscuit/apps/chronos/templates/chronos/substitutions.html new file mode 100644 index 0000000000000000000000000000000000000000..3ab767bbf5586927e522904d0d97a176466bb1c7 --- /dev/null +++ b/biscuit/apps/chronos/templates/chronos/substitutions.html @@ -0,0 +1,11 @@ +{# -*- engine:django -*- #} + +{% extends "core/turnable.html" %} +{% load bootstrap4 i18n font_awesome %} +{% load render_table from django_tables2 %} + +{% block bootstrap4_title %}{% blocktrans %}Substitutions{% endblocktrans %} - {{ block.super }}{% endblock %} + +{% block current_content %} + {% render_table substitutions_table %} +{% endblock %} diff --git a/biscuit/apps/chronos/urls.py b/biscuit/apps/chronos/urls.py index 2972068e96db8a2f5f8c3de7e5870ac819bb55d8..f567ab33cefb5996f357ba1d768a63b8071e3d1c 100644 --- a/biscuit/apps/chronos/urls.py +++ b/biscuit/apps/chronos/urls.py @@ -9,5 +9,7 @@ urlpatterns = [ path('lessons', views.lessons_day, name='lessons_day'), path('lessons/<when>', views.lessons_day, name='lessons_day_by_date'), path('lessons/<int:id_>/<int:week>/substition', views.edit_substitution, name='edit_substitution'), - path('lessons/<int:id_>/<int:week>/substition/delete', views.delete_substitution, name='delete_substitution') + path('lessons/<int:id_>/<int:week>/substition/delete', views.delete_substitution, name='delete_substitution'), + path('substitutions', views.substitutions, name='substitutions'), + path('substitutions/<int:year>/<int:week>', views.substitutions, name='substitutions_by_week') ] diff --git a/biscuit/apps/chronos/views.py b/biscuit/apps/chronos/views.py index 084e65035d1487d0e1a20f040f043e2deb90568b..f388891463742628250e87889d6c822c35a864f5 100644 --- a/biscuit/apps/chronos/views.py +++ b/biscuit/apps/chronos/views.py @@ -17,7 +17,7 @@ from biscuit.core.util import messages from .forms import SelectForm, LessonSubstitutionForm from .models import LessonPeriod, TimePeriod, LessonSubstitution from .util import CalendarWeek -from .tables import LessonsTable +from .tables import LessonsTable, SubstitutionsTable @login_required @@ -160,3 +160,27 @@ def delete_substitution(request: HttpRequest, id_: int, week: int) -> HttpRespon messages.success(request, _('The substitution has been deleted.')) return redirect('lessons_day_by_date', when=wanted_week[lesson_period.period.weekday - 1].strftime('%Y-%m-%d')) + + +def substitutions(request: HttpRequest, year: Optional[int] = None, week: Optional[int] = None) -> HttpResponse: + context = {} + + if week: + wanted_week = CalendarWeek(year=year, week=week) + else: + wanted_week = CalendarWeek() + + substitutions = LessonSubstitution.objects.filter(week=wanted_week.week) + + # Prepare table + substitutions_table = SubstitutionsTable(substitutions) + RequestConfig(request).configure(substitutions_table) + + context['current_head'] = str(wanted_week) + context['substitutions_table'] = substitutions_table + week_prev = wanted_week - 1 + week_next = wanted_week + 1 + context['url_prev'] = '%s' % (reverse('substitutions_by_week', args=[week_prev.year, week_prev.week])) + context['url_next'] = '%s' % (reverse('substitutions_by_week', args=[week_next.year, week_next.week])) + + return render(request, 'chronos/substitutions.html', context)