from django.core import signing from django.contrib import messages from django.core.exceptions import PermissionDenied, ValidationError from django.shortcuts import get_object_or_404, redirect, render from django.views.decorators.cache import never_cache from django.views.decorators.http import require_http_methods from .dispatch_responses import can_open_responses, open_dispatch_responses, render_opening_sms, response_control from .models import GroupDispatch from apps.notifications.models import SMSTemplate from .views import staff_required @staff_required @require_http_methods(["GET", "POST"]) @never_cache def open_responses(request, public_id): dispatch = get_object_or_404(GroupDispatch.objects.select_related("unit"), public_id=public_id) control = response_control(dispatch) if not control or control.mode != "SEALED" or not can_open_responses(request.user, dispatch): raise PermissionDenied if control.opened_at: return redirect("staff_tickets:dispatch_detail", public_id=public_id) if request.method == "POST": try: proof = signing.loads(request.POST.get("confirmation", ""), salt="dispatch-opening", max_age=600) if proof["user"] != request.user.pk or proof["dispatch"] != str(public_id): raise signing.BadSignature open_dispatch_responses(dispatch, request.user, proof["sms"]) except (signing.BadSignature, KeyError): messages.error(request, "تأیید معتبر نیست یا مهلت آن پایان یافته؛ دوباره بررسی کنید.") except (ValidationError, ValueError, SMSTemplate.DoesNotExist) as error: messages.error(request, str(error)) else: messages.success(request, "پاسخ‌ها هم‌زمان بازگشایی شدند؛ وضعیت پیامک را در گزارش بررسی کنید.") return redirect("staff_tickets:dispatch_detail", public_id=public_id) try: sms = render_opening_sms(dispatch) if control.notify_sms else "" except (SMSTemplate.DoesNotExist, ValueError): messages.error(request, "قالب پیامک بازگشایی معتبر یا فعال نیست؛ تنظیمات قالب را بررسی کنید.") return redirect("staff_tickets:dispatch_detail", public_id=public_id) from .dispatch_responses import _respondents proof = signing.dumps({"user": request.user.pk, "dispatch": str(public_id), "sms": sms}, salt="dispatch-opening") return render(request, "tickets/dispatch_open_confirm.html", {"dispatch": dispatch, "control": control, "opening_sms": sms, "respondent_count": len(_respondents(dispatch)), "confirmation": proof})