staff profile page
This commit is contained in:
parent
7e9b5af912
commit
095885c9b7
@ -1290,6 +1290,10 @@ urlpatterns = [
|
||||
|
||||
path('<slug:dealer_slug>/schedules/calendar/', views.schedule_calendar, name='schedule_calendar'),
|
||||
|
||||
# staff profile
|
||||
path('<slug:dealer_slug>/staff/<slug:slug>detail/', views.StaffDetailView.as_view(), name='staff_detail'),
|
||||
|
||||
|
||||
]
|
||||
|
||||
handler404 = "inventory.views.custom_page_not_found_view"
|
||||
|
||||
@ -2197,6 +2197,35 @@ class DealerUpdateView(
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse("dealer_detail", kwargs={"slug": self.object.slug})
|
||||
|
||||
class StaffDetailView(LoginRequiredMixin, DetailView):
|
||||
"""
|
||||
Represents a detailed view for a Dealer model.
|
||||
|
||||
This class extends Django's `DetailView` to provide a detailed view of a dealer.
|
||||
It includes additional context data such as the count of staff members, cars
|
||||
associated with the dealer, available car makes, and dynamically fetched quotas.
|
||||
The class also ensures that users must be logged in to access the detailed view.
|
||||
|
||||
:ivar model: The model associated with this view (Dealer model).
|
||||
:type model: django.db.models.Model
|
||||
:ivar template_name: Path to the template used to render the view.
|
||||
:type template_name: str
|
||||
:ivar context_object_name: The name used to refer to the object in the template context.
|
||||
:type context_object_name: str
|
||||
"""
|
||||
|
||||
model = models.Staff
|
||||
template_name = "staff/staff_detail.html"
|
||||
context_object_name = "staff"
|
||||
|
||||
|
||||
|
||||
def dealer_vat_rate_update(request, slug):
|
||||
dealer = get_object_or_404(models.Dealer, slug=slug)
|
||||
models.VatRate.objects.filter(dealer=dealer).update(rate=request.POST.get("rate"))
|
||||
messages.success(request, _("VAT rate updated successfully"))
|
||||
return redirect("dealer_detail", slug=slug)
|
||||
|
||||
|
||||
class CustomerListView(LoginRequiredMixin, PermissionRequiredMixin, ListView):
|
||||
|
||||
@ -504,7 +504,7 @@
|
||||
</li>
|
||||
{% else %}
|
||||
<li class="nav-item">
|
||||
<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>
|
||||
<a hx-boost="false" class="nav-link px-3 d-block" href="{% url 'staff_detail' request.dealer.slug request.staff.slug %}"> <span class="me-2 text-body align-bottom" data-feather="user"></span><span>{% translate 'profile'|capfirst %}</span></a>
|
||||
</li>
|
||||
{% endif %}
|
||||
{% if request.is_dealer %}
|
||||
@ -530,7 +530,7 @@
|
||||
</li>
|
||||
{% if request.is_staff %}
|
||||
<li class="nav-item">
|
||||
<a hx-boost="false" class="nav-link px-3 d-block" href="{% url 'appointment:get_user_appointments' %}"> <span class="me-2 text-body align-bottom" data-feather="calendar"></span>{{ _("My Calendar") }}</a>
|
||||
<a hx-boost="false" class="nav-link px-3 d-block" href="{% url 'schedule_calendar' request.dealer.slug%}"> <span class="me-2 text-body align-bottom" data-feather="calendar"></span>{{ _("My Calendar") }}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<!--<li class="nav-item"><a class="nav-link px-3 d-block" href=""> Language</a></li>-->
|
||||
|
||||
107
templates/staff/staff_detail.html
Normal file
107
templates/staff/staff_detail.html
Normal file
@ -0,0 +1,107 @@
|
||||
{% extends 'base.html' %}
|
||||
{% load i18n static custom_filters crispy_forms_filters %}
|
||||
{% block title %}
|
||||
{% trans 'Profile' %} {% endblock %}
|
||||
{% block content %}
|
||||
<div class="container-fluid">
|
||||
<div class="row align-items-center justify-content-between g-3 mb-4">
|
||||
<div class="col-auto">
|
||||
<h2 class="mb-0">{% trans 'Profile' %}</h2>
|
||||
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<div class="row g-2 g-sm-3">
|
||||
<div class="col-auto">
|
||||
<a class="btn btn-phoenix-primary"
|
||||
href="{% url 'user_update' request.dealer.slug request.staff.slug %}"><span class="fas fa-edit me-2 text-primary"></span>{{ _("Edit") }} </a>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<a href="{% url 'staff_password_reset' request.dealer.slug staff.user.pk %}" 'staff_password_reset' request.dealer.slug user_.pk
|
||||
class="btn btn-phoenix-danger"><span class="fas fa-key me-2"></span>{{ _("Change Password") }}</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row g-3">
|
||||
<div class="col-12 col-lg-8">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<div class="border-bottom border-dashed pb-4">
|
||||
<div class="row align-items-center g-3 g-sm-5 text-center text-sm-start">
|
||||
<div class="col-12 col-sm-auto">
|
||||
<input class="d-none" id="avatarFile" type="file" />
|
||||
<label class="cursor-pointer avatar avatar-5xl" for="avatarFile">
|
||||
{% if staff.logo %}
|
||||
<img src="{{ staff.logo.url }}"
|
||||
alt="{{ staff.get_local_name }}"
|
||||
class="rounded-circle"
|
||||
style="max-width: 150px" />
|
||||
{% else %}
|
||||
<span class="rounded-circle feather feather-user text-body-tertiary"
|
||||
style="max-width: 150px"></span>
|
||||
<img src="{% static 'images/logos/logo.png' %}"
|
||||
alt="{{ staff.get_local_name }}"
|
||||
class=""
|
||||
style="max-width: 150px" />
|
||||
{% endif %}
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-sm-auto flex-1">
|
||||
<h3>{{ staff.get_local_name }}</h3>
|
||||
<p class="text-body-secondary">{{staff.user.groups.name}}</p>
|
||||
<p class="text-body-secondary">{% trans 'Joined' %} {{ staff.created|timesince }} {% trans 'ago' %}</p>
|
||||
<div></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="d-flex flex-between-center pt-4">
|
||||
<div>
|
||||
<h6 class="mb-2 text-body-secondary">{% trans 'last login'|capfirst %}</h6>
|
||||
<h4 class="fs-7 text-body-highlight mb-0">{{ staff.user.last_login|date:"D M d, Y H:i" }}</h4>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-12 col-lg-4">
|
||||
<div class="card h-100">
|
||||
<div class="card-body">
|
||||
<div class="border-bottom border-dashed">
|
||||
<h4 class="mb-3">{% trans 'Default Address' %}</h4>
|
||||
</div>
|
||||
<div class="pt-4 mb-7 mb-lg-4 mb-xl-7">
|
||||
<div class="row justify-content-between">
|
||||
<div class="col-auto">
|
||||
<h5 class="text-body-highlight">{% trans 'Address' %}</h5>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<p class="text-body-secondary">{{ staff.address }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="border-top border-dashed pt-4">
|
||||
<div class="row flex-between-center mb-2">
|
||||
<div class="col-auto">
|
||||
<h5 class="text-body-highlight mb-0">{% trans 'Email' %}</h5>
|
||||
</div>
|
||||
<div class="col-auto">{{ staff.user.email }}</div>
|
||||
</div>
|
||||
<div class="row flex-between-center">
|
||||
<div class="col-auto">
|
||||
<h5 class="text-body-highlight mb-0">{% trans 'Phone' %}</h5>
|
||||
</div>
|
||||
<div class="col-auto" dir="ltr">{{ staff.phone_number }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
|
||||
|
||||
@ -98,7 +98,7 @@
|
||||
<i class="fa-regular fa-circle-left"></i>
|
||||
</a>
|
||||
<a class="btn btn-sm btn-phoenix-secondary"
|
||||
href="{% url 'staff_password_reset' request.dealer.slug user_.pk %}">
|
||||
href="{% url 'staff_password_reset' request.dealer.slug %}">
|
||||
{{ _("Reset Password") }}
|
||||
<i class="fa-solid fa-key"></i>
|
||||
</a>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user