diff --git a/README.rst b/README.rst index 8b2f1a2c..caddff6f 100644 --- a/README.rst +++ b/README.rst @@ -21,13 +21,12 @@ This cookiecutter template uses features that exists only in cookiecutter 0.9.0 Features --------- -* For Django 1.7 +* For Django 1.8 * Twitter Bootstrap_ 3 * AngularJS_ * 12-Factor_ based settings via django-environ_ * Optimized development and production settings * Registration via django-allauth_ -* User avatars via django-avatar_ * Procfile_ for deploying to Heroku * Grunt build for compass and livereload * Basic e-mail configurations for send emails via SendGrid_ @@ -47,7 +46,7 @@ Constraints ----------- * Only maintained 3rd party libraries are used. -* PostgreSQL everywhere +* PostgreSQL everywhere (9.0+) * Environment variables for configuration (This won't work with Apache/mod_wsgi). diff --git a/{{cookiecutter.repo_name}}/config/settings/common.py b/{{cookiecutter.repo_name}}/config/settings/common.py index 8d8ae674..6971dbd6 100644 --- a/{{cookiecutter.repo_name}}/config/settings/common.py +++ b/{{cookiecutter.repo_name}}/config/settings/common.py @@ -36,7 +36,6 @@ DJANGO_APPS = ( ) THIRD_PARTY_APPS = ( 'crispy_forms', # Form layouts - 'avatar', # for user avatars 'allauth', # registration 'allauth.account', # registration 'allauth.socialaccount', # registration diff --git a/{{cookiecutter.repo_name}}/config/urls.py b/{{cookiecutter.repo_name}}/config/urls.py index bd730660..fafc1c0f 100644 --- a/{{cookiecutter.repo_name}}/config/urls.py +++ b/{{cookiecutter.repo_name}}/config/urls.py @@ -21,9 +21,6 @@ urlpatterns = patterns('', # noqa url(r'^users/', include("{{ cookiecutter.repo_name }}.users.urls", namespace="users")), url(r'^accounts/', include('allauth.urls')), - # Uncomment the next line to enable avatars - url(r'^avatar/', include('avatar.urls')), - # Your stuff: custom urls includes go here diff --git a/{{cookiecutter.repo_name}}/requirements/base.txt b/{{cookiecutter.repo_name}}/requirements/base.txt index 13daf2d9..5a44667a 100644 --- a/{{cookiecutter.repo_name}}/requirements/base.txt +++ b/{{cookiecutter.repo_name}}/requirements/base.txt @@ -1,5 +1,5 @@ # Bleeding edge Django -django>=1.7.7,<1.8 +django==1.8 # Configuration django-environ==0.3.0 @@ -27,9 +27,6 @@ psycopg2==2.6 unicode-slugify==0.1.3 django-autoslug==1.7.2 -# Useful things -django-avatar==2.0 - # Time zones support pytz==2015.2 diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/contrib/sites/migrations/0001_initial.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/contrib/sites/migrations/0001_initial.py index 87d55c75..555d02c4 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/contrib/sites/migrations/0001_initial.py +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/contrib/sites/migrations/0001_initial.py @@ -14,16 +14,18 @@ class Migration(migrations.Migration): migrations.CreateModel( name='Site', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), - ('domain', models.CharField(max_length=100, verbose_name='domain name', validators=[django.contrib.sites.models._simple_domain_name_validator])), - ('name', models.CharField(max_length=50, verbose_name='display name')), + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('domain', models.CharField(verbose_name='domain name', max_length=100, validators=[django.contrib.sites.models._simple_domain_name_validator])), + ('name', models.CharField(verbose_name='display name', max_length=50)), ], options={ - 'ordering': ('domain',), - 'db_table': 'django_site', - 'verbose_name': 'site', 'verbose_name_plural': 'sites', + 'verbose_name': 'site', + 'db_table': 'django_site', + 'ordering': ('domain',), }, - bases=(models.Model,), + managers=[ + (b'objects', django.contrib.sites.models.SiteManager()), + ], ), ] diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/add.html b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/add.html deleted file mode 100644 index 077b81b5..00000000 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/add.html +++ /dev/null @@ -1,23 +0,0 @@ -{% raw %} -{% extends "avatar/base.html" %} -{% load i18n avatar_tags %} -{% load url from future %} - -{% block content %} -
-
-
-

{% trans "Your current avatar: " %}

- {% avatar user %} - {% if not avatars %} -

{% trans "You haven't uploaded an avatar yet. Please upload one now." %}

- {% endif %} -
- {{ upload_avatar_form.as_p }} -

{% csrf_token %}

-
-
-
-
-{% endblock %} -{% endraw %} \ No newline at end of file diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/avatar_tag.html b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/avatar_tag.html deleted file mode 100644 index febc17f0..00000000 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/avatar_tag.html +++ /dev/null @@ -1 +0,0 @@ -{% raw %}{% endraw %} \ No newline at end of file diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/base.html b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/base.html deleted file mode 100644 index 6a0e6e9d..00000000 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/base.html +++ /dev/null @@ -1,5 +0,0 @@ -{% raw %}{% extends "base.html" %} - -{% block title %}django-avatar{% endblock %} -{% block content %}{% endblock %} -{% endraw %} \ No newline at end of file diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/change.html b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/change.html deleted file mode 100644 index 0acbc703..00000000 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/change.html +++ /dev/null @@ -1,29 +0,0 @@ -{% raw %}{% extends "avatar/base.html" %} -{% load i18n avatar_tags %} -{% load url from future %} - -{% block content %} -
-
-
-

{% trans "Your current avatar: " %}

- {% avatar user %} - {% if not avatars %} -

{% trans "You haven't uploaded an avatar yet. Please upload one now." %}

- {% else %} -
-
    - {{ primary_avatar_form.as_ul }} -
-

{% csrf_token %}

-
- {% endif %} -
- {{ upload_avatar_form.as_p }} -

{% csrf_token %}

-
-
-
-
-{% endblock %} -{% endraw %} \ No newline at end of file diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/confirm_delete.html b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/confirm_delete.html deleted file mode 100644 index 896b6ea4..00000000 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/avatar/confirm_delete.html +++ /dev/null @@ -1,25 +0,0 @@ -{% raw %}{% extends "avatar/base.html" %} -{% load i18n %} -{% load url from future %} - -{% block content %} -
-
-
-

{% trans "Please select the avatars that you would like to delete." %}

- {% if not avatars %} - {% url 'avatar_change' as avatar_change_url %} -

{% blocktrans %}You have no avatars to delete. Please upload one now.{% endblocktrans %}

- {% else %} -
-
    - {{ delete_avatar_form.as_ul }} -
-

{% csrf_token %}

-
- {% endif %} -
-
-
-{% endblock %} -{% endraw %} \ No newline at end of file diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/users/user_detail.html b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/users/user_detail.html index 508c845a..62ef2805 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/users/user_detail.html +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/users/user_detail.html @@ -1,5 +1,4 @@ {% raw %}{% extends "base.html" %} -{% load avatar_tags %} {% load static %} {% block title %}User: {{ object.username }}{% endblock %} @@ -15,13 +14,12 @@ {% if object == request.user %} - +
My Info E-Mail - Avatar
@@ -32,4 +30,4 @@
{% endblock content %} -{% endraw %} \ No newline at end of file +{% endraw %} diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/users/user_list.html b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/users/user_list.html index f7c03fd7..a37b70c1 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/users/user_list.html +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/templates/users/user_list.html @@ -1,13 +1,11 @@ {% raw %}{% extends "base.html" %} {% load static %}{% load i18n %} -{% load avatar_tags %} - {% block title %}Members{% endblock %} {% block content %}
- +

Users

@@ -19,15 +17,15 @@
-{% endblock content %}{% endraw %} \ No newline at end of file +{% endblock content %}{% endraw %} diff --git a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/users/migrations/0001_initial.py b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/users/migrations/0001_initial.py index 8c73461b..1036f22d 100644 --- a/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/users/migrations/0001_initial.py +++ b/{{cookiecutter.repo_name}}/{{cookiecutter.repo_name}}/users/migrations/0001_initial.py @@ -3,38 +3,41 @@ from __future__ import unicode_literals from django.db import models, migrations import django.utils.timezone +import django.contrib.auth.models import django.core.validators class Migration(migrations.Migration): dependencies = [ - ('auth', '0001_initial'), + ('auth', '0006_require_contenttypes_0002'), ] operations = [ migrations.CreateModel( name='User', fields=[ - ('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)), + ('id', models.AutoField(primary_key=True, verbose_name='ID', serialize=False, auto_created=True)), ('password', models.CharField(max_length=128, verbose_name='password')), - ('last_login', models.DateTimeField(default=django.utils.timezone.now, 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(help_text='Required. 30 characters or fewer. Letters, digits and @/./+/-/_ only.', unique=True, max_length=30, verbose_name='username', validators=[django.core.validators.RegexValidator('^[\\w.@+-]+$', 'Enter a valid username.', 'invalid')])), + ('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=75, verbose_name='email address', blank=True)), - ('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')), - ('groups', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Group', blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of his/her group.', verbose_name='groups')), - ('user_permissions', models.ManyToManyField(related_query_name='user', related_name='user_set', to='auth.Permission', blank=True, help_text='Specific permissions for this user.', verbose_name='user permissions')), + ('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')), ], options={ - 'abstract': False, 'verbose_name': 'user', + 'abstract': False, 'verbose_name_plural': 'users', }, - bases=(models.Model,), - ) + managers=[ + (b'objects', django.contrib.auth.models.UserManager()), + ], + ), ]