From d66d14e17883558ee63ebf4f228a6121f15bd1d8 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 18 Jul 2025 09:58:59 +0200 Subject: [PATCH 1/5] improve prospect search with entities --- bizdev/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bizdev/admin.py b/bizdev/admin.py index 6605648..9bd6b3d 100644 --- a/bizdev/admin.py +++ b/bizdev/admin.py @@ -96,7 +96,7 @@ class ProspectAdmin(SyncedObjectAdmin): ] list_display = ('entity_names', 'first_name', 'last_name', 'email', 'last_update', 'current_status') list_filter = (ProspectStatusFilter, ProspectDeclineReasonFilter, 'creation_date', StaffUserFilter, 'source', ProspectProfileFilter) - search_fields = ('first_name', 'last_name', 'email') + search_fields = ('first_name', 'last_name', 'email', 'entities__name') date_hierarchy = 'creation_date' change_list_template = "admin/bizdev/prospect/change_list.html" ordering = ['-last_update'] From 4ab605bbc98e0c287ca32859167214bbc0dbd02d Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 18 Jul 2025 10:32:59 +0200 Subject: [PATCH 2/5] add Inbound status + fixes --- bizdev/admin.py | 15 ++++++++------- bizdev/models.py | 4 +++- 2 files changed, 11 insertions(+), 8 deletions(-) diff --git a/bizdev/admin.py b/bizdev/admin.py index 9bd6b3d..1adfd1d 100644 --- a/bizdev/admin.py +++ b/bizdev/admin.py @@ -35,34 +35,35 @@ class EmailTemplateAdmin(SyncedObjectAdmin): search_fields = ('name', 'subject') def contacted_by_sms(modeladmin, request, queryset): - create_default_activity_for_prospect(modeladmin, request, queryset, ActivityType.SMS, Status.CONTACTED) + create_default_activity_for_prospect(modeladmin, request, queryset, ActivityType.SMS, Status.CONTACTED, None) contacted_by_sms.short_description = "Contacted by SMS" def mark_as_customer(modeladmin, request, queryset): - create_default_activity_for_prospect(modeladmin, request, queryset, None, Status.CUSTOMER) + create_default_activity_for_prospect(modeladmin, request, queryset, None, Status.CUSTOMER, None) mark_as_customer.short_description = "Mark as customer" def mark_as_should_test(modeladmin, request, queryset): - create_default_activity_for_prospect(modeladmin, request, queryset, None, Status.TESTING) + create_default_activity_for_prospect(modeladmin, request, queryset, None, Status.TESTING, None) mark_as_should_test.short_description = "Mark as should test" def mark_as_testing(modeladmin, request, queryset): - create_default_activity_for_prospect(modeladmin, request, queryset, None, Status.CUSTOMER) + create_default_activity_for_prospect(modeladmin, request, queryset, None, Status.CUSTOMER, None) mark_as_testing.short_description = "Mark as testing" def declined_too_expensive(modeladmin, request, queryset): - create_default_activity_for_prospect(modeladmin, request, queryset, None, Status.DECLINED_TOO_EXPENSIVE) + create_default_activity_for_prospect(modeladmin, request, queryset, None, Status.DECLINED, DeclinationReason.TOO_EXPENSIVE) declined_too_expensive.short_description = "Declined too expensive" def declined_use_something_else(modeladmin, request, queryset): - create_default_activity_for_prospect(modeladmin, request, queryset, None, Status.DECLINED_USE_SOMETHING_ELSE) + create_default_activity_for_prospect(modeladmin, request, queryset, None, Status.DECLINED, DeclinationReason.USE_OTHER_PRODUCT) declined_use_something_else.short_description = "Declined use something else" -def create_default_activity_for_prospect(modeladmin, request, queryset, type, status): +def create_default_activity_for_prospect(modeladmin, request, queryset, type, status, reason): for prospect in queryset: activity = Activity.objects.create( type=type, status=status, + declination_reason=reason, related_user = request.user ) activity.prospects.add(prospect) diff --git a/bizdev/models.py b/bizdev/models.py index 340db98..26d6948 100644 --- a/bizdev/models.py +++ b/bizdev/models.py @@ -12,6 +12,7 @@ User = get_user_model() class Status(models.TextChoices): NONE = 'NONE', 'None' + INBOUND = 'INBOUND', 'Inbound' CONTACTED = 'CONTACTED', 'Contacted' RESPONDED = 'RESPONDED', 'Responded' SHOULD_TEST = 'SHOULD_TEST', 'Should test' @@ -32,6 +33,7 @@ class ActivityType(models.TextChoices): SMS = 'SMS', 'SMS Campaign' CALL = 'CALL', 'Call' PRESS = 'PRESS', 'Press Release' + WORD_OF_MOUTH = 'WORD_OF_MOUTH', 'Word of mouth' class Entity(BaseModel): name = models.CharField(max_length=200, null=True, blank=True) @@ -119,7 +121,7 @@ class Activity(BaseModel): # return f"{self.get_type_display()} - {self.creation_date.date()}" def html_desc(self): - fields = [field for field in [self.creation_date.strftime("%d/%m/%Y %H:%M"), self.status, self.attachment_text, self.description, self.type] if field is not None] + fields = [field for field in [self.creation_date.strftime("%d/%m/%Y %H:%M"), self.status, self.declination_reason, self.attachment_text, self.description, self.type] if field is not None] html = '' for field in fields: html += f'' From 555fbd59f9f9f00fef6cb696a1948cbac2e8a922 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 18 Jul 2025 10:34:52 +0200 Subject: [PATCH 3/5] fix action naming --- bizdev/admin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bizdev/admin.py b/bizdev/admin.py index 1adfd1d..b1c344f 100644 --- a/bizdev/admin.py +++ b/bizdev/admin.py @@ -85,7 +85,7 @@ def create_activity_for_prospect(modeladmin, request, queryset): url = reverse('admin:bizdev_activity_add') url += f'?prospect={prospect.id}' return redirect(url) -create_activity_for_prospect.short_description = "Create event" +create_activity_for_prospect.short_description = "Create activity" @admin.register(Prospect) class ProspectAdmin(SyncedObjectAdmin): From 95b6390f792c24ebcf37e12a3e152b01d86bd1eb Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 18 Jul 2025 10:36:21 +0200 Subject: [PATCH 4/5] fix other names --- bizdev/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bizdev/models.py b/bizdev/models.py index 26d6948..5f4b93d 100644 --- a/bizdev/models.py +++ b/bizdev/models.py @@ -29,8 +29,8 @@ class DeclinationReason(models.TextChoices): UNKNOWN = 'UNKNOWN', 'Unknown' class ActivityType(models.TextChoices): - MAIL = 'MAIL', 'Mailing List' - SMS = 'SMS', 'SMS Campaign' + MAIL = 'MAIL', 'Mail' + SMS = 'SMS', 'SMS' CALL = 'CALL', 'Call' PRESS = 'PRESS', 'Press Release' WORD_OF_MOUTH = 'WORD_OF_MOUTH', 'Word of mouth' From c703fe3d91252d75b711d965037ab30b0d9c3998 Mon Sep 17 00:00:00 2001 From: Laurent Date: Fri, 18 Jul 2025 12:36:33 +0200 Subject: [PATCH 5/5] add prospects adding to the EntityAdmin --- bizdev/admin.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/bizdev/admin.py b/bizdev/admin.py index b1c344f..ba01d28 100644 --- a/bizdev/admin.py +++ b/bizdev/admin.py @@ -24,10 +24,19 @@ User = get_user_model() logger = logging.getLogger(__name__) +class ProspectInline(admin.StackedInline): + model = Prospect.entities.through + extra = 1 + verbose_name = "Prospect" + verbose_name_plural = "Prospects" + autocomplete_fields = ['prospect'] + @admin.register(Entity) class EntityAdmin(SyncedObjectAdmin): list_display = ('name', 'address', 'zip_code', 'city') search_fields = ('name', 'address', 'zip_code', 'city') + # filter_horizontal = ('prospects',) + inlines = [ProspectInline] @admin.register(EmailTemplate) class EmailTemplateAdmin(SyncedObjectAdmin):
{field}