implement user creation in osusers.admin

- add osusers.admin.UserCreationForm
- add dummy osusers.tasks implementation with create_ldap_group and
  create_ldap_user
- fix UserManager.get_next_username
- add proper transaction handling in UserManager.create_user
- add calls to create_ldap_user and create_ldap_group to
  UserManager.create_user
This commit is contained in:
Jan Dittberner 2014-05-25 23:35:14 +02:00
parent 86b8f03704
commit caab322beb
3 changed files with 94 additions and 11 deletions

View file

@ -1,3 +1,5 @@
from django import forms
from django.utils.translation import ugettext as _
from django.contrib import admin from django.contrib import admin
from .models import ( from .models import (
@ -7,6 +9,8 @@ from .models import (
User, User,
) )
PASSWORD_MISMATCH_ERROR = _("Passwords don't match")
class AdditionalGroupInline(admin.TabularInline): class AdditionalGroupInline(admin.TabularInline):
model = AdditionalGroup model = AdditionalGroup
@ -18,9 +22,73 @@ class ShadowInline(admin.TabularInline):
can_delete = False can_delete = False
class UserCreationForm(forms.ModelForm):
"""
A form for creating system users.
"""
password1 = forms.CharField(label=_('Password'),
widget=forms.PasswordInput)
password2 = forms.CharField(label=_('Password (again)'),
widget=forms.PasswordInput)
class Meta:
model = User
fields = []
def clean_password2(self):
"""
Check that the two password entries match.
"""
password1 = self.cleaned_data.get('password1')
password2 = self.cleaned_data.get('password2')
if password1 and password2 and password1 != password2:
raise forms.ValidationError(PASSWORD_MISMATCH_ERROR)
return password2
def save(self, commit=True):
"""
Save the provided password in hashed format.
"""
user = User.objects.create_user(
password=self.cleaned_data['password1'], commit=commit)
return user
def save_m2m(self):
pass
class UserAdmin(admin.ModelAdmin): class UserAdmin(admin.ModelAdmin):
inlines = [AdditionalGroupInline, ShadowInline] inlines = [AdditionalGroupInline, ShadowInline]
readonly_fields = ['uid'] readonly_fields = ['uid']
add_form = UserCreationForm
add_fieldsets = (
(None, {
'classes': ('wide',),
'fields': ('password1', 'password2')}),
)
def get_form(self, request, obj=None, **kwargs):
"""
Use special form during user creation.
"""
defaults = {}
if obj is None:
defaults.update({
'form': self.add_form,
'fields': admin.util.flatten_fieldsets(self.add_fieldsets),
})
defaults.update(kwargs)
return super(UserAdmin, self).get_form(request, obj, **defaults)
def get_inline_instances(self, request, obj=None):
if obj is None:
return []
return super(UserAdmin, self).get_inline_instances(request, obj)
admin.site.register(Group) admin.site.register(Group)

View file

@ -1,7 +1,7 @@
from datetime import date from datetime import date
import os import os
from django.db import models, transaction from django.db import models
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.utils import timezone from django.utils import timezone
@ -13,6 +13,11 @@ from model_utils.models import TimeStampedModel
from passlib.hash import sha512_crypt from passlib.hash import sha512_crypt
from passlib.utils import generate_password from passlib.utils import generate_password
from .tasks import (
create_ldap_group,
create_ldap_user,
)
class GroupManager(models.Manager): class GroupManager(models.Manager):
@ -59,7 +64,7 @@ class UserManager(models.Manager):
for user in self.values('username').filter( for user in self.values('username').filter(
username__startswith=settings.OSUSER_USERNAME_PREFIX).order_by( username__startswith=settings.OSUSER_USERNAME_PREFIX).order_by(
'username'): 'username'):
if user == nextuser: if user['username'] == nextuser:
count += 1 count += 1
nextuser = usernameformat.format( nextuser = usernameformat.format(
settings.OSUSER_USERNAME_PREFIX, count) settings.OSUSER_USERNAME_PREFIX, count)
@ -67,7 +72,7 @@ class UserManager(models.Manager):
break break
return nextuser return nextuser
def create_user(self, username=None, password=None): def create_user(self, username=None, password=None, commit=False):
uid = self.get_next_uid() uid = self.get_next_uid()
gid = Group.objects.get_next_gid() gid = Group.objects.get_next_gid()
if username is None: if username is None:
@ -75,19 +80,16 @@ class UserManager(models.Manager):
if password is None: if password is None:
password = generate_password() password = generate_password()
homedir = os.path.join(settings.OSUSER_HOME_BASEPATH, username) homedir = os.path.join(settings.OSUSER_HOME_BASEPATH, username)
autocommit = transaction.get_autocommit()
if autocommit:
transaction.set_autocommit(False)
group = Group.objects.create(groupname=username, gid=gid) group = Group.objects.create(groupname=username, gid=gid)
create_ldap_group.delay(group)
user = self.create(username=username, group=group, uid=uid, user = self.create(username=username, group=group, uid=uid,
homedir=homedir, homedir=homedir,
shell=settings.OSUSER_DEFAULT_SHELL) shell=settings.OSUSER_DEFAULT_SHELL)
create_ldap_user.delay(user, password)
shadow = Shadow.objects.create_shadow(user=user, password=password) shadow = Shadow.objects.create_shadow(user=user, password=password)
user.save() if commit:
shadow.save() user.save()
transaction.commit() shadow.save()
if autocommit:
transaction.set_autocommit(True)
return user return user

View file

@ -0,0 +1,13 @@
from __future__ import absolute_import
from celery import shared_task
@shared_task
def create_ldap_group(group):
return group
@shared_task
def create_ldap_user(user, password):
return user, password