add scope to filter data
This commit is contained in:
parent
394546dc67
commit
e9dec3292c
13 changed files with 386 additions and 36 deletions
|
@ -1,5 +1,6 @@
|
|||
{% extends '_base.html' %}
|
||||
{% load static %}
|
||||
{% load accounts_tags %}
|
||||
|
||||
{% block sidebar %}
|
||||
{% include 'sidebars/admin.html' %}
|
||||
|
@ -43,10 +44,12 @@
|
|||
</span>
|
||||
</span>
|
||||
</button>
|
||||
{% if request.user|is_broker %}
|
||||
<button class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#requestModal">
|
||||
<i class="bx bx-plus me-1"></i>
|
||||
درخواست جدید
|
||||
</button>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -132,6 +135,91 @@
|
|||
</div>
|
||||
</div>
|
||||
|
||||
{% if access_denied %}
|
||||
<div class="alert alert-warning d-flex align-items-center mb-3" role="alert">
|
||||
<i class="bx bx-info-circle me-2"></i>
|
||||
<div>شما به این بخش دسترسی ندارید.</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="card mb-3">
|
||||
<div class="card-body">
|
||||
<form method="get" class="row g-2 align-items-end">
|
||||
<div class="col-sm-6 col-md-3">
|
||||
<label class="form-label">وضعیت درخواست</label>
|
||||
<select class="form-select" name="status">
|
||||
<option value="">همه</option>
|
||||
{% for val, label in status_choices %}
|
||||
<option value="{{ val }}" {% if filter_status == val %}selected{% endif %}>{{ label }}</option>
|
||||
{% endfor %}@require_POST
|
||||
@login_required
|
||||
def delete_request(request, instance_id):
|
||||
"""حذف درخواست"""
|
||||
instance = get_object_or_404(ProcessInstance, id=instance_id)
|
||||
# Only BROKER can delete requests and only within their scope
|
||||
try:
|
||||
profile = getattr(request.user, 'profile', None)
|
||||
if not (profile and profile.has_role(UserRoles.BROKER)):
|
||||
return JsonResponse({'success': False, 'message': 'فقط کارگزار مجاز به حذف درخواست است'}, status=403)
|
||||
# Enforce ownership by broker (prevent deleting others' requests)
|
||||
if instance.broker_id and profile.broker and instance.broker_id != profile.broker.id:
|
||||
return JsonResponse({'success': False, 'message': 'شما مجاز به حذف این درخواست نیستید'}, status=403)
|
||||
except Exception:
|
||||
return JsonResponse({'success': False, 'message': 'فقط کارگزار مجاز به حذف درخواست است'}, status=403)
|
||||
code = instance.code
|
||||
if instance.status == 'completed':
|
||||
return JsonResponse({
|
||||
'success': False,
|
||||
'message': 'درخواست تکمیل شده نمیتواند حذف شود'
|
||||
})
|
||||
instance.delete()
|
||||
return JsonResponse({
|
||||
'success': True,
|
||||
'message': f'درخواست {code} با موفقیت حذف شد'
|
||||
})
|
||||
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-sm-6 col-md-3">
|
||||
<label class="form-label">امور</label>
|
||||
<select class="form-select" name="affairs">
|
||||
<option value="">همه</option>
|
||||
{% for a in affairs_list %}
|
||||
<option value="{{ a.id }}" {% if filter_affairs|default:''|stringformat:'s' == a.id|stringformat:'s' %}selected{% endif %}>{{ a.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-sm-6 col-md-3">
|
||||
<label class="form-label">کارگزار</label>
|
||||
<select class="form-select" name="broker">
|
||||
<option value="">همه</option>
|
||||
{% for b in brokers_list %}
|
||||
<option value="{{ b.id }}" {% if filter_broker|default:''|stringformat:'s' == b.id|stringformat:'s' %}selected{% endif %}>{{ b.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-sm-6 col-md-3">
|
||||
<label class="form-label">مرحله فعلی</label>
|
||||
<select class="form-select" name="step">
|
||||
<option value="">همه</option>
|
||||
{% for s in steps_list %}
|
||||
<option value="{{ s.id }}" {% if filter_step|default:''|stringformat:'s' == s.id|stringformat:'s' %}selected{% endif %}>{{ s.process.name }} - {{ s.name }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="col-12 d-flex gap-2 justify-content-end mt-3">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
<i class="bx bx-filter-alt me-1"></i>
|
||||
اعمال فیلتر
|
||||
</button>
|
||||
<a href="?" class="btn btn-outline-secondary">
|
||||
<i class="bx bx-x me-1"></i>
|
||||
حذف فیلتر
|
||||
</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-datatable table-responsive">
|
||||
<table id="requests-table" class="datatables-basic table border-top">
|
||||
|
@ -178,7 +266,7 @@
|
|||
</div>
|
||||
</td>
|
||||
<td>{{ item.instance.get_status_display_with_color|safe }}</td>
|
||||
<td>{{ item.instance.jcreated }}</td>
|
||||
<td>{{ item.instance.jcreated_date }}</td>
|
||||
<td>
|
||||
<div class="d-inline-block">
|
||||
<a href="javascript:;" class="btn btn-icon dropdown-toggle hide-arrow" data-bs-toggle="dropdown">
|
||||
|
@ -196,19 +284,31 @@
|
|||
</a>
|
||||
{% endif %}
|
||||
</li>
|
||||
{% if request.user|is_broker %}
|
||||
<div class="dropdown-divider"></div>
|
||||
<li>
|
||||
<a href="#" class="dropdown-item text-danger" data-instance-id="{{ item.instance.id }}" data-instance-code="{{ item.instance.code }}" onclick="deleteRequest(this.getAttribute('data-instance-id'), this.getAttribute('data-instance-code'))">
|
||||
<i class="bx bx-trash me-1"></i>حذف
|
||||
</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
{% empty %}
|
||||
<tr>
|
||||
<td colspan="11" class="text-center text-muted">موردی ثبت نشده است</td>
|
||||
<td class="text-center text-muted">موردی ثبت نشده است</td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue