From a34a5cec328132a9d1c8e8d78d118e581f340252 Mon Sep 17 00:00:00 2001 From: Pawel Szymanski Date: Thu, 4 Apr 2024 16:16:50 +0100 Subject: [PATCH] Fix wins dataset endpoint for responded_on and sector.. --- .../dataset/export_wins/test/test_views.py | 68 ++++++---- datahub/dataset/export_wins/utils.py | 2 +- datahub/dataset/export_wins/views.py | 122 ++++++++++++------ 3 files changed, 130 insertions(+), 62 deletions(-) diff --git a/datahub/dataset/export_wins/test/test_views.py b/datahub/dataset/export_wins/test/test_views.py index d880f3988..f34779f1f 100644 --- a/datahub/dataset/export_wins/test/test_views.py +++ b/datahub/dataset/export_wins/test/test_views.py @@ -1,4 +1,4 @@ -from datetime import date, timedelta +from datetime import date, datetime, timedelta import pytest from dateutil.relativedelta import relativedelta @@ -8,6 +8,7 @@ from freezegun import freeze_time from datahub.company.test.factories import CompanyFactory, ContactFactory +from datahub.core.constants import Sector from datahub.core.test_utils import ( format_date_or_datetime, ) @@ -162,6 +163,7 @@ def _assert_win_matches_result( result, ): contact = win.company_contacts.first() + has_responded = win.customer_response.responded_on is not None expected = { 'created_on': format_date_or_datetime(win.created_on), 'id': str(win.id), @@ -170,39 +172,52 @@ def _assert_win_matches_result( 'cdms_reference': win.company.company_number, 'company_name': win.company.name, 'complete': win.complete, - 'confirmation__access_to_contacts': win.customer_response.our_support.export_win_id, + 'confirmation__access_to_contacts': + win.customer_response.our_support.export_win_id if has_responded else None, 'confirmation__access_to_information': - win.customer_response.access_to_information.export_win_id, + win.customer_response.access_to_information.export_win_id + if has_responded else None, 'confirmation__agree_with_win': win.customer_response.agree_with_win, - 'confirmation__case_study_willing': win.customer_response.case_study_willing, + 'confirmation__case_study_willing': + win.customer_response.case_study_willing if has_responded else None, 'confirmation__comments': win.customer_response.comments, 'confirmation__company_was_at_risk_of_not_exporting': - win.customer_response.company_was_at_risk_of_not_exporting, + win.customer_response.company_was_at_risk_of_not_exporting + if has_responded else None, 'confirmation__created': format_date_or_datetime( - win.customer_response.created_on, + win.customer_response.responded_on, ), 'confirmation__developed_relationships': - win.customer_response.developed_relationships.export_win_id, + win.customer_response.developed_relationships.export_win_id + if has_responded else None, 'confirmation__gained_confidence': - win.customer_response.gained_confidence.export_win_id, + win.customer_response.gained_confidence.export_win_id if has_responded else None, 'confirmation__has_enabled_expansion_into_existing_market': - win.customer_response.has_enabled_expansion_into_existing_market, + win.customer_response.has_enabled_expansion_into_existing_market + if has_responded else None, 'confirmation__has_enabled_expansion_into_new_market': - win.customer_response.has_enabled_expansion_into_new_market, + win.customer_response.has_enabled_expansion_into_new_market + if has_responded else None, 'confirmation__has_explicit_export_plans': - win.customer_response.has_explicit_export_plans, + win.customer_response.has_explicit_export_plans if has_responded else None, 'confirmation__has_increased_exports_as_percent_of_turnover': - win.customer_response.has_increased_exports_as_percent_of_turnover, - 'confirmation__improved_profile': win.customer_response.improved_profile.export_win_id, + win.customer_response.has_increased_exports_as_percent_of_turnover + if has_responded else None, + 'confirmation__improved_profile': + win.customer_response.improved_profile.export_win_id if has_responded else None, 'confirmation__interventions_were_prerequisite': - win.customer_response.interventions_were_prerequisite, + win.customer_response.interventions_were_prerequisite if has_responded else None, 'confirmation__involved_state_enterprise': - win.customer_response.involved_state_enterprise, + win.customer_response.involved_state_enterprise if has_responded else None, 'confirmation__name': win.customer_response.name, - 'confirmation__other_marketing_source': win.customer_response.other_marketing_source, - 'confirmation__our_support': win.customer_response.our_support.export_win_id, - 'confirmation__overcame_problem': win.customer_response.overcame_problem.export_win_id, - 'confirmation__support_improved_speed': win.customer_response.support_improved_speed, + 'confirmation__other_marketing_source': + win.customer_response.other_marketing_source if has_responded else None, + 'confirmation__our_support': + win.customer_response.our_support.export_win_id if has_responded else None, + 'confirmation__overcame_problem': + win.customer_response.overcame_problem.export_win_id if has_responded else None, + 'confirmation__support_improved_speed': + win.customer_response.support_improved_speed if has_responded else None, 'country': win.country.iso_alpha2_code, 'created': format_date_or_datetime(win.created_on), 'customer_email_address': contact.email, @@ -238,7 +253,7 @@ def _assert_win_matches_result( 'goods_vs_services_display': win.goods_vs_services.name, 'hq_team_display': win.hq_team.name, 'hvo_programme_display': win.hvo_programme.name, - 'sector_display': win.sector.segment, + 'sector_display': win.sector.name, 'team_type_display': win.team_type.name, 'num_notifications': len(tokens), 'customer_email_date': @@ -251,7 +266,11 @@ def _assert_win_matches_result( assert result == expected - def test_success(self, data_flow_api_client): + @pytest.mark.parametrize( + 'responded', + (True, False), + ) + def test_success(self, data_flow_api_client, responded): associated_programmes = AssociatedProgrammeFactory.create_batch(3) types_of_support = SupportTypeFactory.create_batch(2) company = CompanyFactory(company_number='012345') @@ -262,8 +281,13 @@ def test_success(self, data_flow_api_client): hvo_programme=HVOProgrammesFactory(), company=company, company_contacts=[contact], + sector_id=Sector.aerospace_assembly_aircraft.value.id, + ) + customer_response = CustomerResponseFactory( + win=win, + other_marketing_source='marketing' if responded else '', + responded_on=datetime.now() if responded else None, ) - customer_response = CustomerResponseFactory(win=win) tokens = CustomerResponseTokenFactory.create_batch(3, customer_response=customer_response) response = data_flow_api_client.get(self.view_url).json() diff --git a/datahub/dataset/export_wins/utils.py b/datahub/dataset/export_wins/utils.py index 278c357b9..dc8ab9067 100644 --- a/datahub/dataset/export_wins/utils.py +++ b/datahub/dataset/export_wins/utils.py @@ -1,5 +1,5 @@ def use_nulls_on_empty_string_fields(data): - columns = ['audit'] + columns = ['audit', 'confirmation__other_marketing_source'] for column in columns: column_value = data.get(column) if column_value == '': diff --git a/datahub/dataset/export_wins/views.py b/datahub/dataset/export_wins/views.py index 2a58a5074..87a408c07 100644 --- a/datahub/dataset/export_wins/views.py +++ b/datahub/dataset/export_wins/views.py @@ -1,7 +1,20 @@ from django.contrib.postgres.expressions import ArraySubquery from django.contrib.postgres.fields import JSONField -from django.db.models import Case, Count, ExpressionWrapper, F, Func, Max, When -from django.db.models import CharField, IntegerField, OuterRef, Subquery, Value +from django.db.models import ( + BooleanField, + Case, + CharField, + Count, + ExpressionWrapper, + F, + Func, + IntegerField, + Max, + OuterRef, + Subquery, + Value, + When, +) from django.db.models.functions import ( Cast, Concat, @@ -27,6 +40,7 @@ Win, WinAdviser, ) +from datahub.metadata.query_utils import get_sector_name_subquery class ExportWinsAdvisersDatasetView(BaseDatasetView): @@ -131,6 +145,7 @@ def get_dataset(self): 'sector', ) .annotate( + sector_name=get_sector_name_subquery('sector'), # Subquery returns a JSONB document to avoid creating multiple subqueries # to retrieve different properties of the same contact customer_details=Subquery( @@ -188,70 +203,99 @@ def get_dataset(self): goods_vs_services_display=F('goods_vs_services__name'), hq_team_display=F('hq_team__name'), hvo_programme_display=F('hvo_programme__name'), - sector_display=F('sector__segment'), + sector_display=F('sector_name'), team_type_display=F('team_type__name'), num_notifications=Count('customer_response__tokens'), customer_email_date=Max('customer_response__tokens__created_on'), ) .annotate( company_name=F('company__name'), - confirmation__access_to_contacts=Cast( - 'customer_response__our_support__export_win_id', IntegerField(), + confirmation__access_to_contacts=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__our_support__export_win_id'), + output_field=IntegerField(), ), - confirmation__access_to_information=Cast( - 'customer_response__access_to_information__export_win_id', - IntegerField(), + confirmation__access_to_information=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__access_to_information__export_win_id'), + output_field=IntegerField(), ), confirmation__agree_with_win=F('customer_response__agree_with_win'), - confirmation__case_study_willing=F( - 'customer_response__case_study_willing', + confirmation__case_study_willing=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__case_study_willing'), + output_field=BooleanField(), ), confirmation__comments=F('customer_response__comments'), - confirmation__company_was_at_risk_of_not_exporting=F( - 'customer_response__company_was_at_risk_of_not_exporting', + confirmation__company_was_at_risk_of_not_exporting=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__company_was_at_risk_of_not_exporting'), + output_field=BooleanField(), ), - confirmation__created=F('customer_response__created_on'), - confirmation__developed_relationships=Cast( - 'customer_response__developed_relationships__export_win_id', - IntegerField(), + confirmation__created=F('customer_response__responded_on'), + confirmation__developed_relationships=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__developed_relationships__export_win_id'), + output_field=IntegerField(), ), - confirmation__gained_confidence=Cast( - 'customer_response__gained_confidence__export_win_id', - IntegerField(), + confirmation__gained_confidence=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__gained_confidence__export_win_id'), + output_field=IntegerField(), ), - confirmation__has_enabled_expansion_into_existing_market=F( - 'customer_response__has_enabled_expansion_into_existing_market', + confirmation__has_enabled_expansion_into_existing_market=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__has_enabled_expansion_into_existing_market'), + output_field=BooleanField(), ), - confirmation__has_enabled_expansion_into_new_market=F( - 'customer_response__has_enabled_expansion_into_new_market', + confirmation__has_enabled_expansion_into_new_market=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__has_enabled_expansion_into_new_market'), + output_field=BooleanField(), ), - confirmation__has_explicit_export_plans=F( - 'customer_response__has_explicit_export_plans', + confirmation__has_explicit_export_plans=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__has_explicit_export_plans'), + output_field=BooleanField(), ), - confirmation__has_increased_exports_as_percent_of_turnover=F( - 'customer_response__has_increased_exports_as_percent_of_turnover', + confirmation__has_increased_exports_as_percent_of_turnover=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__has_increased_exports_as_percent_of_turnover'), + output_field=BooleanField(), ), - confirmation__improved_profile=Cast( - 'customer_response__improved_profile__export_win_id', IntegerField(), + confirmation__improved_profile=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__improved_profile__export_win_id'), + output_field=IntegerField(), ), - confirmation__interventions_were_prerequisite=F( - 'customer_response__interventions_were_prerequisite', + confirmation__interventions_were_prerequisite=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__interventions_were_prerequisite'), + output_field=BooleanField(), ), - confirmation__involved_state_enterprise=F( - 'customer_response__involved_state_enterprise', + confirmation__involved_state_enterprise=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__involved_state_enterprise'), + output_field=BooleanField(), ), confirmation__name=F('customer_response__name'), confirmation__other_marketing_source=F( 'customer_response__other_marketing_source', ), - confirmation__our_support=Cast( - 'customer_response__our_support__export_win_id', IntegerField(), + confirmation__our_support=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__our_support__export_win_id'), + output_field=IntegerField(), ), - confirmation__overcame_problem=Cast( - 'customer_response__overcame_problem__export_win_id', IntegerField(), + confirmation__overcame_problem=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__overcame_problem__export_win_id'), + output_field=IntegerField(), ), - confirmation__support_improved_speed=F( - 'customer_response__support_improved_speed', + confirmation__support_improved_speed=Case( + When(customer_response__responded_on__isnull=True, then=None), + default=F('customer_response__support_improved_speed'), + output_field=BooleanField(), ), country=F('country__iso_alpha2_code'), hvc=F('hvc__export_win_id'),