Browse Source

Refractored Users app

Ralfp 12 years ago
parent
commit
85bad87579

+ 2 - 2
misago/admin/layout/users.py

@@ -30,7 +30,7 @@ ADMIN_ACTIONS=(
                          },
                         ],
                route='admin_users',
-               urlpatterns=patterns('misago.users.admin.users.views',
+               urlpatterns=patterns('misago.users.views.admin',
                         url(r'^$', 'List', name='admin_users'),
                         url(r'^(?P<page>\d+)/$', 'List', name='admin_users'),
                         url(r'^inactive/$', 'inactive', name='admin_users_inactive'),
@@ -150,7 +150,7 @@ ADMIN_ACTIONS=(
                          },
                         ],
                route='admin_users_pruning',
-               urlpatterns=patterns('misago.users.admin.pruning.views',
+               urlpatterns=patterns('misago.users.views.pruning',
                         url(r'^$', 'List', name='admin_users_pruning'),
                         url(r'^new/$', 'New', name='admin_users_pruning_new'),
                         url(r'^edit/(?P<target>\d+)/$', 'Edit', name='admin_users_pruning_edit'),

+ 0 - 0
misago/users/admin/pruning/__init__.py


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


+ 0 - 0
misago/users/admin/__init__.py → misago/users/forms/__init__.py


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

@@ -1,8 +1,8 @@
+from PIL import Image
 from django.conf import settings
 from django.core.exceptions import ValidationError
 from django.utils.translation import ugettext_lazy as _
 from django import forms
-from PIL import Image
 from misago.ranks.models import Rank
 from misago.roles.models import Role
 from misago.users.models import User

+ 6 - 0
misago/users/forms/list.py

@@ -0,0 +1,6 @@
+from django import forms
+from misago.forms import Form
+    
+    
+class QuickFindUserForm(Form):
+    username = forms.CharField()

+ 1 - 2
misago/users/admin/pruning/forms.py → misago/users/forms/pruning.py

@@ -1,7 +1,6 @@
-from django.core.validators import RegexValidator
 from django.utils.translation import ugettext_lazy as _
 from django import forms
-from misago.forms import Form, YesNoSwitch
+from misago.forms import Form
 
 class PruningForm(Form):
     name = forms.CharField(max_length=255)

+ 1 - 54
misago/users/forms.py → misago/users/forms/register.py

@@ -1,4 +1,3 @@
-import hashlib
 from django import forms
 from django.core.exceptions import ValidationError
 from django.utils.translation import ugettext_lazy as _
@@ -73,56 +72,4 @@ class UserRegisterForm(Form):
         except ValidationError as e:
             new_user.is_password_valid(e)
         validate_password(self.cleaned_data['password'])
-        return self.cleaned_data['password']
-    
-    
-class UserSendSpecialMailForm(Form):
-    email = forms.EmailField(max_length=255)
-    captcha_qa = captcha.QACaptchaField()
-    recaptcha = captcha.ReCaptchaField()
-    error_source = 'email'
-    
-    layout = [
-              (
-               None,
-               [('email', {'label': _("Your E-mail Address"), 'help_text': _("Enter email address you use to sign in to forums."), 'attrs': {'placeholder': _("Enter your e-mail address.")}})]
-               ),
-              (
-               None,
-               ['captcha_qa', 'recaptcha']
-               ),
-              ]
-    
-    def clean_email(self):
-        try:
-            email = self.cleaned_data['email'].lower()
-            email_hash = hashlib.md5(email).hexdigest()
-            self.found_user = User.objects.get(email_hash=email_hash)
-        except User.DoesNotExist:
-            raise ValidationError(_("There is no user with such e-mail address."))
-        return email
-    
-    
-class QuickFindUserForm(Form):
-    username = forms.CharField()
-    
-
-class UserForumOptionsForm(Form):
-    newsletters = forms.BooleanField(required=False)
-    timezone = forms.ChoiceField(choices=tzlist())
-    hide_activity = forms.ChoiceField(choices=(
-                                               (0, _("Show my presence to everyone")),
-                                               (1, _("Show my presence to people I follow")),
-                                               (2, _("Show my presence to nobody")),
-                                               ))
-    
-    layout = (
-              (
-               _("Forum Options"),
-               (
-                ('hide_activity', {'label': _("Your Visibility"), 'help_text': _("If you want to, you can limit other members ability to track your presence on forums.")}),
-                ('timezone', {'label': _("Your Current Timezone"), 'help_text': _("If dates and hours displayed by forums are inaccurate, you can fix it by adjusting timezone setting.")}),
-                ('newsletters', {'label': _("Newsletters"), 'help_text': _("On occasion board administrator may want to send e-mail message to multiple members."), 'inline': _("Yes, I want to subscribe forum newsletter")}),
-                )
-               ),
-              )
+        return self.cleaned_data['password']

+ 33 - 0
misago/users/forms/special.py

@@ -0,0 +1,33 @@
+from django import forms
+from django.core.exceptions import ValidationError
+from django.utils.translation import ugettext_lazy as _
+from misago.forms import Form
+from misago.security import captcha
+from misago.users.models import User
+    
+    
+class UserSendSpecialMailForm(Form):
+    email = forms.EmailField(max_length=255)
+    captcha_qa = captcha.QACaptchaField()
+    recaptcha = captcha.ReCaptchaField()
+    error_source = 'email'
+    
+    layout = [
+              (
+               None,
+               [('email', {'label': _("Your E-mail Address"), 'help_text': _("Enter email address you use to sign in to forums."), 'attrs': {'placeholder': _("Enter your e-mail address.")}})]
+               ),
+              (
+               None,
+               ['captcha_qa', 'recaptcha']
+               ),
+              ]
+    
+    def clean_email(self):
+        try:
+            email = self.cleaned_data['email'].lower()
+            email_hash = hashlib.md5(email).hexdigest()
+            self.found_user = User.objects.get(email_hash=email_hash)
+        except User.DoesNotExist:
+            raise ValidationError(_("There is no user with such e-mail address."))
+        return email

+ 25 - 0
misago/users/forms/usercp.py

@@ -0,0 +1,25 @@
+from django import forms
+from django.utils.translation import ugettext_lazy as _
+from misago.timezones import tzlist
+from misago.forms import Form
+
+
+class UserForumOptionsForm(Form):
+    newsletters = forms.BooleanField(required=False)
+    timezone = forms.ChoiceField(choices=tzlist())
+    hide_activity = forms.ChoiceField(choices=(
+                                               (0, _("Show my presence to everyone")),
+                                               (1, _("Show my presence to people I follow")),
+                                               (2, _("Show my presence to nobody")),
+                                               ))
+    
+    layout = (
+              (
+               _("Forum Options"),
+               (
+                ('hide_activity', {'label': _("Your Visibility"), 'help_text': _("If you want to, you can limit other members ability to track your presence on forums.")}),
+                ('timezone', {'label': _("Your Current Timezone"), 'help_text': _("If dates and hours displayed by forums are inaccurate, you can fix it by adjusting timezone setting.")}),
+                ('newsletters', {'label': _("Newsletters"), 'help_text': _("On occasion board administrator may want to send e-mail message to multiple members."), 'inline': _("Yes, I want to subscribe forum newsletter")}),
+                )
+               ),
+              )

+ 3 - 3
misago/users/urls.py

@@ -1,18 +1,18 @@
 from django.conf.urls import patterns, url, include
 
 urlpatterns = patterns('misago.users.views',
-    url(r'^register/$', 'register', name="register"),
+    url(r'^register/$', 'register.form', name="register"),
     url(r'^activate/(?P<username>[a-z0-9]+)-(?P<user>\d+)/(?P<token>[a-zA-Z0-9]+)/$', 'activation.activate', name="activate"),
     url(r'^resend-activation/$', 'activation.form', name="send_activation"),
     url(r'^reset-pass/$', 'password.form', name="forgot_password"),
     url(r'^reset-pass/(?P<username>[a-z0-9]+)-(?P<user>\d+)/(?P<token>[a-z0-9]+)/$', 'password.reset', name="reset_password"),
-    url(r'^users/$', 'profiles.list', name="users"),
+    url(r'^users/$', 'list.list', name="users"),
     url(r'^users/(?P<username>\w+)-(?P<user>\d+)/$', 'profiles.profile', name="user"),
     url(r'^users/(?P<username>\w+)-(?P<user>\d+)/threads/$', 'profiles.profile', name="user_threads", kwargs={'tab': 'threads'}),
     url(r'^users/(?P<username>\w+)-(?P<user>\d+)/following/$', 'profiles.profile', name="user_following", kwargs={'tab': 'following'}),
     url(r'^users/(?P<username>\w+)-(?P<user>\d+)/followiers/$', 'profiles.profile', name="user_followers", kwargs={'tab': 'followers'}),
     url(r'^users/(?P<username>\w+)-(?P<user>\d+)/details/$', 'profiles.profile', name="user_details", kwargs={'tab': 'details'}),
-    url(r'^users/(?P<rank_slug>(\w|-)+)/$', 'profiles.list', name="users"),
+    url(r'^users/(?P<rank_slug>(\w|-)+)/$', 'list.list', name="users"),
     url(r'^usercp/$', 'usercp.options', name="usercp"),
     url(r'^usercp/credentials$', 'usercp.credentials', name="usercp_credentials"),
     url(r'^usercp/username$', 'usercp.username', name="usercp_username"),

+ 0 - 81
misago/users/views/__init__.py

@@ -1,81 +0,0 @@
-from django.core.urlresolvers import reverse
-from django.shortcuts import redirect
-from django.template import RequestContext
-from django.utils import timezone
-from django.utils.translation import ugettext as _
-from misago.banning.decorators import block_banned
-from misago.forms.layouts import FormLayout
-from misago.messages import Message
-from misago.security.auth import sign_user_in
-from misago.security.decorators import *
-from misago.users.forms import *
-from misago.users.models import User
-from misago.views import redirect_message
-
-@block_banned
-@block_authenticated
-@block_jammed
-def register(request):
-    if request.settings['account_activation'] == 'block':
-       return redirect_message(request, Message(_("We are sorry but we don't allow new members registrations at this time.")), 'info')
-    
-    message = None
-    if request.method == 'POST':
-        form = UserRegisterForm(request.POST, request=request)
-        if form.is_valid():
-            need_activation = 0
-            if request.settings['account_activation'] == 'user':
-                need_activation = User.ACTIVATION_USER
-            if request.settings['account_activation'] == 'admin':
-                need_activation = User.ACTIVATION_ADMIN
-                
-            new_user = User.objects.create_user(
-                                                form.cleaned_data['username'],
-                                                form.cleaned_data['email'],
-                                                form.cleaned_data['password'],
-                                                ip=request.session.get_ip(request),
-                                                activation=need_activation,
-                                                request=request
-                                                )
-                        
-            if need_activation == User.ACTIVATION_NONE:
-                # No need for activation, sign in user
-                sign_user_in(request, new_user)
-                request.messages.set_flash(Message(_("Welcome aboard, %(username)s! Your account has been registered successfully.") % {'username': new_user.username}), 'success')
-                
-            if need_activation == User.ACTIVATION_USER:
-                # Mail user activation e-mail
-                request.messages.set_flash(Message(_("%(username)s, your account has been registered, but you will have to activate it before you will be able to sign-in. We have sent you an e-mail with activation link.") % {'username': new_user.username}), 'info')
-                new_user.email_user(
-                                    request,
-                                    'users/activation/user',
-                                    _("Welcome aboard, %(username)s!") % {'username': new_user.username},
-                                    )
-                
-            if need_activation == User.ACTIVATION_ADMIN:
-                # Require admin activation
-                request.messages.set_flash(Message(_("%(username)s, Your account has been registered, but you won't be able to sign in until board administrator accepts it. We'll notify when this happens. Thank you for your patience!") % {'username': new_user.username}), 'info')
-                new_user.email_user(
-                                    request,
-                                    'users/activation/admin',
-                                    _("Welcome aboard, %(username)s!") % {'username': new_user.username},
-                                    {'password': form.cleaned_data['password']}
-                                    )
-            return redirect(reverse('index'))
-        else:
-            message = Message(form.non_field_errors()[0], 'error')
-            if request.settings['registrations_jams']:
-                SignInAttempt.objects.register_attempt(request.session.get_ip(request))
-            # Have we jammed our account?
-            if SignInAttempt.objects.is_jammed(request.session.get_ip(request)):
-                request.jam.expires = timezone.now()
-                return redirect(reverse('register'))
-    else:
-        form = UserRegisterForm(request=request)
-    return request.theme.render_to_response('users/register.html',
-                                            {
-                                             'message': message,
-                                             'form': FormLayout(form),
-                                             'hide_signin': True, 
-                                            },
-                                            context_instance=RequestContext(request));

+ 1 - 1
misago/users/views/activation.py

@@ -7,7 +7,7 @@ from misago.forms.layouts import FormLayout
 from misago.messages import Message
 from misago.security.auth import sign_user_in
 from misago.security.decorators import *
-from misago.users.forms import *
+from misago.users.forms.special import UserSendSpecialMailForm
 from misago.users.models import User
 from misago.views import redirect_message, error404
 

+ 1 - 2
misago/users/admin/users/views.py → misago/users/views/admin.py

@@ -4,8 +4,7 @@ from django.utils.translation import ugettext as _
 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, NewUserForm, SearchUsersForm
+from misago.users.forms.admin import UserForm, NewUserForm, SearchUsersForm
 from misago.users.models import User
 
 def reverse(route, target=None):

+ 77 - 0
misago/users/views/list.py

@@ -0,0 +1,77 @@
+from django.core.urlresolvers import reverse
+from django.shortcuts import redirect
+from django.template import RequestContext
+from misago.forms import FormFields
+from misago.messages import Message
+from misago.ranks.models import Rank
+from misago.users.forms.list import QuickFindUserForm
+from misago.users.models import User
+from misago.views import error404
+from misago.utils import slugify
+
+
+def list(request, rank_slug=None):
+    ranks = Rank.objects.filter(as_tab=1).order_by('order')
+    
+    # Find active rank
+    active_rank = None
+    if rank_slug:
+        for rank in ranks:
+            if rank.name_slug == rank_slug:
+                active_rank = rank
+        if not active_rank:
+            return error404(request)
+    elif ranks:
+        active_rank = ranks[0]
+    
+    # Empty Defaults
+    message = None
+    users = []
+    in_search = False
+    
+    # Users search?
+    if request.method == 'POST':
+        in_search = True
+        active_rank = None
+        search_form = QuickFindUserForm(request.POST, request=request)
+        if search_form.is_valid():
+            # Direct hit?
+            username = search_form.cleaned_data['username']
+            try:
+                user = User.objects.get(username__iexact=username)
+                return redirect(reverse('user', args=(user.username_slug, user.pk)))
+            except User.DoesNotExist:
+                pass
+            
+            # Looks like well have to find near match
+            if len(username) > 6:
+                username = username[0:-3]
+            elif len(username) > 5:
+                username = username[0:-2]
+            elif len(username) > 4:
+                username = username[0:-1]
+            username = slugify(username.strip())
+            
+            # Go for rought match
+            if len(username) > 0:
+                print username
+                users = User.objects.filter(username_slug__startswith=username).order_by('username_slug')[:10]
+        elif search_form.non_field_errors()[0] == 'form_contains_errors':
+            message = Message(_("To search users you have to enter username in search field."), 'error')
+        else:
+            message = Message(search_form.non_field_errors()[0], 'error')
+    else:
+        search_form = QuickFindUserForm(request=request)
+        if active_rank:
+            users = User.objects.filter(rank=active_rank).order_by('username_slug')
+    
+    return request.theme.render_to_response('users/list.html',
+                                        {
+                                         'message': message,
+                                         'search_form': FormFields(search_form).fields,
+                                         'in_search': in_search,
+                                         'active_rank': active_rank,
+                                         'ranks': ranks,
+                                         'users': users,
+                                        },
+                                        context_instance=RequestContext(request));

+ 1 - 1
misago/users/views/password.py

@@ -7,7 +7,7 @@ from misago.forms.layouts import FormLayout
 from misago.messages import Message
 from misago.security import get_random_string
 from misago.security.decorators import *
-from misago.users.forms import *
+from misago.users.forms.special import UserSendSpecialMailForm
 from misago.users.models import User
 from misago.views import redirect_message, error404
 

+ 0 - 72
misago/users/views/profiles.py

@@ -1,80 +1,8 @@
 from django.core.urlresolvers import reverse
 from django.shortcuts import redirect
 from django.template import RequestContext
-from misago.forms import FormFields
-from misago.messages import Message
-from misago.ranks.models import Rank
-from misago.users.forms import QuickFindUserForm
 from misago.users.models import User
 from misago.views import error404
-from misago.utils import slugify
-
-
-def list(request, rank_slug=None):
-    ranks = Rank.objects.filter(as_tab=1).order_by('order')
-    
-    # Find active rank
-    active_rank = None
-    if rank_slug:
-        for rank in ranks:
-            if rank.name_slug == rank_slug:
-                active_rank = rank
-        if not active_rank:
-            return error404(request)
-    elif ranks:
-        active_rank = ranks[0]
-    
-    # Empty Defaults
-    message = None
-    users = []
-    in_search = False
-    
-    # Users search?
-    if request.method == 'POST':
-        in_search = True
-        active_rank = None
-        search_form = QuickFindUserForm(request.POST, request=request)
-        if search_form.is_valid():
-            # Direct hit?
-            username = search_form.cleaned_data['username']
-            try:
-                user = User.objects.get(username__iexact=username)
-                return redirect(reverse('user', args=(user.username_slug, user.pk)))
-            except User.DoesNotExist:
-                pass
-            
-            # Looks like well have to find near match
-            if len(username) > 6:
-                username = username[0:-3]
-            elif len(username) > 5:
-                username = username[0:-2]
-            elif len(username) > 4:
-                username = username[0:-1]
-            username = slugify(username.strip())
-            
-            # Go for rought match
-            if len(username) > 0:
-                print username
-                users = User.objects.filter(username_slug__startswith=username).order_by('username_slug')[:10]
-        elif search_form.non_field_errors()[0] == 'form_contains_errors':
-            message = Message(_("To search users you have to enter username in search field."), 'error')
-        else:
-            message = Message(search_form.non_field_errors()[0], 'error')
-    else:
-        search_form = QuickFindUserForm(request=request)
-        if active_rank:
-            users = User.objects.filter(rank=active_rank).order_by('username_slug')
-    
-    return request.theme.render_to_response('users/list.html',
-                                        {
-                                         'message': message,
-                                         'search_form': FormFields(search_form).fields,
-                                         'in_search': in_search,
-                                         'active_rank': active_rank,
-                                         'ranks': ranks,
-                                         'users': users,
-                                        },
-                                        context_instance=RequestContext(request));
 
 
 def profile(request, user, username, tab='posts'):

+ 1 - 1
misago/users/admin/pruning/views.py → misago/users/views/pruning.py

@@ -4,7 +4,7 @@ from django.utils.translation import ugettext as _
 from misago.admin import site
 from misago.admin.widgets import *
 from misago.forms import Form
-from misago.users.admin.pruning.forms import PruningForm
+from misago.users.forms.pruning import PruningForm
 from misago.users.models import Pruning
 
 def reverse(route, target=None):

+ 81 - 0
misago/users/views/register.py

@@ -0,0 +1,81 @@
+from django.core.urlresolvers import reverse
+from django.shortcuts import redirect
+from django.template import RequestContext
+from django.utils import timezone
+from django.utils.translation import ugettext as _
+from misago.banning.decorators import block_banned
+from misago.forms.layouts import FormLayout
+from misago.messages import Message
+from misago.security.auth import sign_user_in
+from misago.security.decorators import *
+from misago.users.forms.register import UserRegisterForm
+from misago.users.models import User
+from misago.views import redirect_message
+
+@block_banned
+@block_authenticated
+@block_jammed
+def form(request):
+    if request.settings['account_activation'] == 'block':
+       return redirect_message(request, Message(_("We are sorry but we don't allow new members registrations at this time.")), 'info')
+    
+    message = None
+    if request.method == 'POST':
+        form = UserRegisterForm(request.POST, request=request)
+        if form.is_valid():
+            need_activation = 0
+            if request.settings['account_activation'] == 'user':
+                need_activation = User.ACTIVATION_USER
+            if request.settings['account_activation'] == 'admin':
+                need_activation = User.ACTIVATION_ADMIN
+                
+            new_user = User.objects.create_user(
+                                                form.cleaned_data['username'],
+                                                form.cleaned_data['email'],
+                                                form.cleaned_data['password'],
+                                                ip=request.session.get_ip(request),
+                                                activation=need_activation,
+                                                request=request
+                                                )
+                        
+            if need_activation == User.ACTIVATION_NONE:
+                # No need for activation, sign in user
+                sign_user_in(request, new_user)
+                request.messages.set_flash(Message(_("Welcome aboard, %(username)s! Your account has been registered successfully.") % {'username': new_user.username}), 'success')
+                
+            if need_activation == User.ACTIVATION_USER:
+                # Mail user activation e-mail
+                request.messages.set_flash(Message(_("%(username)s, your account has been registered, but you will have to activate it before you will be able to sign-in. We have sent you an e-mail with activation link.") % {'username': new_user.username}), 'info')
+                new_user.email_user(
+                                    request,
+                                    'users/activation/user',
+                                    _("Welcome aboard, %(username)s!") % {'username': new_user.username},
+                                    )
+                
+            if need_activation == User.ACTIVATION_ADMIN:
+                # Require admin activation
+                request.messages.set_flash(Message(_("%(username)s, Your account has been registered, but you won't be able to sign in until board administrator accepts it. We'll notify when this happens. Thank you for your patience!") % {'username': new_user.username}), 'info')
+                new_user.email_user(
+                                    request,
+                                    'users/activation/admin',
+                                    _("Welcome aboard, %(username)s!") % {'username': new_user.username},
+                                    {'password': form.cleaned_data['password']}
+                                    )
+            return redirect(reverse('index'))
+        else:
+            message = Message(form.non_field_errors()[0], 'error')
+            if request.settings['registrations_jams']:
+                SignInAttempt.objects.register_attempt(request.session.get_ip(request))
+            # Have we jammed our account?
+            if SignInAttempt.objects.is_jammed(request.session.get_ip(request)):
+                request.jam.expires = timezone.now()
+                return redirect(reverse('register'))
+    else:
+        form = UserRegisterForm(request=request)
+    return request.theme.render_to_response('users/register.html',
+                                            {
+                                             'message': message,
+                                             'form': FormLayout(form),
+                                             'hide_signin': True, 
+                                            },
+                                            context_instance=RequestContext(request));

+ 1 - 1
misago/users/views/usercp.py

@@ -5,7 +5,7 @@ from django.utils.translation import ugettext as _
 from misago.forms import FormLayout
 from misago.messages import Message
 from misago.security.decorators import *
-from misago.users.forms import UserForumOptionsForm
+from misago.users.forms.usercp import UserForumOptionsForm
 
 
 @block_guest