users: Improve Django group handling with LDAP

- Create groups on first boot a bit more safely

- Use get_or_create instead of get() and create()

- Fix issue with not showing a full list of groups in user modify page
  when there is are no users for that group.
This commit is contained in:
Sunil Mohan Adapa 2015-07-18 17:17:07 +05:30
parent 02269a93cc
commit f35d4257c2
2 changed files with 12 additions and 12 deletions

View File

@ -82,9 +82,10 @@ than 63 characters in length.'),
messages.error(self.request, messages.error(self.request,
_('Failed to add new user to admin group.')) _('Failed to add new user to admin group.'))
# create initial Django groups # Create initial Django groups
for group_choice in GROUP_CHOICES: for group_choice in GROUP_CHOICES:
auth.models.Group.objects.create(name=group_choice[0]) auth.models.Group.objects.get_or_create(name=group_choice[0])
admin_group = auth.models.Group.objects.get(name='admin') admin_group = auth.models.Group.objects.get(name='admin')
admin_group.user_set.add(user) admin_group.user_set.add(user)

View File

@ -19,7 +19,6 @@ from django import forms
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.models import User, Group from django.contrib.auth.models import User, Group
from django.contrib.auth.forms import UserCreationForm, SetPasswordForm from django.contrib.auth.forms import UserCreationForm, SetPasswordForm
from django.core.exceptions import ObjectDoesNotExist
from gettext import gettext as _ from gettext import gettext as _
from plinth import actions from plinth import actions
@ -79,11 +78,8 @@ class CreateUserForm(UserCreationForm):
self.request, self.request,
_('Failed to add new user to %s group.') % group) _('Failed to add new user to %s group.') % group)
try: group_object, _ = Group.objects.get_or_create(name=group)
g = Group.objects.get(name=group) group_object.user_set.add(user)
except ObjectDoesNotExist:
g = Group.objects.create(name=group)
g.user_set.add(user)
return user return user
@ -101,19 +97,21 @@ class UserUpdateForm(forms.ModelForm):
def __init__(self, request, username, *args, **kwargs): def __init__(self, request, username, *args, **kwargs):
"""Initialize the form with extra request argument.""" """Initialize the form with extra request argument."""
for group, _ in GROUP_CHOICES:
Group.objects.get_or_create(name=group)
self.request = request self.request = request
self.username = username self.username = username
super(UserUpdateForm, self).__init__(*args, **kwargs) super(UserUpdateForm, self).__init__(*args, **kwargs)
def save(self, commit=True): def save(self, commit=True):
"""Update LDAP user name after saving user model.""" """Update LDAP user name and groups after saving user model."""
user = super(UserUpdateForm, self).save(commit) user = super(UserUpdateForm, self).save(commit)
if commit: if commit:
output = actions.superuser_run('get-ldap-user-groups', output = actions.superuser_run('get-ldap-user-groups', [self.username])
[self.username])
old_groups = output.strip().split('\n') old_groups = output.strip().split('\n')
old_groups = list(filter(None, old_groups)) # remove blank strings old_groups = [group for group in old_groups if group]
if self.username != user.get_username(): if self.username != user.get_username():
try: try:
@ -132,6 +130,7 @@ class UserUpdateForm(forms.ModelForm):
except ActionError: except ActionError:
messages.error(self.request, messages.error(self.request,
_('Failed to remove user from group.')) _('Failed to remove user from group.'))
for new_group in new_groups: for new_group in new_groups:
if new_group not in old_groups: if new_group not in old_groups:
try: try: