Source code for concurrency.views
from typing import NoReturn
from django.http import HttpResponse
from django.template import loader, TemplateDoesNotExist
from django.template.base import Template
from django.utils.translation import gettext as _
from concurrency.exceptions import RecordModifiedError
class ConflictResponse(HttpResponse):
status_code = 409
def callback(target, *args, **kwargs) -> NoReturn:
raise RecordModifiedError(_("Record has been modified"), target=target)
[docs]
def conflict(request, target=None, template_name="409.html"):
"""409 error handler.
:param request: Request
:param template_name: `409.html`
:param target: The model to save
"""
try:
template = loader.get_template(template_name)
except TemplateDoesNotExist: # pragma: no cover
template = Template(
"<h1>Conflict</h1>"
"<p>The request was unsuccessful due to a conflict. "
"The object changed during the transaction.</p>"
)
try:
saved = target.__class__._default_manager.get(pk=target.pk)
except target.__class__.DoesNotExist: # pragma: no cover
saved = None
ctx = {"target": target, "saved": saved, "request_path": request.path}
return ConflictResponse(template.render(ctx))