From 93065b34d27ff0c4e4b53e956535e35e8c2bcb61 Mon Sep 17 00:00:00 2001 From: Chris Hopkins Date: Thu, 4 Apr 2024 14:54:54 +0100 Subject: [PATCH 1/8] added properties to admin search --- datahub/export_win/admin.py | 25 +++++++++++++++++++++++++ fixtures/test_data.yaml | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/datahub/export_win/admin.py b/datahub/export_win/admin.py index 8c318b9e0..2718176f4 100644 --- a/datahub/export_win/admin.py +++ b/datahub/export_win/admin.py @@ -3,6 +3,8 @@ from django.contrib import admin from django.contrib.admin import DateFieldListFilter +from django.db.models import Value +from django.db.models.functions import Concat from django.forms import ModelForm from reversion.admin import VersionAdmin @@ -172,9 +174,12 @@ class WinAdmin(BaseModelAdminMixin, VersionAdmin): ) search_fields = ( 'id', + 'adviser_name', 'company__pk', + 'lead_officer_adviser_name', 'company__name', 'country__name', + 'contact_name', 'sector__segment', 'customer_response__responded_on', 'created_on', @@ -270,6 +275,26 @@ def has_add_permission(self, request, obj=None): def has_delete_permission(self, request, obj=None): return False + def get_search_results(self, request, queryset, search_term): + + queryset = queryset.annotate( + adviser_name=Concat( + 'adviser__first_name', Value(' '), 'adviser__last_name', + ), + lead_officer_adviser_name=Concat( + 'lead_officer__first_name', Value(' '), 'lead_officer__last_name', + ), + contact_name=Concat( + 'company_contacts__first_name', Value(' '), 'company_contacts__last_name', + ), + ) + + return super().get_search_results( + request, + queryset, + search_term, + ) + class WinSoftDeletedAdminForm(ModelForm): """Win soft deleted admin form""" diff --git a/fixtures/test_data.yaml b/fixtures/test_data.yaml index bcaf78fc9..c189812d8 100644 --- a/fixtures/test_data.yaml +++ b/fixtures/test_data.yaml @@ -2262,6 +2262,41 @@ created_on: "2024-03-27T11:00:00Z" modified_on: "2024-03-27T11:00:00Z" +- model: export_win.Win + pk: 2343d010-1436-4cb3-851a-4c87276d4953 + fields: + adviser: 95a99736-5402-11eb-ae93-0242ac130002 + lead_officer: e83a608e-84a4-11e6-ae22-56b6b6499611 + hq_team: b9afc253-5aa1-498f-b5d7-d43dad1ced82 + team_type: 1f6eccf9-289a-450b-a4af-b75600ea521b + business_potential: 0e6f1d69-e9c3-4460-a74b-3881930fe3e9 + company: a73efeba-8499-11e6-ae22-56b6b6499611 + company_contacts: [9b1138ab-ec7b-497f-b8c3-27fed21694ef] + customer_location: 256a5a92-44a6-473e-adcb-6f9ec4d17c62 + business_type: "The best type" + description: "Description" + name_of_export: "Sand" + date: "2024-05-05" + country: 81756b9a-5d95-e211-a939-e4115bead28a + total_expected_export_value: 158778 + total_expected_non_export_value: 525478 + total_expected_odi_value: 88987 + goods_vs_services: 8711e3dd-3a2c-4b47-aea7-9a53c135efb6 + sector: b422c9d2-5f95-e211-a939-e4115bead28a + type_of_support: [1ed7f465-1461-4d66-b4a2-8d704ea239a8] + associated_programme: [b6f5c31a-aa45-4ae0-89bd-2eb3ab943f76] + is_personally_confirmed: False + is_line_manager_confirmed: False + name_of_customer: "Overseas Customer" + name_of_customer_confidential: True + export_experience: 587928e3-cab1-45cb-ba49-0656b6d2f867 + lead_officer_name: "Dave" + line_manager_name: "Dave" + company_name: "Test company name" + cdms_reference: "1234" + created_on: "2024-03-27T11:00:00Z" + modified_on: "2024-03-27T11:00:00Z" + - model: export_win.Breakdown pk: ab38d245-331e-49e9-96a1-904a984bf477 fields: From ef420adcd5054a99d15a178e72cb9e8e2fbc2f55 Mon Sep 17 00:00:00 2001 From: Chris Hopkins Date: Thu, 4 Apr 2024 15:55:22 +0100 Subject: [PATCH 2/8] added tests for admin form --- datahub/export_win/admin.py | 4 +-- datahub/export_win/test/test_admin.py | 38 +++++++++++++++++++++++++++ 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/datahub/export_win/admin.py b/datahub/export_win/admin.py index 2718176f4..da891ea2e 100644 --- a/datahub/export_win/admin.py +++ b/datahub/export_win/admin.py @@ -173,9 +173,9 @@ class WinAdmin(BaseModelAdminMixin, VersionAdmin): 'modified_on', ) search_fields = ( - 'id', + '=id', 'adviser_name', - 'company__pk', + '=company__pk', 'lead_officer_adviser_name', 'company__name', 'country__name', diff --git a/datahub/export_win/test/test_admin.py b/datahub/export_win/test/test_admin.py index 270eec548..d695a3a2c 100644 --- a/datahub/export_win/test/test_admin.py +++ b/datahub/export_win/test/test_admin.py @@ -1,3 +1,4 @@ +from unittest.mock import Mock import pytest from django.contrib.admin.sites import AdminSite @@ -253,3 +254,40 @@ def test_init_method(self): if instance_mock and instance_mock.pk: assert form.fields['name'].required is False assert form.fields['id'].widget.attrs['readonly'] is True + + +@pytest.mark.django_db +class TestWinAdminSearchResults: + def test_admin_search_on_adviser_name(self): + adviser = AdviserFactory(first_name='FIRST', last_name='LAST') + win1 = WinFactory(adviser=adviser) + WinFactory.create_batch(3) + admin = WinAdmin(Win, None) + results = admin.get_search_results(Mock(), Win.objects.all(), 'FIRST LAST')[0] + + assert len(results) == 1 + assert results[0].id == win1.id + + def test_admin_search_on_lead_officer_name(self): + lead_officer = AdviserFactory(first_name='LEAD', last_name='OFFICER') + win1 = WinFactory(lead_officer=lead_officer) + WinFactory.create_batch(3) + admin = WinAdmin(Win, None) + results = admin.get_search_results(Mock(), Win.objects.all(), 'LEAD OFFICER')[0] + + assert len(results) == 1 + assert results[0].id == win1.id + + def test_admin_search_on_contact_name(self): + contact1 = ContactFactory(first_name='John', last_name='Doe') + contact2 = ContactFactory(first_name='Jane', last_name='Smith') + + win1 = WinFactory() + win1.company_contacts.add(contact1, contact2) + + WinFactory.create_batch(3) + admin = WinAdmin(Win, None) + results = admin.get_search_results(Mock(), Win.objects.all(), 'John Doe')[0] + + assert len(results) == 1 + assert results[0].id == win1.id From 00baeb112cd461bcb5f3865a142e966d111a7846 Mon Sep 17 00:00:00 2001 From: Chris Hopkins Date: Thu, 4 Apr 2024 16:11:29 +0100 Subject: [PATCH 3/8] remove contacts from search --- datahub/export_win/admin.py | 4 ---- datahub/export_win/test/test_admin.py | 25 +++++++++++-------------- 2 files changed, 11 insertions(+), 18 deletions(-) diff --git a/datahub/export_win/admin.py b/datahub/export_win/admin.py index da891ea2e..b43f2b439 100644 --- a/datahub/export_win/admin.py +++ b/datahub/export_win/admin.py @@ -276,7 +276,6 @@ def has_delete_permission(self, request, obj=None): return False def get_search_results(self, request, queryset, search_term): - queryset = queryset.annotate( adviser_name=Concat( 'adviser__first_name', Value(' '), 'adviser__last_name', @@ -284,9 +283,6 @@ def get_search_results(self, request, queryset, search_term): lead_officer_adviser_name=Concat( 'lead_officer__first_name', Value(' '), 'lead_officer__last_name', ), - contact_name=Concat( - 'company_contacts__first_name', Value(' '), 'company_contacts__last_name', - ), ) return super().get_search_results( diff --git a/datahub/export_win/test/test_admin.py b/datahub/export_win/test/test_admin.py index d695a3a2c..4fcaa8e3e 100644 --- a/datahub/export_win/test/test_admin.py +++ b/datahub/export_win/test/test_admin.py @@ -258,6 +258,17 @@ def test_init_method(self): @pytest.mark.django_db class TestWinAdminSearchResults: + + def test_admin_search_no_filters(self): + win1 = WinFactory() + contacts = ContactFactory.create_batch(4) + win1.company_contacts.set(contacts) + + admin = WinAdmin(Win, None) + results = admin.get_search_results(Mock(), Win.objects.all(), '')[0] + + assert len(results) == 1 + def test_admin_search_on_adviser_name(self): adviser = AdviserFactory(first_name='FIRST', last_name='LAST') win1 = WinFactory(adviser=adviser) @@ -277,17 +288,3 @@ def test_admin_search_on_lead_officer_name(self): assert len(results) == 1 assert results[0].id == win1.id - - def test_admin_search_on_contact_name(self): - contact1 = ContactFactory(first_name='John', last_name='Doe') - contact2 = ContactFactory(first_name='Jane', last_name='Smith') - - win1 = WinFactory() - win1.company_contacts.add(contact1, contact2) - - WinFactory.create_batch(3) - admin = WinAdmin(Win, None) - results = admin.get_search_results(Mock(), Win.objects.all(), 'John Doe')[0] - - assert len(results) == 1 - assert results[0].id == win1.id From d5117fd287bcad5e86cfc1e6e3a79eb231abea3e Mon Sep 17 00:00:00 2001 From: Chris Hopkins Date: Thu, 4 Apr 2024 16:13:40 +0100 Subject: [PATCH 4/8] flake8 --- datahub/export_win/test/test_admin.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/datahub/export_win/test/test_admin.py b/datahub/export_win/test/test_admin.py index 4fcaa8e3e..9f30e4f27 100644 --- a/datahub/export_win/test/test_admin.py +++ b/datahub/export_win/test/test_admin.py @@ -1,6 +1,7 @@ -from unittest.mock import Mock import pytest +from unittest.mock import Mock + from django.contrib.admin.sites import AdminSite from django.contrib.auth.models import Group from django.test import RequestFactory From a07c44ff5bf6b13474bc27dba739148767aa8b5d Mon Sep 17 00:00:00 2001 From: Chris Hopkins Date: Thu, 4 Apr 2024 16:14:18 +0100 Subject: [PATCH 5/8] remove contact name from search fields --- datahub/export_win/admin.py | 1 - 1 file changed, 1 deletion(-) diff --git a/datahub/export_win/admin.py b/datahub/export_win/admin.py index b43f2b439..5865911d8 100644 --- a/datahub/export_win/admin.py +++ b/datahub/export_win/admin.py @@ -179,7 +179,6 @@ class WinAdmin(BaseModelAdminMixin, VersionAdmin): 'lead_officer_adviser_name', 'company__name', 'country__name', - 'contact_name', 'sector__segment', 'customer_response__responded_on', 'created_on', From eabb0bd191f5f7a1c7a49a9b33bfae4968bdb899 Mon Sep 17 00:00:00 2001 From: Chris Hopkins Date: Thu, 4 Apr 2024 16:15:59 +0100 Subject: [PATCH 6/8] flake8 --- datahub/export_win/test/test_admin.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/datahub/export_win/test/test_admin.py b/datahub/export_win/test/test_admin.py index 9f30e4f27..08c83a23a 100644 --- a/datahub/export_win/test/test_admin.py +++ b/datahub/export_win/test/test_admin.py @@ -1,7 +1,7 @@ -import pytest - from unittest.mock import Mock +import pytest + from django.contrib.admin.sites import AdminSite from django.contrib.auth.models import Group from django.test import RequestFactory From 58dcacbc6264bd41ae84e64885f3d83839f92b07 Mon Sep 17 00:00:00 2001 From: Chris Hopkins Date: Thu, 4 Apr 2024 16:37:10 +0100 Subject: [PATCH 7/8] added searching on contact name --- datahub/export_win/admin.py | 21 +++++++++++++-------- datahub/export_win/test/test_admin.py | 19 ++++++++++++++++++- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/datahub/export_win/admin.py b/datahub/export_win/admin.py index 5865911d8..a32104092 100644 --- a/datahub/export_win/admin.py +++ b/datahub/export_win/admin.py @@ -179,6 +179,7 @@ class WinAdmin(BaseModelAdminMixin, VersionAdmin): 'lead_officer_adviser_name', 'company__name', 'country__name', + 'contact_name', 'sector__segment', 'customer_response__responded_on', 'created_on', @@ -275,14 +276,18 @@ def has_delete_permission(self, request, obj=None): return False def get_search_results(self, request, queryset, search_term): - queryset = queryset.annotate( - adviser_name=Concat( - 'adviser__first_name', Value(' '), 'adviser__last_name', - ), - lead_officer_adviser_name=Concat( - 'lead_officer__first_name', Value(' '), 'lead_officer__last_name', - ), - ) + if search_term: + queryset = queryset.annotate( + adviser_name=Concat( + 'adviser__first_name', Value(' '), 'adviser__last_name', + ), + lead_officer_adviser_name=Concat( + 'lead_officer__first_name', Value(' '), 'lead_officer__last_name', + ), + contact_name=Concat( + 'company_contacts__first_name', Value(' '), 'company_contacts__last_name', + ), + ) return super().get_search_results( request, diff --git a/datahub/export_win/test/test_admin.py b/datahub/export_win/test/test_admin.py index 08c83a23a..6004d2057 100644 --- a/datahub/export_win/test/test_admin.py +++ b/datahub/export_win/test/test_admin.py @@ -264,11 +264,12 @@ def test_admin_search_no_filters(self): win1 = WinFactory() contacts = ContactFactory.create_batch(4) win1.company_contacts.set(contacts) + WinFactory() admin = WinAdmin(Win, None) results = admin.get_search_results(Mock(), Win.objects.all(), '')[0] - assert len(results) == 1 + assert len(results) == 2 def test_admin_search_on_adviser_name(self): adviser = AdviserFactory(first_name='FIRST', last_name='LAST') @@ -289,3 +290,19 @@ def test_admin_search_on_lead_officer_name(self): assert len(results) == 1 assert results[0].id == win1.id + + def test_admin_search_on_contact_name(self): + contact1 = ContactFactory(first_name='John', last_name='Doe') + contact2 = ContactFactory(first_name='Jane', last_name='Smith') + + win1 = WinFactory() + win1.company_contacts.add(contact1, contact2) + + WinFactory.create_batch(3) + admin = WinAdmin(Win, None) + results = admin.get_search_results(Mock(), Win.objects.all(), 'John Doe')[0] + + print(results) + + assert len(results) == 1 + assert results[0].id == win1.id From 7c10d05a44288ceb1031709517ba44b4c5a9e6a6 Mon Sep 17 00:00:00 2001 From: Chris Hopkins Date: Thu, 4 Apr 2024 16:40:01 +0100 Subject: [PATCH 8/8] flake8 --- datahub/export_win/test/test_admin.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/datahub/export_win/test/test_admin.py b/datahub/export_win/test/test_admin.py index 6004d2057..4a7eb0ba9 100644 --- a/datahub/export_win/test/test_admin.py +++ b/datahub/export_win/test/test_admin.py @@ -302,7 +302,5 @@ def test_admin_search_on_contact_name(self): admin = WinAdmin(Win, None) results = admin.get_search_results(Mock(), Win.objects.all(), 'John Doe')[0] - print(results) - assert len(results) == 1 assert results[0].id == win1.id