from django.contrib import messages from django.shortcuts import redirect from django.utils.translation import ugettext_lazy as _ from misago.admin.views import generic from misago.acl import get_change_permissions_forms from misago.acl.models import ForumRole from misago.acl.forms import ForumRoleForm class ForumRoleAdmin(generic.AdminBaseMixin): root_link = 'misago:admin:permissions:forums:index' Model = ForumRole templates_dir = 'misago/admin/forumroles' message_404 = _("Requested role does not exist.") class ForumRolesList(ForumRoleAdmin, generic.ListView): ordering = (('name', None),) class RoleFormMixin(object): def real_dispatch(self, request, target): role_permissions = target.permissions form = ForumRoleForm(instance=target) perms_forms = get_change_permissions_forms(target) if request.method == 'POST': perms_forms = [f(request.POST) for f in perms_forms] valid_forms = 0 for permissions_form in perms_forms: if permissions_form.is_valid(): valid_forms += 1 form = ForumRoleForm(request.POST, instance=target) if form.is_valid() and len(perms_forms) == valid_forms: new_permissions = {} for permissions_form in perms_forms: new_permissions.update(permissions_form.cleaned_data) form.instance.permissions = new_permissions form.instance.save() messages.success(request, self.message_submit % target.name) if 'stay' in request.POST: return redirect(request.path) else: return redirect(self.root_link) else: perms_forms = [f(initial=role_permissions) for f in perms_forms] return self.render( request, { 'form': form, 'target': target, 'perms_forms': perms_forms, }) class NewForumRole(RoleFormMixin, ForumRoleAdmin, generic.ModelFormView): message_submit = _('New role "%s" has been saved.') class EditForumRole(RoleFormMixin, ForumRoleAdmin, generic.ModelFormView): message_submit = _('Role "%s" has been changed.') class DeleteForumRole(ForumRoleAdmin, generic.ButtonView): def button_action(self, request, target): target.delete() message = _('Role "%s" has been deleted.') % unicode(target.name) messages.success(request, message)