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)