303 lines
10 KiB
Python
303 lines
10 KiB
Python
from drf_spectacular.utils import extend_schema, inline_serializer
|
|
from rest_framework import serializers, status
|
|
from rest_framework.permissions import IsAuthenticated
|
|
from rest_framework.response import Response
|
|
from rest_framework.views import APIView
|
|
|
|
from common.models import APISettings, Attachments, Comment
|
|
from common.permissions import HasOrgContext
|
|
from common.serializer import LeadCommentSerializer
|
|
from contacts.models import Contact
|
|
from leads import swagger_params
|
|
from leads.forms import LeadListForm
|
|
from leads.models import Lead
|
|
from leads.serializer import (
|
|
CreateLeadFromSiteSwaggerSerializer,
|
|
LeadCommentEditSwaggerSerializer,
|
|
LeadUploadSwaggerSerializer,
|
|
)
|
|
from leads.tasks import create_lead_from_file, send_lead_assigned_emails
|
|
|
|
|
|
class LeadUploadView(APIView):
|
|
model = Lead
|
|
permission_classes = (IsAuthenticated, HasOrgContext)
|
|
|
|
@extend_schema(
|
|
tags=["Leads"],
|
|
parameters=swagger_params.organization_params,
|
|
request=LeadUploadSwaggerSerializer,
|
|
responses={
|
|
200: inline_serializer(
|
|
name="LeadUploadResponse",
|
|
fields={
|
|
"error": serializers.BooleanField(),
|
|
"message": serializers.CharField(),
|
|
},
|
|
)
|
|
},
|
|
)
|
|
def post(self, request, *args, **kwargs):
|
|
lead_form = LeadListForm(request.POST, request.FILES)
|
|
if lead_form.is_valid():
|
|
create_lead_from_file.delay(
|
|
lead_form.validated_rows,
|
|
lead_form.invalid_rows,
|
|
request.profile.id,
|
|
request.get_host(),
|
|
request.profile.org.id,
|
|
)
|
|
return Response(
|
|
{"error": False, "message": "Leads created Successfully"},
|
|
status=status.HTTP_200_OK,
|
|
)
|
|
return Response(
|
|
{"error": True, "errors": lead_form.errors},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
|
|
|
|
class LeadCommentView(APIView):
|
|
model = Comment
|
|
permission_classes = (IsAuthenticated, HasOrgContext)
|
|
|
|
def get_object(self, pk):
|
|
return self.model.objects.get(pk=pk, org=self.request.profile.org)
|
|
|
|
@extend_schema(
|
|
tags=["Leads"],
|
|
parameters=swagger_params.organization_params,
|
|
request=LeadCommentEditSwaggerSerializer,
|
|
responses={
|
|
200: inline_serializer(
|
|
name="LeadCommentUpdateResponse",
|
|
fields={
|
|
"error": serializers.BooleanField(),
|
|
"message": serializers.CharField(),
|
|
},
|
|
)
|
|
},
|
|
)
|
|
def put(self, request, pk, format=None):
|
|
params = request.data
|
|
obj = self.get_object(pk)
|
|
if (
|
|
request.profile.role == "ADMIN"
|
|
or request.user.is_superuser
|
|
or request.profile == obj.commented_by
|
|
):
|
|
serializer = LeadCommentSerializer(obj, data=params)
|
|
if serializer.is_valid():
|
|
serializer.save()
|
|
return Response(
|
|
{"error": False, "message": "Comment Submitted"},
|
|
status=status.HTTP_200_OK,
|
|
)
|
|
return Response(
|
|
{"error": True, "errors": serializer.errors},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
return Response(
|
|
{
|
|
"error": True,
|
|
"errors": "You don't have permission to perform this action",
|
|
},
|
|
status=status.HTTP_403_FORBIDDEN,
|
|
)
|
|
|
|
@extend_schema(
|
|
tags=["Leads"],
|
|
parameters=swagger_params.organization_params,
|
|
request=LeadCommentEditSwaggerSerializer,
|
|
description="Partial Comment Update",
|
|
responses={
|
|
200: inline_serializer(
|
|
name="LeadCommentPatchResponse",
|
|
fields={
|
|
"error": serializers.BooleanField(),
|
|
"message": serializers.CharField(),
|
|
},
|
|
)
|
|
},
|
|
)
|
|
def patch(self, request, pk, format=None):
|
|
"""Handle partial updates to a comment."""
|
|
params = request.data
|
|
obj = self.get_object(pk)
|
|
if (
|
|
request.profile.role == "ADMIN"
|
|
or request.user.is_superuser
|
|
or request.profile == obj.commented_by
|
|
):
|
|
serializer = LeadCommentSerializer(obj, data=params, partial=True)
|
|
if serializer.is_valid():
|
|
serializer.save()
|
|
return Response(
|
|
{"error": False, "message": "Comment Updated"},
|
|
status=status.HTTP_200_OK,
|
|
)
|
|
return Response(
|
|
{"error": True, "errors": serializer.errors},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|
|
return Response(
|
|
{
|
|
"error": True,
|
|
"errors": "You don't have permission to perform this action",
|
|
},
|
|
status=status.HTTP_403_FORBIDDEN,
|
|
)
|
|
|
|
@extend_schema(
|
|
tags=["Leads"],
|
|
parameters=swagger_params.organization_params,
|
|
responses={
|
|
200: inline_serializer(
|
|
name="LeadCommentDeleteResponse",
|
|
fields={
|
|
"error": serializers.BooleanField(),
|
|
"message": serializers.CharField(),
|
|
},
|
|
)
|
|
},
|
|
)
|
|
def delete(self, request, pk, format=None):
|
|
self.object = self.get_object(pk)
|
|
if (
|
|
request.profile.role == "ADMIN"
|
|
or request.user.is_superuser
|
|
or request.profile == self.object.commented_by
|
|
):
|
|
self.object.delete()
|
|
return Response(
|
|
{"error": False, "message": "Comment Deleted Successfully"},
|
|
status=status.HTTP_200_OK,
|
|
)
|
|
|
|
return Response(
|
|
{
|
|
"error": True,
|
|
"errors": "You do not have permission to perform this action",
|
|
},
|
|
status=status.HTTP_403_FORBIDDEN,
|
|
)
|
|
|
|
|
|
class LeadAttachmentView(APIView):
|
|
model = Attachments
|
|
permission_classes = (IsAuthenticated, HasOrgContext)
|
|
|
|
@extend_schema(
|
|
tags=["Leads"],
|
|
parameters=swagger_params.organization_params,
|
|
responses={
|
|
200: inline_serializer(
|
|
name="LeadAttachmentDeleteResponse",
|
|
fields={
|
|
"error": serializers.BooleanField(),
|
|
"message": serializers.CharField(),
|
|
},
|
|
)
|
|
},
|
|
)
|
|
def delete(self, request, pk, format=None):
|
|
self.object = self.model.objects.get(pk=pk)
|
|
if (
|
|
request.profile.role == "ADMIN"
|
|
or request.user.is_superuser
|
|
or request.profile.user == self.object.created_by
|
|
):
|
|
self.object.delete()
|
|
return Response(
|
|
{"error": False, "message": "Attachment Deleted Successfully"},
|
|
status=status.HTTP_200_OK,
|
|
)
|
|
return Response(
|
|
{
|
|
"error": True,
|
|
"errors": "You don't have permission to perform this action",
|
|
},
|
|
status=status.HTTP_403_FORBIDDEN,
|
|
)
|
|
|
|
|
|
class CreateLeadFromSite(APIView):
|
|
@extend_schema(
|
|
tags=["Leads"],
|
|
parameters=swagger_params.organization_params,
|
|
request=CreateLeadFromSiteSwaggerSerializer,
|
|
responses={
|
|
200: inline_serializer(
|
|
name="CreateLeadFromSiteResponse",
|
|
fields={
|
|
"error": serializers.BooleanField(),
|
|
"message": serializers.CharField(),
|
|
},
|
|
)
|
|
},
|
|
)
|
|
def post(self, request, *args, **kwargs):
|
|
params = request.data
|
|
api_key = params.get("apikey")
|
|
# api_setting = APISettings.objects.filter(
|
|
# website=website_address, apikey=api_key).first()
|
|
api_setting = APISettings.objects.filter(apikey=api_key).first()
|
|
if not api_setting:
|
|
return Response(
|
|
{
|
|
"error": True,
|
|
"message": "You don't have permission, please contact the admin!.",
|
|
},
|
|
status=status.HTTP_403_FORBIDDEN,
|
|
)
|
|
|
|
if api_setting and params.get("email"):
|
|
# user = User.objects.filter(is_admin=True, is_active=True).first()
|
|
user = api_setting.created_by
|
|
lead = Lead.objects.create(
|
|
salutation=params.get(
|
|
"title"
|
|
), # 'title' param maps to salutation for backwards compatibility
|
|
first_name=params.get("first_name"),
|
|
last_name=params.get("last_name"),
|
|
status="assigned",
|
|
source=api_setting.website,
|
|
description=params.get("message"),
|
|
email=params.get("email"),
|
|
phone=params.get("phone"),
|
|
is_active=True,
|
|
created_by=user,
|
|
org=api_setting.org,
|
|
)
|
|
lead.assigned_to.add(user)
|
|
# Send Email to Assigned Users
|
|
site_address = request.scheme + "://" + request.META["HTTP_HOST"]
|
|
send_lead_assigned_emails.delay(
|
|
lead.id, [user.id], site_address, str(api_setting.org.id)
|
|
)
|
|
# Create Contact
|
|
try:
|
|
contact = Contact.objects.create(
|
|
first_name=params.get("first_name") or "",
|
|
last_name=params.get("last_name") or "",
|
|
email=params.get("email"),
|
|
phone=params.get("phone"),
|
|
description=params.get("message"),
|
|
created_by=user,
|
|
is_active=True,
|
|
org=api_setting.org,
|
|
)
|
|
contact.assigned_to.add(user)
|
|
|
|
lead.contacts.add(contact)
|
|
except Exception:
|
|
pass
|
|
|
|
return Response(
|
|
{"error": False, "message": "Lead Created sucessfully."},
|
|
status=status.HTTP_200_OK,
|
|
)
|
|
return Response(
|
|
{"error": True, "message": "Invalid data"},
|
|
status=status.HTTP_400_BAD_REQUEST,
|
|
)
|