-
My Info
-
E-Mail
+
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/migrations/0001_initial.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/migrations/0001_initial.py
index 8327d2890..e76c333f0 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/migrations/0001_initial.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/migrations/0001_initial.py
@@ -1,44 +1,47 @@
# -*- coding: utf-8 -*-
+# Generated by Django 1.10.1 on 2016-09-23 04:36
from __future__ import unicode_literals
-from django.db import models, migrations
-import django.utils.timezone
import django.contrib.auth.models
-import django.core.validators
+import django.contrib.auth.validators
+from django.db import migrations, models
+import django.utils.timezone
class Migration(migrations.Migration):
+ initial = True
+
dependencies = [
- ('auth', '0006_require_contenttypes_0002'),
+ ('auth', '0008_alter_user_username_max_length'),
]
operations = [
migrations.CreateModel(
name='User',
fields=[
- ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)),
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
- ('last_login', models.DateTimeField(null=True, verbose_name='last login', blank=True)),
- ('is_superuser', models.BooleanField(help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status', default=False)),
- ('username', models.CharField(max_length=30, validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username. This value may contain only letters, numbers and @/./+/-/_ characters.', 'invalid')], verbose_name='username', error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True)),
- ('first_name', models.CharField(max_length=30, verbose_name='first name', blank=True)),
- ('last_name', models.CharField(max_length=30, verbose_name='last name', blank=True)),
- ('email', models.EmailField(max_length=254, verbose_name='email address', blank=True)),
- ('is_staff', models.BooleanField(help_text='Designates whether the user can log into this admin site.', verbose_name='staff status', default=False)),
- ('is_active', models.BooleanField(help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active', default=True)),
- ('date_joined', models.DateTimeField(verbose_name='date joined', default=django.utils.timezone.now)),
- ('groups', models.ManyToManyField(related_name='user_set', blank=True, verbose_name='groups', to='auth.Group', help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_query_name='user')),
- ('user_permissions', models.ManyToManyField(related_name='user_set', blank=True, verbose_name='user permissions', to='auth.Permission', help_text='Specific permissions for this user.', related_query_name='user')),
- ('name', models.CharField(max_length=255, verbose_name='Name of User', blank=True)),
+ ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
+ ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
+ ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
+ ('first_name', models.CharField(blank=True, max_length=30, verbose_name='first name')),
+ ('last_name', models.CharField(blank=True, max_length=30, verbose_name='last name')),
+ ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
+ ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
+ ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
+ ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
+ ('name', models.CharField(blank=True, max_length=255, verbose_name='Name of User')),
+ ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')),
+ ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')),
],
options={
+ 'verbose_name_plural': 'users',
'verbose_name': 'user',
'abstract': False,
- 'verbose_name_plural': 'users',
},
managers=[
- (b'objects', django.contrib.auth.models.UserManager()),
+ ('objects', django.contrib.auth.models.UserManager()),
],
),
]
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py
index 10b07b749..a1ff0b846 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_admin.py
@@ -6,14 +6,14 @@ from ..admin import MyUserCreationForm
class TestMyUserCreationForm(TestCase):
def setUp(self):
- self.user = self.make_user()
+ self.user = self.make_user('notalamode', 'notalamodespassword')
def test_clean_username_success(self):
# Instantiate the form with a new username
form = MyUserCreationForm({
'username': 'alamode',
- 'password1': '123456',
- 'password2': '123456',
+ 'password1': '7jefB#f@Cc7YJB]2v',
+ 'password2': '7jefB#f@Cc7YJB]2v',
})
# Run is_valid() to trigger the validation
valid = form.is_valid()
@@ -27,8 +27,8 @@ class TestMyUserCreationForm(TestCase):
# Instantiate the form with the same username as self.user
form = MyUserCreationForm({
'username': self.user.username,
- 'password1': '123456',
- 'password2': '123456',
+ 'password1': 'notalamodespassword',
+ 'password2': 'notalamodespassword',
})
# Run is_valid() to trigger the validation, which is going to fail
# because the username is already taken
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_urls.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_urls.py
new file mode 100644
index 000000000..6e181cc8e
--- /dev/null
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/tests/test_urls.py
@@ -0,0 +1,51 @@
+from django.core.urlresolvers import reverse, resolve
+
+from test_plus.test import TestCase
+
+
+class TestUserURLs(TestCase):
+ """Test URL patterns for users app."""
+
+ def setUp(self):
+ self.user = self.make_user()
+
+ def test_list_reverse(self):
+ """users:list should reverse to /users/."""
+ self.assertEqual(reverse('users:list'), '/users/')
+
+ def test_list_resolve(self):
+ """/users/ should resolve to users:list."""
+ self.assertEqual(resolve('/users/').view_name, 'users:list')
+
+ def test_redirect_reverse(self):
+ """users:redirect should reverse to /users/~redirect/."""
+ self.assertEqual(reverse('users:redirect'), '/users/~redirect/')
+
+ def test_redirect_resolve(self):
+ """/users/~redirect/ should resolve to users:redirect."""
+ self.assertEqual(
+ resolve('/users/~redirect/').view_name,
+ 'users:redirect'
+ )
+
+ def test_detail_reverse(self):
+ """users:detail should reverse to /users/testuser/."""
+ self.assertEqual(
+ reverse('users:detail', kwargs={'username': 'testuser'}),
+ '/users/testuser/'
+ )
+
+ def test_detail_resolve(self):
+ """/users/testuser/ should resolve to users:detail."""
+ self.assertEqual(resolve('/users/testuser/').view_name, 'users:detail')
+
+ def test_update_reverse(self):
+ """users:update should reverse to /users/~update/."""
+ self.assertEqual(reverse('users:update'), '/users/~update/')
+
+ def test_update_resolve(self):
+ """/users/~update/ should resolve to users:update."""
+ self.assertEqual(
+ resolve('/users/~update/').view_name,
+ 'users:update'
+ )
diff --git a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/urls.py b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/urls.py
index d0592ef97..6ae4b6fa6 100644
--- a/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/urls.py
+++ b/{{cookiecutter.project_slug}}/{{cookiecutter.project_slug}}/users/urls.py
@@ -6,28 +6,21 @@ from django.conf.urls import url
from . import views
urlpatterns = [
- # URL pattern for the UserListView
url(
regex=r'^$',
view=views.UserListView.as_view(),
name='list'
),
-
- # URL pattern for the UserRedirectView
url(
regex=r'^~redirect/$',
view=views.UserRedirectView.as_view(),
name='redirect'
),
-
- # URL pattern for the UserDetailView
url(
regex=r'^(?P
[\w.@+-]+)/$',
view=views.UserDetailView.as_view(),
name='detail'
),
-
- # URL pattern for the UserUpdateView
url(
regex=r'^~update/$',
view=views.UserUpdateView.as_view(),