diff --git a/bizdev/admin.py b/bizdev/admin.py index 6605648..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): @@ -35,34 +44,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) @@ -84,7 +94,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): @@ -96,7 +106,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'] diff --git a/bizdev/models.py b/bizdev/models.py index 340db98..5f4b93d 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' @@ -28,10 +29,11 @@ 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' 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''
{field}