diff --git a/README.rst b/README.rst index 4993989..2d063cc 100644 --- a/README.rst +++ b/README.rst @@ -12,9 +12,9 @@ django-inspectional-registration :target: https://requires.io/github/lambdalisue/django-inspectional-registration/requirements/?branch=master :alt: Requirements Status -.. image:: https://landscape.io/github/lambdalisue/django-inspectional-registration/master/landscape.png - :target: https://landscape.io/github/lambdalisue/django-inspectional-registration/master - :alt: Code Health +.. image:: https://landscape.io/github/lambdalisue/django-inspectional-registration/master/landscape.svg?style=flat + :target: https://landscape.io/github/lambdalisue/django-inspectional-registration/master + :alt: Code Health .. image:: https://scrutinizer-ci.com/g/lambdalisue/django-inspectional-registration/badges/quality-score.png?b=master :target: https://scrutinizer-ci.com/g/lambdalisue/django-inspectional-registration/inspections diff --git a/docs/about_registration_supplement.rst b/docs/about_registration_supplement.rst index 5d39549..95f4168 100644 --- a/docs/about_registration_supplement.rst +++ b/docs/about_registration_supplement.rst @@ -21,7 +21,9 @@ Quick tutorial to create your own Registration Supplement 2. Create new registration supplement model in your ``models.py`` as:: + from __future__ import unicode_literals from django.db import models + from django.utils.encoding import python_2_unicode_compatible from registration.supplements import RegistrationSupplementBase class MyRegistrationSupplement(RegistrationSupplementBase): @@ -30,7 +32,7 @@ Quick tutorial to create your own Registration Supplement age = models.IntegerField("Age") remarks = models.TextField("Remarks", blank=True) - def __unicode__(self): + def __str__(self): # a summary of this supplement return "%s (%s)" % (self.realname, self.age) diff --git a/docs/conf.py b/docs/conf.py index c58f5ff..84c8fab 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -19,6 +19,10 @@ sys.path.insert(0, os.path.join(BASE_DIR, 'tests')) os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' +import django +if django.VERSION >= (1, 7): + django.setup() + # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. diff --git a/docs/registration.migrations.rst b/docs/registration.migrations.rst index 06e217e..6b9c86a 100644 --- a/docs/registration.migrations.rst +++ b/docs/registration.migrations.rst @@ -12,30 +12,6 @@ registration.migrations.0001_initial module :undoc-members: :show-inheritance: -registration.migrations.0002_auto__add_field_registrationprofile__status__chg_field_registrationpro module ----------------------------------------------------------------------------------------------------------- - -.. automodule:: registration.migrations.0002_auto__add_field_registrationprofile__status__chg_field_registrationpro - :members: - :undoc-members: - :show-inheritance: - -registration.migrations.0003_status module ------------------------------------------- - -.. automodule:: registration.migrations.0003_status - :members: - :undoc-members: - :show-inheritance: - -registration.migrations.0004_activation_keys module ---------------------------------------------------- - -.. automodule:: registration.migrations.0004_activation_keys - :members: - :undoc-members: - :show-inheritance: - Module contents --------------- diff --git a/docs/registration.rst b/docs/registration.rst index 14377dd..4d99433 100644 --- a/docs/registration.rst +++ b/docs/registration.rst @@ -11,6 +11,7 @@ Subpackages registration.contrib registration.management registration.migrations + registration.south_migrations registration.supplements registration.tests diff --git a/docs/registration.south_migrations.rst b/docs/registration.south_migrations.rst new file mode 100644 index 0000000..3bde41a --- /dev/null +++ b/docs/registration.south_migrations.rst @@ -0,0 +1,46 @@ +registration.south_migrations package +===================================== + +Submodules +---------- + +registration.south_migrations.0001_initial module +------------------------------------------------- + +.. automodule:: registration.south_migrations.0001_initial + :members: + :undoc-members: + :show-inheritance: + +registration.south_migrations.0002_auto__add_field_registrationprofile__status__chg_field_registrationpro module +---------------------------------------------------------------------------------------------------------------- + +.. automodule:: registration.south_migrations.0002_auto__add_field_registrationprofile__status__chg_field_registrationpro + :members: + :undoc-members: + :show-inheritance: + +registration.south_migrations.0003_status module +------------------------------------------------ + +.. automodule:: registration.south_migrations.0003_status + :members: + :undoc-members: + :show-inheritance: + +registration.south_migrations.0004_activation_keys module +--------------------------------------------------------- + +.. automodule:: registration.south_migrations.0004_activation_keys + :members: + :undoc-members: + :show-inheritance: + + +Module contents +--------------- + +.. automodule:: registration.south_migrations + :members: + :undoc-members: + :show-inheritance: diff --git a/manage.py b/manage.py index 3b53be6..ce50ede 100644 --- a/manage.py +++ b/manage.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Django 1.2 - 1.6 compatible manage.py Modify this script to make your own manage.py diff --git a/src/registration/__init__.py b/src/registration/__init__.py index 8280c89..381a2d8 100644 --- a/src/registration/__init__.py +++ b/src/registration/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals from app_version import get_versions __version__, VERSION = get_versions('django-inspectional-registration', allow_ambiguous=True) diff --git a/src/registration/admin/__init__.py b/src/registration/admin/__init__.py index eb66460..26275f4 100644 --- a/src/registration/admin/__init__.py +++ b/src/registration/admin/__init__.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Admins of django-inspectional-registration @@ -55,6 +56,7 @@ from django.utils.safestring import mark_safe from django.utils.decorators import method_decorator from django.utils.translation import ugettext_lazy as _ +from django.utils.encoding import force_text from registration.conf import settings from registration.backends import get_backend @@ -62,7 +64,6 @@ from registration.utils import get_site from registration.admin.forms import RegistrationAdminForm from registration.compat import import_module -from registration.compat import force_unicode from registration.compat import transaction_atomic from registration.compat import unquote @@ -87,7 +88,7 @@ def get_supplement_admin_inline_base_class(path=None): module, attr = path[:i], path[i+1:] try: mod = import_module(module) - except ImportError, e: + except ImportError as e: raise ImproperlyConfigured(( 'Error loading admin inline class for registration supplement ' '%s: "%s"' @@ -306,7 +307,7 @@ def display_supplement_summary(self, obj): """ if obj.supplement: - return force_unicode(obj.supplement) + return force_text(obj.supplement) return _('Not available') display_supplement_summary.short_description = _( 'A summary of supplemental information' @@ -329,7 +330,7 @@ def display_activation_key(self, obj): activation_url = reverse('registration_activate', kwargs={ 'activation_key': obj.activation_key}) - return mark_safe(u'%s' % ( + return mark_safe('%s' % ( activation_url, obj.activation_key)) return _('Not available') display_activation_key.short_description = _('Activation key') diff --git a/src/registration/admin/forms.py b/src/registration/admin/forms.py index 115bac9..acb7714 100644 --- a/src/registration/admin/forms.py +++ b/src/registration/admin/forms.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ A forms used in RegistrationAdmin """ diff --git a/src/registration/backends/__init__.py b/src/registration/backends/__init__.py index 2cc547c..02ca52c 100644 --- a/src/registration/backends/__init__.py +++ b/src/registration/backends/__init__.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Backend @@ -64,7 +65,7 @@ def get_backend_class(path=None): module, attr = path[:i], path[i+1:] try: mod = import_module(module) - except ImportError, e: + except ImportError as e: raise ImproperlyConfigured( 'Error loading registration backend %s: "%s"' % (module, e)) try: diff --git a/src/registration/backends/base.py b/src/registration/backends/base.py index 1752545..c9af07a 100644 --- a/src/registration/backends/base.py +++ b/src/registration/backends/base.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Base class of registration backend diff --git a/src/registration/backends/default/__init__.py b/src/registration/backends/default/__init__.py index ddc1d8f..c7b7299 100644 --- a/src/registration/backends/default/__init__.py +++ b/src/registration/backends/default/__init__.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Default registration backend class diff --git a/src/registration/compat.py b/src/registration/compat.py index 8b17733..ceb0139 100644 --- a/src/registration/compat.py +++ b/src/registration/compat.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Compatibility module """ @@ -39,12 +40,6 @@ except ImportError: from django.utils.hashcompat import sha_constructor as sha1 -try: - # only available in python 2 - from django.utils.encoding import force_unicode -except ImportError: - from django.utils.encoding import force_text as force_unicode - # # Django change the transaction strategy from Django 1.6 # https://docs.djangoproject.com/en/1.6/topics/db/transactions/ diff --git a/src/registration/conf.py b/src/registration/conf.py index ff5b78d..429c74b 100644 --- a/src/registration/conf.py +++ b/src/registration/conf.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Confiurations of django-inspectional-registration """ diff --git a/src/registration/contrib/__init__.py b/src/registration/contrib/__init__.py index ef58eb5..3bf7901 100644 --- a/src/registration/contrib/__init__.py +++ b/src/registration/contrib/__init__.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Contributions of django-inspectional-registration diff --git a/src/registration/contrib/autologin/__init__.py b/src/registration/contrib/autologin/__init__.py index fddd05c..8d5aa14 100644 --- a/src/registration/contrib/autologin/__init__.py +++ b/src/registration/contrib/autologin/__init__.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Automatically log activated user in when they have activated with their activation link. This doesn't happen when the user was activated programatically with Django diff --git a/src/registration/contrib/autologin/conf.py b/src/registration/contrib/autologin/conf.py index 73e1756..b7ed537 100644 --- a/src/registration/contrib/autologin/conf.py +++ b/src/registration/contrib/autologin/conf.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ """ __author__ = 'Alisue ' diff --git a/src/registration/contrib/autologin/tests.py b/src/registration/contrib/autologin/tests.py index c459f49..e0d4c24 100644 --- a/src/registration/contrib/autologin/tests.py +++ b/src/registration/contrib/autologin/tests.py @@ -1,4 +1,5 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ """ __author__ = 'Alisue ' diff --git a/src/registration/contrib/notification/__init__.py b/src/registration/contrib/notification/__init__.py index 996879c..e840ff0 100644 --- a/src/registration/contrib/notification/__init__.py +++ b/src/registration/contrib/notification/__init__.py @@ -1,4 +1,5 @@ -# coding: utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Send notification emails to admins, managers or particular recipients when new user has registered in the site diff --git a/src/registration/contrib/notification/conf.py b/src/registration/contrib/notification/conf.py index 52b384a..7ef5897 100644 --- a/src/registration/contrib/notification/conf.py +++ b/src/registration/contrib/notification/conf.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ """ __author__ = 'Alisue ' diff --git a/src/registration/contrib/notification/tests/__init__.py b/src/registration/contrib/notification/tests/__init__.py index 00b87e0..407397c 100644 --- a/src/registration/contrib/notification/tests/__init__.py +++ b/src/registration/contrib/notification/tests/__init__.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ """ __author__ = 'Alisue ' diff --git a/src/registration/contrib/notification/tests/urls.py b/src/registration/contrib/notification/tests/urls.py index aba690b..642f9f1 100644 --- a/src/registration/contrib/notification/tests/urls.py +++ b/src/registration/contrib/notification/tests/urls.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals from registration.compat import url from registration.compat import patterns from registration.compat import include diff --git a/src/registration/forms.py b/src/registration/forms.py index 375b033..2ecd595 100644 --- a/src/registration/forms.py +++ b/src/registration/forms.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Forms of django-inspectional-registration @@ -143,8 +144,8 @@ class RegistrationFormTermsOfService(RegistrationForm): """ tos = forms.BooleanField(widget=forms.CheckboxInput(attrs=attrs_dict), - label=_(u'I have read and agree to the Terms ' - u'of Service'), + label=_('I have read and agree to the Terms ' + 'of Service'), error_messages={'required': _( "You must agree to the terms to register")}) diff --git a/src/registration/management/commands/cleanup_expired_registrations.py b/src/registration/management/commands/cleanup_expired_registrations.py index ed443a1..d385179 100644 --- a/src/registration/management/commands/cleanup_expired_registrations.py +++ b/src/registration/management/commands/cleanup_expired_registrations.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ A management command which deletes expired or rejected accounts (e.g., accounts which signed up but never activated) from the database. diff --git a/src/registration/management/commands/cleanup_registrations.py b/src/registration/management/commands/cleanup_registrations.py index a1618a9..84ae096 100644 --- a/src/registration/management/commands/cleanup_registrations.py +++ b/src/registration/management/commands/cleanup_registrations.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ A management command which deletes expired or rejected accounts (e.g., accounts which signed up but never activated) from the database. diff --git a/src/registration/management/commands/cleanup_rejected_registrations.py b/src/registration/management/commands/cleanup_rejected_registrations.py index 627567f..e0a0b7c 100644 --- a/src/registration/management/commands/cleanup_rejected_registrations.py +++ b/src/registration/management/commands/cleanup_rejected_registrations.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ A management command which deletes expired or rejected accounts (e.g., accounts which signed up but never activated) from the database. diff --git a/src/registration/management/commands/cleanupregistration.py b/src/registration/management/commands/cleanupregistration.py index e131628..1534744 100644 --- a/src/registration/management/commands/cleanupregistration.py +++ b/src/registration/management/commands/cleanupregistration.py @@ -1,2 +1,4 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals # This is for compatibility to django-registration -from cleanup_registrations import * +from registration.management.commands.cleanup_registrations import * diff --git a/src/registration/migrations/0001_initial.py b/src/registration/migrations/0001_initial.py index 39f32cb..6b008a0 100644 --- a/src/registration/migrations/0001_initial.py +++ b/src/registration/migrations/0001_initial.py @@ -1,71 +1,46 @@ -# encoding: utf-8 -import datetime -from south.db import db -from south.v2 import SchemaMigration -from django.db import models +# -*- coding: utf-8 -*- +from __future__ import unicode_literals -class Migration(SchemaMigration): +from django.db import models, migrations +from django.conf import settings - def forwards(self, orm): - - # Adding model 'RegistrationProfile' - db.create_table('registration_registrationprofile', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], unique=True)), - ('activation_key', self.gf('django.db.models.fields.CharField')(max_length=40)), - )) - db.send_create_signal('registration', ['RegistrationProfile']) +class Migration(migrations.Migration): - def backwards(self, orm): - - # Deleting model 'RegistrationProfile' - db.delete_table('registration_registrationprofile') + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] - - models = { - 'auth.group': { - 'Meta': {'object_name': 'Group'}, - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), - 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - 'auth.permission': { - 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - 'auth.user': { - 'Meta': {'object_name': 'User'}, - 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), - 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), - 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), - 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), - 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), - 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), - 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - 'contenttypes.contenttype': { - 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, - 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) - }, - 'registration.registrationprofile': { - 'Meta': {'object_name': 'RegistrationProfile'}, - 'activation_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True'}) - } - } - - complete_apps = ['registration'] + operations = [ + migrations.CreateModel( + name='DefaultRegistrationSupplement', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)), + ('remarks', models.TextField(verbose_name='remarks')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='RegistrationProfile', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)), + ('_status', models.CharField(editable=False, default='untreated', max_length=10, choices=[('untreated', 'Untreated yet'), ('accepted', 'Registration has accepted'), ('rejected', 'Registration has rejected')], verbose_name='status', db_column='status')), + ('activation_key', models.CharField(null=True, default=None, verbose_name='activation key', max_length=40, editable=False)), + ('user', models.OneToOneField(editable=False, related_name='registration_profile', verbose_name='user', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'permissions': (('accept_registration', 'Can accept registration'), ('reject_registration', 'Can reject registration'), ('activate_user', 'Can activate user in admin site')), + 'verbose_name': 'registration profile', + 'verbose_name_plural': 'registration profiles', + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='defaultregistrationsupplement', + name='registration_profile', + field=models.OneToOneField(editable=False, related_name='_registration_defaultregistrationsupplement_supplement', verbose_name='registration profile', to='registration.RegistrationProfile'), + preserve_default=True, + ), + ] diff --git a/src/registration/models.py b/src/registration/models.py index b637c2a..195c658 100644 --- a/src/registration/models.py +++ b/src/registration/models.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Models of django-inspectional-registration @@ -55,6 +56,7 @@ from django.template.loader import render_to_string from django.core.exceptions import ObjectDoesNotExist from django.utils.text import ugettext_lazy as _ +from django.utils.encoding import python_2_unicode_compatible from registration.conf import settings from registration.compat import get_user_model @@ -340,6 +342,7 @@ def delete_rejected_users(self): profile.delete() +@python_2_unicode_compatible class RegistrationProfile(models.Model): """Registration profile model class @@ -438,9 +441,6 @@ def get_status_display(self): return sl.get(self.status) get_status_display.short_description = _("status") - def __unicode__(self): - return u"Registration information for %s" % self.user - def __str__(self): return "Registration information for %s" % self.user diff --git a/src/registration/signals.py b/src/registration/signals.py index 0c53b3d..572fbf6 100644 --- a/src/registration/signals.py +++ b/src/registration/signals.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Django custom signals used in django-inspectional-registration diff --git a/src/registration/south_migrations/0001_initial.py b/src/registration/south_migrations/0001_initial.py new file mode 100644 index 0000000..68d1db0 --- /dev/null +++ b/src/registration/south_migrations/0001_initial.py @@ -0,0 +1,72 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding model 'RegistrationProfile' + db.create_table('registration_registrationprofile', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], unique=True)), + ('activation_key', self.gf('django.db.models.fields.CharField')(max_length=40)), + )) + db.send_create_signal('registration', ['RegistrationProfile']) + + + def backwards(self, orm): + + # Deleting model 'RegistrationProfile' + db.delete_table('registration_registrationprofile') + + + models = { + 'auth.group': { + 'Meta': {'object_name': 'Group'}, + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + 'auth.permission': { + 'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + 'auth.user': { + 'Meta': {'object_name': 'User'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + 'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + 'registration.registrationprofile': { + 'Meta': {'object_name': 'RegistrationProfile'}, + 'activation_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'unique': 'True'}) + } + } + + complete_apps = ['registration'] diff --git a/src/registration/migrations/0002_auto__add_field_registrationprofile__status__chg_field_registrationpro.py b/src/registration/south_migrations/0002_auto__add_field_registrationprofile__status__chg_field_registrationpro.py similarity index 98% rename from src/registration/migrations/0002_auto__add_field_registrationprofile__status__chg_field_registrationpro.py rename to src/registration/south_migrations/0002_auto__add_field_registrationprofile__status__chg_field_registrationpro.py index 48726e5..ff38097 100644 --- a/src/registration/migrations/0002_auto__add_field_registrationprofile__status__chg_field_registrationpro.py +++ b/src/registration/south_migrations/0002_auto__add_field_registrationprofile__status__chg_field_registrationpro.py @@ -1,4 +1,5 @@ -# encoding: utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals import datetime from south.db import db from south.v2 import SchemaMigration diff --git a/src/registration/migrations/0003_status.py b/src/registration/south_migrations/0003_status.py similarity index 98% rename from src/registration/migrations/0003_status.py rename to src/registration/south_migrations/0003_status.py index 8be72d7..7e4249c 100644 --- a/src/registration/migrations/0003_status.py +++ b/src/registration/south_migrations/0003_status.py @@ -1,4 +1,5 @@ -# encoding: utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals import datetime from south.db import db from south.v2 import DataMigration diff --git a/src/registration/migrations/0004_activation_keys.py b/src/registration/south_migrations/0004_activation_keys.py similarity index 98% rename from src/registration/migrations/0004_activation_keys.py rename to src/registration/south_migrations/0004_activation_keys.py index 854a3e6..0701268 100644 --- a/src/registration/migrations/0004_activation_keys.py +++ b/src/registration/south_migrations/0004_activation_keys.py @@ -1,4 +1,5 @@ -# encoding: utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals import datetime from south.db import db from south.v2 import DataMigration diff --git a/src/registration/south_migrations/__init__.py b/src/registration/south_migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/registration/supplements/__init__.py b/src/registration/supplements/__init__.py index 063c810..ab7dc51 100644 --- a/src/registration/supplements/__init__.py +++ b/src/registration/supplements/__init__.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Registration Supplement """ @@ -29,7 +30,7 @@ def get_supplement_class(path=None): module, attr = path[:i], path[i+1:] try: mod = import_module(module) - except ImportError, e: + except ImportError as e: raise ImproperlyConfigured( 'Error loading registration addition %s: "%s"' % (module, e)) try: diff --git a/src/registration/supplements/base.py b/src/registration/supplements/base.py index 44c0232..bf4516d 100644 --- a/src/registration/supplements/base.py +++ b/src/registration/supplements/base.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ A registration supplemental abstract model """ @@ -6,8 +7,10 @@ from django.db import models from django.forms.models import modelform_factory from django.utils.text import ugettext_lazy as _ +from django.utils.encoding import python_2_unicode_compatible +@python_2_unicode_compatible class RegistrationSupplementBase(models.Model): """A registration supplement abstract model @@ -16,9 +19,9 @@ class RegistrationSupplementBase(models.Model): user who tried to register the site and displaied in django admin page to help determine the acceptance/rejection of the registration - The ``__unicode__()`` method is used to display the summary of the + The ``__str__()`` method is used to display the summary of the supplemental information in django admin's change list view. Thus subclasses - must define them own ``__unicode__()`` method. + must define them own ``__str__()`` method. The ``get_form_class()`` is a class method return a value of ``form_class`` attribute to determine the form class used for filling up the supplemental @@ -52,13 +55,13 @@ class RegistrationSupplementBase(models.Model): class Meta: abstract = True - def __unicode__(self): + def __str__(self): """return the summary of this supplemental information Subclasses must define them own method """ raise NotImplementedError( - "You must define '__unicode__' method and return summary of " + "You must define '__str__' method and return summary of " "the supplement") @classmethod diff --git a/src/registration/supplements/default/models.py b/src/registration/supplements/default/models.py index c51f096..f773ed4 100644 --- a/src/registration/supplements/default/models.py +++ b/src/registration/supplements/default/models.py @@ -1,18 +1,21 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ A simple registration supplement model which requires ``remarks`` """ __author__ = 'Alisue ' from django.db import models from django.utils.text import ugettext_lazy as _ +from django.utils.encoding import python_2_unicode_compatible from registration.supplements import RegistrationSupplementBase +@python_2_unicode_compatible class DefaultRegistrationSupplement(RegistrationSupplementBase): """A simple registration supplement model which requires remarks""" remarks = models.TextField(_('remarks')) - def __unicode__(self): + def __str__(self): """return a summary of this addition""" return self.remarks diff --git a/src/registration/tests/__init__.py b/src/registration/tests/__init__.py index 5948f89..fe29db3 100644 --- a/src/registration/tests/__init__.py +++ b/src/registration/tests/__init__.py @@ -1,10 +1,12 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals import django if django.VERSION < (1, 6): - from test_admin import * - from test_models import * - from test_forms import * - from test_views import * - from test_backends import * - from test_supplements import * + from registration.tests.test_admin import * + from registration.tests.test_models import * + from registration.tests.test_forms import * + from registration.tests.test_views import * + from registration.tests.test_backends import * + from registration.tests.test_supplements import * diff --git a/src/registration/tests/compat.py b/src/registration/tests/compat.py index 298d1b6..c47b4e1 100644 --- a/src/registration/tests/compat.py +++ b/src/registration/tests/compat.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ """ __author__ = 'Alisue ' diff --git a/src/registration/tests/mock.py b/src/registration/tests/mock.py index 879840a..c059902 100644 --- a/src/registration/tests/mock.py +++ b/src/registration/tests/mock.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Mock request for unittest diff --git a/src/registration/tests/test_admin.py b/src/registration/tests/test_admin.py index fbdc504..56efbb2 100644 --- a/src/registration/tests/test_admin.py +++ b/src/registration/tests/test_admin.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ """ __author__ = 'Alisue ' @@ -177,8 +178,8 @@ def test_change_view_post_invalid_reject_from_accepted(self): self.failIf(response.context['adminform'].form.is_valid()) self.assertEqual( response.context['adminform'].form.errors['action_name'], - [u"Select a valid choice. " - u"reject is not one of the available choices."]) + ["Select a valid choice. " + "reject is not one of the available choices."]) profile = RegistrationProfile.objects.get(user__pk=new_user.pk) self.assertEqual(profile.status, 'accepted') @@ -207,8 +208,8 @@ def test_change_view_post_invalid_reject_from_rejected(self): self.failIf(response.context['adminform'].form.is_valid()) self.assertEqual( response.context['adminform'].form.errors['action_name'], - [u"Select a valid choice. " - u"reject is not one of the available choices."]) + ["Select a valid choice. " + "reject is not one of the available choices."]) profile = RegistrationProfile.objects.get(user__pk=new_user.pk) self.assertEqual(profile.status, 'rejected') @@ -234,8 +235,8 @@ def test_change_view_post_invalid_activate_from_untreated(self): self.failIf(response.context['adminform'].form.is_valid()) self.assertEqual( response.context['adminform'].form.errors['action_name'], - [u"Select a valid choice. " - u"activate is not one of the available choices."]) + ["Select a valid choice. " + "activate is not one of the available choices."]) profile = RegistrationProfile.objects.get(user__pk=new_user.pk) self.assertEqual(profile.status, 'untreated') @@ -287,8 +288,8 @@ def test_change_view_post_invalid_activate_from_rejected(self): self.failIf(response.context['adminform'].form.is_valid()) self.assertEqual( response.context['adminform'].form.errors['action_name'], - [u"Select a valid choice. " - u"activate is not one of the available choices."]) + ["Select a valid choice. " + "activate is not one of the available choices."]) profile = RegistrationProfile.objects.get(user__pk=new_user.pk) self.assertEqual(profile.status, 'rejected') @@ -337,8 +338,8 @@ def test_change_view_post_invalid_force_activate_from_accepted(self): self.failIf(response.context['adminform'].form.is_valid()) self.assertEqual( response.context['adminform'].form.errors['action_name'], - [u"Select a valid choice. " - u"force_activate is not one of the available choices."]) + ["Select a valid choice. " + "force_activate is not one of the available choices."]) profile = RegistrationProfile.objects.get(user__pk=new_user.pk) self.assertEqual(profile.status, 'accepted') diff --git a/src/registration/tests/test_backends.py b/src/registration/tests/test_backends.py index 22eb6de..cef8695 100644 --- a/src/registration/tests/test_backends.py +++ b/src/registration/tests/test_backends.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ """ __author__ = 'Alisue ' diff --git a/src/registration/tests/test_forms.py b/src/registration/tests/test_forms.py index 3ce0490..3428734 100644 --- a/src/registration/tests/test_forms.py +++ b/src/registration/tests/test_forms.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ """ __author__ = 'Alisue ' @@ -27,7 +28,7 @@ def test_activation_form(self): # Mismatched passwords. {'data': {'password1': 'foo', 'password2': 'bar'}, - 'error': ('__all__', [u"The two password fields didn't match."])}, + 'error': ('__all__', ["The two password fields didn't match."])}, ] for invalid_dict in invalid_data_dicts: @@ -62,17 +63,17 @@ def test_registration_form(self): {'data': {'username': 'foo/bar', 'email1': 'foo@example.com', 'email2': 'foo@example.com'}, - 'error': ('username', [u"This value must contain only letters, numbers and underscores."])}, + 'error': ('username', ["This value must contain only letters, numbers and underscores."])}, # Already-existing username. {'data': {'username': 'alice', 'email1': 'alice@example.com', 'email2': 'alice@example.com'}, - 'error': ('username', [u"A user with that username already exists."])}, + 'error': ('username', ["A user with that username already exists."])}, # Mismatched email. {'data': {'username': 'foo', 'email1': 'foo@example.com', 'email2': 'bar@example.com'}, - 'error': ('__all__', [u"The two email fields didn't match."])}, + 'error': ('__all__', ["The two email fields didn't match."])}, ] for invalid_dict in invalid_data_dicts: @@ -97,7 +98,7 @@ def test_registration_form_tos(self): 'email2': 'foo@example.com'}) self.failIf(form.is_valid()) self.assertEqual(form.errors['tos'], - [u"You must agree to the terms to register"]) + ["You must agree to the terms to register"]) form = forms.RegistrationFormTermsOfService(data={'username': 'foofoohogehoge', 'email1': 'foo@example.com', @@ -121,7 +122,7 @@ def test_registration_form_unique_email(self): 'email2': 'alice@example.com'}) self.failIf(form.is_valid()) self.assertEqual(form.errors['email1'], - [u"This email address is already in use. Please supply a different email address."]) + ["This email address is already in use. Please supply a different email address."]) form = forms.RegistrationFormUniqueEmail(data={'username': 'foofoohogehoge', 'email1': 'foo@example.com', @@ -137,12 +138,12 @@ def test_registration_form_no_free_email(self): base_data = {'username': 'foofoohogehoge'} for domain in forms.RegistrationFormNoFreeEmail.bad_domains: invalid_data = base_data.copy() - invalid_data['email1'] = u"foo@%s" % domain + invalid_data['email1'] = "foo@%s" % domain invalid_data['email2'] = invalid_data['email1'] form = forms.RegistrationFormNoFreeEmail(data=invalid_data) self.failIf(form.is_valid()) self.assertEqual(form.errors['email1'], - [u"Registration using free email addresses is prohibited. Please supply a different email address."]) + ["Registration using free email addresses is prohibited. Please supply a different email address."]) base_data['email1'] = 'foo@example.com' base_data['email2'] = base_data['email1'] diff --git a/src/registration/tests/test_models.py b/src/registration/tests/test_models.py index da03902..c35f39c 100644 --- a/src/registration/tests/test_models.py +++ b/src/registration/tests/test_models.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ """ __author__ = 'Alisue ' @@ -47,7 +48,7 @@ def test_profile_creation(self): self.assertEqual(profile.user.id, new_user.id) self.assertEqual(profile.status, 'untreated') self.assertEqual(profile.activation_key, None) - self.assertEqual(unicode(profile), + self.assertEqual(str(profile), "Registration information for alice") def test_profile_status_modification(self): diff --git a/src/registration/tests/test_supplements.py b/src/registration/tests/test_supplements.py index 7035a62..767d8cb 100644 --- a/src/registration/tests/test_supplements.py +++ b/src/registration/tests/test_supplements.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ """ __author__ = 'Alisue ' @@ -116,7 +117,7 @@ def test_registration_view_post_failure(self): self.failIf(response.context['form'].is_valid()) self.failUnless(response.context['supplement_form'].is_valid()) self.assertFormError(response, 'form', field=None, - errors=u"The two email fields didn't match.") + errors="The two email fields didn't match.") self.assertEqual(len(mail.outbox), 0) def test_registration_view_post_no_remarks_failure(self): @@ -133,5 +134,5 @@ def test_registration_view_post_no_remarks_failure(self): self.failUnless(response.context['form'].is_valid()) self.failIf(response.context['supplement_form'].is_valid()) self.assertFormError(response, 'supplement_form', field='remarks', - errors=u"This field is required.") + errors="This field is required.") self.assertEqual(len(mail.outbox), 0) diff --git a/src/registration/tests/test_views.py b/src/registration/tests/test_views.py index 324878e..229094a 100644 --- a/src/registration/tests/test_views.py +++ b/src/registration/tests/test_views.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ """ __author__ = 'Alisue ' @@ -72,7 +73,7 @@ def test_registration_view_post_failure(self): self.assertEqual(response.status_code, 200) self.failIf(response.context['form'].is_valid()) self.assertFormError(response, 'form', field=None, - errors=u"The two email fields didn't match.") + errors="The two email fields didn't match.") self.assertEqual(len(mail.outbox), 0) def test_registration_complete_view_get(self): diff --git a/src/registration/tests/utils.py b/src/registration/tests/utils.py index 00326c2..6814005 100644 --- a/src/registration/tests/utils.py +++ b/src/registration/tests/utils.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ """ __author__ = 'Alisue ' diff --git a/src/registration/urls.py b/src/registration/urls.py index ac889db..69e77a1 100644 --- a/src/registration/urls.py +++ b/src/registration/urls.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ URLconf for django-inspectional-registration """ diff --git a/src/registration/utils.py b/src/registration/utils.py index 179dc8b..dea2502 100644 --- a/src/registration/utils.py +++ b/src/registration/utils.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Utilities for django-inspectional-registration """ @@ -7,6 +8,8 @@ from django.contrib.sites.models import Site from django.contrib.sites.models import RequestSite +from django.utils.encoding import force_text +from django.utils.six.moves import range from registration.compat import sha1 @@ -30,9 +33,8 @@ def generate_activation_key(username): .. _django-registration: https://bitbucket.org/ubernostrum/django-registration """ - if not isinstance(username, unicode): - username = username.decode('utf-8') - seed = unicode(random.random()) + username = force_text(username) + seed = force_text(random.random()) salt = sha1(seed.encode('utf-8')).hexdigest()[:5] activation_key = sha1((salt+username).encode('utf-8')).hexdigest() return activation_key @@ -43,7 +45,7 @@ def generate_random_password(length=10): # Without 1, l, O, 0 because those character are hard to tell # the difference between in same fonts chars = '23456789abcdefghijklmnopqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ' - password = "".join([random.choice(chars) for i in xrange(length)]) + password = "".join([random.choice(chars) for i in range(length)]) return password diff --git a/src/registration/views.py b/src/registration/views.py index 13253f5..734972c 100644 --- a/src/registration/views.py +++ b/src/registration/views.py @@ -1,4 +1,5 @@ -# coding=utf-8 +# -*- coding: utf-8 -*- +from __future__ import unicode_literals """ Class based views for django-inspectional-registration """ diff --git a/tests/settings.py b/tests/settings.py index 10d183c..fd1a95d 100644 --- a/tests/settings.py +++ b/tests/settings.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals # Django settings for tests project. import os import sys diff --git a/tests/urls.py b/tests/urls.py index 944766d..bb83d09 100644 --- a/tests/urls.py +++ b/tests/urls.py @@ -1,3 +1,5 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals try: from django.conf.urls import url, patterns, include except ImportError: diff --git a/tox.ini b/tox.ini index a7e21fe..71e894d 100644 --- a/tox.ini +++ b/tox.ini @@ -20,19 +20,8 @@ deps= -rrequirements-test.txt coverage commands= - py26,py27: {envbindir}/coverage run --source=src/registration runtests.py [] - py32,py33,py34: mkdir -p {envdir}/build - py32,py33,py34: cp -rf src {envdir}/build - py32,py33,py34: cp -rf tests {envdir}/build - py32,py33,py34: 2to3 -p --no-diffs --output-dir={envdir}/build/src -W -n src - py32,py33,py34: 2to3 -p --no-diffs --output-dir={envdir}/build/tests -W -n tests - py32,py33,py34: {envbindir}/coverage run --source={envdir}/build/src/registration runtests.py --where={envdir}/build [] + {envbindir}/coverage run --source=src/registration runtests.py [] coverage report -whitelist_externals= - py32,py33,py34: make - py32,py33,py34: mkdir - py32,py33,py34: cp - py32,py33,py34: 2to3 [testenv:docs] basepython=python @@ -41,3 +30,5 @@ deps=-rrequirements-docs.txt commands= make clean make html +whitelist_externals= + make