Add Lead Event and Send SMS

This commit is contained in:
javad committed 2024-08-27 12:04:27 +03:30
1 parent 43f5dd4594
commit 5e396c0e32
20 files changed
+364 -31

No files matched your search

@@ -0,0 +1,19 @@
# Generated by Django 4.2.1 on 2024-08-24 13:14
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
dependencies = [
('jwt_auth', '0088_alter_cuserroleloginopt_uuid'),
]
operations = [
migrations.AlterField(
model_name='cuserroleloginopt',
name='uuid',
field=models.UUIDField(default=uuid.UUID('70141bbf-e757-4eae-a6a4-7d430084c8a6'), unique=True),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.1 on 2024-08-24 13:21
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
dependencies = [
('jwt_auth', '0089_alter_cuserroleloginopt_uuid'),
]
operations = [
migrations.AlterField(
model_name='cuserroleloginopt',
name='uuid',
field=models.UUIDField(default=uuid.UUID('48476cd6-6133-4355-a10b-319b7de479ee'), unique=True),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.1 on 2024-08-27 06:14
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
dependencies = [
('jwt_auth', '0090_alter_cuserroleloginopt_uuid'),
]
operations = [
migrations.AlterField(
model_name='cuserroleloginopt',
name='uuid',
field=models.UUIDField(default=uuid.UUID('2072fa9d-9601-4c50-b1ee-bd2b437bee2c'), unique=True),
),
]
@@ -0,0 +1,19 @@
# Generated by Django 4.2.1 on 2024-08-27 06:38
from django.db import migrations, models
import uuid
class Migration(migrations.Migration):
dependencies = [
('jwt_auth', '0091_alter_cuserroleloginopt_uuid'),
]
operations = [
migrations.AlterField(
model_name='cuserroleloginopt',
name='uuid',
field=models.UUIDField(default=uuid.UUID('52471ac1-6299-4ffa-b56f-8b1e8a343d18'), unique=True),
),
]
+4
View File
@@ -33,4 +33,8 @@ class LeadReasonAdmin(admin.ModelAdmin):
pass
@admin.register(LeadEvent)
class LeadEventAdmin(admin.ModelAdmin):
pass
@@ -0,0 +1,33 @@
# Generated by Django 4.2.1 on 2024-08-24 13:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0042_alter_lead_desc_alter_lead_status_alter_lead_title_and_more'),
]
operations = [
migrations.AddField(
model_name='lead',
name='mobile1',
field=models.PositiveBigIntegerField(blank=True, null=True),
),
migrations.AddField(
model_name='lead',
name='mobile2',
field=models.PositiveBigIntegerField(blank=True, null=True),
),
migrations.AddField(
model_name='lead',
name='phone',
field=models.PositiveBigIntegerField(blank=True, null=True),
),
migrations.AlterField(
model_name='lead',
name='status',
field=models.CharField(blank=True, choices=[('UN', 'unknown'), ('SU', 'OK'), ('FA', 'FAIL')], default='UN', max_length=2, null=True),
),
]
+28
View File
@@ -0,0 +1,28 @@
# Generated by Django 4.2.1 on 2024-08-24 13:21
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('workspace', '0016_remove_workspace_cuser_owner'),
('lead', '0043_lead_mobile1_lead_mobile2_lead_phone_and_more'),
]
operations = [
migrations.CreateModel(
name='LeadEvent',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created_at', models.DateTimeField(auto_now_add=True)),
('updated_at', models.DateTimeField(auto_now=True)),
('name', models.CharField(max_length=50)),
('sys_ws', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='workspace.workspace')),
],
options={
'abstract': False,
},
),
]
@@ -0,0 +1,24 @@
# Generated by Django 4.2.1 on 2024-08-27 06:14
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('lead', '0044_leadevent'),
]
operations = [
migrations.AddField(
model_name='lead',
name='lead_event',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='lead.leadevent'),
),
migrations.AlterField(
model_name='lead',
name='status',
field=models.CharField(blank=True, choices=[('FA', 'FAIL'), ('UN', 'unknown'), ('SU', 'OK')], default='UN', max_length=2, null=True),
),
]
@@ -0,0 +1,23 @@
# Generated by Django 4.2.1 on 2024-08-27 06:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0045_lead_lead_event_alter_lead_status'),
]
operations = [
migrations.AddField(
model_name='leadevent',
name='message',
field=models.TextField(blank=True, null=True),
),
migrations.AddField(
model_name='leadevent',
name='send_sms',
field=models.BooleanField(blank=True, default=False, null=True),
),
]
+12
View File
@@ -30,6 +30,14 @@ class LeadStep(BaseModel):
def __str__(self):
return self.name
class LeadEvent(BaseModel):
name = models.CharField(max_length=50)
message = models.TextField(null=True, blank=True)
send_sms = models.BooleanField(default=False, null=True, blank=True)
sys_ws = models.ForeignKey(WorkspaceModel, on_delete=models.CASCADE, null=False, blank=False)
def __str__(self):
return self.name
class LeadReason(BaseModel):
name = models.CharField(max_length=50)
@@ -50,7 +58,11 @@ class Lead(BaseModel):
title = models.CharField(max_length=300)
desc = models.TextField()
mobile1 = models.PositiveBigIntegerField(null=True, blank=True)
mobile2 = models.PositiveBigIntegerField(null=True, blank=True)
phone = models.PositiveBigIntegerField(null=True, blank=True)
customer = models.ForeignKey(CustomerModel, on_delete=models.CASCADE, null=False, blank=False)
lead_event = models.ForeignKey(LeadEvent, on_delete=models.SET_NULL, null=True, blank=True)
product_type = models.ForeignKey(ProductTypeModel, on_delete=models.SET_NULL, null=True, blank=True)
type = models.ForeignKey(LeadType, on_delete=models.SET_NULL, null=True, blank=True)
source = models.ForeignKey(LeadSource, on_delete=models.SET_NULL, null=True, blank=True)
+3 -1
View File
@@ -1,5 +1,5 @@
from apps.lead.models import Lead as LeadModel, LeadType as LeadTypeModel,\
LeadSource as LeadSourceModel, LeadStep as LeadStepModel
LeadSource as LeadSourceModel, LeadStep as LeadStepModel, LeadEvent as LeadEventModel
from apps.shop.models import ProductType as ProductTypeModel
from apps.workspace.models import City as CityModel
from utils.get_user_workspace import get_user_workspace_uuid
@@ -84,6 +84,7 @@ def fields_new_lead_form(request):
product_types = ProductTypeModel.objects.filter(sys_ws__uuid=workspace_uuid)
lead_source = LeadSourceModel.objects.filter(sys_ws__uuid=workspace_uuid)
lead_step = LeadStepModel.objects.filter(sys_ws__uuid=workspace_uuid)
lead_event = LeadEventModel.objects.filter(sys_ws__uuid=workspace_uuid)
shahr = CityModel.objects.filter()
data = {
@@ -91,6 +92,7 @@ def fields_new_lead_form(request):
'lead_types': lead_type,
'lead_source': lead_source,
'lead_steps': lead_step,
'lead_event': lead_event,
'shahr': shahr,
}
return data
+8 -1
View File
@@ -1,7 +1,8 @@
from rest_framework import serializers
from apps.lead.models import (
LeadType as LeadTypeModel, LeadSource as LeadSourceModel,
LeadStep as LeadStepModel, LeadReason as LeadReasonModel
LeadStep as LeadStepModel, LeadReason as LeadReasonModel,
LeadEvent as LeadEventModel
)
from apps.shop.models import ProductType as ProductTypeModel
from apps.workspace.models import City as CityModel
@@ -39,6 +40,12 @@ class LeadReasonSerializers(serializers.ModelSerializer):
exclude = ['sys_ws', 'created_at', 'updated_at']
class LeadEventSerializers(serializers.ModelSerializer):
class Meta:
model = LeadEventModel
exclude = ['sys_ws', 'created_at', 'updated_at']
class ShahrSerializers(serializers.ModelSerializer):
class Meta:
model = CityModel
+30 -4
View File
@@ -1,16 +1,17 @@
from apps.lead.models import Lead as LeadModel,\
LeadType as LeadTypeModel, LeadStep as LeadStepModel, LeadSource as LeadSourceModel, LeadComment as LeadCommentModel
LeadType as LeadTypeModel, LeadStep as LeadStepModel, LeadSource as LeadSourceModel, LeadComment as LeadCommentModel, LeadEvent as LeadEventModel
from apps.shop.models import ProductType as ProductTypeModel
from utils.get_user_workspace import get_user_workspace
from utils.get_cuser_role import get_cuser_role
from utils.validations import ObjectValidationById
from apps.customer.models import Customer as CustomerModel
from apps.workspace.models import City as CityModel
from utils.services.sms import DefaultSmsProvider
from rest_framework import exceptions
def create_new_lead(request, title: str, customer_id: str, desc: str, product_type_id: int,
lead_type_id: int, lead_source_id: int, city_id: int, lead_step_id: int) -> LeadModel:
def create_new_lead(request, title: str, customer_id: str, mobile1: int, desc: str, product_type_id: int,
lead_type_id: int, lead_source_id: int, city_id: int, lead_step_id: int, mobile2: int = None, phone: int = None, lead_event_id: int = None) -> LeadModel:
try:
sys_ws = get_user_workspace(request=request)
cuser_role = get_cuser_role(request=request)
@@ -22,9 +23,20 @@ def create_new_lead(request, title: str, customer_id: str, desc: str, product_ty
product_type = ObjectValidationById(object_model=ProductTypeModel, request=request).is_valid(product_type_id)
city = ObjectValidationById(object_model=CityModel, request=request).is_valid(city_id)
lead_event_obj = None
new_lead = LeadModel()
new_lead.title = title
new_lead.customer = customer
if mobile1:
new_lead.mobile1 = mobile1
if mobile2:
new_lead.mobile2 = mobile2
if phone:
new_lead.phone = phone
if lead_event_id and (lead_event_id != '0' or lead_event_id != 0):
lead_event_obj = LeadEventModel.objects.get(id=lead_event_id, sys_ws=sys_ws)
new_lead.lead_event = lead_event_obj
new_lead.desc = desc
new_lead.type = lead_type
new_lead.step = lead_step
@@ -36,6 +48,14 @@ def create_new_lead(request, title: str, customer_id: str, desc: str, product_ty
new_lead.save()
# send sms
if lead_event_obj and lead_event_obj.send_sms:
sms_provider = DefaultSmsProvider()
if mobile1:
sms_provider.send_sms(str(mobile1), lead_event_obj.message)
if mobile2:
sms_provider.send_sms(str(mobile2), lead_event_obj.message)
return new_lead
except Exception as exp:
@@ -45,7 +65,7 @@ def create_new_lead(request, title: str, customer_id: str, desc: str, product_ty
def update_lead(request, lead_id: int, title: str, customer_id: str, desc: str, product_type_id: int,
lead_type_id: int, lead_source_id: int, city_id: int, lead_step_id: int) -> LeadModel:
lead_type_id: int, lead_source_id: int, city_id: int, lead_step_id: int, mobile1: int = None, mobile2: int = None, phone: int = None) -> LeadModel:
try:
sys_ws = get_user_workspace(request=request)
cuser_role = get_cuser_role(request=request)
@@ -60,6 +80,12 @@ def update_lead(request, lead_id: int, title: str, customer_id: str, desc: str,
lead = LeadModel.objects.get(id=lead_id, sys_ws=sys_ws, cuser_role=cuser_role)
lead.title = title
lead.customer = customer
if mobile1:
lead.mobile1 = mobile1
if mobile2:
lead.mobile2 = mobile2
if phone:
lead.phone = phone
lead.desc = desc
lead.type = lead_type
lead.step = lead_step
+7 -2
View File
@@ -4,7 +4,7 @@ from rest_framework.generics import ListAPIView
from rest_framework.response import Response
from rest_framework import serializers
from apps.lead.serializers import LeadTypeSerializers, ProductTypeSerializers,\
LeadSourceSerializers, LeadStepSerializers, ShahrSerializers
LeadSourceSerializers, LeadStepSerializers, ShahrSerializers, LeadEventSerializers
from apps.lead.selectors import fields_new_lead_form
from apps.lead.services import create_new_lead, update_lead, update_lead_status,\
update_lead_comment, delete_lead_comment, create_lead_comment
@@ -25,6 +25,7 @@ class LeadFormItemsApi(APIView):
lead_types = LeadTypeSerializers(many=True)
product_types = ProductTypeSerializers(many=True)
lead_source = LeadSourceSerializers(many=True)
lead_event = LeadEventSerializers(many=True)
lead_steps = LeadStepSerializers(many=True)
shahr = ShahrSerializers(many=True)
@@ -41,7 +42,11 @@ class LeadCreateApi(APIView):
class InputSerializer(serializers.Serializer):
title = serializers.CharField(max_length=100, required=True)
customer_id = serializers.IntegerField(required=True)
desc = serializers.CharField(max_length=200, required=True)
desc = serializers.CharField(required=True)
mobile1 = serializers.IntegerField(required=True)
mobile2 = serializers.IntegerField(required=False)
lead_event_id = serializers.IntegerField(required=False)
phone = serializers.IntegerField(required=False)
lead_type_id = serializers.IntegerField(required=True)
product_type_id = serializers.IntegerField(required=True)
lead_source_id = serializers.IntegerField(required=True)
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-08-24 13:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0036_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('LE', 'LEAD'), ('CU', 'CUSTOMER'), ('UN', 'UNKNOWN'), ('NO', 'NOTE')], default='UN', max_length=2),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-08-24 13:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0037_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('LE', 'LEAD'), ('UN', 'UNKNOWN'), ('CU', 'CUSTOMER'), ('NO', 'NOTE')], default='UN', max_length=2),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-08-27 06:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('reminder', '0038_alter_reminder_type'),
]
operations = [
migrations.AlterField(
model_name='reminder',
name='type',
field=models.CharField(choices=[('CU', 'CUSTOMER'), ('UN', 'UNKNOWN'), ('LE', 'LEAD'), ('NO', 'NOTE')], default='UN', max_length=2),
),
]