error_handlers.py 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  1. from django.contrib import messages
  2. def handle_protectederror(obj, request, e):
  3. """
  4. Generate a user-friendly error message in response to a ProtectedError exception.
  5. """
  6. try:
  7. dep_class = e.protected_objects[0]._meta.verbose_name_plural
  8. except IndexError:
  9. raise e
  10. # Grammar for single versus multiple triggering objects
  11. if type(obj) in (list, tuple):
  12. err_message = u"Unable to delete the requested {}. The following dependent {} were found: ".format(
  13. obj[0]._meta.verbose_name_plural,
  14. dep_class,
  15. )
  16. else:
  17. err_message = u"Unable to delete {} {}. The following dependent {} were found: ".format(
  18. obj._meta.verbose_name,
  19. obj,
  20. dep_class,
  21. )
  22. # Append dependent objects to error message
  23. dependent_objects = []
  24. for o in e.protected_objects:
  25. if hasattr(o, 'get_absolute_url'):
  26. dependent_objects.append(u'<a href="{}">{}</a>'.format(o.get_absolute_url(), o))
  27. else:
  28. dependent_objects.append(str(o))
  29. err_message += u', '.join(dependent_objects)
  30. messages.error(request, err_message)