Merge branch 'main' of http://10.10.1.136:3000/ismail/haikal into frontend

This commit is contained in:
Faheedkhan 2025-06-01 17:39:47 +03:00
commit 1ca769d451
4 changed files with 49 additions and 40 deletions

View File

@ -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):

View File

@ -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},

View File

@ -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>

View File

@ -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">