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})