From cd022fbf54012c2a5dec577260e208315e3e308c Mon Sep 17 00:00:00 2001 From: John Mullins Date: Fri, 16 Feb 2024 18:10:08 +1100 Subject: [PATCH] Added cached readonly field "address" to traveler to allow search functionally and reduce database lookups --- busManager/coord/admin.py | 11 +---------- busManager/coord/models.py | 13 ++++++++----- busManager/coord/scheduled_tasks.py | 25 +------------------------ 3 files changed, 10 insertions(+), 39 deletions(-) diff --git a/busManager/coord/admin.py b/busManager/coord/admin.py index c038fa8..eef1e75 100644 --- a/busManager/coord/admin.py +++ b/busManager/coord/admin.py @@ -185,7 +185,7 @@ class TravellerAdmin(MyImportExportModelAdmin, admin.ModelAdmin, TravellerRollMi title="End date" )) ] - search_fields = ["first_name", "last_name"] + search_fields = ["first_name", "last_name", "address"] inlines = [FamilyInline, TravellerRouteInline] readonly_fields = ["travel_start_date", "travel_end_date", "fare_paying", "created_on", "last_edit", "is_active", "address"] actions = ["export_to_csv", "send_sms", "confirmation_letter", "letter_creator"] @@ -233,15 +233,6 @@ class TravellerAdmin(MyImportExportModelAdmin, admin.ModelAdmin, TravellerRollMi return stops.first() return "Multiple" - def address(self, obj): - families = Family.objects.filter(traveller__id__exact=obj.id) - if families.count() == 0: - return "" - if families.count() == 1: - family = families.first() - return f"{family.residential_address} {family.residential_suburb}" - return "Multiple" - # def save_model(self, request, obj, form, change): # if obj.is_archived and obj.travel_end_date is None: # obj.is_archived = False diff --git a/busManager/coord/models.py b/busManager/coord/models.py index e88c929..f42e339 100644 --- a/busManager/coord/models.py +++ b/busManager/coord/models.py @@ -182,6 +182,7 @@ class Traveller(models.Model): year_level = models.CharField(max_length=2, choices=YEAR) bus_stops = models.ManyToManyField(BusStop, through='TravellerRoute', blank=True) distance_to_school = models.PositiveSmallIntegerField(blank=True, null=True) + address = models.CharField(max_length=100, default="") travel_start_date = models.DateField(blank=True, null=True) travel_end_date = models.DateField(blank=True, null=True) @@ -211,6 +212,7 @@ class Traveller(models.Model): def save(self, *args, **kwargs): self._update_active_status() + self._repopulate_address() super(Traveller, self).save(*args, **kwargs) def _is_active(self): @@ -259,14 +261,15 @@ class Traveller(models.Model): stops = 1 return f"${str(cost * stops)}" - def address(self): + def _repopulate_address(self): families = Family.objects.filter(traveller__id__exact=self.id) if families.count() == 0: - return "" - if families.count() == 1: + self.address = "" + elif families.count() == 1: family = families.first() - return f"{family.residential_address} {family.residential_suburb}" - return "Multiple" + self.address = f"{family.residential_address} {family.residential_suburb}" + else: + self.address = "Multiple" def get_parsed_numbers(self, parents=False, emergency=False): return [] # Moved to family model. To remove from traveller model diff --git a/busManager/coord/scheduled_tasks.py b/busManager/coord/scheduled_tasks.py index 68b810c..a06f8c8 100644 --- a/busManager/coord/scheduled_tasks.py +++ b/busManager/coord/scheduled_tasks.py @@ -11,27 +11,4 @@ def nightly_check_active_status(): traveller.save() for traveller in Traveller.objects.all(): - if Family.objects.filter(traveller=traveller).exists(): - continue - fam = Family() - fam.traveller = traveller - fam.residential_address = traveller.residential_address - fam.residential_suburb = traveller.residential_suburb - fam.postal_address = traveller.postal_address - fam.parent_A_firstname = traveller.parent_A_firstname - fam.parent_A_lastname = traveller.parent_A_lastname - fam.parent_A_phone = traveller.parent_A_phone - fam.parent_A_email = traveller.parent_A_email - fam.parent_B_firstname = traveller.parent_B_firstname - fam.parent_B_lastname = traveller.parent_B_lastname - fam.parent_B_phone = traveller.parent_B_phone - fam.parent_B_email = traveller.parent_B_email - fam.emergency_contact_A_firstname = traveller.emergency_contact_A_firstname - fam.emergency_contact_A_lastname = traveller.emergency_contact_A_lastname - fam.emergency_contact_A_phone = traveller.emergency_contact_A_phone - fam.emergency_contact_A_relation = traveller.emergency_contact_A_firstname - fam.emergency_contact_B_firstname = traveller.emergency_contact_B_firstname - fam.emergency_contact_B_lastname = traveller.emergency_contact_B_lastname - fam.emergency_contact_B_phone = traveller.emergency_contact_B_firstname - fam.emergency_contact_B_relation = traveller.emergency_contact_B_relation - fam.save() + traveller.save()