docs: def process_action(self, request, queryset):
          """
          Deletes the object(s). Successful deletes are logged.
          Returns a 'render redirect' to the result of the
          `get_done_url` method.
  
          If a ProtectedError is raised, the `render` method
          is called with message explaining the error added
          to the context as `protected`.
          """
          count = 0
          try:
              with transaction.commit_on_success():
                  for obj in queryset:
                      self.log_action(obj, CMSLog.DELETE)
                      count += 1
                      obj.delete()
              msg = "%s object%s deleted." % (count, ('' if count ==1 else 's'))
              url = self.get_done_url()
              return self.render(request, redirect_url=url, message = msg)
          except ProtectedError, e:
              protected = []
              for x in e.protected_objects:
                  if hasattr(x, 'delete_blocked_message'):
                      protected.append(x.delete_blocked_message())
                  else:
                      protected.append(u"%s - %s" % (x._meta.verbose_name, x))
              msg = "Cannot delete some objects because the following objects depend on them:"
              return self.render(request, error_msg = msg, errors = protected)