Add profile drop down and clean up sidebar

This commit is contained in:
aminhashemi92 2025-09-07 11:43:46 +03:30
parent 525a2a9378
commit 7a153c46e6
6 changed files with 50 additions and 111 deletions

View file

@ -64,21 +64,18 @@ layout-wide customizer-hide
<span class="app-brand-text demo text-body fw-bold">سامانه شفافیت</span> <span class="app-brand-text demo text-body fw-bold">سامانه شفافیت</span>
</a> </a>
</div> </div>
<!-- /Logo -->
<h4 class="mb-2">Welcome to Sneat! 👋</h4>
<p class="mb-4">Please sign-in to your account and start the adventure</p>
<form id="formAuthentication" class="mb-3 fv-plugins-bootstrap5 fv-plugins-framework" method="post" novalidate="novalidate"> <form id="formAuthentication" class="mb-3 fv-plugins-bootstrap5 fv-plugins-framework" method="post" novalidate="novalidate">
{% csrf_token %} {% csrf_token %}
<div class="mb-3 fv-plugins-icon-container"> <div class="mb-3 fv-plugins-icon-container">
<label for="email" class="form-label">Email or Username</label> <label for="email" class="form-label">نام کاربری</label>
<input type="text" class="form-control" id="email" name="username" placeholder="Enter your email or username" autofocus=""> <input type="text" class="form-control" id="email" name="username" placeholder="Enter your email or username" autofocus="">
<div class="fv-plugins-message-container fv-plugins-message-container--enabled invalid-feedback"></div></div> <div class="fv-plugins-message-container fv-plugins-message-container--enabled invalid-feedback"></div></div>
<div class="mb-3 form-password-toggle fv-plugins-icon-container"> <div class="mb-3 form-password-toggle fv-plugins-icon-container">
<div class="d-flex justify-content-between"> <div class="d-flex justify-content-between">
<label class="form-label" for="password">Password</label> <label class="form-label" for="password">رمز عبور</label>
<a href="auth-forgot-password-basic.html"> <a href="auth-forgot-password-basic.html">
<small>Forgot Password?</small> <small>رمز عبور را فراموش کرده اید؟</small>
</a> </a>
</div> </div>
<div class="input-group input-group-merge has-validation"> <div class="input-group input-group-merge has-validation">
@ -86,43 +83,12 @@ layout-wide customizer-hide
<span class="input-group-text cursor-pointer"><i class="bx bx-hide"></i></span> <span class="input-group-text cursor-pointer"><i class="bx bx-hide"></i></span>
</div><div class="fv-plugins-message-container fv-plugins-message-container--enabled invalid-feedback"></div> </div><div class="fv-plugins-message-container fv-plugins-message-container--enabled invalid-feedback"></div>
</div> </div>
<div class="mb-3"> <div class="mb-3">
<div class="form-check"> <button class="btn btn-primary d-grid w-100" type="submit">ورود</button>
<input class="form-check-input" type="checkbox" id="remember-me">
<label class="form-check-label" for="remember-me">
Remember Me
</label>
</div>
</div>
<div class="mb-3">
<button class="btn btn-primary d-grid w-100" type="submit">Sign in</button>
</div> </div>
<input type="hidden"></form> <input type="hidden"></form>
<p class="text-center">
<span>New on our platform?</span>
<a href="auth-register-basic.html">
<span>Create an account</span>
</a>
</p>
<div class="divider my-4">
<div class="divider-text">or</div>
</div>
<div class="d-flex justify-content-center">
<a href="javascript:;" class="btn btn-icon btn-label-facebook me-3">
<i class="tf-icons bx bxl-facebook"></i>
</a>
<a href="javascript:;" class="btn btn-icon btn-label-google-plus me-3">
<i class="tf-icons bx bxl-google-plus"></i>
</a>
<a href="javascript:;" class="btn btn-icon btn-label-twitter">
<i class="tf-icons bx bxl-twitter"></i>
</a>
</div>
</div> </div>
</div> </div>
<!-- /Register --> <!-- /Register -->

View file

@ -1,10 +1,11 @@
from django.urls import path from django.urls import path
from accounts.views import login_view, dashboard, customer_list, add_customer_ajax, edit_customer_ajax, get_customer_data from accounts.views import login_view, dashboard, customer_list, add_customer_ajax, edit_customer_ajax, get_customer_data, logout_view
app_name = "accounts" app_name = "accounts"
urlpatterns = [ urlpatterns = [
path('login/', login_view, name='login'), path('login/', login_view, name='login'),
path('logout/', logout_view, name='logout'),
path('dashboard/', dashboard, name='dashboard'), path('dashboard/', dashboard, name='dashboard'),
path('customers/', customer_list, name='customer_list'), path('customers/', customer_list, name='customer_list'),
path('customers/add/', add_customer_ajax, name='add_customer_ajax'), path('customers/add/', add_customer_ajax, name='add_customer_ajax'),

View file

@ -1,11 +1,11 @@
from django.contrib import messages from django.contrib import messages
from django.contrib.auth import login, authenticate from django.contrib.auth import login, authenticate, logout
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from django.http import JsonResponse from django.http import JsonResponse
from django.views.decorators.http import require_POST, require_GET from django.views.decorators.http import require_POST, require_GET
from django.views.decorators.csrf import csrf_exempt from django.views.decorators.csrf import csrf_exempt
from django import forms from django import forms
from django.contrib.auth.decorators import login_required
from accounts.models import Profile from accounts.models import Profile
from accounts.forms import CustomerForm from accounts.forms import CustomerForm
from common.consts import UserRoles from common.consts import UserRoles
@ -21,15 +21,12 @@ def login_view(request):
username = request.POST.get("username") username = request.POST.get("username")
password = request.POST.get("password") password = request.POST.get("password")
user = authenticate(request, username=username, password=password) user = authenticate(request, username=username, password=password)
# if user is not None: if user is not None:
# login(request, user) login(request, user)
# if user.profile.has_none_of([UserRoles.MANAGER]): return redirect("processes:request_list")
# return redirect("dashboard:dashboard") else:
# else: messages.error(request, "کاربری با این مشخصات یافت نشد!")
# return redirect("dashboard:admin_dashboard") return redirect("accounts:login")
# else:
# messages.error(request, "کاربری با این مشخصات یافت نشد!")
# return redirect("accounts:login")
return render(request, "accounts/login.html") return render(request, "accounts/login.html")
@ -37,7 +34,7 @@ def dashboard(request):
return render(request, "accounts/dashboard.html") return render(request, "accounts/dashboard.html")
@login_required
def customer_list(request): def customer_list(request):
# Get all profiles that have customer role # Get all profiles that have customer role
customers = Profile.objects.filter(roles__slug=UserRoles.CUSTOMER.value, is_deleted=False).select_related('user') customers = Profile.objects.filter(roles__slug=UserRoles.CUSTOMER.value, is_deleted=False).select_related('user')
@ -163,3 +160,9 @@ def get_customer_data(request, customer_id):
}, },
'form_html': form_html 'form_html': form_html
}) })
def logout_view(request):
"""Log out current user and redirect to login page."""
logout(request)
return redirect("accounts:login")

Binary file not shown.

View file

@ -35,7 +35,7 @@ id="layout-navbar">
<!-- /Language --> <!-- /Language -->
<!-- Quick links --> <!-- Quick links -->
<li class="nav-item dropdown-shortcuts navbar-dropdown dropdown me-2 me-xl-0"> <li class="nav-item dropdown-shortcuts navbar-dropdown dropdown me-2 me-xl-0 d-none">
<a class="nav-link dropdown-toggle hide-arrow" href="#" data-bs-toggle="dropdown" <a class="nav-link dropdown-toggle hide-arrow" href="#" data-bs-toggle="dropdown"
data-bs-auto-close="outside" aria-expanded="false"> data-bs-auto-close="outside" aria-expanded="false">
<i class='bx bx-grid-alt bx-sm'></i> <i class='bx bx-grid-alt bx-sm'></i>
@ -127,17 +127,17 @@ id="layout-navbar">
<ul class="dropdown-menu dropdown-menu-end dropdown-styles"> <ul class="dropdown-menu dropdown-menu-end dropdown-styles">
<li> <li>
<a class="dropdown-item" href="#" data-theme="light"> <a class="dropdown-item" href="#" data-theme="light">
<span class="align-middle"><i class='bx bx-sun me-2'></i>Light</span> <span class="align-middle"><i class='bx bx-sun me-2'></i>روشن</span>
</a> </a>
</li> </li>
<li> <li>
<a class="dropdown-item" href="#" data-theme="dark"> <a class="dropdown-item" href="#" data-theme="dark">
<span class="align-middle"><i class="bx bx-moon me-2"></i>Dark</span> <span class="align-middle"><i class="bx bx-moon me-2"></i>تاریک</span>
</a> </a>
</li> </li>
<li> <li>
<a class="dropdown-item" href="#" data-theme="system"> <a class="dropdown-item" href="#" data-theme="system">
<span class="align-middle"><i class="bx bx-desktop me-2"></i>System</span> <span class="align-middle"><i class="bx bx-desktop me-2"></i>سیستم</span>
</a> </a>
</li> </li>
</ul> </ul>
@ -146,7 +146,7 @@ id="layout-navbar">
<!-- Notification --> <!-- Notification -->
<li class="nav-item dropdown-notifications navbar-dropdown dropdown me-3 me-xl-1"> <li class="nav-item dropdown-notifications navbar-dropdown dropdown me-3 me-xl-1 d-none">
<a class="nav-link dropdown-toggle hide-arrow" href="#" data-bs-toggle="dropdown" <a class="nav-link dropdown-toggle hide-arrow" href="#" data-bs-toggle="dropdown"
data-bs-auto-close="outside" aria-expanded="false"> data-bs-auto-close="outside" aria-expanded="false">
<i class="bx bx-bell bx-sm"></i> <i class="bx bx-bell bx-sm"></i>
@ -306,24 +306,6 @@ id="layout-navbar">
</div> </div>
</div> </div>
</li> </li>
<li class="list-group-item list-group-item-action dropdown-notifications-item marked-as-read">
<div class="d-flex">
<div class="flex-shrink-0 me-3">
<div class="avatar">
<span class="avatar-initial rounded-circle bg-label-warning"><i class="bx bx-error"></i></span>
</div>
</div>
<div class="flex-grow-1">
<h6 class="mb-1">CPU is running high</h6>
<p class="mb-0">CPU Utilization Percent is currently at 88.63%,</p>
<small class="text-muted">5 days ago</small>
</div>
<div class="flex-shrink-0 dropdown-notifications-actions">
<a href="javascript:void(0)" class="dropdown-notifications-read"><span class="badge badge-dot"></span></a>
<a href="javascript:void(0)" class="dropdown-notifications-archive"><span class="bx bx-x"></span></a>
</div>
</div>
</li>
</ul> </ul>
</li> </li>
<li class="dropdown-menu-footer border-top p-3"> <li class="dropdown-menu-footer border-top p-3">
@ -332,25 +314,36 @@ id="layout-navbar">
</ul> </ul>
</li> </li>
<!--/ Notification --> <!--/ Notification -->
<!-- User --> <!-- User -->
<li class="nav-item navbar-dropdown dropdown-user dropdown"> <li class="nav-item navbar-dropdown dropdown-user dropdown">
<a class="nav-link dropdown-toggle hide-arrow" href="#" data-bs-toggle="dropdown"> <a class="nav-link dropdown-toggle hide-arrow" href="#" data-bs-toggle="dropdown">
<div class="avatar avatar-online"> <div class="avatar avatar-online">
<img src="{% static 'assets/img/avatars/1.png' %}" alt class="w-px-40 h-auto rounded-circle"> {% if request.user.is_authenticated and request.user.profile and request.user.profile.pic %}
<img src="{{ request.user.profile.pic.url }}" alt class="w-px-40 h-auto rounded-circle">
{% else %}
<img src="{% static 'assets/img/avatars/1.png' %}" alt class="w-px-40 h-auto rounded-circle">
{% endif %}
</div> </div>
</a> </a>
<ul class="dropdown-menu dropdown-menu-end"> <ul class="dropdown-menu dropdown-menu-end">
<li> <li>
<a class="dropdown-item" href="pages-account-settings-account.html"> <a class="dropdown-item" href="#">
<div class="d-flex"> <div class="d-flex">
<div class="flex-shrink-0 me-3"> <div class="flex-shrink-0 me-3">
<div class="avatar avatar-online"> <div class="avatar avatar-online">
<img src="{% static 'assets/img/avatars/1.png' %}" alt class="w-px-40 h-auto rounded-circle"> {% if request.user.is_authenticated and request.user.profile and request.user.profile.pic %}
<img src="{{ request.user.profile.pic.url }}" alt class="w-px-40 h-auto rounded-circle">
{% else %}
<img src="{% static 'assets/img/avatars/1.png' %}" alt class="w-px-40 h-auto rounded-circle">
{% endif %}
</div> </div>
</div> </div>
<div class="flex-grow-1"> <div class="flex-grow-1">
<span class="fw-medium d-block">John Doe</span> <span class="fw-medium d-block">{{ request.user.get_full_name|default:request.user.username }}</span>
<small class="text-muted">Admin</small> {% if request.user.profile %}
<small class="text-muted">{{ request.user.profile.roles_str }}</small>
{% endif %}
</div> </div>
</div> </div>
</a> </a>
@ -359,48 +352,24 @@ id="layout-navbar">
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
</li> </li>
<li> <li>
<a class="dropdown-item" href="pages-profile-user.html"> <a class="dropdown-item" href="#">
<i class="bx bx-user me-2"></i> <i class="bx bx-user me-2"></i>
<span class="align-middle">My Profile</span> <span class="align-middle">پروفایل</span>
</a> </a>
</li> </li>
<li> <li>
<a class="dropdown-item" href="pages-account-settings-account.html"> <a class="dropdown-item" href="#">
<i class="bx bx-cog me-2"></i> <i class="bx bx-cog me-2"></i>
<span class="align-middle">Settings</span> <span class="align-middle">تنظیمات</span>
</a>
</li>
<li>
<a class="dropdown-item" href="pages-account-settings-billing.html">
<span class="d-flex align-items-center align-middle">
<i class="flex-shrink-0 bx bx-credit-card me-2"></i>
<span class="flex-grow-1 align-middle">Billing</span>
<span class="flex-shrink-0 badge badge-center rounded-pill bg-danger w-px-20 h-px-20">4</span>
</span>
</a> </a>
</li> </li>
<li> <li>
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
</li> </li>
<li> <li>
<a class="dropdown-item" href="pages-faq.html"> <a class="dropdown-item" href="{% url 'accounts:logout' %}">
<i class="bx bx-help-circle me-2"></i>
<span class="align-middle">FAQ</span>
</a>
</li>
<li>
<a class="dropdown-item" href="pages-pricing.html">
<i class="bx bx-dollar me-2"></i>
<span class="align-middle">Pricing</span>
</a>
</li>
<li>
<div class="dropdown-divider"></div>
</li>
<li>
<a class="dropdown-item" href="auth-login-cover.html" target="_blank">
<i class="bx bx-power-off me-2"></i> <i class="bx bx-power-off me-2"></i>
<span class="align-middle">Log Out</span> <span class="align-middle">خروج</span>
</a> </a>
</li> </li>
</ul> </ul>

View file

@ -63,7 +63,7 @@
<ul class="menu-inner py-1"> <ul class="menu-inner py-1">
<!-- Dashboards --> <!-- Dashboards -->
<li class="menu-item"> <li class="menu-item d-none">
<a href="#" class="menu-link menu-toggle"> <a href="#" class="menu-link menu-toggle">
<i class="menu-icon tf-icons bx bx-home-circle"></i> <i class="menu-icon tf-icons bx bx-home-circle"></i>
<div class="text-truncate">داشبورد</div> <div class="text-truncate">داشبورد</div>