From d858bf84fd173b088951030fafc892967cc64ba1 Mon Sep 17 00:00:00 2001 From: John Mullins Date: Mon, 11 Dec 2023 10:25:30 +1100 Subject: [PATCH] Added rollover function. Hidden some admin views --- .gitignore | 1 - busManager/busManager/urls.py | 3 ++ busManager/coord/admin.py | 15 ++++---- busManager/coord/models.py | 2 +- busManager/coord/utils/rollover.py | 60 ++++++++++++++++++++++++++++++ 5 files changed, 71 insertions(+), 10 deletions(-) create mode 100644 busManager/coord/utils/rollover.py diff --git a/.gitignore b/.gitignore index efc551a..e4dba48 100644 --- a/.gitignore +++ b/.gitignore @@ -131,5 +131,4 @@ GitHub.sublime-settings /media /static -/busManager/busManager/settings.py /busManager/coord/migrations \ No newline at end of file diff --git a/busManager/busManager/urls.py b/busManager/busManager/urls.py index 93c5ef3..9574012 100644 --- a/busManager/busManager/urls.py +++ b/busManager/busManager/urls.py @@ -18,11 +18,14 @@ from azure_auth.views import azure_auth_logout from django.contrib import admin from django.urls import path, include +from coord.utils.rollover import rollover + admin.site.site_header = "Bus Portal Admin" urlpatterns = [ path('report/', include("coord.urls")), path('logout/', azure_auth_logout), path('auth/', include("azure_auth.urls"),), + path('rollover', rollover, name="rollover"), path('', admin.site.urls), ] diff --git a/busManager/coord/admin.py b/busManager/coord/admin.py index 0020440..586c4f8 100644 --- a/busManager/coord/admin.py +++ b/busManager/coord/admin.py @@ -100,7 +100,7 @@ class ArchiveFilter(BooleanFieldListFilter): field_choices = dict(self.field.flatchoices) for lookup, title in ( (None, gettext_lazy("All")), - ("0", field_choices.get(True, gettext_lazy("Current"))), + ("0", field_choices.get(True, gettext_lazy("Current Year"))), ("1", field_choices.get(False, gettext_lazy("Archived"))), ): yield { @@ -172,14 +172,14 @@ class BusesAdmin(MyImportExportModelAdmin, admin.ModelAdmin, BusRollMixin): return format_html('{} Travellers', url, obj.traveller_count()) -@admin.register(BusStop) +# @admin.register(BusStop) class BusStopAdmin(MyImportExportModelAdmin, admin.ModelAdmin): list_filter = ["bus__company", "bus__route_name"] list_display = ["__str__", "am_time", "pm_time", "address"] search_fields = ["bus__route_name", "address"] -@admin.register(Suburb) +# @admin.register(Suburb) class SuburbsAdmin(MyImportExportModelAdmin, admin.ModelAdmin): list_filter = ["state"] @@ -193,14 +193,13 @@ class TravellerRouteInline(admin.TabularInline): class TravellerAdmin(MyImportExportModelAdmin, CloneModelAdmin, admin.ModelAdmin, TravellerRollMixin, TemplateMixin): list_display = ["first_name", "last_name", "school", "year_level", "residential_address", "residential_suburb", "stop_route", "shuttle", "travel_start_date", "travel_end_date"] list_filter = [ - "school", "year_level", "eligibility_status", "bus_stops__bus", "shuttle", "residential_suburb", + ("is_archived", ArchiveFilter), "school", "year_level", "eligibility_status", "bus_stops__bus", "shuttle", "residential_suburb", ("travel_start_date", DateRangeFilterBuilder( title="Start date" )), ("travel_end_date", DateRangeFilterBuilder( title="End date" - )), - ("is_archived", ArchiveFilter) + )) ] search_fields = ["first_name", "last_name", "residential_address"] cloneable_fields = ["last_name", "residential_address", "residential_suburb", @@ -295,7 +294,7 @@ class TravellerAdmin(MyImportExportModelAdmin, CloneModelAdmin, admin.ModelAdmin super().save_model(request, obj, form, change) -@admin.register(TravellerRoute) +# @admin.register(TravellerRoute) class TravellerRouteAdmin(MyImportExportModelAdmin, admin.ModelAdmin): list_display = ["traveller", "busStop"] @@ -328,7 +327,7 @@ class ShuttleAdmin(MyImportExportModelAdmin, admin.ModelAdmin, ShuttleRollMixin) return format_html('{} Travellers', url, obj.traveller_count()) -@admin.register(Driver) +# @admin.register(Driver) class DriverAdmin(MyImportExportModelAdmin, admin.ModelAdmin): list_display = ["__str__", "route", "phone_number"] diff --git a/busManager/coord/models.py b/busManager/coord/models.py index 00e67b0..a9cf36b 100644 --- a/busManager/coord/models.py +++ b/busManager/coord/models.py @@ -110,7 +110,7 @@ class Shuttle(models.Model): def traveller_count(self): count = 0 - for traveller in Traveller.objects.filter(shuttle=self): + for traveller in Traveller.objects.filter(shuttle=self, is_archived=False): if traveller.is_active(): count += 1 return count diff --git a/busManager/coord/utils/rollover.py b/busManager/coord/utils/rollover.py new file mode 100644 index 0000000..ea5395b --- /dev/null +++ b/busManager/coord/utils/rollover.py @@ -0,0 +1,60 @@ +import datetime + +from django import forms +from django.contrib.admin.views.decorators import staff_member_required +from django.http import HttpResponseRedirect, HttpResponse +from django.shortcuts import render + +from coord.models import Traveller + + +# Any active year 12 without exit date set exit date before today + +# Any user active user with exit date before today > Archive + +# Any active user (not adult learner) increase year by 1 +def previous_rollover_date(): + today = datetime.date.today() + return datetime.date(year=today.year - 1, month=12, day=31) + + +class RolloverForm(forms.Form): + exit_date = forms.DateField(initial=previous_rollover_date) + agreement = forms.BooleanField(label='I have run an export/backup for travellers') + + +def _rollover(exit_date): + print(f"Setting exit date {exit_date}") + result = Traveller.objects.filter(year_level='12', travel_end_date=None).update(travel_end_date=exit_date) + print(f"{result} Year 12s exited") + today = datetime.date.today().strftime('%Y-%m-%d') + result = Traveller.objects.filter(travel_end_date__lt=today, is_archived=False).update(is_archived=True) + print(f"{result} travellers archived") + result = Traveller.objects.filter(is_archived=False, year_level='11').update(year_level='12') + result += Traveller.objects.filter(is_archived=False, year_level='10').update(year_level='11') + result += Traveller.objects.filter(is_archived=False, year_level='09').update(year_level='10') + result += Traveller.objects.filter(is_archived=False, year_level='08').update(year_level='09') + result += Traveller.objects.filter(is_archived=False, year_level='07').update(year_level='08') + result += Traveller.objects.filter(is_archived=False, year_level='06').update(year_level='07') + result += Traveller.objects.filter(is_archived=False, year_level='05').update(year_level='06') + result += Traveller.objects.filter(is_archived=False, year_level='04').update(year_level='05') + result += Traveller.objects.filter(is_archived=False, year_level='03').update(year_level='04') + result += Traveller.objects.filter(is_archived=False, year_level='02').update(year_level='03') + result += Traveller.objects.filter(is_archived=False, year_level='01').update(year_level='02') + result += Traveller.objects.filter(is_archived=False, year_level='00').update(year_level='01') + result += Traveller.objects.filter(is_archived=False, year_level='PS').update(year_level='00') + print(f"{result} travellers modified") + + +@staff_member_required +def rollover(request): + # if 'confirm' in request.POST: + if request.method == 'POST': + form = RolloverForm(request.POST) + if form.is_valid(): + _rollover(form.cleaned_data['exit_date']) + # rollover_mixin.message_user(request, "Users have been rolled over") + return HttpResponseRedirect('/') + + form = RolloverForm() + return render(request, 'admin/rollover_form.html', context={'form': form})