This commit is contained in:
javad committed 2024-01-22 13:01:42 +03:30
commit 89a5d70512
284 files changed
+8364

No files matched your search

View File
Whitespace-only changes.
+36
View File
@@ -0,0 +1,36 @@
from django.contrib import admin
from apps.lead.models import *
# Register your models here.
@admin.register(Lead)
class LeadAdmin(admin.ModelAdmin):
pass
@admin.register(LeadComment)
class LeadCommentAdmin(admin.ModelAdmin):
pass
@admin.register(LeadStep)
class LeadStepAdmin(admin.ModelAdmin):
pass
@admin.register(LeadType)
class LeadTypeAdmin(admin.ModelAdmin):
pass
@admin.register(LeadSource)
class LeadSourceAdmin(admin.ModelAdmin):
pass
@admin.register(LeadReason)
class LeadReasonAdmin(admin.ModelAdmin):
pass
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class LeadConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'apps.lead'
+93
View File
@@ -0,0 +1,93 @@
# Generated by Django 4.2.1 on 2024-01-01 11:07
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('shop', '0011_producttype'),
('cuser', '0005_smsopt'),
('customer', '0003_alter_customer_address'),
('workspace', '0003_alter_workspace_uuid'),
]
operations = [
migrations.CreateModel(
name='LeadType',
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)),
('title', models.CharField(max_length=50)),
('sys_ws', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='workspace.workspace')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='LeadStep',
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,
},
),
migrations.CreateModel(
name='LeadSource',
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)),
('title', models.CharField(max_length=50)),
('sys_ws', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='workspace.workspace')),
],
options={
'abstract': False,
},
),
migrations.CreateModel(
name='LeadReason',
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,
},
),
migrations.CreateModel(
name='Lead',
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)),
('title', models.CharField(max_length=100)),
('status', models.CharField(blank=True, choices=[('SU', 'OK'), ('FA', 'OK')], max_length=2, null=True)),
('city', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='workspace.city')),
('cuser_role', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cuser.cuserrole')),
('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='customer.customer')),
('product_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='shop.producttype')),
('reason', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='lead.leadreason')),
('source', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='lead.leadsource')),
('step', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='lead.leadstep')),
('sys_ws', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='workspace.workspace')),
('type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='lead.leadtype')),
],
options={
'abstract': False,
},
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-01 11:08
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='leadreason',
name='success',
field=models.BooleanField(blank=True, null=True),
),
]
@@ -0,0 +1,30 @@
# Generated by Django 4.2.1 on 2024-01-05 07:11
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0002_leadreason_success'),
]
operations = [
migrations.CreateModel(
name='LeadProxy',
fields=[
],
options={
'proxy': True,
'indexes': [],
'constraints': [],
},
bases=('lead.lead',),
),
migrations.AddField(
model_name='lead',
name='desc',
field=models.CharField(default='1', max_length=300),
preserve_default=False,
),
]
@@ -0,0 +1,21 @@
# Generated by Django 4.2.1 on 2024-01-07 15:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0003_leadproxy_lead_desc'),
]
operations = [
migrations.DeleteModel(
name='LeadProxy',
),
migrations.AlterField(
model_name='lead',
name='status',
field=models.CharField(blank=True, choices=[('UN', 'unknown'), ('SU', 'OK'), ('FA', 'FAIL')], max_length=2, null=True),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-07 15:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0004_delete_leadproxy_alter_lead_status'),
]
operations = [
migrations.AlterField(
model_name='lead',
name='status',
field=models.CharField(blank=True, choices=[('SU', 'OK'), ('FA', 'FAIL'), ('UN', 'unknown')], default='UN', max_length=2, null=True),
),
]
@@ -0,0 +1,36 @@
# Generated by Django 4.2.1 on 2024-01-08 11:53
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('cuser', '0005_smsopt'),
('workspace', '0003_alter_workspace_uuid'),
('lead', '0005_alter_lead_status'),
]
operations = [
migrations.AlterField(
model_name='lead',
name='status',
field=models.CharField(blank=True, choices=[('FA', 'FAIL'), ('SU', 'OK'), ('UN', 'unknown')], default='UN', max_length=2, null=True),
),
migrations.CreateModel(
name='LeadComment',
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)),
('desc', models.CharField(max_length=300)),
('cuser_role', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='cuser.cuserrole')),
('lead', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='lead_comment', to='lead.lead')),
('sys_ws', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='workspace.workspace')),
],
options={
'abstract': False,
},
),
]
@@ -0,0 +1,17 @@
# Generated by Django 4.2.1 on 2024-01-09 10:05
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('lead', '0006_alter_lead_status_leadcomment'),
]
operations = [
migrations.AlterModelOptions(
name='leadcomment',
options={'ordering': ['-created_at']},
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-10 12:08
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0007_alter_leadcomment_options'),
]
operations = [
migrations.AlterField(
model_name='lead',
name='status',
field=models.CharField(blank=True, choices=[('SU', 'OK'), ('UN', 'unknown'), ('FA', 'FAIL')], default='UN', max_length=2, null=True),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-13 10:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0008_alter_lead_status'),
]
operations = [
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,18 @@
# Generated by Django 4.2.1 on 2024-01-13 10:35
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0009_alter_lead_status'),
]
operations = [
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),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-13 15:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0010_alter_lead_status'),
]
operations = [
migrations.AlterField(
model_name='lead',
name='status',
field=models.CharField(blank=True, choices=[('SU', 'OK'), ('FA', 'FAIL'), ('UN', 'unknown')], default='UN', max_length=2, null=True),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-18 08:40
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0011_alter_lead_status'),
]
operations = [
migrations.AlterField(
model_name='lead',
name='status',
field=models.CharField(blank=True, choices=[('FA', 'FAIL'), ('SU', 'OK'), ('UN', 'unknown')], default='UN', max_length=2, null=True),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-20 07:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0012_alter_lead_status'),
]
operations = [
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),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 08:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0013_alter_lead_status'),
]
operations = [
migrations.AlterField(
model_name='lead',
name='status',
field=models.CharField(blank=True, choices=[('FA', 'FAIL'), ('SU', 'OK'), ('UN', 'unknown')], default='UN', max_length=2, null=True),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 08:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0014_alter_lead_status'),
]
operations = [
migrations.AlterField(
model_name='lead',
name='status',
field=models.CharField(blank=True, choices=[('SU', 'OK'), ('FA', 'FAIL'), ('UN', 'unknown')], default='UN', max_length=2, null=True),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 09:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0015_alter_lead_status'),
]
operations = [
migrations.AlterField(
model_name='lead',
name='status',
field=models.CharField(blank=True, choices=[('UN', 'unknown'), ('FA', 'FAIL'), ('SU', 'OK')], default='UN', max_length=2, null=True),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 09:16
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0016_alter_lead_status'),
]
operations = [
migrations.AlterField(
model_name='lead',
name='status',
field=models.CharField(blank=True, choices=[('SU', 'OK'), ('FA', 'FAIL'), ('UN', 'unknown')], default='UN', max_length=2, null=True),
),
]
@@ -0,0 +1,18 @@
# Generated by Django 4.2.1 on 2024-01-21 12:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0017_alter_lead_status'),
]
operations = [
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,18 @@
# Generated by Django 4.2.1 on 2024-01-21 12:45
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('lead', '0018_alter_lead_status'),
]
operations = [
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),
),
]
View File
Whitespace-only changes.
+80
View File
@@ -0,0 +1,80 @@
from django.db import models
from utils.base_model import BaseModel
from apps.customer.models import Customer as CustomerModel
from apps.shop.models import ProductType as ProductTypeModel
from apps.workspace.models import City as CityModel, Workspace as WorkspaceModel
from apps.cuser.models import CuserRole as CuserRoleModel
# Create your models here.
class LeadType(BaseModel):
title = models.CharField(max_length=50)
sys_ws = models.ForeignKey(WorkspaceModel, on_delete=models.CASCADE, null=False, blank=False)
def __str__(self):
return self.title
class LeadSource(BaseModel):
title = models.CharField(max_length=50)
sys_ws = models.ForeignKey(WorkspaceModel, on_delete=models.CASCADE, null=False, blank=False)
def __str__(self):
return self.title
class LeadStep(BaseModel):
name = models.CharField(max_length=50)
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)
success = models.BooleanField(null=True, blank=True)
sys_ws = models.ForeignKey(WorkspaceModel, on_delete=models.CASCADE, null=False, blank=False)
def __str__(self):
return self.name
class Lead(BaseModel):
STATUS_CHOICES = {
("SU", "OK"),
("FA", "FAIL"),
("UN", "unknown"),
}
title = models.CharField(max_length=100)
desc = models.CharField(max_length=300)
customer = models.ForeignKey(CustomerModel, on_delete=models.CASCADE, null=False, blank=False)
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)
step = models.ForeignKey(LeadStep, on_delete=models.SET_NULL, null=True, blank=True)
city = models.ForeignKey(CityModel, on_delete=models.SET_NULL, null=True, blank=True)
status = models.CharField(max_length=2, choices=STATUS_CHOICES, null=True, blank=True, default='UN')
reason = models.ForeignKey(LeadReason, on_delete=models.SET_NULL, null=True, blank=True)
cuser_role = models.ForeignKey(CuserRoleModel, on_delete=models.SET_NULL, null=True, blank=True)
sys_ws = models.ForeignKey(WorkspaceModel, on_delete=models.CASCADE, null=False, blank=False)
def __str__(self):
return self.title
class LeadComment(BaseModel):
lead = models.ForeignKey(Lead, on_delete=models.CASCADE, null=False, blank=False, related_name='lead_comment')
desc = models.CharField(max_length=300)
cuser_role = models.ForeignKey(CuserRoleModel, on_delete=models.SET_NULL, null=True, blank=True)
sys_ws = models.ForeignKey(WorkspaceModel, on_delete=models.CASCADE, null=False, blank=False)
class Meta:
ordering = ['-created_at']
def __str__(self):
return self.lead.title
+20
View File
@@ -0,0 +1,20 @@
from apps.lead.models import Lead as LeadModel, LeadType as LeadTypeModel, LeadStep as LeadStepModel
from apps.workspace.models import City as CityModel
from apps.customer.models import Customer as CustomerModel
from apps.shop.models import ProductType as ProductTypeModel
from django.core.exceptions import ValidationError
from utils.validations import ObjectValidationById
class LeadProxy(LeadModel):
def full_objects_validation_by_id(self, request):
customer = ObjectValidationById(object_model=CustomerModel, request=request).is_valid(self.customer_id)
customer = ObjectValidationById(object_model=LeadTypeModel, request=request).is_valid(lead_type_id)
customer = ObjectValidationById(object_model=CustomerModel, request=request).is_valid(customer_id)
customer = ObjectValidationById(object_model=CustomerModel, request=request).is_valid(customer_id)
customer = ObjectValidationById(object_model=CustomerModel, request=request).is_valid(customer_id)
customer = ObjectValidationById(object_model=CustomerModel, request=request).is_valid(customer_id)
return True
+79
View File
@@ -0,0 +1,79 @@
from apps.lead.models import Lead as LeadModel, LeadType as LeadTypeModel,\
LeadSource as LeadSourceModel, LeadStep as LeadStepModel
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
from utils.get_cuser_role import get_cuser_role_uuid
from rest_framework import exceptions
def list_leads(request) -> LeadModel:
try:
workspace_uuid = get_user_workspace_uuid(request)
cuser_role_uuid = get_cuser_role_uuid(request)
leads = LeadModel.objects.filter(sys_ws__uuid=workspace_uuid, cuser_role__uuid=cuser_role_uuid).order_by('-created_at')
return leads
except Exception as exp:
message = f'Error Fetching List Leads: {exp}'
raise exceptions.ValidationError({'error': message})
def retrieve_lead(request, id: int) -> LeadModel:
try:
workspace_uuid = get_user_workspace_uuid(request)
cuser_role_uuid = get_cuser_role_uuid(request)
lead = LeadModel.objects.get(id=id, sys_ws__uuid=workspace_uuid, cuser_role__uuid=cuser_role_uuid)
return lead
except Exception as exp:
message = f'Error retrieve Leads: {exp}'
raise exceptions.ValidationError({'error': message})
def retrieve_summary_lead(request) -> LeadModel:
try:
workspace_uuid = get_user_workspace_uuid(request)
cuser_role_uuid = get_cuser_role_uuid(request)
mozakere = LeadModel.objects.filter(step_id=2, status__in=('UN', ''),
sys_ws__uuid=workspace_uuid, cuser_role__uuid=cuser_role_uuid)[:20]
pish = LeadModel.objects.filter(step_id=3, status__in=('UN', ''),
sys_ws__uuid=workspace_uuid, cuser_role__uuid=cuser_role_uuid)[:20]
kharid = LeadModel.objects.filter(step_id=4, status__in=('UN', ''),
sys_ws__uuid=workspace_uuid, cuser_role__uuid=cuser_role_uuid)[:20]
leads = {
'mozakere': mozakere,
'pishfactor': pish,
'kharid': kharid,
}
return leads
except Exception as exp:
message = f'Error retrieve summary Leads: {exp}'
raise exceptions.ValidationError({'error': message})
def fields_new_lead_form(request):
workspace_uuid = get_user_workspace_uuid(request)
lead_type = LeadTypeModel.objects.filter(sys_ws__uuid=workspace_uuid)
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)
shahr = CityModel.objects.filter()
data = {
'product_types': product_types,
'lead_types': lead_type,
'lead_source': lead_source,
'lead_steps': lead_step,
'shahr': shahr,
}
return data
+45
View File
@@ -0,0 +1,45 @@
from rest_framework import serializers
from apps.lead.models import (
LeadType as LeadTypeModel, LeadSource as LeadSourceModel,
LeadStep as LeadStepModel, LeadReason as LeadReasonModel
)
from apps.shop.models import ProductType as ProductTypeModel
from apps.workspace.models import City as CityModel
class ProductTypeSerializers(serializers.ModelSerializer):
class Meta:
model = ProductTypeModel
exclude = ['sys_ws', 'created_at', 'updated_at']
class LeadTypeSerializers(serializers.ModelSerializer):
class Meta:
model = LeadTypeModel
exclude = ['sys_ws', 'created_at', 'updated_at']
class LeadSourceSerializers(serializers.ModelSerializer):
class Meta:
model = LeadSourceModel
exclude = ['sys_ws', 'created_at', 'updated_at']
class LeadStepSerializers(serializers.ModelSerializer):
class Meta:
model = LeadStepModel
exclude = ['sys_ws', 'created_at', 'updated_at']
class LeadReasonSerializers(serializers.ModelSerializer):
class Meta:
model = LeadReasonModel
exclude = ['sys_ws', 'created_at', 'updated_at']
class ShahrSerializers(serializers.ModelSerializer):
class Meta:
model = CityModel
exclude = ['created_at', 'updated_at']
+146
View File
@@ -0,0 +1,146 @@
from apps.lead.models import Lead as LeadModel,\
LeadType as LeadTypeModel, LeadStep as LeadStepModel, LeadSource as LeadSourceModel, LeadComment as LeadCommentModel
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 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:
try:
sys_ws = get_user_workspace(request=request)
cuser_role = get_cuser_role(request=request)
customer = ObjectValidationById(object_model=CustomerModel, request=request).is_valid(int(customer_id))
lead_type = ObjectValidationById(object_model=LeadTypeModel, request=request).is_valid(lead_type_id)
lead_step = ObjectValidationById(object_model=LeadStepModel, request=request).is_valid(lead_step_id)
lead_source = ObjectValidationById(object_model=LeadSourceModel, request=request).is_valid(lead_source_id)
product_type = ObjectValidationById(object_model=ProductTypeModel, request=request).is_valid(product_type_id)
city = ObjectValidationById(object_model=CityModel, request=request).is_valid(city_id)
new_lead = LeadModel()
new_lead.title = title
new_lead.customer = customer
new_lead.desc = desc
new_lead.type = lead_type
new_lead.step = lead_step
new_lead.source = lead_source
new_lead.product_type = product_type
new_lead.city = city
new_lead.sys_ws = sys_ws
new_lead.cuser_role = cuser_role
new_lead.save()
return new_lead
except Exception as exp:
print("error creae lead")
message = f'Error Create New Lead: {exp}'
raise exceptions.ValidationError({'error': message})
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:
try:
sys_ws = get_user_workspace(request=request)
cuser_role = get_cuser_role(request=request)
customer = ObjectValidationById(object_model=CustomerModel, request=request).is_valid(int(customer_id))
lead_type = ObjectValidationById(object_model=LeadTypeModel, request=request).is_valid(lead_type_id)
lead_step = ObjectValidationById(object_model=LeadStepModel, request=request).is_valid(lead_step_id)
lead_source = ObjectValidationById(object_model=LeadSourceModel, request=request).is_valid(lead_source_id)
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 = LeadModel.objects.get(id=lead_id, sys_ws=sys_ws, cuser_role=cuser_role)
lead.title = title
lead.customer = customer
lead.desc = desc
lead.type = lead_type
lead.step = lead_step
lead.source = lead_source
lead.product_type = product_type
lead.city = city
lead.save()
return lead
except Exception as exp:
message = f'Error Update Lead: {exp}'
raise exceptions.ValidationError({'error': message})
def update_lead_status(request, lead_id: int, status: str) -> LeadModel:
try:
sys_ws = get_user_workspace(request=request)
cuser_role = get_cuser_role(request=request)
lead = LeadModel.objects.get(id=lead_id, sys_ws=sys_ws, cuser_role=cuser_role)
lead.status = status
lead.save()
return lead
except Exception as exp:
message = f'Error Update Lead Status: {exp}'
raise exceptions.ValidationError({'error': message})
def update_lead_comment(request, lead_comment_id: int, desc: str) -> LeadModel:
try:
sys_ws = get_user_workspace(request=request)
cuser_role = get_cuser_role(request=request)
lead_comment = LeadCommentModel.objects.get(id=lead_comment_id, sys_ws=sys_ws, cuser_role=cuser_role)
lead_comment.desc = desc
lead_comment.save()
return lead_comment
except Exception as exp:
message = f'Error Update Lead_comment: {exp}'
raise exceptions.ValidationError({'error': message})
def create_lead_comment(request, lead_id, desc: str) -> LeadCommentModel:
try:
sys_ws = get_user_workspace(request=request)
cuser_role = get_cuser_role(request=request)
lead_comment = LeadCommentModel()
lead_comment.lead = LeadModel.objects.get(id=lead_id, sys_ws=sys_ws, cuser_role=cuser_role)
lead_comment.sys_ws = sys_ws
lead_comment.cuser_role = cuser_role
lead_comment.desc = desc
lead_comment.save()
return lead_comment
except Exception as exp:
message = f'Error Create Lead comment: {exp}'
raise exceptions.ValidationError({'error': message})
def delete_lead_comment(request, lead_comment_id: int) -> LeadModel:
try:
sys_ws = get_user_workspace(request=request)
cuser_role = get_cuser_role(request=request)
lead_comment = LeadCommentModel.objects.get(id=lead_comment_id, sys_ws=sys_ws, cuser_role=cuser_role)
lead_comment.delete()
return lead_comment
except Exception as exp:
message = f'Error Delete Lead_comment: {exp}'
raise exceptions.ValidationError({'error': message})
+3
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+17
View File
@@ -0,0 +1,17 @@
from django.urls import path, include
from apps.lead.views import *
urlpatterns = [
path('form-items/', LeadFormItemsApi.as_view(), name='lead-form-items'),
path('new/', LeadCreateApi.as_view(), name='lead-new'),
path('list/', LeadListApi.as_view(), name='lead-list'),
path('<int:lead_id>/', LeadRetrieveApi.as_view(), name='lead-id'),
path('<int:lead_id>/edit-status/', LeadUpdateStatusApi.as_view(), name='lead-edit-status'),
path('<int:lead_id>/edit/', LeadUpdateApi.as_view(), name='lead-edit'),
path('<int:lead_id>/comment/add/', LeadCommentCreateApi.as_view(), name='lead-comment-add'),
path('comment/<int:lead_comment_id>/edit/', LeadCommentUpdateApi.as_view(), name='lead-comment-edit'),
path('comment/<int:lead_comment_id>/delete/', LeadCommentDeleteApi.as_view(), name='lead-comment-delete'),
path('summary/', LeadSummaryApi.as_view(), name='marketing-summary'),
]
+318
View File
@@ -0,0 +1,318 @@
from django.shortcuts import render
from rest_framework.views import APIView
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
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
from apps.lead.models import Lead as LeadModel
from rest_framework import status
from apps.lead.selectors import list_leads, retrieve_lead, retrieve_summary_lead
from rest_framework.permissions import IsAuthenticated
from utils import custom_permissions
from utils.tools import inline_serializer
from utils.pagination import CustomPagination
from django_filters.rest_framework import DjangoFilterBackend
# Create your views here.
class LeadFormItemsApi(APIView):
class OutputSerializer(serializers.Serializer):
lead_types = LeadTypeSerializers(many=True)
product_types = ProductTypeSerializers(many=True)
lead_source = LeadSourceSerializers(many=True)
lead_steps = LeadStepSerializers(many=True)
shahr = ShahrSerializers(many=True)
def get(self, request):
fields_value = fields_new_lead_form(request)
serializer = self.OutputSerializer(fields_value)
return Response(data=serializer.data)
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)
lead_type_id = serializers.IntegerField(required=True)
product_type_id = serializers.IntegerField(required=True)
lead_source_id = serializers.IntegerField(required=True)
lead_step_id = serializers.IntegerField(required=True)
city_id = serializers.IntegerField(required=True)
class OutputSerializer(serializers.Serializer):
id = serializers.IntegerField(required=True)
def post(self, request):
serializer = self.InputSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
new_lead = create_new_lead(request=request, **serializer.validated_data)
output = self.OutputSerializer(new_lead)
return Response(data=output.data, status=status.HTTP_201_CREATED)
class LeadUpdateApi(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)
lead_type_id = serializers.IntegerField(required=True)
product_type_id = serializers.IntegerField(required=True)
lead_source_id = serializers.IntegerField(required=True)
lead_step_id = serializers.IntegerField(required=True)
city_id = serializers.IntegerField(required=True)
class OutputSerializer(serializers.Serializer):
id = serializers.IntegerField(required=True)
def patch(self, request, lead_id):
serializer = self.InputSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
lead = update_lead(request=request, lead_id=lead_id, **serializer.validated_data)
output = self.OutputSerializer(lead)
return Response(data=output.data, status=status.HTTP_201_CREATED)
class LeadUpdateStatusApi(APIView):
class InputSerializer(serializers.Serializer):
status = serializers.CharField(max_length=2, required=True)
class OutputSerializer(serializers.Serializer):
id = serializers.IntegerField(required=True)
def patch(self, request, lead_id):
serializer = self.InputSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
lead = update_lead_status(request=request, lead_id=lead_id, **serializer.validated_data)
output = self.OutputSerializer(lead)
return Response(data=output.data, status=status.HTTP_201_CREATED)
class LeadListApi(ListAPIView):
permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission)
class Pagination(CustomPagination):
page_size = 10
page_size_query_param = 'page_size'
max_page_size = 20
class OutputSerializer(serializers.ModelSerializer):
customer = inline_serializer(many=False, fields={'name_family': serializers.CharField(), })
product_type = inline_serializer(many=False, fields={'name': serializers.CharField(), })
type = inline_serializer(many=False, fields={'title': serializers.CharField(), })
source = inline_serializer(many=False, fields={'title': serializers.CharField(), })
step = inline_serializer(many=False, fields={
'id': serializers.IntegerField(),
'name': serializers.CharField(),
})
city = inline_serializer(many=False, fields={
'name': serializers.CharField(),
'ostan': inline_serializer(many=False, fields={'name': serializers.CharField() })
})
class Meta:
model = LeadModel
fields = '__all__'
serializer_class = OutputSerializer
pagination_class = Pagination
filter_backends = [DjangoFilterBackend]
filterset_fields = ['step', 'status', ]
def get_queryset(self):
return list_leads(request=self.request)
class LeadRetrieveApi(APIView):
permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission)
class OutputSerializer(serializers.ModelSerializer):
customer = inline_serializer(many=False, fields={
'id': serializers.IntegerField(),
'name_family': serializers.CharField(),
})
product_type = inline_serializer(many=False, fields={
'id': serializers.IntegerField(),
'name': serializers.CharField(),
})
type = inline_serializer(many=False, fields={
'id': serializers.IntegerField(),
'title': serializers.CharField(),
})
source = inline_serializer(many=False, fields={
'id': serializers.IntegerField(),
'title': serializers.CharField(),
})
step = inline_serializer(many=False, fields={
'id': serializers.IntegerField(),
'name': serializers.CharField(),
})
city = inline_serializer(many=False, fields={
'id': serializers.IntegerField(),
'name': serializers.CharField(),
'ostan': inline_serializer(many=False, fields={
'id': serializers.IntegerField(),
'name': serializers.CharField()
})
})
lead_comment = inline_serializer(many=True, fields={
'id': serializers.IntegerField(),
'created_at': serializers.DateTimeField(),
'desc': serializers.CharField()
})
lead_reminder = inline_serializer(many=False, fields={
'id': serializers.IntegerField(),
'created_at': serializers.DateTimeField(),
'datetime': serializers.DateTimeField(),
'desc': serializers.CharField()
})
class Meta:
model = LeadModel
fields = '__all__'
serializer_class = OutputSerializer
def get(self, request, lead_id):
lead = retrieve_lead(request=request, id=lead_id)
output = self.OutputSerializer(lead, many=False)
return Response(data=output.data)
class LeadCommentCreateApi(APIView):
class InputSerializer(serializers.Serializer):
desc = serializers.CharField(max_length=200, required=True)
class OutputSerializer(serializers.Serializer):
id = serializers.IntegerField(required=True)
def post(self, request, lead_id):
serializer = self.InputSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
lead = create_lead_comment(request=request, lead_id=lead_id, **serializer.validated_data)
output = self.OutputSerializer(lead)
return Response(data=output.data, status=status.HTTP_200_OK)
class LeadCommentUpdateApi(APIView):
class InputSerializer(serializers.Serializer):
desc = serializers.CharField(max_length=200, required=True)
class OutputSerializer(serializers.Serializer):
id = serializers.IntegerField(required=True)
def patch(self, request, lead_comment_id):
serializer = self.InputSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
lead = update_lead_comment(request=request, lead_comment_id=lead_comment_id, **serializer.validated_data)
output = self.OutputSerializer(lead)
return Response(data=output.data, status=status.HTTP_200_OK)
class LeadCommentDeleteApi(APIView):
class OutputSerializer(serializers.Serializer):
id = serializers.IntegerField(required=True)
def delete(self, request, lead_comment_id):
lead = delete_lead_comment(request=request, lead_comment_id=lead_comment_id)
output = self.OutputSerializer(lead)
return Response(data=output.data, status=status.HTTP_200_OK)
class LeadSummaryApi(APIView):
permission_classes = (IsAuthenticated, custom_permissions.WorkspaceOperatorPermission)
class OutputSerializer(serializers.Serializer):
mozakere = inline_serializer(many=True, fields={
'id': serializers.IntegerField(),
'customer': inline_serializer(fields={
'id': serializers.IntegerField(),
'name_family': serializers.CharField(),
}),
'title': serializers.CharField(),
'created_at': serializers.DateTimeField()
})
pishfactor = inline_serializer(many=True, fields={
'id': serializers.IntegerField(),
'customer': inline_serializer(fields={
'id': serializers.IntegerField(),
'name_family': serializers.CharField(),
}),
'title': serializers.CharField(),
'created_at': serializers.DateTimeField()
})
kharid = inline_serializer(many=True, fields={
'id': serializers.IntegerField(),
'customer': inline_serializer(fields={
'id': serializers.IntegerField(),
'name_family': serializers.CharField(),
}),
'title': serializers.CharField(),
'created_at': serializers.DateTimeField()
})
def get(self, request):
leads = retrieve_summary_lead(request=request)
output = self.OutputSerializer(leads, many=False)
return Response(data=output.data, status=status.HTTP_200_OK)