Browse Source

Forms handling and New User form.

Ralfp 12 years ago
parent
commit
87559f91f0

+ 9 - 5
misago/forms/__init__.py

@@ -43,17 +43,21 @@ class Form(forms.Form):
         """
         for key, field in self.base_fields.iteritems():
             try:
-                if field.__class__.__name__ not in ['DateField', 'DateTimeField']:
+                if field.__class__.__name__ == 'ModelChoiceField':
+                    data[key] = int(data[key])
+                elif field.__class__.__name__ == 'ModelMultipleChoiceField':
+                    data.setlist(key, [int(x) for x in data.getlist(key, [])])
+                elif field.__class__.__name__ not in ['DateField', 'DateTimeField']:
                     if not key in self.dont_strip:
                         if field.__class__.__name__ in ['MultipleChoiceField', 'TypedMultipleChoiceField']:
-                            data[key] = [x.strip() for x in data.getlist(key.html_name, [])]
+                            data.setlist(key, [x.strip() for x in data.getlist(key, [])])
                         else:
-                            data[key] = data[key.html_name].strip()
+                            data[key] = data[key].strip()
                     if not key in self.allow_nl:
                         if field.__class__.__name__ in ['MultipleChoiceField', 'TypedMultipleChoiceField']:
-                            data[key] = [x.replace("\n", '') for x in data.getlist(key.html_name, [])]
+                            data.setlist(key, [x.replace("\n", '') for x in data.getlist(key, [])])
                         else:
-                            data[key] = data[key.html_name].replace("\n", '')
+                            data[key] = data[key].replace("\n", '')
             except (KeyError, AttributeError):
                 pass
         return data

+ 1 - 1
misago/users/admin/__init__.py

@@ -41,7 +41,7 @@ ADMIN_ACTIONS=(
                         url(r'^$', 'List', name='admin_users'),
                         url(r'^(?P<page>\d+)/$', 'List', name='admin_users'),
                         url(r'^inactive/$', 'inactive', name='admin_users_inactive'),
-                        url(r'^new/$', 'List', name='admin_users_new'),
+                        url(r'^new/$', 'New', name='admin_users_new'),
                         url(r'^edit/(?P<slug>[a-z0-9]+)-(?P<target>\d+)/$', 'Edit', name='admin_users_edit'),
                         url(r'^delete/(?P<slug>[a-z0-9]+)-(?P<target>\d+)/$', 'Delete', name='admin_users_delete'),
                     ),

+ 68 - 1
misago/users/admin/users/forms.py

@@ -37,7 +37,7 @@ class UserForm(Form):
               [
                _("Sign-in Credentials"),
                [
-                ('email', {'label': _("E-mail Address"), 'help_text': _("Username is name under which user is known to other users.")}),
+                ('email', {'label': _("E-mail Address"), 'help_text': _("Member e-mail address.")}),
                 ('new_password', {'label': _("Change User Password"), 'help_text': _("If you wish to change user password, enter here new password. Otherwhise leave this field blank."), 'has_value': False}),
                 ],
                ],
@@ -116,6 +116,73 @@ class UserForm(Form):
         return ''
 
 
+class NewUserForm(Form):
+    username = forms.CharField(max_length=255)
+    title = forms.CharField(max_length=255,required=False)
+    rank = forms.ModelChoiceField(queryset=Rank.objects.order_by('order').all(),required=False,empty_label=_('No rank assigned'))
+    roles = False
+    email = forms.EmailField(max_length=255)
+    password = forms.CharField(max_length=255,widget=forms.PasswordInput)
+    
+    layout = [
+              [
+               _("Basic Account Settings"),
+               [
+                ('username', {'label': _("Username"), 'help_text': _("Username is name under which user is known to other users. Between 3 and 15 characters, only letters and digits are allowed.")}),
+                ('title', {'label': _("User Title"), 'help_text': _("To override user title with custom one, enter it here.")}),
+                ('rank', {'label': _("User Rank"), 'help_text': _("This user rank.")}),
+                ('roles', {'label': _("User Roles"), 'help_text': _("This user roles. Roles are sets of user permissions")}),
+                ],
+               ],
+              [
+               _("Sign-in Credentials"),
+               [
+                ('email', {'label': _("E-mail Address"), 'help_text': _("Member e-mail address.")}),
+                ('password', {'label': _("User Password"), 'help_text': _("Member password."), 'has_value': False}),
+                ],
+               ],
+              ]
+        
+    def __init__(self, *args, **kwargs):
+        self.request = kwargs['request']
+        
+        # Roles list
+        if self.request.user.is_god():
+            self.base_fields['roles'] = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple,queryset=Role.objects.order_by('name').all(),error_messages={'required': _("User must have at least one role assigned.")})
+        else:
+            self.base_fields['roles'] = forms.ModelMultipleChoiceField(widget=forms.CheckboxSelectMultiple,queryset=Role.objects.filter(protected__exact=False).order_by('name').all(),required=False)
+        
+        super(NewUserForm, self).__init__(*args, **kwargs)
+        
+    def clean_username(self):
+        new_user = User.objects.get_blank_user()
+        new_user.set_username(self.cleaned_data['username'])
+        try:
+            new_user.full_clean()
+        except ValidationError as e:
+            new_user.is_username_valid(e)
+        return self.cleaned_data['username']
+        
+    def clean_email(self):
+        new_user = User.objects.get_blank_user()
+        new_user.set_email(self.cleaned_data['email'])
+        try:
+            new_user.full_clean()
+        except ValidationError as e:
+            new_user.is_email_valid(e)
+        return self.cleaned_data['email']
+        
+    def clean_password(self):
+        new_user = User.objects.get_blank_user()
+        new_user.set_password(self.cleaned_data['password'])
+        try:
+            new_user.full_clean()
+        except ValidationError as e:
+            new_user.is_password_valid(e)
+        validate_password(self.cleaned_data['password'])
+        return self.cleaned_data['password']
+
+
 class SearchUsersForm(Form):
     username = forms.CharField(max_length=255, required=False)
     email = forms.CharField(max_length=255, required=False)

+ 34 - 1
misago/users/admin/users/views.py

@@ -4,7 +4,7 @@ from misago.admin import site
 from misago.admin.widgets import *
 from misago.security import get_random_string
 from misago.utils import slugify
-from misago.users.admin.users.forms import UserForm, SearchUsersForm
+from misago.users.admin.users.forms import UserForm, NewUserForm, SearchUsersForm
 from misago.users.models import User
 
 def reverse(route, target=None):
@@ -176,6 +176,39 @@ class List(ListWidget):
         return Message(_('Selected users have been deleted successfully.'), 'success'), reverse('admin_users')
     
 
+class New(FormWidget):
+    admin = site.get_action('users')
+    id = 'new'
+    fallback = 'admin_users' 
+    form = NewUserForm
+    submit_button = _("Save User")
+        
+    def get_new_url(self, request, model):
+        return reverse('admin_users')
+    
+    def get_edit_url(self, request, model):
+        return reverse('admin_users_edit', model)
+    
+    def submit_form(self, request, form, target):
+        new_user = User.objects.create_user(
+                                            form.cleaned_data['username'],
+                                            form.cleaned_data['email'],
+                                            form.cleaned_data['password'],
+                                            request.settings['default_timezone'],
+                                            request.META['REMOTE_ADDR'],
+                                            no_roles=True,
+                                            request=request,
+                                            )
+        new_user.title = form.cleaned_data['title']
+        new_user.rank = form.cleaned_data['rank']
+        
+        for role in form.cleaned_data['roles']:
+            new_user.roles.add(role)
+        new_user.save(force_update=True)
+        
+        return new_user, Message(_('New User has been created.'), 'success')
+    
+    
 class Edit(FormWidget):
     admin = site.get_action('users')
     id = 'edit'

+ 12 - 10
misago/users/models.py

@@ -37,18 +37,18 @@ class UserManager(models.Manager):
         monitor['last_user_name'] = last_user.username
         monitor['last_user_slug'] = last_user.username_slug
     
-    def create_user(self, username, email, password, timezone=False, ip='127.0.0.1', activation=0, request=False):
+    def create_user(self, username, email, password, timezone=False, ip='127.0.0.1', no_roles=False, activation=0, request=False):
         token = ''
         if activation > 0:
             token = get_random_string(12)
+        
+        try:
+            db_settings = request.settings
+        except AttributeError:
+            db_settings = DBSettings()
             
         if timezone == False:
-            try:
-                timezone = request.settings['default_timezone']
-                db_settings = request.settings
-            except AttributeError:
-                db_settings = DBSettings()
-                timezone = db_settings['default_timezone']
+            timezone = db_settings['default_timezone']
         
         # Get first rank
         try:
@@ -58,6 +58,7 @@ class UserManager(models.Manager):
         
         # Store user in database
         new_user = User(
+                        last_sync=tz_util.now(),
                         join_date=tz_util.now(),
                         join_ip=ip,
                         activation=activation,
@@ -73,9 +74,10 @@ class UserManager(models.Manager):
         new_user.default_avatar(db_settings)
         new_user.save(force_insert=True)
         
-        # Set user roles
-        new_user.roles.add(Role.objects.get(token='registered'))
-        new_user.save(force_update=True)
+        # Set user roles?
+        if not no_roles:
+            new_user.roles.add(Role.objects.get(token='registered'))
+            new_user.save(force_update=True)
         
         # Load monitor
         try: