Merge branch 'development' into lokeshmanmode/mayan-edms-master
This commit is contained in:
@@ -1,11 +1,9 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.apps import apps
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.models import Group
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
from actstream import registry
|
||||
|
||||
from common import menu_multi_item, menu_object, menu_secondary, menu_setup
|
||||
from common.apps import MayanAppConfig
|
||||
from common.widgets import two_state_template
|
||||
@@ -23,11 +21,17 @@ from .links import (
|
||||
|
||||
|
||||
def get_groups():
|
||||
Group = apps.get_model(app_label='auth', model_name='Group')
|
||||
return ','.join([group.name for group in Group.objects.all()])
|
||||
|
||||
|
||||
def get_users():
|
||||
return ','.join([user.get_full_name() or user.username for user in get_user_model().objects.all()])
|
||||
return ','.join(
|
||||
[
|
||||
user.get_full_name() or user.username
|
||||
for user in get_user_model().objects.all()
|
||||
]
|
||||
)
|
||||
|
||||
|
||||
class UserManagementApp(MayanAppConfig):
|
||||
@@ -38,7 +42,9 @@ class UserManagementApp(MayanAppConfig):
|
||||
|
||||
def ready(self):
|
||||
super(UserManagementApp, self).ready()
|
||||
from actstream import registry
|
||||
|
||||
Group = apps.get_model(app_label='auth', model_name='Group')
|
||||
User = get_user_model()
|
||||
|
||||
APIEndPoint(app=self, version_string='1')
|
||||
|
||||
@@ -2,6 +2,8 @@ from __future__ import unicode_literals
|
||||
|
||||
from django import forms
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.password_validation import validate_password
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
|
||||
|
||||
@@ -18,3 +20,18 @@ class PasswordForm(forms.Form):
|
||||
new_password_2 = forms.CharField(
|
||||
label=_('Confirm password'), widget=forms.PasswordInput()
|
||||
)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.user = kwargs.pop('user', None)
|
||||
return super(PasswordForm, self).__init__(*args, **kwargs)
|
||||
|
||||
def clean(self):
|
||||
password_1 = self.cleaned_data['new_password_1']
|
||||
password_2 = self.cleaned_data['new_password_2']
|
||||
if password_1 != password_2:
|
||||
raise ValidationError('Passwords do not match.')
|
||||
else:
|
||||
if self.user:
|
||||
validate_password(password_2, self.user)
|
||||
|
||||
return self.cleaned_data
|
||||
|
||||
@@ -59,11 +59,11 @@ link_user_multiple_delete = Link(
|
||||
view='user_management:user_multiple_delete'
|
||||
)
|
||||
link_user_multiple_set_password = Link(
|
||||
permissions=(permission_user_edit,), text=_('Reset password'),
|
||||
permissions=(permission_user_edit,), text=_('Set password'),
|
||||
view='user_management:user_multiple_set_password'
|
||||
)
|
||||
link_user_set_password = Link(
|
||||
permissions=(permission_user_edit,), text=_('Reset password'),
|
||||
permissions=(permission_user_edit,), text=_('Set password'),
|
||||
view='user_management:user_set_password', args='object.id'
|
||||
)
|
||||
link_user_setup = Link(
|
||||
|
||||
@@ -2,6 +2,7 @@ from __future__ import unicode_literals
|
||||
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.models import Group
|
||||
from django.contrib.auth.password_validation import validate_password
|
||||
|
||||
from rest_framework import serializers
|
||||
|
||||
@@ -59,3 +60,9 @@ class UserSerializer(serializers.HyperlinkedModelSerializer):
|
||||
instance.save()
|
||||
|
||||
return instance
|
||||
|
||||
def validate(self, data):
|
||||
if 'password' in data:
|
||||
validate_password(data['password'], self.instance)
|
||||
|
||||
return data
|
||||
|
||||
@@ -17,102 +17,98 @@ from ..permissions import (
|
||||
permission_user_delete, permission_user_edit, permission_user_view
|
||||
)
|
||||
|
||||
from .literals import (
|
||||
TEST_USER_PASSWORD, TEST_USER_PASSWORD_EDITED, TEST_USER_USERNAME
|
||||
)
|
||||
from .literals import TEST_USER_PASSWORD_EDITED, TEST_USER_USERNAME
|
||||
|
||||
TEST_USER_TO_DELETE_USERNAME = 'user_to_delete'
|
||||
|
||||
|
||||
class UserManagementViewTestCase(GenericViewTestCase):
|
||||
def test_user_set_password_view_no_permissions(self):
|
||||
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
|
||||
def setUp(self):
|
||||
super(UserManagementViewTestCase, self).setUp()
|
||||
self.login_user()
|
||||
|
||||
self.role.permissions.add(permission_user_view.stored_permission)
|
||||
|
||||
response = self.post(
|
||||
def _set_password(self, password):
|
||||
return self.post(
|
||||
'user_management:user_set_password', args=(self.user.pk,), data={
|
||||
'new_password_1': TEST_USER_PASSWORD_EDITED,
|
||||
'new_password_2': TEST_USER_PASSWORD_EDITED
|
||||
'new_password_1': password, 'new_password_2': password
|
||||
}
|
||||
)
|
||||
|
||||
def test_user_set_password_view_no_permissions(self):
|
||||
self.grant(permission=permission_user_view)
|
||||
|
||||
response = self._set_password(password=TEST_USER_PASSWORD_EDITED)
|
||||
|
||||
self.assertEqual(response.status_code, 403)
|
||||
|
||||
self.client.logout()
|
||||
self.client.login(
|
||||
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD_EDITED
|
||||
)
|
||||
self.logout()
|
||||
|
||||
with self.assertRaises(AssertionError):
|
||||
self.login(
|
||||
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD_EDITED
|
||||
)
|
||||
|
||||
response = self.get('common:current_user_details')
|
||||
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
def test_user_set_password_view_with_permissions(self):
|
||||
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
|
||||
self.grant(permission=permission_user_edit)
|
||||
self.grant(permission=permission_user_view)
|
||||
|
||||
self.role.permissions.add(permission_user_edit.stored_permission)
|
||||
self.role.permissions.add(permission_user_view.stored_permission)
|
||||
response = self._set_password(password=TEST_USER_PASSWORD_EDITED)
|
||||
|
||||
response = self.post(
|
||||
'user_management:user_set_password', args=(self.user.pk,), data={
|
||||
'new_password_1': TEST_USER_PASSWORD_EDITED,
|
||||
'new_password_2': TEST_USER_PASSWORD_EDITED
|
||||
}, follow=True
|
||||
)
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
self.assertContains(response, text='Successfull', status_code=200)
|
||||
|
||||
self.client.logout()
|
||||
self.client.login(
|
||||
self.logout()
|
||||
self.login(
|
||||
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD_EDITED
|
||||
)
|
||||
response = self.get('common:current_user_details')
|
||||
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
def test_user_multiple_set_password_view_no_permissions(self):
|
||||
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
|
||||
|
||||
self.role.permissions.add(permission_user_view.stored_permission)
|
||||
|
||||
response = self.post(
|
||||
def _multiple_user_set_password(self, password):
|
||||
return self.post(
|
||||
'user_management:user_multiple_set_password', data={
|
||||
'id_list': self.user.pk,
|
||||
'new_password_1': TEST_USER_PASSWORD_EDITED,
|
||||
'new_password_2': TEST_USER_PASSWORD_EDITED
|
||||
}
|
||||
'new_password_1': password,
|
||||
'new_password_2': password
|
||||
}, follow=True
|
||||
)
|
||||
|
||||
def test_user_multiple_set_password_view_no_permissions(self):
|
||||
self.grant(permission=permission_user_view)
|
||||
|
||||
response = self._multiple_user_set_password(
|
||||
password=TEST_USER_PASSWORD_EDITED
|
||||
)
|
||||
|
||||
self.assertEqual(response.status_code, 403)
|
||||
|
||||
self.client.logout()
|
||||
self.client.login(
|
||||
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD_EDITED
|
||||
)
|
||||
self.logout()
|
||||
|
||||
with self.assertRaises(AssertionError):
|
||||
self.login(
|
||||
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD_EDITED
|
||||
)
|
||||
|
||||
response = self.get('common:current_user_details')
|
||||
|
||||
self.assertEqual(response.status_code, 302)
|
||||
|
||||
def test_user_multiple_set_password_view_with_permissions(self):
|
||||
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
|
||||
self.grant(permission=permission_user_edit)
|
||||
self.grant(permission=permission_user_view)
|
||||
|
||||
self.role.permissions.add(permission_user_edit.stored_permission)
|
||||
self.role.permissions.add(permission_user_view.stored_permission)
|
||||
|
||||
response = self.post(
|
||||
'user_management:user_multiple_set_password', data={
|
||||
'id_list': self.user.pk,
|
||||
'new_password_1': TEST_USER_PASSWORD_EDITED,
|
||||
'new_password_2': TEST_USER_PASSWORD_EDITED
|
||||
}, follow=True
|
||||
response = self._multiple_user_set_password(
|
||||
password=TEST_USER_PASSWORD_EDITED
|
||||
)
|
||||
|
||||
self.assertContains(response, text='Successfull', status_code=200)
|
||||
self.assertEqual(response.status_code, 200)
|
||||
|
||||
self.client.logout()
|
||||
self.client.login(
|
||||
self.logout()
|
||||
self.login(
|
||||
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD_EDITED
|
||||
)
|
||||
response = self.get('common:current_user_details')
|
||||
@@ -124,9 +120,7 @@ class UserManagementViewTestCase(GenericViewTestCase):
|
||||
username=TEST_USER_TO_DELETE_USERNAME
|
||||
)
|
||||
|
||||
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
|
||||
|
||||
self.role.permissions.add(permission_user_view.stored_permission)
|
||||
self.grant(permission=permission_user_view)
|
||||
|
||||
response = self.post(
|
||||
'user_management:user_delete', args=(user.pk,)
|
||||
@@ -140,10 +134,8 @@ class UserManagementViewTestCase(GenericViewTestCase):
|
||||
username=TEST_USER_TO_DELETE_USERNAME
|
||||
)
|
||||
|
||||
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
|
||||
|
||||
self.role.permissions.add(permission_user_delete.stored_permission)
|
||||
self.role.permissions.add(permission_user_view.stored_permission)
|
||||
self.grant(permission=permission_user_delete)
|
||||
self.grant(permission=permission_user_view)
|
||||
|
||||
response = self.post(
|
||||
'user_management:user_delete', args=(user.pk,), follow=True
|
||||
@@ -157,9 +149,7 @@ class UserManagementViewTestCase(GenericViewTestCase):
|
||||
username=TEST_USER_TO_DELETE_USERNAME
|
||||
)
|
||||
|
||||
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
|
||||
|
||||
self.role.permissions.add(permission_user_view.stored_permission)
|
||||
self.grant(permission=permission_user_view)
|
||||
|
||||
response = self.post(
|
||||
'user_management:user_multiple_delete', data={
|
||||
@@ -175,10 +165,8 @@ class UserManagementViewTestCase(GenericViewTestCase):
|
||||
username=TEST_USER_TO_DELETE_USERNAME
|
||||
)
|
||||
|
||||
self.login(username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD)
|
||||
|
||||
self.role.permissions.add(permission_user_delete.stored_permission)
|
||||
self.role.permissions.add(permission_user_view.stored_permission)
|
||||
self.grant(permission=permission_user_delete)
|
||||
self.grant(permission=permission_user_view)
|
||||
|
||||
response = self.post(
|
||||
'user_management:user_multiple_delete', data={
|
||||
@@ -200,11 +188,9 @@ class MetadataLookupIntegrationTestCase(GenericDocumentViewTestCase):
|
||||
|
||||
self.document_type.metadata.create(metadata_type=self.metadata_type)
|
||||
|
||||
def test_user_list_lookup_render(self):
|
||||
self.login(
|
||||
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD
|
||||
)
|
||||
self.login_user()
|
||||
|
||||
def test_user_list_lookup_render(self):
|
||||
self.metadata_type.lookup = '{{ users }}'
|
||||
self.metadata_type.save()
|
||||
self.document.metadata.create(metadata_type=self.metadata_type)
|
||||
@@ -223,10 +209,6 @@ class MetadataLookupIntegrationTestCase(GenericDocumentViewTestCase):
|
||||
)
|
||||
|
||||
def test_group_list_lookup_render(self):
|
||||
self.login(
|
||||
username=TEST_USER_USERNAME, password=TEST_USER_PASSWORD
|
||||
)
|
||||
|
||||
self.metadata_type.lookup = '{{ groups }}'
|
||||
self.metadata_type.save()
|
||||
self.document.metadata.create(metadata_type=self.metadata_type)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
from __future__ import unicode_literals
|
||||
|
||||
from django.conf.urls import patterns, url
|
||||
from django.conf.urls import url
|
||||
|
||||
from .api_views import (
|
||||
APICurrentUserView, APIGroupListView, APIGroupView, APIUserListView,
|
||||
@@ -8,11 +8,11 @@ from .api_views import (
|
||||
)
|
||||
from .views import (
|
||||
GroupCreateView, GroupDeleteView, GroupEditView, GroupListView,
|
||||
GroupMembersView, UserEditView, UserGroupsView, UserListView
|
||||
GroupMembersView, UserCreateView, UserDeleteView, UserEditView,
|
||||
UserGroupsView, UserListView, UserSetPasswordView
|
||||
)
|
||||
|
||||
urlpatterns = patterns(
|
||||
'user_management.views',
|
||||
urlpatterns = [
|
||||
url(r'^group/list/$', GroupListView.as_view(), name='group_list'),
|
||||
url(r'^group/add/$', GroupCreateView.as_view(), name='group_add'),
|
||||
url(
|
||||
@@ -29,29 +29,31 @@ urlpatterns = patterns(
|
||||
),
|
||||
|
||||
url(r'^user/list/$', UserListView.as_view(), name='user_list'),
|
||||
url(r'^user/add/$', 'user_add', name='user_add'),
|
||||
url(r'^user/add/$', UserCreateView.as_view(), name='user_add'),
|
||||
url(r'^user/(?P<pk>\d+)/edit/$', UserEditView.as_view(), name='user_edit'),
|
||||
url(r'^user/(?P<user_id>\d+)/delete/$', 'user_delete', name='user_delete'),
|
||||
url(
|
||||
r'^user/multiple/delete/$', 'user_multiple_delete',
|
||||
r'^user/(?P<pk>\d+)/delete/$', UserDeleteView.as_view(),
|
||||
name='user_delete'
|
||||
),
|
||||
url(
|
||||
r'^user/multiple/delete/$', UserDeleteView.as_view(),
|
||||
name='user_multiple_delete'
|
||||
),
|
||||
url(
|
||||
r'^user/(?P<user_id>\d+)/set_password/$', 'user_set_password',
|
||||
r'^user/(?P<pk>\d+)/set_password/$', UserSetPasswordView.as_view(),
|
||||
name='user_set_password'
|
||||
),
|
||||
url(
|
||||
r'^user/multiple/set_password/$', 'user_multiple_set_password',
|
||||
r'^user/multiple/set_password/$', UserSetPasswordView.as_view(),
|
||||
name='user_multiple_set_password'
|
||||
),
|
||||
url(
|
||||
r'^user/(?P<pk>\d+)/groups/$', UserGroupsView.as_view(),
|
||||
name='user_groups'
|
||||
),
|
||||
)
|
||||
]
|
||||
|
||||
api_urls = patterns(
|
||||
'',
|
||||
api_urls = [
|
||||
url(r'^groups/$', APIGroupListView.as_view(), name='group-list'),
|
||||
url(
|
||||
r'^groups/(?P<pk>[0-9]+)/$', APIGroupView.as_view(),
|
||||
@@ -64,4 +66,4 @@ api_urls = patterns(
|
||||
),
|
||||
url(r'^users/(?P<pk>[0-9]+)/groups/$',APIUserGroupMap.as_view(),
|
||||
name='users-group-map'),
|
||||
)
|
||||
]
|
||||
|
||||
+135
-178
@@ -1,21 +1,19 @@
|
||||
from __future__ import absolute_import, unicode_literals
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib import messages
|
||||
from django.contrib.auth import get_user_model
|
||||
from django.contrib.auth.models import Group
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.core.urlresolvers import reverse, reverse_lazy
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.shortcuts import get_object_or_404, render_to_response
|
||||
from django.template import RequestContext
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.utils.translation import ungettext, ugettext_lazy as _
|
||||
|
||||
from common.views import (
|
||||
AssignRemoveView, SingleObjectCreateView, SingleObjectDeleteView,
|
||||
SingleObjectEditView, SingleObjectListView
|
||||
AssignRemoveView, MultipleObjectConfirmActionView,
|
||||
MultipleObjectFormActionView, SingleObjectCreateView,
|
||||
SingleObjectDeleteView, SingleObjectEditView, SingleObjectListView
|
||||
)
|
||||
from permissions import Permission
|
||||
|
||||
from .forms import PasswordForm, UserForm
|
||||
from .permissions import (
|
||||
@@ -113,6 +111,79 @@ class GroupMembersView(AssignRemoveView):
|
||||
self.get_object().user_set.remove(item)
|
||||
|
||||
|
||||
class UserCreateView(SingleObjectCreateView):
|
||||
extra_context = {
|
||||
'title': _('Create new user'),
|
||||
}
|
||||
form_class = UserForm
|
||||
view_permission = permission_user_create
|
||||
|
||||
def form_valid(self, form):
|
||||
user = form.save(commit=False)
|
||||
user.set_unusable_password()
|
||||
user.save()
|
||||
messages.success(
|
||||
self.request, _('User "%s" created successfully.') % user
|
||||
)
|
||||
return HttpResponseRedirect(
|
||||
reverse('user_management:user_set_password', args=(user.pk,))
|
||||
)
|
||||
|
||||
|
||||
class UserDeleteView(MultipleObjectConfirmActionView):
|
||||
model = get_user_model()
|
||||
success_message = _('User delete request performed on %(count)d user')
|
||||
success_message_plural = _(
|
||||
'User delete request performed on %(count)d users'
|
||||
)
|
||||
view_permission = permission_user_delete
|
||||
|
||||
def get_extra_context(self):
|
||||
queryset = self.get_queryset()
|
||||
|
||||
result = {
|
||||
'title': ungettext(
|
||||
'Delete user',
|
||||
'Delete users',
|
||||
queryset.count()
|
||||
)
|
||||
}
|
||||
|
||||
if queryset.count() == 1:
|
||||
result.update(
|
||||
{
|
||||
'object': queryset.first(),
|
||||
'title': _('Delete user: %s') % queryset.first()
|
||||
}
|
||||
)
|
||||
|
||||
return result
|
||||
|
||||
def object_action(self, form, instance):
|
||||
try:
|
||||
if instance.is_superuser or instance.is_staff:
|
||||
messages.error(
|
||||
self.request,
|
||||
_(
|
||||
'Super user and staff user deleting is not '
|
||||
'allowed, use the admin interface for these cases.'
|
||||
)
|
||||
)
|
||||
else:
|
||||
instance.delete()
|
||||
messages.success(
|
||||
self.request, _(
|
||||
'User "%s" deleted successfully.'
|
||||
) % instance
|
||||
)
|
||||
except Exception as exception:
|
||||
messages.error(
|
||||
self.request, _(
|
||||
'Error deleting user "%(user)s": %(error)s'
|
||||
) % {'user': instance, 'error': exception}
|
||||
)
|
||||
|
||||
|
||||
class UserEditView(SingleObjectEditView):
|
||||
fields = ('username', 'first_name', 'last_name', 'email', 'is_active',)
|
||||
post_action_redirect = reverse_lazy('user_management:user_list')
|
||||
@@ -175,183 +246,69 @@ class UserListView(SingleObjectListView):
|
||||
).exclude(is_staff=True).order_by('last_name', 'first_name')
|
||||
|
||||
|
||||
def user_add(request):
|
||||
Permission.check_permissions(request.user, (permission_user_create,))
|
||||
|
||||
if request.method == 'POST':
|
||||
form = UserForm(request.POST)
|
||||
if form.is_valid():
|
||||
user = form.save(commit=False)
|
||||
user.set_unusable_password()
|
||||
user.save()
|
||||
messages.success(
|
||||
request, _('User "%s" created successfully.') % user
|
||||
)
|
||||
return HttpResponseRedirect(
|
||||
reverse('user_management:user_set_password', args=(user.pk,))
|
||||
)
|
||||
else:
|
||||
form = UserForm()
|
||||
|
||||
return render_to_response('appearance/generic_form.html', {
|
||||
'title': _('Create new user'),
|
||||
'form': form,
|
||||
}, context_instance=RequestContext(request))
|
||||
|
||||
|
||||
def user_delete(request, user_id=None, user_id_list=None):
|
||||
Permission.check_permissions(request.user, (permission_user_delete,))
|
||||
post_action_redirect = None
|
||||
|
||||
if user_id:
|
||||
users = get_user_model().objects.filter(pk=user_id)
|
||||
post_action_redirect = reverse('user_management:user_list')
|
||||
elif user_id_list:
|
||||
users = get_user_model().objects.filter(pk__in=user_id_list)
|
||||
|
||||
if not users:
|
||||
messages.error(request, _('Must provide at least one user.'))
|
||||
return HttpResponseRedirect(
|
||||
request.META.get(
|
||||
'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)
|
||||
)
|
||||
)
|
||||
|
||||
previous = request.POST.get('previous', request.GET.get('previous', request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))))
|
||||
next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))))
|
||||
|
||||
if request.method == 'POST':
|
||||
for user in users:
|
||||
try:
|
||||
if user.is_superuser or user.is_staff:
|
||||
messages.error(
|
||||
request,
|
||||
_(
|
||||
'Super user and staff user deleting is not '
|
||||
'allowed, use the admin interface for these cases.'
|
||||
)
|
||||
)
|
||||
else:
|
||||
user.delete()
|
||||
messages.success(
|
||||
request, _('User "%s" deleted successfully.') % user
|
||||
)
|
||||
except Exception as exception:
|
||||
messages.error(
|
||||
request, _('Error deleting user "%(user)s": %(error)s') % {
|
||||
'user': user, 'error': exception
|
||||
}
|
||||
)
|
||||
|
||||
return HttpResponseRedirect(next)
|
||||
|
||||
context = {
|
||||
'delete_view': True,
|
||||
'previous': previous,
|
||||
'next': next,
|
||||
}
|
||||
if users.count() == 1:
|
||||
context['object'] = users.first()
|
||||
context['title'] = _('Delete the user: %s?') % ', '.join([unicode(d) for d in users])
|
||||
elif len(users) > 1:
|
||||
context['title'] = _('Delete the users: %s?') % ', '.join([unicode(d) for d in users])
|
||||
|
||||
return render_to_response(
|
||||
'appearance/generic_confirm.html', context,
|
||||
context_instance=RequestContext(request)
|
||||
class UserSetPasswordView(MultipleObjectFormActionView):
|
||||
form_class = PasswordForm
|
||||
model = get_user_model()
|
||||
success_message = _('Password change request performed on %(count)d user')
|
||||
success_message_plural = _(
|
||||
'Password change request performed on %(count)d users'
|
||||
)
|
||||
view_permission = permission_user_edit
|
||||
|
||||
def get_extra_context(self):
|
||||
queryset = self.get_queryset()
|
||||
|
||||
def user_multiple_delete(request):
|
||||
return user_delete(
|
||||
request, user_id_list=request.GET.get(
|
||||
'id_list', request.POST.get('id_list', '')
|
||||
).split(',')
|
||||
)
|
||||
|
||||
|
||||
def user_set_password(request, user_id=None, user_id_list=None):
|
||||
Permission.check_permissions(request.user, (permission_user_edit,))
|
||||
post_action_redirect = None
|
||||
|
||||
if user_id:
|
||||
users = get_user_model().objects.filter(pk=user_id)
|
||||
post_action_redirect = reverse('user_management:user_list')
|
||||
elif user_id_list:
|
||||
users = get_user_model().objects.filter(pk__in=user_id_list)
|
||||
|
||||
if not users:
|
||||
messages.error(request, _('Must provide at least one user.'))
|
||||
return HttpResponseRedirect(
|
||||
request.META.get(
|
||||
'HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL)
|
||||
result = {
|
||||
'submit_label': _('Submit'),
|
||||
'title': ungettext(
|
||||
'Change user password',
|
||||
'Change users passwords',
|
||||
queryset.count()
|
||||
)
|
||||
)
|
||||
}
|
||||
|
||||
next = request.POST.get('next', request.GET.get('next', post_action_redirect if post_action_redirect else request.META.get('HTTP_REFERER', reverse(settings.LOGIN_REDIRECT_URL))))
|
||||
if queryset.count() == 1:
|
||||
result.update(
|
||||
{
|
||||
'object': queryset.first(),
|
||||
'title': _('Change password for user: %s') % queryset.first()
|
||||
}
|
||||
)
|
||||
|
||||
if request.method == 'POST':
|
||||
form = PasswordForm(request.POST)
|
||||
if form.is_valid():
|
||||
password_1 = form.cleaned_data['new_password_1']
|
||||
password_2 = form.cleaned_data['new_password_2']
|
||||
if password_1 != password_2:
|
||||
return result
|
||||
|
||||
def get_form_extra_kwargs(self):
|
||||
queryset = self.get_queryset()
|
||||
result = {}
|
||||
if queryset:
|
||||
result['user'] = queryset.first()
|
||||
|
||||
return result
|
||||
|
||||
def object_action(self, form, instance):
|
||||
try:
|
||||
if instance.is_superuser or instance.is_staff:
|
||||
messages.error(
|
||||
request, _('Passwords do not match, try again.')
|
||||
self.request,
|
||||
_(
|
||||
'Super user and staff user password '
|
||||
'reseting is not allowed, use the admin '
|
||||
'interface for these cases.'
|
||||
)
|
||||
)
|
||||
else:
|
||||
for user in users:
|
||||
try:
|
||||
if user.is_superuser or user.is_staff:
|
||||
messages.error(
|
||||
request,
|
||||
_(
|
||||
'Super user and staff user password '
|
||||
'reseting is not allowed, use the admin '
|
||||
'interface for these cases.'
|
||||
)
|
||||
)
|
||||
else:
|
||||
user.set_password(password_1)
|
||||
user.save()
|
||||
messages.success(
|
||||
request, _(
|
||||
'Successfull password reset for user: %s.'
|
||||
) % user
|
||||
)
|
||||
except Exception as exception:
|
||||
messages.error(
|
||||
request, _(
|
||||
'Error reseting password for user "%(user)s": %(error)s'
|
||||
) % {
|
||||
'user': user, 'error': exception
|
||||
}
|
||||
)
|
||||
|
||||
return HttpResponseRedirect(next)
|
||||
else:
|
||||
form = PasswordForm()
|
||||
|
||||
context = {
|
||||
'next': next,
|
||||
'form': form,
|
||||
}
|
||||
|
||||
if users.count() == 1:
|
||||
context['object'] = users.first()
|
||||
context['title'] = _('Reseting password for user: %s') % ', '.join([unicode(d) for d in users])
|
||||
elif len(users) > 1:
|
||||
context['title'] = _('Reseting password for users: %s') % ', '.join([unicode(d) for d in users])
|
||||
|
||||
return render_to_response(
|
||||
'appearance/generic_form.html', context,
|
||||
context_instance=RequestContext(request)
|
||||
)
|
||||
|
||||
|
||||
def user_multiple_set_password(request):
|
||||
return user_set_password(
|
||||
request, user_id_list=request.GET.get(
|
||||
'id_list', request.POST.get('id_list', '')
|
||||
).split(',')
|
||||
)
|
||||
instance.set_password(form.cleaned_data['new_password_1'])
|
||||
instance.save()
|
||||
messages.success(
|
||||
self.request, _(
|
||||
'Successfull password reset for user: %s.'
|
||||
) % instance
|
||||
)
|
||||
except Exception as exception:
|
||||
messages.error(
|
||||
self.request, _(
|
||||
'Error reseting password for user "%(user)s": %(error)s'
|
||||
) % {
|
||||
'user': instance, 'error': exception
|
||||
}
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user