Razmig Sarkissian 4 months ago
commit 0ebce12199
  1. 28
      bizdev/admin.py
  2. 8
      bizdev/models.py

@ -24,10 +24,19 @@ User = get_user_model()
logger = logging.getLogger(__name__) 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) @admin.register(Entity)
class EntityAdmin(SyncedObjectAdmin): class EntityAdmin(SyncedObjectAdmin):
list_display = ('name', 'address', 'zip_code', 'city') list_display = ('name', 'address', 'zip_code', 'city')
search_fields = ('name', 'address', 'zip_code', 'city') search_fields = ('name', 'address', 'zip_code', 'city')
# filter_horizontal = ('prospects',)
inlines = [ProspectInline]
@admin.register(EmailTemplate) @admin.register(EmailTemplate)
class EmailTemplateAdmin(SyncedObjectAdmin): class EmailTemplateAdmin(SyncedObjectAdmin):
@ -35,34 +44,35 @@ class EmailTemplateAdmin(SyncedObjectAdmin):
search_fields = ('name', 'subject') search_fields = ('name', 'subject')
def contacted_by_sms(modeladmin, request, queryset): 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" contacted_by_sms.short_description = "Contacted by SMS"
def mark_as_customer(modeladmin, request, queryset): 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" mark_as_customer.short_description = "Mark as customer"
def mark_as_should_test(modeladmin, request, queryset): 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" mark_as_should_test.short_description = "Mark as should test"
def mark_as_testing(modeladmin, request, queryset): 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" mark_as_testing.short_description = "Mark as testing"
def declined_too_expensive(modeladmin, request, queryset): 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" declined_too_expensive.short_description = "Declined too expensive"
def declined_use_something_else(modeladmin, request, queryset): 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" 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: for prospect in queryset:
activity = Activity.objects.create( activity = Activity.objects.create(
type=type, type=type,
status=status, status=status,
declination_reason=reason,
related_user = request.user related_user = request.user
) )
activity.prospects.add(prospect) activity.prospects.add(prospect)
@ -84,7 +94,7 @@ def create_activity_for_prospect(modeladmin, request, queryset):
url = reverse('admin:bizdev_activity_add') url = reverse('admin:bizdev_activity_add')
url += f'?prospect={prospect.id}' url += f'?prospect={prospect.id}'
return redirect(url) return redirect(url)
create_activity_for_prospect.short_description = "Create event" create_activity_for_prospect.short_description = "Create activity"
@admin.register(Prospect) @admin.register(Prospect)
class ProspectAdmin(SyncedObjectAdmin): class ProspectAdmin(SyncedObjectAdmin):
@ -96,7 +106,7 @@ class ProspectAdmin(SyncedObjectAdmin):
] ]
list_display = ('entity_names', 'first_name', 'last_name', 'email', 'last_update', 'current_status') list_display = ('entity_names', 'first_name', 'last_name', 'email', 'last_update', 'current_status')
list_filter = (ProspectStatusFilter, ProspectDeclineReasonFilter, 'creation_date', StaffUserFilter, 'source', ProspectProfileFilter) 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' date_hierarchy = 'creation_date'
change_list_template = "admin/bizdev/prospect/change_list.html" change_list_template = "admin/bizdev/prospect/change_list.html"
ordering = ['-last_update'] ordering = ['-last_update']

@ -12,6 +12,7 @@ User = get_user_model()
class Status(models.TextChoices): class Status(models.TextChoices):
NONE = 'NONE', 'None' NONE = 'NONE', 'None'
INBOUND = 'INBOUND', 'Inbound'
CONTACTED = 'CONTACTED', 'Contacted' CONTACTED = 'CONTACTED', 'Contacted'
RESPONDED = 'RESPONDED', 'Responded' RESPONDED = 'RESPONDED', 'Responded'
SHOULD_TEST = 'SHOULD_TEST', 'Should test' SHOULD_TEST = 'SHOULD_TEST', 'Should test'
@ -28,10 +29,11 @@ class DeclinationReason(models.TextChoices):
UNKNOWN = 'UNKNOWN', 'Unknown' UNKNOWN = 'UNKNOWN', 'Unknown'
class ActivityType(models.TextChoices): class ActivityType(models.TextChoices):
MAIL = 'MAIL', 'Mailing List' MAIL = 'MAIL', 'Mail'
SMS = 'SMS', 'SMS Campaign' SMS = 'SMS', 'SMS'
CALL = 'CALL', 'Call' CALL = 'CALL', 'Call'
PRESS = 'PRESS', 'Press Release' PRESS = 'PRESS', 'Press Release'
WORD_OF_MOUTH = 'WORD_OF_MOUTH', 'Word of mouth'
class Entity(BaseModel): class Entity(BaseModel):
name = models.CharField(max_length=200, null=True, blank=True) 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()}" # return f"{self.get_type_display()} - {self.creation_date.date()}"
def html_desc(self): 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 = '<table><tr>' html = '<table><tr>'
for field in fields: for field in fields:
html += f'<td style="padding:0px 5px;">{field}</td>' html += f'<td style="padding:0px 5px;">{field}</td>'

Loading…
Cancel
Save