import os from django.contrib import messages, admin from django.core.exceptions import PermissionDenied from django.template.response import TemplateResponse from django.utils.translation import ungettext, ugettext_lazy as _ from orchestra.contrib.orchestration import Operation, helpers from .forms import PermissionForm, LinkForm def get_verbose_choice(choices, value): for choice, verbose in choices: if choice == value: return verbose def set_permission(modeladmin, request, queryset): account_id = None for user in queryset: account_id = account_id or user.account_id if user.account_id != account_id: messages.error(request, "Users from the same account should be selected.") return user = queryset[0] form = PermissionForm(user) action_value = 'set_permission' if request.POST.get('post') == 'generic_confirmation': form = PermissionForm(user, request.POST) if form.is_valid(): cleaned_data = form.cleaned_data operations = [] for user in queryset: base_home = cleaned_data['base_home'] extension = cleaned_data['home_extension'] action = cleaned_data['set_action'] perms = cleaned_data['permissions'] user.set_perm_action = action user.set_perm_base_home = base_home user.set_perm_home_extension = extension user.set_perm_perms = perms operations.extend(Operation.create_for_action(user, 'set_permission')) verbose_action = get_verbose_choice(form.fields['set_action'].choices, user.set_perm_action) verbose_permissions = get_verbose_choice(form.fields['permissions'].choices, user.set_perm_perms) context = { 'action': verbose_action, 'perms': verbose_permissions, 'to': os.path.join(user.set_perm_base_home, user.set_perm_home_extension), } msg = _("%(action)s %(perms)s permission to %(to)s") % context modeladmin.log_change(request, user, msg) if not operations: messages.error(request, "No backend operation has been executed.") else: logs = Operation.execute(operations) helpers.message_user(request, logs) return opts = modeladmin.model._meta app_label = opts.app_label context = { 'title': _("Set permission"), 'action_name': _("Set permission"), 'action_value': action_value, 'queryset': queryset, 'opts': opts, 'obj': user, 'app_label': app_label, 'action_checkbox_name': admin.helpers.ACTION_CHECKBOX_NAME, 'form': form, } return TemplateResponse(request, 'admin/systemusers/systemuser/set_permission.html', context, current_app=modeladmin.admin_site.name) set_permission.url_name = 'set-permission' set_permission.tool_description = _("Set permission") def create_link(modeladmin, request, queryset): account_id = None for user in queryset: account_id = account_id or user.account_id if user.account_id != account_id: messages.error(request, "Users from the same account should be selected.") return user = queryset[0] form = LinkForm(user) action_value = 'create_link' if request.POST.get('post') == 'generic_confirmation': form = LinkForm(user, request.POST, queryset=queryset) if form.is_valid(): cleaned_data = form.cleaned_data operations = [] for user in queryset: base_home = cleaned_data['base_home'] extension = cleaned_data['home_extension'] target = os.path.join(base_home, extension) default_name = os.path.join(user.home, os.path.basename(target)) link_name = cleaned_data['link_name'] or default_name user.create_link_target = target user.create_link_name = link_name operations.extend(Operation.create_for_action(user, 'create_link')) context = { 'target': target, 'link_name': link_name, } msg = _("Created link from %(target)s to %(link_name)s") % context modeladmin.log_change(request, request.user, msg) logs = Operation.execute(operations) if logs: helpers.message_user(request, logs) else: messages.error(request, "No backend operation has been executed.") return opts = modeladmin.model._meta app_label = opts.app_label context = { 'title': _("Create link"), 'action_name': _("Create link"), 'action_value': action_value, 'queryset': queryset, 'opts': opts, 'obj': user, 'app_label': app_label, 'action_checkbox_name': admin.helpers.ACTION_CHECKBOX_NAME, 'form': form, } return TemplateResponse(request, 'admin/systemusers/systemuser/create_link.html', context, current_app=modeladmin.admin_site.name) create_link.url_name = 'create-link' create_link.tool_description = _("Create link") def delete_selected(modeladmin, request, queryset): """ wrapper arround admin.actions.delete_selected to prevent main system users deletion """ opts = modeladmin.model._meta app_label = opts.app_label # Check that the user has delete permission for the actual model if not modeladmin.has_delete_permission(request): raise PermissionDenied else: accounts = [] for user in queryset: if user.is_main: accounts.append(user.username) if accounts: n = len(accounts) messages.error(request, ungettext( "You have selected one main system user (%(accounts)s), which can not be deleted.", "You have selected some main system users which can not be deleted (%(accounts)s).", n) % { 'accounts': ', '.join(accounts[:10]+['...'] if n > 10 else accounts) } ) return return admin.actions.delete_selected(modeladmin, request, queryset) delete_selected.short_description = _("Delete selected %(verbose_name_plural)s")