diff --git a/README.rst b/README.rst index d978a8a..413d8ae 100644 --- a/README.rst +++ b/README.rst @@ -26,7 +26,7 @@ Postorius requires Python 2.6 or newer and mailman.client, the official Python bindings for GNU Mailman, it also requires django-social-auth. -The minimum Django version is 1.6. +The minimum Django version is 1.8. Postorius needs a running version of GNU Mailman version 3. diff --git a/setup.py b/setup.py index 480c249..0b8aebb 100644 --- a/setup.py +++ b/setup.py @@ -39,7 +39,7 @@ packages=find_packages('src'), package_dir={'': 'src'}, include_package_data=True, - install_requires=['django>=1.6', + install_requires=['django>=1.8', 'django-browserid', 'mailmanclient'] ) diff --git a/src/postorius/context_processors.py b/src/postorius/context_processors.py index 8d5e65b..9dfff0f 100644 --- a/src/postorius/context_processors.py +++ b/src/postorius/context_processors.py @@ -48,8 +48,7 @@ 'postorius_base_template': template_to_extend, 'request': request, 'hyperkitty_url': hyperkitty_url, - # Resolve the login and logout URLs from the settings (they can be - # either URLs or view names since Django 1.6) + # Resolve the login and logout URLs from the settings 'login_url': resolve_url(settings.LOGIN_URL), 'logout_url': resolve_url(settings.LOGOUT_URL), } diff --git a/src/postorius/doc/development.rst b/src/postorius/doc/development.rst index 9afbab6..58ce334 100644 --- a/src/postorius/doc/development.rst +++ b/src/postorius/doc/development.rst @@ -43,18 +43,17 @@ # List all currently configured envs: $ tox -l - py27-django1.5 - py27-django1.6 - py27-django1.7 + py27-django18 + py27-django19 - # Test Django 1.7 on Python2.7 only: - $ tox -e py27-django1.7 + # Test Django 1.8 on Python2.7 only: + $ tox -e py27-django18 # Run only tests in ``test_address_activation``: $ tox -- postorius.tests.test_address_activation # You get the idea... - $ tox -e py27-django1.7 -- postorius.tests.test_address_activation + $ tox -e py27-django18 -- postorius.tests.test_address_activation All test modules reside in the ``postorius/src/postorius/tests`` diff --git a/src/postorius/doc/setup.rst b/src/postorius/doc/setup.rst index 0dd4ba7..01d834e 100644 --- a/src/postorius/doc/setup.rst +++ b/src/postorius/doc/setup.rst @@ -73,7 +73,7 @@ :: $ cd postorius_standalone - $ python manage.py syncdb + $ python manage.py migrate $ cd .. This will create the ``.db file`` (if you ar using SQLite) and will setup all the diff --git a/src/postorius/fieldset_forms.py b/src/postorius/fieldset_forms.py index 69e820c..01550b4 100644 --- a/src/postorius/fieldset_forms.py +++ b/src/postorius/fieldset_forms.py @@ -19,10 +19,7 @@ from django.forms import Form from django.utils import safestring from django.forms.forms import BoundField -try: - from django.forms.utils import ErrorList -except ImportError: - from django.forms.util import ErrorList # Django 1.6 +from django.forms.utils import ErrorList class FieldsetError(Exception): diff --git a/src/postorius/south_migrations/0001_initial.py b/src/postorius/south_migrations/0001_initial.py deleted file mode 100644 index 06e6f0f..0000000 --- a/src/postorius/south_migrations/0001_initial.py +++ /dev/null @@ -1,74 +0,0 @@ -# -*- coding: utf-8 -*- -from south.utils import datetime_utils as 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 'AddressConfirmationProfile' - db.create_table(u'postorius_addressconfirmationprofile', ( - (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('email', self.gf('django.db.models.fields.EmailField')(max_length=75)), - ('activation_key', self.gf('django.db.models.fields.CharField')(max_length=40)), - ('created', self.gf('django.db.models.fields.DateTimeField')()), - ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])), - )) - db.send_create_signal(u'postorius', ['AddressConfirmationProfile']) - - - def backwards(self, orm): - # Deleting model 'AddressConfirmationProfile' - db.delete_table(u'postorius_addressconfirmationprofile') - - - models = { - u'auth.group': { - 'Meta': {'object_name': 'Group'}, - u'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': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) - }, - u'auth.permission': { - 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, - 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), - 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) - }, - u'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', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), - u'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', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), - 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) - }, - u'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'}), - u'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'}) - }, - u'postorius.addressconfirmationprofile': { - 'Meta': {'object_name': 'AddressConfirmationProfile'}, - 'activation_key': ('django.db.models.fields.CharField', [], {'max_length': '40'}), - 'created': ('django.db.models.fields.DateTimeField', [], {}), - 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75'}), - u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"}) - } - } - - complete_apps = ['postorius'] \ No newline at end of file diff --git a/src/postorius/south_migrations/__init__.py b/src/postorius/south_migrations/__init__.py deleted file mode 100644 index e69de29..0000000 --- a/src/postorius/south_migrations/__init__.py +++ /dev/null diff --git a/src/postorius/tests/mailman_api_tests/test_address_activation.py b/src/postorius/tests/mailman_api_tests/test_address_activation.py index 9dfd084..f4341bb 100644 --- a/src/postorius/tests/mailman_api_tests/test_address_activation.py +++ b/src/postorius/tests/mailman_api_tests/test_address_activation.py @@ -187,11 +187,5 @@ self.assertEqual( set([a.email for a in self.mm_user.addresses]), set(['ler@example.org', 'les@example.org'])) - try: - logged_in_user = response.wsgi_request.user - except AttributeError: - # Django 1.6: the wsgi request is not available, ignore this last - # assertion. - pass - else: - self.assertEqual(logged_in_user.other_emails, ['les@example.org']) + logged_in_user = response.wsgi_request.user + self.assertEqual(logged_in_user.other_emails, ['les@example.org']) diff --git a/src/postorius/tests/utils.py b/src/postorius/tests/utils.py index 08a991e..dc70f10 100644 --- a/src/postorius/tests/utils.py +++ b/src/postorius/tests/utils.py @@ -131,9 +131,6 @@ def assertRedirectsToLogin(self, url): response = self.client.get(url) - if DJANGO_VERSION >= (1, 8): - # Django < 1.8 did not quote "@" signs. - url = quote(url) self.assertRedirects(response, - '{}?next={}'.format(reverse(settings.LOGIN_URL), url)) + '{}?next={}'.format(reverse(settings.LOGIN_URL), quote(url))) diff --git a/src/postorius/views/user.py b/src/postorius/views/user.py index eef78f4..48e454f 100644 --- a/src/postorius/views/user.py +++ b/src/postorius/views/user.py @@ -241,17 +241,9 @@ if request.method == 'POST': form = AddressActivationForm(request.POST) if form.is_valid(): - # XXX Use the following when django 1.6 is dropped as a dependency - # It is more efficient because it can be done in one database operation - # - # profile, created = AddressConfirmationProfile.objects.update_or_create( - # email=form.cleaned_data['email'], user=request.user, defaults={ - # 'activation_key': uuid.uuid4().hex}) - try: - profile = AddressConfirmationProfile.objects.get(email=form.cleaned_data['email'], user=request.user) - profile.save() - except AddressConfirmationProfile.DoesNotExist: - profile = AddressConfirmationProfile.objects.create(email=form.cleaned_data['email'], user=request.user) + profile, created = AddressConfirmationProfile.objects.update_or_create( + email=form.cleaned_data['email'], user=request.user, defaults={ + 'activation_key': uuid.uuid4().hex}) try: profile.send_confirmation_link(request) messages.success(request, diff --git a/tox.ini b/tox.ini index c0cffe9..a673092 100644 --- a/tox.ini +++ b/tox.ini @@ -1,5 +1,5 @@ [tox] -envlist = py27-django{16,17,18,19} +envlist = py27-django{18,19} [base] deps = @@ -12,8 +12,6 @@ usedevelop = True deps = {[base]deps} - django16: Django>=1.6,<1.7 - django17: Django>=1.7,<1.8 django18: Django>=1.8,<1.9 django19: Django>=1.9,<1.10a commands =