From e9dec3292c34ea8c521112b2b3d89facbfcfcf76 Mon Sep 17 00:00:00 2001 From: aminhashemi92 Date: Sat, 13 Sep 2025 12:08:50 +0330 Subject: [PATCH] add scope to filter data --- accounts/views.py | 12 +- certificates/views.py | 5 +- common/decorators.py | 2 +- contracts/views.py | 5 +- db.sqlite3 | Bin 3133440 -> 3149824 bytes installations/views.py | 5 +- invoices/views.py | 39 ++++-- .../templates/processes/request_list.html | 104 ++++++++++++++- processes/templatetags/processes_tags.py | 6 + processes/utils.py | 118 ++++++++++++++++++ processes/views.py | 100 +++++++++++++-- templates/sidebars/admin.html | 8 +- wells/views.py | 18 ++- 13 files changed, 386 insertions(+), 36 deletions(-) create mode 100644 processes/utils.py diff --git a/accounts/views.py b/accounts/views.py index 6a4f23c..beb49ff 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -8,7 +8,9 @@ from django import forms from django.contrib.auth.decorators import login_required from accounts.models import Profile from accounts.forms import CustomerForm +from processes.utils import scope_customers_queryset from common.consts import UserRoles +from common.decorators import allowed_roles # Create your views here. @@ -35,9 +37,11 @@ def dashboard(request): @login_required +@allowed_roles([UserRoles.ADMIN, UserRoles.BROKER, UserRoles.MANAGER, UserRoles.ACCOUNTANT]) def customer_list(request): # Get all profiles that have customer role - customers = Profile.objects.filter(roles__slug=UserRoles.CUSTOMER.value, is_deleted=False).select_related('user') + base = Profile.objects.filter(roles__slug=UserRoles.CUSTOMER.value, is_deleted=False).select_related('user') + customers = scope_customers_queryset(request.user, base) form = CustomerForm() return render(request, "accounts/customer_list.html", { @@ -47,6 +51,8 @@ def customer_list(request): @require_POST +@login_required +@allowed_roles([UserRoles.ADMIN, UserRoles.BROKER, UserRoles.MANAGER, UserRoles.ACCOUNTANT]) def add_customer_ajax(request): """AJAX endpoint for adding customers""" form = CustomerForm(request.POST, request.FILES) @@ -85,6 +91,8 @@ def add_customer_ajax(request): @require_POST +@login_required +@allowed_roles([UserRoles.ADMIN, UserRoles.BROKER, UserRoles.MANAGER, UserRoles.ACCOUNTANT]) def edit_customer_ajax(request, customer_id): customer = get_object_or_404(Profile, id=customer_id) form = CustomerForm(request.POST, request.FILES, instance=customer) @@ -122,6 +130,7 @@ def edit_customer_ajax(request, customer_id): }) @require_GET +@login_required def get_customer_data(request, customer_id): customer = get_object_or_404(Profile, id=customer_id) @@ -162,6 +171,7 @@ def get_customer_data(request, customer_id): }) +@login_required def logout_view(request): """Log out current user and redirect to login page.""" logout(request) diff --git a/certificates/views.py b/certificates/views.py index 8cfb704..ce6748e 100644 --- a/certificates/views.py +++ b/certificates/views.py @@ -12,6 +12,7 @@ from .models import CertificateTemplate, CertificateInstance from common.consts import UserRoles from _helpers.jalali import Gregorian +from processes.utils import get_scoped_instance_or_404 def _to_jalali(date_obj): @@ -46,7 +47,7 @@ def _render_template(template: CertificateTemplate, instance: ProcessInstance): @login_required def certificate_step(request, instance_id, step_id): - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) step = get_object_or_404(instance.process.steps, id=step_id) # Ensure all previous steps are completed and invoice settled prior_steps = instance.process.steps.filter(order__lt=instance.current_step.order if instance.current_step else 9999) @@ -128,7 +129,7 @@ def certificate_step(request, instance_id, step_id): @login_required def certificate_print(request, instance_id): - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) cert = CertificateInstance.objects.filter(process_instance=instance).order_by('-created').first() template = cert.template if cert else None return render(request, 'certificates/print.html', { diff --git a/common/decorators.py b/common/decorators.py index 7ac7259..7493abe 100644 --- a/common/decorators.py +++ b/common/decorators.py @@ -3,7 +3,7 @@ from functools import wraps from django.http import JsonResponse, HttpResponse from django.shortcuts import redirect -from extensions.consts import UserRoles +from common.consts import UserRoles def require_ajax(view_func): diff --git a/contracts/views.py b/contracts/views.py index 7a1788b..87c8ff2 100644 --- a/contracts/views.py +++ b/contracts/views.py @@ -11,6 +11,7 @@ from .models import ContractTemplate, ContractInstance from invoices.models import Invoice, Quote from _helpers.utils import jalali_converter2 from django.http import JsonResponse +from processes.utils import get_scoped_instance_or_404 def build_contract_context(instance: ProcessInstance) -> dict: @@ -52,7 +53,7 @@ def build_contract_context(instance: ProcessInstance) -> dict: @login_required def contract_step(request, instance_id, step_id): - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) # Resolve step navigation step = get_object_or_404(instance.process.steps, id=step_id) previous_step = instance.process.steps.filter(order__lt=step.order).last() @@ -117,7 +118,7 @@ def contract_step(request, instance_id, step_id): @login_required def contract_print(request, instance_id): - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) contract = get_object_or_404(ContractInstance, process_instance=instance) return render(request, 'contracts/contract_print.html', { 'instance': instance, diff --git a/db.sqlite3 b/db.sqlite3 index 2808c83c43ecd3107913cfbc223f6ce5d7ceabdd..425dfa988dbcf6613dac0124066761ed3ba42579 100644 GIT binary patch delta 115059 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

|S6TQUWopW#M@jT3dNOUNCxBpQ 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 TuwQyePrReb3Uzo?X=eTfVOSI% diff --git a/installations/views.py b/installations/views.py index ac27db9..008135b 100644 --- a/installations/views.py +++ b/installations/views.py @@ -10,10 +10,11 @@ from accounts.models import Role from invoices.models import Item, Quote, QuoteItem from .models import InstallationAssignment, InstallationReport, InstallationPhoto, InstallationItemChange from decimal import Decimal, InvalidOperation +from processes.utils import get_scoped_instance_or_404 @login_required def installation_assign_step(request, instance_id, step_id): - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) step = get_object_or_404(instance.process.steps, id=step_id) previous_step = instance.process.steps.filter(order__lt=step.order).last() next_step = instance.process.steps.filter(order__gt=step.order).first() @@ -104,7 +105,7 @@ def create_item_changes_for_report(report, remove_map, add_map, quote_price_map) @login_required def installation_report_step(request, instance_id, step_id): - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) step = get_object_or_404(instance.process.steps, id=step_id) previous_step = instance.process.steps.filter(order__lt=step.order).last() diff --git a/invoices/views.py b/invoices/views.py index 8820598..7e01a51 100644 --- a/invoices/views.py +++ b/invoices/views.py @@ -14,11 +14,15 @@ from accounts.models import Role from common.consts import UserRoles from .models import Item, Quote, QuoteItem, Payment, Invoice, InvoiceItem from installations.models import InstallationReport, InstallationItemChange - +from processes.utils import get_scoped_instance_or_404 @login_required def quote_step(request, instance_id, step_id): """مرحله انتخاب اقلام و ساخت پیش‌فاکتور""" + # Enforce scoped access to prevent URL tampering + instance = get_scoped_instance_or_404(request, instance_id) + + # Enforce scoped access to prevent URL tampering instance = get_object_or_404( ProcessInstance.objects.select_related('process', 'well', 'requester', 'representative', 'representative__profile'), id=instance_id @@ -68,7 +72,7 @@ def quote_step(request, instance_id, step_id): @login_required def create_quote(request, instance_id, step_id): """ساخت/بروزرسانی پیش‌فاکتور از اقلام انتخابی""" - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) step = get_object_or_404(instance.process.steps, id=step_id) # enforce permission: only BROKER can create/update quote profile = getattr(request.user, 'profile', None) @@ -219,6 +223,9 @@ def create_quote(request, instance_id, step_id): @login_required def quote_preview_step(request, instance_id, step_id): """مرحله صدور پیش‌فاکتور - نمایش و تایید فاکتور""" + # Enforce scoped access to prevent URL tampering + instance = get_scoped_instance_or_404(request, instance_id) + instance = get_object_or_404( ProcessInstance.objects.select_related('process', 'well', 'requester', 'representative', 'representative__profile', 'broker', 'broker__company', 'broker__affairs', 'broker__affairs__county', 'broker__affairs__county__city'), id=instance_id @@ -261,7 +268,7 @@ def quote_preview_step(request, instance_id, step_id): @login_required def quote_print(request, instance_id): """صفحه پرینت پیش‌فاکتور""" - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) quote = get_object_or_404(Quote, process_instance=instance) return render(request, 'invoices/quote_print.html', { @@ -274,7 +281,7 @@ def quote_print(request, instance_id): @login_required def approve_quote(request, instance_id, step_id): """تایید پیش‌فاکتور و انتقال به مرحله بعدی""" - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) step = get_object_or_404(instance.process.steps, id=step_id) quote = get_object_or_404(Quote, process_instance=instance) # enforce permission: only BROKER can approve @@ -316,6 +323,9 @@ def approve_quote(request, instance_id, step_id): @login_required def quote_payment_step(request, instance_id, step_id): """مرحله سوم: ثبت فیش‌های واریزی پیش‌فاکتور""" + # Enforce scoped access to prevent URL tampering + instance = get_scoped_instance_or_404(request, instance_id) + instance = get_object_or_404( ProcessInstance.objects.select_related('process', 'well', 'requester', 'representative', 'representative__profile'), id=instance_id @@ -449,7 +459,7 @@ def quote_payment_step(request, instance_id, step_id): @login_required def add_quote_payment(request, instance_id, step_id): """افزودن فیش واریزی جدید برای پیش‌فاکتور""" - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) step = get_object_or_404(instance.process.steps, id=step_id) quote = get_object_or_404(Quote, process_instance=instance) invoice, _ = Invoice.objects.get_or_create( @@ -564,7 +574,7 @@ def add_quote_payment(request, instance_id, step_id): @require_POST @login_required def delete_quote_payment(request, instance_id, step_id, payment_id): - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) step = get_object_or_404(instance.process.steps, id=step_id) quote = get_object_or_404(Quote, process_instance=instance) invoice = Invoice.objects.filter(quote=quote).first() @@ -632,6 +642,9 @@ def delete_quote_payment(request, instance_id, step_id, payment_id): @login_required def final_invoice_step(request, instance_id, step_id): """تجمیع اقلام پیش‌فاکتور با تغییرات نصب و صدور فاکتور نهایی""" + # Enforce scoped access to prevent URL tampering + instance = get_scoped_instance_or_404(request, instance_id) + instance = get_object_or_404( ProcessInstance.objects.select_related('process', 'well', 'requester', 'representative', 'representative__profile'), id=instance_id @@ -770,7 +783,7 @@ def final_invoice_step(request, instance_id, step_id): @login_required def final_invoice_print(request, instance_id): - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) invoice = get_object_or_404(Invoice, process_instance=instance) items = invoice.items.select_related('item').filter(is_deleted=False).all() return render(request, 'invoices/final_invoice_print.html', { @@ -783,7 +796,7 @@ def final_invoice_print(request, instance_id): @require_POST @login_required def approve_final_invoice(request, instance_id, step_id): - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) step = get_object_or_404(instance.process.steps, id=step_id) invoice = get_object_or_404(Invoice, process_instance=instance) # only MANAGER can approve @@ -811,7 +824,7 @@ def approve_final_invoice(request, instance_id, step_id): @login_required def add_special_charge(request, instance_id, step_id): """افزودن هزینه ویژه تعمیر/تعویض به فاکتور نهایی به‌صورت آیتم جداگانه""" - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) invoice = get_object_or_404(Invoice, process_instance=instance) # only MANAGER can add special charges try: @@ -848,7 +861,7 @@ def add_special_charge(request, instance_id, step_id): @require_POST @login_required def delete_special_charge(request, instance_id, step_id, item_id): - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) invoice = get_object_or_404(Invoice, process_instance=instance) # only MANAGER can delete special charges try: @@ -870,7 +883,7 @@ def delete_special_charge(request, instance_id, step_id, item_id): @login_required def final_settlement_step(request, instance_id, step_id): - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) step = get_object_or_404(instance.process.steps, id=step_id) if not instance.can_access_step(step): @@ -976,7 +989,7 @@ def final_settlement_step(request, instance_id, step_id): @require_POST @login_required def add_final_payment(request, instance_id, step_id): - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) step = get_object_or_404(instance.process.steps, id=step_id) invoice = get_object_or_404(Invoice, process_instance=instance) # Only BROKER can add final settlement payments @@ -1093,7 +1106,7 @@ def add_final_payment(request, instance_id, step_id): @require_POST @login_required def delete_final_payment(request, instance_id, step_id, payment_id): - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, instance_id) step = get_object_or_404(instance.process.steps, id=step_id) invoice = get_object_or_404(Invoice, process_instance=instance) payment = get_object_or_404(Payment, id=payment_id, invoice=invoice) diff --git a/processes/templates/processes/request_list.html b/processes/templates/processes/request_list.html index feb1294..611a8de 100644 --- a/processes/templates/processes/request_list.html +++ b/processes/templates/processes/request_list.html @@ -1,5 +1,6 @@ {% extends '_base.html' %} {% load static %} +{% load accounts_tags %} {% block sidebar %} {% include 'sidebars/admin.html' %} @@ -43,10 +44,12 @@ + {% if request.user|is_broker %} + {% endif %} @@ -132,6 +135,91 @@ + {% if access_denied %} +

+ {% endif %} + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + + + حذف فیلتر + +
+
+
+
@@ -178,7 +266,7 @@ - + {% empty %} - + + + + + + + + + + + {% endfor %} diff --git a/processes/templatetags/processes_tags.py b/processes/templatetags/processes_tags.py index 0922e3c..5ee7b2f 100644 --- a/processes/templatetags/processes_tags.py +++ b/processes/templatetags/processes_tags.py @@ -1,6 +1,7 @@ from django import template from django.utils.safestring import mark_safe from ..models import ProcessInstance, StepInstance +from ..utils import count_incomplete_instances register = template.Library() @@ -104,3 +105,8 @@ def instance_info(instance, modal_id=None): title="اطلاعات کامل چاه و نماینده"> ''' return mark_safe(html) + + +@register.simple_tag +def incomplete_requests_count(user): + return count_incomplete_instances(user) diff --git a/processes/utils.py b/processes/utils.py new file mode 100644 index 0000000..951398e --- /dev/null +++ b/processes/utils.py @@ -0,0 +1,118 @@ +from django.shortcuts import get_object_or_404 +from .models import ProcessInstance +from common.consts import UserRoles + + +def scope_instances_queryset(user, queryset=None): + """Return a queryset of ProcessInstance scoped by the user's role. + + If no profile/role, returns an empty queryset. + """ + qs = queryset if queryset is not None else ProcessInstance.objects.all() + profile = getattr(user, 'profile', None) + if not profile: + return qs.none() + try: + if profile.has_role(UserRoles.INSTALLER): + # Only instances assigned to this installer + from installations.models import InstallationAssignment + assign_ids = InstallationAssignment.objects.filter(installer=user).values_list('process_instance', flat=True) + return qs.filter(id__in=assign_ids) + if profile.has_role(UserRoles.BROKER): + return qs.filter(broker=profile.broker) + if profile.has_role(UserRoles.ACCOUNTANT) or profile.has_role(UserRoles.MANAGER): + return qs.filter(broker__affairs__county=profile.county) + if profile.has_role(UserRoles.ADMIN): + return qs + # if profile.has_role(UserRoles.WATER_RESOURCE_MANAGER) or profile.has_role(UserRoles.HEADQUARTER): + # return qs.filter(well__county=profile.county) + # Fallback: no special scope + # return qs + except Exception: + return qs.none() + + +def count_incomplete_instances(user): + """Count non-completed, non-deleted requests within the user's scope.""" + base = ProcessInstance.objects.select_related('well').filter(is_deleted=False).exclude(status='completed') + return scope_instances_queryset(user, base).count() + + +def user_can_access_instance(user, instance: ProcessInstance) -> bool: + """Check if user can access a specific instance based on scoping rules.""" + try: + scoped = scope_instances_queryset(user, ProcessInstance.objects.filter(id=instance.id)) + return scoped.exists() + except Exception: + return False + + +def get_scoped_instance_or_404(request, instance_id: int) -> ProcessInstance: + """Return instance only if it's within the user's scope; otherwise 404. + + Use this in any view receiving instance_id from URL to prevent URL tampering. + """ + base = ProcessInstance.objects.filter(is_deleted=False) + qs = scope_instances_queryset(request.user, base) + return get_object_or_404(qs, id=instance_id) + + +def scope_wells_queryset(user, queryset=None): + """Return a queryset of Well scoped by the user's role (parity with instances).""" + try: + from wells.models import Well + qs = queryset if queryset is not None else Well.objects.all() + profile = getattr(user, 'profile', None) + if not profile: + return qs.none() + if profile.has_role(UserRoles.ADMIN): + return qs + if profile.has_role(UserRoles.BROKER): + return qs.filter(broker=profile.broker) + if profile.has_role(UserRoles.ACCOUNTANT) or profile.has_role(UserRoles.MANAGER): + return qs.filter(broker__affairs__county=profile.county) + if profile.has_role(UserRoles.INSTALLER): + # Wells that have instances assigned to this installer + from installations.models import InstallationAssignment + assign_ids = InstallationAssignment.objects.filter(installer=user).values_list('process_instance', flat=True) + inst_qs = ProcessInstance.objects.filter(id__in=assign_ids) + return qs.filter(process_instances__in=inst_qs).distinct() + # Fallback + return qs.none() + except Exception: + return qs.none() if 'qs' in locals() else [] + + +def scope_customers_queryset(user, queryset=None): + """Return a queryset of customer Profiles scoped by user's role. + + Assumes queryset is Profiles already filtered to customers, otherwise we filter here. + """ + try: + from accounts.models import Profile + qs = queryset if queryset is not None else Profile.objects.all() + # Ensure we're only looking at customer profiles + from common.consts import UserRoles as UR + qs = qs.filter(roles__slug=UR.CUSTOMER.value, is_deleted=False) + + profile = getattr(user, 'profile', None) + if not profile: + return qs.none() + if profile.has_role(UserRoles.ADMIN): + return qs + if profile.has_role(UserRoles.BROKER): + return qs.filter(broker=profile.broker) + if profile.has_role(UserRoles.ACCOUNTANT) or profile.has_role(UserRoles.MANAGER): + return qs.filter(county=profile.county) + if profile.has_role(UserRoles.INSTALLER): + # Customers that are representatives of instances assigned to this installer + from installations.models import InstallationAssignment + assign_ids = InstallationAssignment.objects.filter(installer=user).values_list('process_instance', flat=True) + rep_ids = ProcessInstance.objects.filter(id__in=assign_ids).values_list('representative', flat=True) + return qs.filter(user_id__in=rep_ids) + # Fallback + return qs.none() + except Exception: + return qs.none() if 'qs' in locals() else [] + + diff --git a/processes/views.py b/processes/views.py index f84e826..38ad946 100644 --- a/processes/views.py +++ b/processes/views.py @@ -7,19 +7,62 @@ from django.http import JsonResponse from django.views.decorators.http import require_POST, require_GET from django.db import transaction from django.contrib.auth import get_user_model -from .models import Process, ProcessInstance, StepInstance +from .models import Process, ProcessInstance, StepInstance, ProcessStep +from .utils import scope_instances_queryset, get_scoped_instance_or_404 +from installations.models import InstallationAssignment from wells.models import Well -from accounts.models import Profile +from accounts.models import Profile, Broker +from locations.models import Affairs from accounts.forms import CustomerForm from wells.forms import WellForm from wells.models import WaterMeterManufacturer +from common.consts import UserRoles @login_required def request_list(request): """نمایش لیست درخواست‌ها با جدول و مدال ایجاد""" - instances = ProcessInstance.objects.select_related('well', 'representative', 'requester').prefetch_related('step_instances__step').filter(is_deleted=False).order_by('-created') + instances = ProcessInstance.objects.select_related('well', 'representative', 'requester', 'broker', 'current_step', 'process').prefetch_related('step_instances__step').filter(is_deleted=False).order_by('-created') + access_denied = False + + # filter by roles (scoped queryset) + try: + instances = scope_instances_queryset(request.user, instances) + if not instances.exists() and not getattr(request.user, 'profile', None): + access_denied = True + instances = instances.none() + except Exception: + access_denied = True + instances = instances.none() + + # Filters + status_q = (request.GET.get('status') or '').strip() + affairs_q = (request.GET.get('affairs') or '').strip() + broker_q = (request.GET.get('broker') or '').strip() + step_q = (request.GET.get('step') or '').strip() + + if status_q: + instances = instances.filter(status=status_q) + if affairs_q: + try: + instances = instances.filter(well__affairs_id=int(affairs_q)) + except Exception: + pass + if broker_q: + try: + instances = instances.filter(broker_id=int(broker_q)) + except Exception: + pass + if step_q: + try: + instances = instances.filter(current_step_id=int(step_q)) + except Exception: + pass processes = Process.objects.filter(is_active=True) + status_choices = list(ProcessInstance.STATUS_CHOICES) + affairs_list = Affairs.objects.all().order_by('name') + brokers_list = Broker.objects.all().order_by('name') + steps_list = ProcessStep.objects.select_related('process').all().order_by('process__name', 'order') manufacturers = WaterMeterManufacturer.objects.all().order_by('name') # Calculate progress for each instance @@ -52,6 +95,16 @@ def request_list(request): 'completed_count': completed_count, 'in_progress_count': in_progress_count, 'pending_count': pending_count, + # filter context + 'status_choices': status_choices, + 'affairs_list': affairs_list, + 'brokers_list': brokers_list, + 'steps_list': steps_list, + 'filter_status': status_q, + 'filter_affairs': affairs_q, + 'filter_broker': broker_q, + 'filter_step': step_q, + 'access_denied': access_denied, }) @@ -125,6 +178,13 @@ def lookup_representative_by_national_code(request): def create_request_with_entities(request): """ایجاد/به‌روزرسانی چاه و نماینده و سپس ایجاد درخواست""" User = get_user_model() + # Only BROKER can create requests + try: + if not (hasattr(request.user, 'profile') and request.user.profile.has_role(UserRoles.BROKER)): + return JsonResponse({'ok': False, 'error': 'فقط کارگزار مجاز به ایجاد درخواست است'}, status=403) + except Exception: + return JsonResponse({'ok': False, 'error': 'فقط کارگزار مجاز به ایجاد درخواست است'}, status=403) + process_id = request.POST.get('process') process = Process.objects.get(id=process_id) description = request.POST.get('description', '') @@ -230,6 +290,14 @@ def create_request_with_entities(request): well.broker = current_profile.broker well.save() + # Ensure no active (non-deleted, non-completed) request exists for this well + try: + active_exists = ProcessInstance.objects.filter(well=well, is_deleted=False).exclude(status='completed').exists() + if active_exists: + return JsonResponse({'ok': False, 'error': 'برای این چاه یک درخواست جاری وجود دارد. ابتدا آن را تکمیل یا حذف کنید.'}, status=400) + except Exception: + return JsonResponse({'ok': False, 'error': 'خطا در بررسی وضعیت درخواست‌های قبلی این چاه'}, status=400) + # Create request instance instance = ProcessInstance.objects.create( process=process, @@ -261,7 +329,17 @@ def create_request_with_entities(request): @login_required def delete_request(request, instance_id): """حذف درخواست""" - instance = get_object_or_404(ProcessInstance, id=instance_id) + instance = get_scoped_instance_or_404(request, 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({ @@ -278,10 +356,10 @@ def delete_request(request, instance_id): @login_required def step_detail(request, instance_id, step_id): """نمایش جزئیات مرحله خاص""" - instance = get_object_or_404( - ProcessInstance.objects.select_related('process', 'well', 'requester', 'representative', 'representative__profile'), - id=instance_id - ) + # Enforce scoped access to prevent URL tampering + instance = get_scoped_instance_or_404(request, instance_id) + # Prefetch for performance + instance = ProcessInstance.objects.select_related('process', 'well', 'requester', 'representative', 'representative__profile').get(id=instance.id) step = get_object_or_404(instance.process.steps, id=step_id) # If the request is already completed, redirect to read-only summary page if instance.status == 'completed': @@ -339,7 +417,8 @@ def step_detail(request, instance_id, step_id): @login_required def instance_steps(request, instance_id): """هدایت به مرحله فعلی instance""" - instance = get_object_or_404(ProcessInstance, id=instance_id) + # Enforce scoped access to prevent URL tampering + instance = get_scoped_instance_or_404(request, instance_id) if not instance.current_step: # اگر مرحله فعلی تعریف نشده، به اولین مرحله برو @@ -361,6 +440,9 @@ def instance_steps(request, instance_id): @login_required def instance_summary(request, instance_id): """نمای خلاصهٔ فقط‌خواندنی برای درخواست‌های تکمیل‌شده.""" + # Enforce scoped access to prevent URL tampering + instance = get_scoped_instance_or_404(request, instance_id) + instance = get_object_or_404(ProcessInstance.objects.select_related('well', 'representative'), id=instance_id) # Only show for completed requests; otherwise route to steps if instance.status != 'completed': diff --git a/templates/sidebars/admin.html b/templates/sidebars/admin.html index aacdf24..066c177 100644 --- a/templates/sidebars/admin.html +++ b/templates/sidebars/admin.html @@ -1,4 +1,5 @@ {% load static %} +{% load accounts_tags %}
{{ item.instance.get_status_display_with_color|safe }}{{ item.instance.jcreated }}{{ item.instance.jcreated_date }}
@@ -196,19 +284,31 @@ {% endif %} + {% if request.user|is_broker %}
  • حذف
  • + {% endif %}
    موردی ثبت نشده استموردی ثبت نشده است