diff --git a/apps/main/__init__.py b/apps/main/__init__.py index ddbfcd248c..beaff20ffc 100644 --- a/apps/main/__init__.py +++ b/apps/main/__init__.py @@ -2,7 +2,7 @@ from django.utils.translation import ugettext_lazy as _ from navigation.api import register_menu from permissions import role_list -from user_management import user_list +from user_management import user_list, group_list from main.conf.settings import SIDE_BAR_SEARCH @@ -33,7 +33,7 @@ main_menu = [ ], 'famfam': 'wrench', 'name': 'tools', 'position': 7}, {'text': _(u'setup'), 'view': 'setting_list', 'links': [ - check_settings, role_list, user_list, admin_site + check_settings, role_list, user_list, group_list, admin_site ], 'famfam': 'cog', 'name': 'setup', 'position': 8}, {'text': _(u'about'), 'view': 'about', 'position': 9}, diff --git a/apps/user_management/__init__.py b/apps/user_management/__init__.py index 7a50c07ba4..1b9f2dcf2e 100644 --- a/apps/user_management/__init__.py +++ b/apps/user_management/__init__.py @@ -1,5 +1,5 @@ from django.utils.translation import ugettext_lazy as _ -from django.contrib.auth.models import User +from django.contrib.auth.models import User, Group from navigation.api import register_links, register_multi_item_links from permissions.api import register_permissions @@ -9,11 +9,22 @@ PERMISSION_USER_EDIT = 'user_edit' PERMISSION_USER_VIEW = 'user_view' PERMISSION_USER_DELETE = 'user_delete' +PERMISSION_GROUP_CREATE = 'group_create' +PERMISSION_GROUP_EDIT = 'group_edit' +PERMISSION_GROUP_VIEW = 'group_view' +PERMISSION_GROUP_DELETE = 'group_delete' + register_permissions('user_management', [ + # Users {'name': PERMISSION_USER_CREATE, 'label': _(u'Create new users')}, {'name': PERMISSION_USER_EDIT, 'label': _(u'Edit existing users')}, {'name': PERMISSION_USER_VIEW, 'label': _(u'View existing users')}, {'name': PERMISSION_USER_DELETE, 'label': _(u'Delete existing users')}, + # Groups + {'name': PERMISSION_GROUP_CREATE, 'label': _(u'Create new groups')}, + {'name': PERMISSION_GROUP_EDIT, 'label': _(u'Edit existing groups')}, + {'name': PERMISSION_GROUP_VIEW, 'label': _(u'View existing groups')}, + {'name': PERMISSION_GROUP_DELETE, 'label': _(u'Delete existing groups')}, ]) user_list = {'text': _(u'user list'), 'view': 'user_list', 'famfam': 'user', 'permissions': {'namespace': 'user_management', 'permissions': [PERMISSION_USER_VIEW]}} @@ -24,6 +35,16 @@ user_multiple_delete = {u'text': _('delete'), 'view': 'user_multiple_delete', 'f user_set_password = {u'text': _('reset password'), 'view': 'user_set_password', 'args': 'object.id', 'famfam': 'lock_edit', 'permissions': {'namespace': 'user_management', 'permissions': [PERMISSION_USER_EDIT]}} user_multiple_set_password = {u'text': _('reset password'), 'view': 'user_multiple_set_password', 'famfam': 'lock_edit', 'permissions': {'namespace': 'user_management', 'permissions': [PERMISSION_USER_EDIT]}} +group_list = {'text': _(u'group list'), 'view': 'group_list', 'famfam': 'group', 'permissions': {'namespace': 'user_management', 'permissions': [PERMISSION_GROUP_VIEW]}} +group_edit = {'text': _(u'edit'), 'view': 'group_edit', 'args': 'object.id', 'famfam': 'group_edit', 'permissions': {'namespace': 'user_management', 'permissions': [PERMISSION_GROUP_EDIT]}} +group_add = {'text': _(u'create new group'), 'view': 'group_add', 'famfam': 'group_add', 'permissions': {'namespace': 'user_management', 'permissions': [PERMISSION_GROUP_CREATE]}} +group_delete = {u'text': _('delete'), 'view': 'group_delete', 'args': 'object.id', 'famfam': 'group_delete', 'permissions': {'namespace': 'user_management', 'permissions': [PERMISSION_GROUP_DELETE]}} +group_multiple_delete = {u'text': _('delete'), 'view': 'group_multiple_delete', 'famfam': 'group_delete', 'permissions': {'namespace': 'user_management', 'permissions': [PERMISSION_GROUP_DELETE]}} + register_links(User, [user_edit, user_set_password, user_delete]) register_links(['user_multiple_set_password', 'user_set_password', 'user_multiple_delete', 'user_delete', 'user_edit', 'user_list','user_add'], [user_add, user_list], menu_name=u'sidebar') register_multi_item_links(['user_list'], [user_multiple_set_password, user_multiple_delete]) + +register_links(Group, [group_edit, group_delete]) +register_links(['group_multiple_delete', 'group_delete', 'group_edit', 'group_list','group_add'], [group_add, group_list], menu_name=u'sidebar') +register_multi_item_links(['group_list'], [group_multiple_delete]) diff --git a/apps/user_management/forms.py b/apps/user_management/forms.py index 6027d2bd51..a5bb1cd60b 100644 --- a/apps/user_management/forms.py +++ b/apps/user_management/forms.py @@ -1,5 +1,5 @@ from django import forms -from django.contrib.auth.models import User +from django.contrib.auth.models import User, Group from django.utils.translation import ugettext_lazy as _ @@ -12,3 +12,9 @@ class UserForm(forms.ModelForm): class PasswordForm(forms.Form): new_password_1 = forms.CharField(label=_(u'New password'), widget=forms.PasswordInput()) new_password_2 = forms.CharField(label=_(u'Confirm password'), widget=forms.PasswordInput()) + + +class GroupForm(forms.ModelForm): + class Meta: + model = Group + fields = ('name',) diff --git a/apps/user_management/urls.py b/apps/user_management/urls.py index d46ce1cbe3..6c6e856e58 100644 --- a/apps/user_management/urls.py +++ b/apps/user_management/urls.py @@ -1,11 +1,17 @@ from django.conf.urls.defaults import patterns, url urlpatterns = patterns('user_management.views', - url(r'^list/$', 'user_list', (), 'user_list'), - url(r'^add/$', 'user_add', (), 'user_add'), - url(r'^(?P\d+)/edit/$', 'user_edit', (), 'user_edit'), - url(r'^(?P\d+)/delete/$', 'user_delete', (), 'user_delete'), - url(r'^multiple/delete/$', 'user_multiple_delete', (), 'user_multiple_delete'), - url(r'^(?P\d+)/set_password/$', 'user_set_password', (), 'user_set_password'), - url(r'^multiple/set_password/$', 'user_multiple_set_password', (), 'user_multiple_set_password'), + url(r'^user/list/$', 'user_list', (), 'user_list'), + url(r'^user/add/$', 'user_add', (), 'user_add'), + url(r'^user/(?P\d+)/edit/$', 'user_edit', (), 'user_edit'), + url(r'^user/(?P\d+)/delete/$', 'user_delete', (), 'user_delete'), + url(r'^user/multiple/delete/$', 'user_multiple_delete', (), 'user_multiple_delete'), + url(r'^user/(?P\d+)/set_password/$', 'user_set_password', (), 'user_set_password'), + url(r'^user/multiple/set_password/$', 'user_multiple_set_password', (), 'user_multiple_set_password'), + + url(r'^group/list/$', 'group_list', (), 'group_list'), + url(r'^group/add/$', 'group_add', (), 'group_add'), + url(r'^group/(?P\d+)/edit/$', 'group_edit', (), 'group_edit'), + url(r'^group/(?P\d+)/delete/$', 'group_delete', (), 'group_delete'), + url(r'^group/multiple/delete/$', 'group_multiple_delete', (), 'group_multiple_delete'), ) diff --git a/apps/user_management/views.py b/apps/user_management/views.py index c8b539c7f8..f11603ae39 100644 --- a/apps/user_management/views.py +++ b/apps/user_management/views.py @@ -5,14 +5,16 @@ from django.template import RequestContext from django.contrib import messages from django.views.generic.list_detail import object_list from django.core.urlresolvers import reverse -from django.contrib.auth.models import User +from django.contrib.auth.models import User, Group from permissions.api import check_permissions from user_management import PERMISSION_USER_VIEW, \ PERMISSION_USER_EDIT, PERMISSION_USER_CREATE, \ - PERMISSION_USER_DELETE -from user_management.forms import UserForm, PasswordForm + PERMISSION_USER_DELETE, PERMISSION_GROUP_CREATE, \ + PERMISSION_GROUP_EDIT, PERMISSION_GROUP_VIEW, \ + PERMISSION_GROUP_DELETE +from user_management.forms import UserForm, PasswordForm, GroupForm def user_list(request): @@ -89,7 +91,7 @@ def user_add(request): def user_delete(request, user_id=None, user_id_list=None): - check_permissions(request.user, 'users', [PERMISSION_USER_DELETE]) + check_permissions(request.user, 'user_management', [PERMISSION_USER_DELETE]) post_action_redirect = None if user_id: @@ -142,7 +144,7 @@ def user_multiple_delete(request): def user_set_password(request, user_id=None, user_id_list=None): - check_permissions(request.user, 'users', [PERMISSION_USER_EDIT]) + check_permissions(request.user, 'user_management', [PERMISSION_USER_EDIT]) post_action_redirect = None if user_id: @@ -201,3 +203,115 @@ def user_multiple_set_password(request): return user_set_password( request, user_id_list=request.GET.get('id_list', []) ) + + +def group_list(request): + check_permissions(request.user, 'user_management', [PERMISSION_GROUP_VIEW]) + + return object_list( + request, + queryset=Group.objects.all(), + template_name='generic_list.html', + extra_context={ + 'title': _(u'groups'), + 'hide_link': True, + 'extra_columns': [ + { + 'name': _(u'members'), + 'attribute': 'user_set.count' + }, + ], + 'multi_select_as_buttons': True, + }, + ) + + +def group_edit(request, group_id): + check_permissions(request.user, 'user_management', [PERMISSION_GROUP_EDIT]) + group = get_object_or_404(Group, pk=group_id) + + if request.method == 'POST': + form = GroupForm(instance=group, data=request.POST) + if form.is_valid(): + form.save() + messages.success(request, _(u'Group "%s" updated successfully.') % group) + return HttpResponseRedirect(reverse('group_list')) + else: + form = GroupForm(instance=group) + + return render_to_response('generic_form.html', { + 'title': _(u'edit group: %s') % group, + 'form': form, + 'object': group, + }, + context_instance=RequestContext(request)) + + +def group_add(request): + check_permissions(request.user, 'user_management', [PERMISSION_GROUP_CREATE]) + + if request.method == 'POST': + form = GroupForm(request.POST) + if form.is_valid(): + group = form.save() + messages.success(request, _(u'Group "%s" created successfully.') % group) + return HttpResponseRedirect(reverse('group_list')) + else: + form = GroupForm() + + return render_to_response('generic_form.html', { + 'title': _(u'create new group'), + 'form': form, + }, + context_instance=RequestContext(request)) + + +def group_delete(request, group_id=None, group_id_list=None): + check_permissions(request.user, 'user_management', [PERMISSION_GROUP_DELETE]) + post_action_redirect = None + + if group_id: + groups = [get_object_or_404(Group, pk=group_id)] + post_action_redirect = reverse('group_list') + elif group_id_list: + groups = [get_object_or_404(Group, pk=group_id) for group_id in group_id_list.split(',')] + else: + messages.error(request, _(u'Must provide at least one group.')) + return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/')) + + previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', '/'))) + next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', '/'))) + + if request.method == 'POST': + for group in groups: + try: + group.delete() + messages.success(request, _(u'Group "%s" deleted successfully.') % group) + except Exception, e: + messages.error(request, _(u'Error deleting group "%(group)s": %(error)s') % { + 'group': group, 'error': e + }) + + return HttpResponseRedirect(next) + + context = { + 'object_name': _(u'group'), + 'delete_view': True, + 'previous': previous, + 'next': next, + } + if len(groups) == 1: + context['object'] = groups[0] + context['title'] = _(u'Are you sure you wish to delete the group: %s?') % ', '.join([unicode(d) for d in groups]) + elif len(groups) > 1: + context['title'] = _(u'Are you sure you wish to delete the groups: %s?') % ', '.join([unicode(d) for d in groups]) + + return render_to_response('generic_confirm.html', context, + context_instance=RequestContext(request)) + + +def group_multiple_delete(request): + return group_delete( + request, group_id_list=request.GET.get('id_list', []) + ) +