This commit is contained in:
ismail 2025-07-29 16:42:43 +03:00
parent 85a0b8e827
commit 7a0079e25d
14 changed files with 45 additions and 44 deletions

View File

@ -142,10 +142,11 @@ class StaffForm(forms.ModelForm):
queryset=CustomGroup.objects.all(), queryset=CustomGroup.objects.all(),
required=True, required=True,
) )
name = forms.CharField(
label=_("Full Name"))
class Meta: class Meta:
model = Staff model = Staff
fields = ["name", "arabic_name", "phone_number", "address", "logo", "group"] fields = ["first_name","last_name","name", "arabic_name", "phone_number", "address", "logo", "group"]
# Dealer Form # Dealer Form

View File

@ -1278,6 +1278,8 @@ class Staff(models.Model, LocalizedNameMixin):
StaffMember, on_delete=models.CASCADE, related_name="staff" StaffMember, on_delete=models.CASCADE, related_name="staff"
) )
dealer = models.ForeignKey(Dealer, on_delete=models.CASCADE, related_name="staff") dealer = models.ForeignKey(Dealer, on_delete=models.CASCADE, related_name="staff")
first_name = models.CharField(max_length=255, verbose_name=_("First Name"))
last_name = models.CharField(max_length=255, verbose_name=_("Last Name"))
name = models.CharField(max_length=255, verbose_name=_("Name")) name = models.CharField(max_length=255, verbose_name=_("Name"))
arabic_name = models.CharField(max_length=255, verbose_name=_("Arabic Name")) arabic_name = models.CharField(max_length=255, verbose_name=_("Arabic Name"))
phone_number = PhoneNumberField(region="SA", verbose_name=_("Phone Number")) phone_number = PhoneNumberField(region="SA", verbose_name=_("Phone Number"))
@ -2000,6 +2002,8 @@ class Lead(models.Model):
.order_by("-updated") .order_by("-updated")
.first() .first()
) )
def get_absolute_url(self):
return reverse("lead_detail", args=[self.slug])
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
if not self.slug: if not self.slug:

View File

@ -914,7 +914,7 @@ class SearchCodeView(LoginRequiredMixin, View):
) )
car = get_object_or_404(models.Car, vin=code) car = get_object_or_404(models.Car, vin=code)
logger.info( logger.info(
f"Successfully found car (VIN: {code}, ID: {car.id}) based on scanned code for user: {request.user.username}." f"Successfully found car (VIN: {code}, ID: {car.pk}) based on scanned code for user: {request.user.username}."
) )
return JsonResponse( return JsonResponse(
{ {
@ -3405,6 +3405,7 @@ class UserCreateView(
return form return form
def form_valid(self, form): def form_valid(self, form):
staff = form.save(commit=False)
dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"]) dealer = get_object_or_404(models.Dealer, slug=self.kwargs["dealer_slug"])
if dealer.is_staff_exceed_quota_limit: if dealer.is_staff_exceed_quota_limit:
messages.error( messages.error(
@ -3426,14 +3427,13 @@ class UserCreateView(
return redirect("user_create", dealer_slug=dealer.slug) return redirect("user_create", dealer_slug=dealer.slug)
password = "Tenhal@123" password = "Tenhal@123"
user = User.objects.create_user(username=email, email=email, password=password) user = User.objects.create_user(first_name=staff.first_name, last_name=staff.last_name, username=email, email=email, password=password)
user.is_staff = True user.is_staff = True
user.save() user.save()
staff_member = StaffMember.objects.create(user=user) staff_member = StaffMember.objects.create(user=user)
for service in form.cleaned_data["service_offered"]: for service in form.cleaned_data["service_offered"]:
staff_member.services_offered.add(service) staff_member.services_offered.add(service)
staff = form.save(commit=False)
staff.staff_member = staff_member staff.staff_member = staff_member
staff.dealer = dealer staff.dealer = dealer
staff.save() staff.save()

Binary file not shown.

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

View File

@ -18,7 +18,7 @@
</div> </div>
<div class="card-body bg-light-subtle"> <div class="card-body bg-light-subtle">
<form method="post" enctype="multipart/form-data" class="needs-validation" novalidate> <form hx-boost="false" method="post" enctype="multipart/form-data" class="needs-validation" novalidate>
{% csrf_token %} {% csrf_token %}
{{ form|crispy }} {{ form|crispy }}
<hr class="my-2"> <hr class="my-2">

View File

@ -40,7 +40,6 @@
<div class="empty-state-container"> <div class="empty-state-container">
<!-- Empty State Illustration --> <!-- Empty State Illustration -->
{% if image %} {% if image %}
{% static image as final_image_path %} {% static image as final_image_path %}
{% else %} {% else %}

View File

@ -504,7 +504,7 @@
</li> </li>
{% else %} {% else %}
<li class="nav-item"> <li class="nav-item">
<a class="nav-link px-3 d-block" href="{% url 'appointment:user_profile' request.user.id %}"> <span class="me-2 text-body align-bottom" data-feather="user"></span><span>{% translate 'profile'|capfirst %}</span></a> <a hx-boost="false" class="nav-link px-3 d-block" href="{% url 'appointment:user_profile' request.user.id %}"> <span class="me-2 text-body align-bottom" data-feather="user"></span><span>{% translate 'profile'|capfirst %}</span></a>
</li> </li>
{% endif %} {% endif %}
{% if request.is_dealer %} {% if request.is_dealer %}

View File

@ -19,8 +19,8 @@
<script src="{% static 'vendors/zxing/index.min.js' %}"></script> <script src="{% static 'vendors/zxing/index.min.js' %}"></script>
<script src="{% static 'vendors/tesseract/tesseract.min.js' %}"></script> <script src="{% static 'vendors/tesseract/tesseract.min.js' %}"></script>
{% if not vendor_exists %} {% if not vendor_exists %}
{% url "vendor_create" request.dealer.slug as create_vendor_url %} {% url "user_create" request.dealer.slug as create_vendor_url %}
{% include "message-illustration.html" with value1="Please Add A Vendor, Before Adding A Car." value2="Create Vendor" message_image="images/empty/vendor2.png" url=create_vendor_url %} {% include "empty-illustration-page.html" with value="Vendor" url=create_vendor_url %}
{% endif %} {% endif %}
<!----> <!---->
<div class="row justify-content-center mt-5 mb-3 {% if not vendor_exists %}d-none{% endif %}" hx-boost="false"> <div class="row justify-content-center mt-5 mb-3 {% if not vendor_exists %}d-none{% endif %}" hx-boost="false">
@ -332,16 +332,17 @@
{% block customJS %} {% block customJS %}
<script> <script>
// Global variables // Global variables
let codeReader;
let currentStream = null;
const csrfToken = getCookie("csrftoken");
const ajaxUrl = "{% url 'ajax_handler' request.dealer.slug %}";
// Initialize when page loads and after HTMX swaps // Initialize when page loads and after HTMX swaps
document.addEventListener('DOMContentLoaded', initPage); document.addEventListener('DOMContentLoaded', initPage);
document.addEventListener('htmx:afterSwap', initPage); document.addEventListener('htmx:afterSwap', initPage);
function initPage() { function initPage() {
let codeReader;
let currentStream = null;
const csrfToken = getCookie("csrftoken");
const ajaxUrl = "{% url 'ajax_handler' request.dealer.slug %}";
// Get DOM elements // Get DOM elements
const elements = { const elements = {
vinInput: document.getElementById("{{ form.vin.id_for_label }}"), vinInput: document.getElementById("{{ form.vin.id_for_label }}"),

View File

@ -125,16 +125,15 @@
<div class="row"> <div class="row">
<div class="col"> <div class="col">
{% if not items %} {% if not items %}
{% url "car_add" request.dealer.slug as create_car_url %}
{% url "car_add" request.dealer.slug as create_car_url %} {% include "message-illustration.html" with value1="Please add at least one car before creating a quotation." value2="Add car" message_image="images/logos/no-content-new.jpg" url=create_car_url %}
{% include "message-illustration.html" with value1="Please add at least one car before creating a quotation." value2="Add car" message_image="images/empty/no_car.png" url=create_car_url %}
{% endif %} {% endif %}
</div> </div>
<div class="col"> <div class="col">
{% if not customer_count %} {% if not customer_count %}
{% url "customer_create" request.dealer.slug as create_customer_url %} {% url "customer_create" request.dealer.slug as create_customer_url %}
{% include "message-illustration.html" with value1="Please add at least one customer before creating a quotation." value2="Add Customer" message_image="images/empty/no_estimate.png" url=create_customer_url %} {% include "message-illustration.html" with value1="Please add at least one customer before creating a quotation." value2="Add Customer" message_image="images/logos/no-content-new.jpg" url=create_customer_url %}
{% endif %} {% endif %}
</div> </div>
<div> <div>

View File

@ -18,7 +18,6 @@
<div class="card shadow-sm border-0 rounded-3"> <div class="card shadow-sm border-0 rounded-3">
<div class="card-header bg-gray-200 py-3 border-0 rounded-top-3"> <div class="card-header bg-gray-200 py-3 border-0 rounded-top-3">
<h3 class="mb-0 fs-4 text-center"> <h3 class="mb-0 fs-4 text-center">
{% if staff.created %} {% if staff.created %}
{{ _("Edit Staff") }} {{ _("Edit Staff") }}
{% else %} {% else %}
@ -31,6 +30,8 @@
<form class="row g-3 mb-3" method="post" class="form" novalidate> <form class="row g-3 mb-3" method="post" class="form" novalidate>
{% csrf_token %} {% csrf_token %}
{{ redirect_field }} {{ redirect_field }}
{{ form.first_name|as_crispy_field }}
{{ form.last_name|as_crispy_field }}
{{ form.name|as_crispy_field }} {{ form.name|as_crispy_field }}
{{ form.arabic_name|as_crispy_field }} {{ form.arabic_name|as_crispy_field }}
{{ form.email|as_crispy_field }} {{ form.email|as_crispy_field }}

View File

@ -20,7 +20,7 @@
{% else %} {% else %}
{% url "pricing_page" request.dealer.slug as pricing_page_url %} {% url "pricing_page" request.dealer.slug as pricing_page_url %}
{% include "message-illustration.html" with value1="No Active Plan, please create your subscription plan." value2="Manage Subscription" message_image="images/messages/haikal_plan_message.jpg" url=pricing_page_url %} {% include "message-illustration.html" with value1="No Active Plan, please create your subscription plan." value2="Manage Subscription" url=pricing_page_url %}
{% endif %} {% endif %}
</div> </div>
@ -82,17 +82,13 @@
</section> </section>
{% else %} {% else %}
{% if request.user.userplan %} {% if request.user.userplan %}
{% url "user_create" request.dealer.slug as create_staff_url %} {% url "user_create" request.dealer.slug as create_staff_url %}
{% include "empty-illustration-page.html" with value="staff" url=create_staff_url image="images/no_content/no_user.png"%} {% include "empty-illustration-page.html" with value="staff" url=create_staff_url %}
{% else %} {% else %}
{% url "pricing_page" request.dealer.slug as pricing_page_url %} {% url "pricing_page" request.dealer.slug as pricing_page_url %}
{% include "message-illustration.html" with value1="No Active Plan, please create your subscription plan." value2="Buy Plan" message_image="images/no_content/no_plan.jpg" url=pricing_page_url %} {% include "message-illustration.html" with value1="No Active Plan, please create your subscription plan." value2="Buy Plan" url=pricing_page_url %}
{% endif %} {% endif %}
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@ -166,6 +166,6 @@
{% else %} {% else %}
{% url "vendor_create" request.dealer.slug as create_vendor_url %} {% url "vendor_create" request.dealer.slug as create_vendor_url %}
{% include "empty-illustration-page.html" with value="vendor" url=create_vendor_url image="images/no_content/no_vendor.png" %} {% include "empty-illustration-page.html" with value="vendor" url=create_vendor_url %}
{% endif %} {% endif %}
{% endblock %} {% endblock %}