46 lines
2.7 KiB
Python
46 lines
2.7 KiB
Python
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})
|