Merge branch 'main' of http://10.10.1.136:3000/ismail/haikal into frontend
This commit is contained in:
commit
1ca769d451
@ -1958,7 +1958,7 @@ class Opportunity(models.Model):
|
||||
loss_reason = models.CharField(max_length=255, blank=True, null=True)
|
||||
|
||||
def get_notes(self):
|
||||
return self._get_filter(Notes)
|
||||
return self._get_filter(Notes).order_by("-created")
|
||||
def get_activities(self):
|
||||
return self._get_filter(Activity)
|
||||
|
||||
@ -1968,7 +1968,7 @@ class Opportunity(models.Model):
|
||||
def get_schedules(self):
|
||||
return self.lead.get_all_schedules().filter(
|
||||
scheduled_at__gt=timezone.now()
|
||||
)
|
||||
).order_by("scheduled_at")
|
||||
|
||||
def get_emails(self):
|
||||
return self._get_filter(Email)
|
||||
@ -1980,7 +1980,7 @@ class Opportunity(models.Model):
|
||||
lead_objects = Model.objects.filter(
|
||||
content_type__model="lead", object_id=self.lead.id
|
||||
)
|
||||
objects = objects.union(lead_objects)
|
||||
objects = objects.union(lead_objects).order_by("-created")
|
||||
return objects
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
|
||||
@ -26,7 +26,7 @@ from django.db.models import Q
|
||||
from django.conf import settings
|
||||
from django.db.models import Func
|
||||
from django.contrib import messages
|
||||
from django.http import Http404, JsonResponse, HttpResponseForbidden
|
||||
from django.http import Http404, HttpResponseRedirect, JsonResponse, HttpResponseForbidden
|
||||
from django.forms import HiddenInput, ValidationError
|
||||
from django.shortcuts import HttpResponse
|
||||
|
||||
@ -5220,13 +5220,7 @@ def schedule_lead(request, slug):
|
||||
|
||||
instance.customer = lead.get_customer_model()
|
||||
|
||||
# Create AppointmentRequest
|
||||
# service,_ = Service.objects.get_or_create(name=instance.scheduled_type,duration=datetime.timedelta(minutes=10),price=0)
|
||||
service = Service.objects.get(name=instance.scheduled_type)
|
||||
# service = Service.objects.filter(name=instance.scheduled_type).first()
|
||||
# if not service:
|
||||
# messages.error(request, "Service not found!")
|
||||
# return redirect("lead_list")
|
||||
|
||||
try:
|
||||
appointment_request = AppointmentRequest.objects.create(
|
||||
@ -5251,13 +5245,16 @@ def schedule_lead(request, slug):
|
||||
|
||||
instance.save()
|
||||
messages.success(
|
||||
request, _("Lead scheduled and appointment created successfully")
|
||||
request, _("Appointment Created Successfully")
|
||||
)
|
||||
return redirect("lead_list")
|
||||
try:
|
||||
if lead.opportunity:
|
||||
return redirect("opportunity_detail", slug=lead.opportunity.slug)
|
||||
except models.Lead.opportunity.RelatedObjectDoesNotExist:
|
||||
return redirect("lead_list")
|
||||
else:
|
||||
messages.error(request, f"Invalid form data: {str(form.errors)}")
|
||||
return redirect("lead_list")
|
||||
|
||||
return redirect("schedule_lead", slug=lead.slug)
|
||||
form = forms.ScheduleForm()
|
||||
return render(request, "crm/leads/schedule_lead.html", {"lead": lead, "form": form})
|
||||
|
||||
@ -5330,9 +5327,16 @@ def send_lead_email(request, slug, email_pk=None):
|
||||
activity_type=models.ActionChoices.EMAIL,
|
||||
)
|
||||
messages.success(request, _("Email Draft successfully"))
|
||||
response = HttpResponse(redirect("lead_detail", slug=lead.slug))
|
||||
response["HX-Redirect"] = reverse("lead_detail", args=[lead.slug])
|
||||
return response
|
||||
try:
|
||||
if lead.opportunity:
|
||||
response = HttpResponse(redirect("opportunity_detail", slug=lead.opportunity.slug))
|
||||
response["HX-Redirect"] = reverse("opportunity_detail", args=[lead.opportunity.slug])
|
||||
else:
|
||||
response = HttpResponse(redirect("lead_detail", slug=lead.slug))
|
||||
response["HX-Redirect"] = reverse("lead_detail", args=[lead.slug])
|
||||
return response
|
||||
except models.Lead.opportunity.RelatedObjectDoesNotExist:
|
||||
return redirect("lead_list")
|
||||
|
||||
if request.method == "POST":
|
||||
email_pk = request.POST.get("email_pk")
|
||||
@ -5365,7 +5369,11 @@ def send_lead_email(request, slug, email_pk=None):
|
||||
activity_type=models.ActionChoices.EMAIL,
|
||||
)
|
||||
messages.success(request, _("Email sent successfully"))
|
||||
return redirect("lead_list")
|
||||
try:
|
||||
if lead.opportunity:
|
||||
return redirect("opportunity_detail", slug=lead.opportunity.slug)
|
||||
except models.Lead.opportunity.RelatedObjectDoesNotExist:
|
||||
return redirect("lead_list")
|
||||
msg = f"""
|
||||
السلام عليكم
|
||||
Dear {lead.full_name},
|
||||
|
||||
@ -26,7 +26,7 @@
|
||||
</div>
|
||||
<div class="d-flex justify-content-between align-items-center">
|
||||
<div class="d-flex gap-2">
|
||||
<a href="{% url 'lead_detail' lead.slug %}" class="btn btn-link text-body fs-10 text-decoration-none">Discard</a>
|
||||
<a href="{{ request.META.HTTP_REFERER }}" class="btn btn-link text-body fs-10 text-decoration-none">Discard</a>
|
||||
<a hx-boost="true" hx-push-url='false' hx-include="#message,#subject,#to" href="{% url 'send_lead_email' lead.slug %}?status=draft" class="btn btn-secondary text-white fs-10 text-decoration-none">Save as Draft</a>
|
||||
<button class="btn btn-primary fs-10" type="submit">Send<span class="fa-solid fa-paper-plane ms-1"></span></button>
|
||||
</div>
|
||||
|
||||
@ -76,27 +76,20 @@
|
||||
<div class="card-body">
|
||||
<h4 class="mb-5 d-flex align-items-center"><span class="d-inline-block lh-sm me-1" data-feather="link" style="height:16px;width:16px;"></span> {{ _("Upcoming Events")}}</h4>
|
||||
<div class="row g-3">
|
||||
<div class="col-12">
|
||||
{% for event in opportunity.get_schedules %}
|
||||
<table class="table table-sm table-borderless mb-4">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">{{ _("Type") }}</th>
|
||||
<th scope="col">{{ _("Purpose") }}</th>
|
||||
<th scope="col">{{ _("Scheduled At") }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td>{{ event.scheduled_type|capfirst }}</td>
|
||||
<td>{{ event.purpose }}</td>
|
||||
<td>{{ event.scheduled_at|naturaltime|capfirst }}</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
{% empty %}
|
||||
<p>{{ _("No Invoice") }}</p>
|
||||
{% endfor %}
|
||||
<div class="col-12 overflow-auto" style="max-height: 200px;">
|
||||
<ul class="list-group list-group-flush">
|
||||
{% for event in opportunity.get_schedules %}
|
||||
<li class="list-group-item d-flex justify-content-between align-items-center">
|
||||
<div class="d-flex align-items-center">
|
||||
<span class="badge rounded-pill bg-phoenix-primary text-primary me-2 fs-9">{{ event.scheduled_type|capfirst }}</span>
|
||||
<span class="fs-9">{{ event.purpose }}</span>
|
||||
</div>
|
||||
<div class="fs-9">{{ event.scheduled_at|naturaltime|capfirst }}</div>
|
||||
</li>
|
||||
{% empty %}
|
||||
<li class="list-group-item text-center fs-9">{{ _("No upcoming events") }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -510,6 +503,14 @@
|
||||
</div>
|
||||
<div class="tab-pane fade" id="tab-emails" role="tabpanel" aria-labelledby="emails-tab">
|
||||
<h2 class="mb-4">Emails</h2>
|
||||
<div class="d-flex justify-content-end">
|
||||
<a href="{% url 'send_lead_email' opportunity.lead.slug %}">
|
||||
<button type="button" class="btn btn-sm btn-phoenix-primary">
|
||||
<span class="fas fa-plus me-1"></span>
|
||||
{% trans 'Send Email' %}
|
||||
</button>
|
||||
</a>
|
||||
</div>
|
||||
<div>
|
||||
<div class="scrollbar">
|
||||
<ul class="nav nav-underline fs-9 flex-nowrap mb-1" id="emailTab" role="tablist">
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user