Commit d733629f29588ca2f60691f696a7b76be33fd898
Exists in
master
and in
39 other branches
Merge branch 'incomplete_register_redirect' into 'master'
Incomplete register redirect Let browserid handle the new users registration.
Showing
12 changed files
with
96 additions
and
56 deletions
Show diff stats
colab/accounts/auth.py
| 1 | 1 | ||
| 2 | from django_browserid.auth import BrowserIDBackend | 2 | from django_browserid.auth import BrowserIDBackend |
| 3 | 3 | ||
| 4 | + | ||
| 4 | class ColabBrowserIDBackend(BrowserIDBackend): | 5 | class ColabBrowserIDBackend(BrowserIDBackend): |
| 5 | def filter_users_by_email(self, email): | 6 | def filter_users_by_email(self, email): |
| 6 | return self.User.objects.filter(emails__address=email) | 7 | return self.User.objects.filter(emails__address=email) |
colab/accounts/forms.py
| @@ -32,7 +32,7 @@ class UserForm(forms.ModelForm): | @@ -32,7 +32,7 @@ class UserForm(forms.ModelForm): | ||
| 32 | # Forces username to be lowercase always | 32 | # Forces username to be lowercase always |
| 33 | widget=forms.TextInput(attrs={'style' : 'text-transform: lowercase;'}), | 33 | widget=forms.TextInput(attrs={'style' : 'text-transform: lowercase;'}), |
| 34 | ) | 34 | ) |
| 35 | - required = ('first_name', 'last_name', 'email', 'username') | 35 | + required = ('first_name', 'last_name', 'username') |
| 36 | 36 | ||
| 37 | class Meta: | 37 | class Meta: |
| 38 | model = User | 38 | model = User |
| @@ -49,9 +49,17 @@ class UserForm(forms.ModelForm): | @@ -49,9 +49,17 @@ class UserForm(forms.ModelForm): | ||
| 49 | 49 | ||
| 50 | 50 | ||
| 51 | class UserCreationForm(UserForm): | 51 | class UserCreationForm(UserForm): |
| 52 | + | ||
| 53 | + def clean_username(self): | ||
| 54 | + username = self.cleaned_data['username'] | ||
| 55 | + username = username.strip() | ||
| 56 | + if not username: | ||
| 57 | + raise forms.ValidationError(_('This field cannot be blank.')) | ||
| 58 | + return username | ||
| 59 | + | ||
| 52 | class Meta: | 60 | class Meta: |
| 53 | model = User | 61 | model = User |
| 54 | - fields = ('first_name', 'last_name', 'email', 'username') | 62 | + fields = ('first_name', 'last_name', 'username') |
| 55 | 63 | ||
| 56 | 64 | ||
| 57 | class UserUpdateForm(UserForm): | 65 | class UserUpdateForm(UserForm): |
colab/accounts/management/__init__.py
colab/accounts/management/commands/__init__.py
colab/accounts/management/commands/delete_invalid.py
| @@ -1,42 +0,0 @@ | @@ -1,42 +0,0 @@ | ||
| 1 | - | ||
| 2 | - | ||
| 3 | -from django.db.models import F | ||
| 4 | -from django.utils import timezone | ||
| 5 | -from django.utils.translation import ugettext as _ | ||
| 6 | -from django.core.management.base import BaseCommand, CommandError | ||
| 7 | - | ||
| 8 | - | ||
| 9 | -from ...models import User | ||
| 10 | - | ||
| 11 | - | ||
| 12 | -class Command(BaseCommand): | ||
| 13 | - """Delete user accounts that have never logged in. | ||
| 14 | - | ||
| 15 | - Delete from database user accounts that have never logged in | ||
| 16 | - and are at least 24h older. | ||
| 17 | - | ||
| 18 | - """ | ||
| 19 | - | ||
| 20 | - help = __doc__ | ||
| 21 | - | ||
| 22 | - def handle(self, *args, **kwargs): | ||
| 23 | - seconds = timezone.timedelta(seconds=1) | ||
| 24 | - now = timezone.now() | ||
| 25 | - one_day_ago = timezone.timedelta(days=1) | ||
| 26 | - | ||
| 27 | - # Query for users that have NEVER logged in | ||
| 28 | - # | ||
| 29 | - # By default django sets the last_login as auto_now and then | ||
| 30 | - # last_login is pretty much the same than date_joined | ||
| 31 | - # (instead of null as I expected). Because of that we query | ||
| 32 | - # for users which last_login is between date_joined - N and | ||
| 33 | - # date_joined + N, where N is a small constant in seconds. | ||
| 34 | - users = User.objects.filter(last_login__gt=(F('date_joined') - seconds), | ||
| 35 | - last_login__lt=(F('date_joined') + seconds), | ||
| 36 | - date_joined__lt=now-one_day_ago) | ||
| 37 | - count = 0 | ||
| 38 | - for user in users: | ||
| 39 | - count += 1 | ||
| 40 | - user.delete() | ||
| 41 | - | ||
| 42 | - print _(u'%(count)s users deleted.') % {'count': count} |
| @@ -0,0 +1,21 @@ | @@ -0,0 +1,21 @@ | ||
| 1 | + | ||
| 2 | +from django.shortcuts import redirect | ||
| 3 | + | ||
| 4 | +VIEW_NAMES_ALLOWED = ('signup', 'Logout') | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +class UserRegisterMiddleware(object): | ||
| 8 | + | ||
| 9 | + def process_view(self, request, view_func, view_args, view_kwargs): | ||
| 10 | + | ||
| 11 | + if request.is_ajax(): | ||
| 12 | + return | ||
| 13 | + | ||
| 14 | + if not request.user.is_authenticated(): | ||
| 15 | + return | ||
| 16 | + | ||
| 17 | + if not request.user.needs_update: | ||
| 18 | + return | ||
| 19 | + | ||
| 20 | + if view_func.__name__ not in VIEW_NAMES_ALLOWED: | ||
| 21 | + return redirect('signup') |
| @@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | ||
| 2 | +from __future__ import unicode_literals | ||
| 3 | + | ||
| 4 | +from django.db import models, migrations | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +class Migration(migrations.Migration): | ||
| 8 | + | ||
| 9 | + dependencies = [ | ||
| 10 | + ('accounts', '0001_initial'), | ||
| 11 | + ] | ||
| 12 | + | ||
| 13 | + operations = [ | ||
| 14 | + migrations.AddField( | ||
| 15 | + model_name='user', | ||
| 16 | + name='needs_update', | ||
| 17 | + field=models.BooleanField(default=False), | ||
| 18 | + preserve_default=True, | ||
| 19 | + ), | ||
| 20 | + ] |
| @@ -0,0 +1,20 @@ | @@ -0,0 +1,20 @@ | ||
| 1 | +# -*- coding: utf-8 -*- | ||
| 2 | +from __future__ import unicode_literals | ||
| 3 | + | ||
| 4 | +from django.db import models, migrations | ||
| 5 | + | ||
| 6 | + | ||
| 7 | +class Migration(migrations.Migration): | ||
| 8 | + | ||
| 9 | + dependencies = [ | ||
| 10 | + ('accounts', '0002_user_needs_update'), | ||
| 11 | + ] | ||
| 12 | + | ||
| 13 | + operations = [ | ||
| 14 | + migrations.AlterField( | ||
| 15 | + model_name='user', | ||
| 16 | + name='needs_update', | ||
| 17 | + field=models.BooleanField(default=True), | ||
| 18 | + preserve_default=True, | ||
| 19 | + ), | ||
| 20 | + ] |
colab/accounts/models.py
| @@ -26,6 +26,7 @@ class User(AbstractUser): | @@ -26,6 +26,7 @@ class User(AbstractUser): | ||
| 26 | verification_hash = models.CharField(max_length=32, null=True, blank=True) | 26 | verification_hash = models.CharField(max_length=32, null=True, blank=True) |
| 27 | modified = models.DateTimeField(auto_now=True) | 27 | modified = models.DateTimeField(auto_now=True) |
| 28 | bio = models.CharField(max_length=200, null=True, blank=True) | 28 | bio = models.CharField(max_length=200, null=True, blank=True) |
| 29 | + needs_update = models.BooleanField(default=True) | ||
| 29 | 30 | ||
| 30 | def check_password(self, raw_password): | 31 | def check_password(self, raw_password): |
| 31 | 32 |
colab/accounts/views.py
| @@ -123,21 +123,34 @@ class UserProfileDetailView(UserProfileBaseMixin, DetailView): | @@ -123,21 +123,34 @@ class UserProfileDetailView(UserProfileBaseMixin, DetailView): | ||
| 123 | 123 | ||
| 124 | 124 | ||
| 125 | def signup(request): | 125 | def signup(request): |
| 126 | + user = request.user | ||
| 127 | + | ||
| 128 | + # If the user is not authenticated, redirect to login | ||
| 129 | + if not user.is_authenticated(): | ||
| 130 | + return redirect('login') | ||
| 131 | + | ||
| 132 | + # If the user doesn't need to update its main data, redirect to its profile | ||
| 133 | + if not user.needs_update: | ||
| 134 | + return redirect('user_profile', username=user.username) | ||
| 135 | + | ||
| 126 | # If the request method is GET just return the form | 136 | # If the request method is GET just return the form |
| 127 | if request.method == 'GET': | 137 | if request.method == 'GET': |
| 128 | user_form = UserCreationForm() | 138 | user_form = UserCreationForm() |
| 129 | lists_form = ListsForm() | 139 | lists_form = ListsForm() |
| 140 | + | ||
| 130 | return render(request, 'accounts/user_create_form.html', | 141 | return render(request, 'accounts/user_create_form.html', |
| 131 | {'user_form': user_form, 'lists_form': lists_form}) | 142 | {'user_form': user_form, 'lists_form': lists_form}) |
| 132 | 143 | ||
| 133 | - user_form = UserCreationForm(request.POST) | 144 | + user_form = UserCreationForm(request.POST, instance=user) |
| 134 | lists_form = ListsForm(request.POST) | 145 | lists_form = ListsForm(request.POST) |
| 135 | 146 | ||
| 136 | if not user_form.is_valid() or not lists_form.is_valid(): | 147 | if not user_form.is_valid() or not lists_form.is_valid(): |
| 137 | return render(request, 'accounts/user_create_form.html', | 148 | return render(request, 'accounts/user_create_form.html', |
| 138 | {'user_form': user_form, 'lists_form': lists_form}) | 149 | {'user_form': user_form, 'lists_form': lists_form}) |
| 139 | 150 | ||
| 140 | - user = user_form.save() | 151 | + user = user_form.save(commit=False) |
| 152 | + user.needs_update = False | ||
| 153 | + user.save() | ||
| 141 | 154 | ||
| 142 | # Check if the user's email have been used previously | 155 | # Check if the user's email have been used previously |
| 143 | # in the mainling lists to link the user to old messages | 156 | # in the mainling lists to link the user to old messages |
| @@ -152,8 +165,6 @@ def signup(request): | @@ -152,8 +165,6 @@ def signup(request): | ||
| 152 | mailman.update_subscription(user.email, mailing_lists) | 165 | mailman.update_subscription(user.email, mailing_lists) |
| 153 | 166 | ||
| 154 | messages.success(request, _('Your profile has been created!')) | 167 | messages.success(request, _('Your profile has been created!')) |
| 155 | - messages.warning(request, _('You must login to validated your profile. ' | ||
| 156 | - 'Profiles not validated are deleted in 24h.')) | ||
| 157 | 168 | ||
| 158 | return redirect('user_profile', username=user.username) | 169 | return redirect('user_profile', username=user.username) |
| 159 | 170 |
colab/settings.py
| @@ -214,6 +214,7 @@ MIDDLEWARE_CLASSES = ( | @@ -214,6 +214,7 @@ MIDDLEWARE_CLASSES = ( | ||
| 214 | 'django_mobile.middleware.MobileDetectionMiddleware', | 214 | 'django_mobile.middleware.MobileDetectionMiddleware', |
| 215 | 'django_mobile.middleware.SetFlavourMiddleware', | 215 | 'django_mobile.middleware.SetFlavourMiddleware', |
| 216 | 'colab.tz.middleware.TimezoneMiddleware', | 216 | 'colab.tz.middleware.TimezoneMiddleware', |
| 217 | + 'colab.accounts.middleware.UserRegisterMiddleware', | ||
| 217 | ) | 218 | ) |
| 218 | 219 | ||
| 219 | # Add the django_browserid authentication backend. | 220 | # Add the django_browserid authentication backend. |
| @@ -272,12 +273,13 @@ LOGIN_URL = '/user/login' | @@ -272,12 +273,13 @@ LOGIN_URL = '/user/login' | ||
| 272 | LOGIN_REDIRECT_URL = '/' | 273 | LOGIN_REDIRECT_URL = '/' |
| 273 | LOGIN_REDIRECT_URL_FAILURE = '/?bid_login_failed=true' | 274 | LOGIN_REDIRECT_URL_FAILURE = '/?bid_login_failed=true' |
| 274 | LOGOUT_REDIRECT_URL = '/' | 275 | LOGOUT_REDIRECT_URL = '/' |
| 275 | -BROWSERID_CREATE_USER = False | 276 | +BROWSERID_CREATE_USER = True |
| 276 | 277 | ||
| 277 | REVPROXY_ADD_REMOTE_USER = True | 278 | REVPROXY_ADD_REMOTE_USER = True |
| 278 | 279 | ||
| 279 | # Converse.js settings | 280 | # Converse.js settings |
| 280 | # This URL must use SSL in order to keep chat sessions secure | 281 | # This URL must use SSL in order to keep chat sessions secure |
| 282 | +CONVERSEJS_ENABLED = False | ||
| 281 | CONVERSEJS_BOSH_SERVICE_URL = SITE_URL + '/http-bind' | 283 | CONVERSEJS_BOSH_SERVICE_URL = SITE_URL + '/http-bind' |
| 282 | 284 | ||
| 283 | CONVERSEJS_ALLOW_CONTACT_REQUESTS = False | 285 | CONVERSEJS_ALLOW_CONTACT_REQUESTS = False |
colab/templates/base.html
| @@ -119,28 +119,28 @@ | @@ -119,28 +119,28 @@ | ||
| 119 | {% if proxy.noosfero %} | 119 | {% if proxy.noosfero %} |
| 120 | <li class="dropdown"> | 120 | <li class="dropdown"> |
| 121 | <a href="#" class="dropdown-toggle" data-toggle="dropdown"> | 121 | <a href="#" class="dropdown-toggle" data-toggle="dropdown"> |
| 122 | - {% trans "Social" %} <b class="caret"></b> | 122 | + {% trans "Social" %} <b class="caret"></b> |
| 123 | </a> | 123 | </a> |
| 124 | <ul class="dropdown-menu"> | 124 | <ul class="dropdown-menu"> |
| 125 | <li> | 125 | <li> |
| 126 | <a href="/social/search/people"> | 126 | <a href="/social/search/people"> |
| 127 | - {% trans "Users" %} | 127 | + {% trans "Users" %} |
| 128 | </a> | 128 | </a> |
| 129 | </li> | 129 | </li> |
| 130 | <li> | 130 | <li> |
| 131 | <a href="/social/search/communities"> | 131 | <a href="/social/search/communities"> |
| 132 | - {% trans "Communities" %} | 132 | + {% trans "Communities" %} |
| 133 | </a> | 133 | </a> |
| 134 | </li> | 134 | </li> |
| 135 | {% if user.is_active %} | 135 | {% if user.is_active %} |
| 136 | <li> | 136 | <li> |
| 137 | <a href="/social/profile/{{ user.username }}"> | 137 | <a href="/social/profile/{{ user.username }}"> |
| 138 | - {% trans "Profile" %} | 138 | + {% trans "Profile" %} |
| 139 | </a> | 139 | </a> |
| 140 | </li> | 140 | </li> |
| 141 | <li> | 141 | <li> |
| 142 | <a href="/social/myprofile/{{ user.username }}"> | 142 | <a href="/social/myprofile/{{ user.username }}"> |
| 143 | - {% trans "Control panel" %} | 143 | + {% trans "Control panel" %} |
| 144 | </a> | 144 | </a> |
| 145 | </li> | 145 | </li> |
| 146 | {% endif %} | 146 | {% endif %} |
| @@ -180,12 +180,10 @@ | @@ -180,12 +180,10 @@ | ||
| 180 | <li class="dropdown hidden-xs hidden-lg"> | 180 | <li class="dropdown hidden-xs hidden-lg"> |
| 181 | <a href="#" class="dropdown-toggle" data-toggle="dropdown">Acesso <b class="caret"></b></a> | 181 | <a href="#" class="dropdown-toggle" data-toggle="dropdown">Acesso <b class="caret"></b></a> |
| 182 | <ul class="dropdown-menu"> | 182 | <ul class="dropdown-menu"> |
| 183 | - <li><a href="{% url 'signup' %}">{% trans "Register" %}</a></li> | ||
| 184 | {% trans 'Login' as login_text %} | 183 | {% trans 'Login' as login_text %} |
| 185 | <li>{% browserid_login text=login_text %}</li> | 184 | <li>{% browserid_login text=login_text %}</li> |
| 186 | </ul> | 185 | </ul> |
| 187 | </li> | 186 | </li> |
| 188 | - <li class="visible-xs hidden-sm hidden-md"><a href="{% url 'signup' %}">{% trans "Register" %}</a></li> | ||
| 189 | {% trans 'Login' as login_text %} | 187 | {% trans 'Login' as login_text %} |
| 190 | <li class="visible-xs hidden-sm hidden-md">{% browserid_login text=login_text %}</li> | 188 | <li class="visible-xs hidden-sm hidden-md">{% browserid_login text=login_text %}</li> |
| 191 | {% else %} | 189 | {% else %} |