Repository: nephila/djangocms-installer
Pull request #238 (2016-02-05 16:39:49)

Remove support for old python / django / django cms versions


Patch:
diff --git a/.checkignore b/.checkignore
index e7e1fb0..17fe64d 100644
--- a/.checkignore
+++ b/.checkignore
@@ -1,1 +1,2 @@
 tests/*
+docs/*
diff --git a/.travis.yml b/.travis.yml
index fe0bfa6..3b948ed 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -9,7 +9,6 @@ python:
   - 3.4
   - 3.3
   - 2.7
-  - 2.6
 
 env:
 
@@ -28,7 +27,6 @@ before_install:
 # command to install dependencies, e.g. pip install -r requirements.txt --use-mirrors
 install:
   - pip install -U tox virtualenv coveralls
-  - "if [[ $TRAVIS_PYTHON_VERSION == '2.6' ]]; then pip install unittest2; export TOX_ENV=py26; fi"
   - "if [[ $TRAVIS_PYTHON_VERSION == '2.7' ]]; then export TOX_ENV=py27; fi"
   - "if [[ $TRAVIS_PYTHON_VERSION == '3.3' ]]; then export TOX_ENV=py33; fi"
   - "if [[ $TRAVIS_PYTHON_VERSION == '3.4' ]]; then export TOX_ENV=py34; fi"
@@ -44,12 +42,6 @@ after_success:
 
 matrix:
   exclude:
-  - python: 2.6
-    env: TEST='pep8'
-  - python: 2.6
-    env: TEST='isort'
-  - python: 2.6
-    env: TEST='docs'
   - python: 2.7
     env: TEST='pep8'
   - python: 2.7
diff --git a/HISTORY.rst b/HISTORY.rst
index 35d9213..7e5d9d4 100644
--- a/HISTORY.rst
+++ b/HISTORY.rst
@@ -3,6 +3,13 @@
 History
 -------
 
+0.9.0 (unreleased)
+++++++++++++++++++
+
+* Drop support for Python 2.6
+* Drop support for Django < 1.8
+* Drop support for django CMS < 3.2
+
 0.8.6 (2016-02-05)
 ++++++++++++++++++
 
diff --git a/djangocms_installer/config/__init__.py b/djangocms_installer/config/__init__.py
index 719dbfc..b0e5ee5 100644
--- a/djangocms_installer/config/__init__.py
+++ b/djangocms_installer/config/__init__.py
@@ -130,10 +130,10 @@ def parse(args):
 
     # First of all, check if the project name is valid
     if not validate_project(args.project_name):
-        sys.stderr.write('Project name "%s" is not a valid app name, '
-                         'or it\'s already defined. '
-                         'Please use only numbers, letters and underscores.\n'
-                         % args.project_name)
+        sys.stderr.write(
+            'Project name "{0}" is not a valid app name, or it\'s already defined. '
+            'Please use only numbers, letters and underscores.\n'.format(args.project_name)
+        )
         sys.exit(3)
 
     # Checking the given path
@@ -142,63 +142,26 @@ def parse(args):
     if not args.skip_project_dir_check:
         if (os.path.exists(args.project_directory) and
                 [path for path in os.listdir(args.project_directory) if not path.startswith('.')]):
-            sys.stderr.write('Path "%s" already exists and is not empty, '
-                             'please choose a different one\nIf you want to use this path anyway '
-                             'use the -s flag to skip this check.\n' % args.project_directory)
+            sys.stderr.write(
+                'Path "{0}" already exists and is not empty, please choose a different one\n'
+                'If you want to use this path anyway use the -s flag to skip this check.\n'
+                ''.format(args.project_directory)
+            )
             sys.exit(4)
 
     if os.path.exists(args.project_path):
-        sys.stderr.write('Path "%s" already exists, '
-                         'please choose a different one\n' % args.project_path)
+        sys.stderr.write(
+            'Path "{0}" already exists, please choose a different one\n'.format(args.project_path)
+        )
         sys.exit(4)
 
     if args.config_dump and os.path.isfile(args.config_dump):
-        sys.stdout.write('Cannot dump because given configuration file "%s" '
-                         'is exists.\n' % args.config_dump)
+        sys.stdout.write(
+            'Cannot dump because given configuration file "{0}" exists.\n'.format(args.config_dump)
+        )
         sys.exit(8)
 
-    for item in data.CONFIGURABLE_OPTIONS:
-        action = parser._option_string_actions[item]
-        choices = default = ''
-        input_value = getattr(args, action.dest)
-        new_val = None
-        if not args.noinput:
-            if action.choices:
-                choices = ' (choices: %s)' % ', '.join(action.choices)
-            if input_value:
-                if type(input_value) == list:
-                    default = ' [default %s]' % ', '.join(input_value)
-                else:
-                    default = ' [default %s]' % input_value
-
-            while not new_val:
-                prompt = '%s%s%s: ' % (action.help, choices, default)
-                if action.choices in ('yes', 'no'):
-                    new_val = utils.query_yes_no(prompt)
-                else:
-                    new_val = compat.input(prompt)
-                new_val = compat.clean(new_val)
-                if not new_val and input_value:
-                    new_val = input_value
-                if new_val and action.dest == 'templates':
-                    if new_val != 'no' and not os.path.isdir(new_val):
-                        sys.stdout.write('Given directory does not exists, retry\n')
-                        new_val = False
-                if new_val and action.dest == 'db':
-                    action(parser, args, new_val, action.option_strings)
-                    new_val = getattr(args, action.dest)
-        else:
-            if not input_value and action.required:
-                raise ValueError('Option %s is required when in no-input mode' % action.dest)
-            new_val = input_value
-            if action.dest == 'db':
-                action(parser, args, new_val, action.option_strings)
-                new_val = getattr(args, action.dest)
-        if action.dest == 'templates' and (new_val == 'no' or not os.path.isdir(new_val)):
-            new_val = False
-        if action.dest in ('bootstrap', 'starting_page'):
-            new_val = (new_val == 'yes')
-        setattr(args, action.dest, new_val)
+    args = _manage_args(parser,  args)
 
     # what do we want here?!
     # * if languages are given as multiple arguments, let's use it as is
@@ -228,12 +191,16 @@ def parse(args):
         sys.stderr.write(compat.unicode(e))
         sys.exit(6)
     if django_version is None:
-        sys.stderr.write('Please provide a Django supported version: %s. Only Major.Minor '
-                         'version selector is accepted\n' % ', '.join(data.DJANGO_SUPPORTED))
+        sys.stderr.write(
+            'Please provide a Django supported version: {0}. Only Major.Minor '
+            'version selector is accepted\n'.format(', '.join(data.DJANGO_SUPPORTED))
+        )
         sys.exit(6)
     if django_version is None:
-        sys.stderr.write('Please provide a django CMS supported version: %s. Only Major.Minor '
-                         'version selector is accepted\n' % ', '.join(data.DJANGOCMS_SUPPORTED))
+        sys.stderr.write(
+            'Please provide a django CMS supported version: {0}. Only Major.Minor '
+            'version selector is accepted\n'.format(', '.join(data.DJANGOCMS_SUPPORTED))
+        )
         sys.exit(6)
 
     if not getattr(args, 'requirements_file'):
@@ -242,85 +209,54 @@ def parse(args):
         # django CMS version check
         if args.cms_version == 'develop':
             requirements.append(data.DJANGOCMS_DEVELOP)
-            warnings.warn(data.VERSION_WARNING % ('develop', 'django CMS'))
-        elif args.cms_version == 'rc':
+            warnings.warn(data.VERSION_WARNING.format('develop', 'django CMS'))
+        elif args.cms_version == 'rc':  # pragma: no cover
             requirements.append(data.DJANGOCMS_RC)
-        elif args.cms_version == 'beta':
+        elif args.cms_version == 'beta':  # pragma: no cover
             requirements.append(data.DJANGOCMS_BETA)
-            warnings.warn(data.VERSION_WARNING % ('beta', 'django CMS'))
+            warnings.warn(data.VERSION_WARNING.format('beta', 'django CMS'))
         else:
-            requirements.append('django-cms<%s' % less_than_version(cms_version))
+            requirements.append('django-cms<{0}'.format(less_than_version(cms_version)))
 
-        if cms_version == 3:
-            requirements.extend(data.REQUIREMENTS['cms-3.0'])
-        elif cms_version >= 3.2:
+        if cms_version >= 3.2:
             requirements.extend(data.REQUIREMENTS['cms-3.2'])
-        elif cms_version == 3.1:
-            requirements.extend(data.REQUIREMENTS['cms-3.1'])
-        else:
-            requirements.extend(data.REQUIREMENTS['cms-2.x'])
 
         if not args.no_db_driver:
             requirements.append(args.db_driver)
         if not args.no_plugins:
             if args.filer:
                 if cms_version >= 3:
-                    if django_version < 1.7:
-                        requirements.extend(data.REQUIREMENTS['plugins-common'])
-                        requirements.extend(data.REQUIREMENTS['filer'])
-                    else:
-                        requirements.extend(data.REQUIREMENTS['plugins-common-master'])
-                        requirements.extend(data.REQUIREMENTS['filer'])
-                else:
-                    requirements.extend(data.REQUIREMENTS['filer-cms-2.x'])
-            elif cms_version >= 3:
-                if django_version < 1.7:
-                    requirements.extend(data.REQUIREMENTS['plugins-common'])
-                    requirements.extend(data.REQUIREMENTS['plugins-basic'])
-                else:
                     requirements.extend(data.REQUIREMENTS['plugins-common-master'])
-                    requirements.extend(data.REQUIREMENTS['plugins-basic-master'])
-            if cms_version == 3:
-                requirements.extend(data.REQUIREMENTS['ckeditor-3.0'])
-            elif cms_version >= 3.2:
+                    requirements.extend(data.REQUIREMENTS['filer'])
+            elif cms_version >= 3:
+                requirements.extend(data.REQUIREMENTS['plugins-common-master'])
+                requirements.extend(data.REQUIREMENTS['plugins-basic-master'])
+            if cms_version >= 3.2:
                 requirements.extend(data.REQUIREMENTS['ckeditor-3.2'])
-            elif cms_version == 3.1:
-                requirements.extend(data.REQUIREMENTS['ckeditor-3.1'])
         if args.aldryn:  # pragma: no cover
             requirements.extend(data.REQUIREMENTS['aldryn'])
 
-        if args.apphooks_reload and cms_version < 3.2:
-            requirements.extend(data.REQUIREMENTS['apphooks-reload'])
-
         # Django version check
-        if args.django_version == 'develop':
+        if args.django_version == 'develop':  # pragma: no cover
             requirements.append(data.DJANGO_DEVELOP)
-            warnings.warn(data.VERSION_WARNING % ('develop', 'Django'))
-        elif args.django_version == 'beta':
+            warnings.warn(data.VERSION_WARNING.format('develop', 'Django'))
+        elif args.django_version == 'beta':  # pragma: no cover
             requirements.append(data.DJANGO_BETA)
-            warnings.warn(data.VERSION_WARNING % ('beta', 'Django'))
+            warnings.warn(data.VERSION_WARNING.format('beta', 'Django'))
         else:
-            requirements.append('Django<%s' % less_than_version(django_version))
+            requirements.append('Django<{0}'.format(less_than_version(django_version)))
 
         # Timezone support
         if args.use_timezone:
             requirements.append('pytz')
 
         # Requirements dependendent on django version
-        if django_version < 1.7:
-            requirements.extend(data.REQUIREMENTS['django-legacy'])
+        # if django_version < 1.7:
+        #    requirements.extend(data.REQUIREMENTS['django-legacy'])
 
         # Reversion package version depends on django version
         if args.reversion:
-            if django_version < 1.5:
-                requirements.extend(data.REQUIREMENTS['reversion-django-1.4'])
-            elif django_version == 1.5:
-                requirements.extend(data.REQUIREMENTS['reversion-django-1.5'])
-            elif django_version == 1.6:
-                requirements.extend(data.REQUIREMENTS['reversion-django-1.6'])
-            elif django_version == 1.7:
-                requirements.extend(data.REQUIREMENTS['reversion-django-1.7'])
-            elif django_version == 1.8:
+            if django_version == 1.8:
                 requirements.extend(data.REQUIREMENTS['reversion-django-1.8'])
             elif django_version == 1.9:
                 requirements.extend(data.REQUIREMENTS['reversion-django-1.9'])
@@ -328,9 +264,6 @@ def parse(args):
         requirements.extend(data.REQUIREMENTS['default'])
 
         setattr(args, 'requirements', '\n'.join(requirements).strip())
-    if cms_version < 3 and args.aldryn:  # pragma: no cover
-        sys.stderr.write('Aldryn Boilerplate is not compatible with django CMS versions < 3\n')
-        sys.exit(5)
 
     # Convenient shortcuts
     setattr(args, 'cms_version', cms_version)
@@ -367,3 +300,55 @@ def show_requirements(args):
     Prints the list of requirements according to the arguments provided
     """
     sys.stdout.write(compat.unicode(args.requirements))
+
+
+def _manage_args(parser,  args):
+    """
+    Checks and validate provided input
+    """
+    for item in data.CONFIGURABLE_OPTIONS:
+        action = parser._option_string_actions[item]
+        choices = default = ''
+        input_value = getattr(args, action.dest)
+        new_val = None
+        # cannot count this until we find a way to test input
+        if not args.noinput:  # pragma: no cover
+            if action.choices:
+                choices = ' (choices: {0})'.format(', '.join(action.choices))
+            if input_value:
+                if type(input_value) == list:
+                    default = ' [default {0}]'.format(', '.join(input_value))
+                else:
+                    default = ' [default {0}]'.format(input_value)
+
+            while not new_val:
+                prompt = '{0}{1}{2}: '.format(action.help, choices, default)
+                if action.choices in ('yes', 'no'):
+                    new_val = utils.query_yes_no(prompt)
+                else:
+                    new_val = compat.input(prompt)
+                new_val = compat.clean(new_val)
+                if not new_val and input_value:
+                    new_val = input_value
+                if new_val and action.dest == 'templates':
+                    if new_val != 'no' and not os.path.isdir(new_val):
+                        sys.stdout.write('Given directory does not exists, retry\n')
+                        new_val = False
+                if new_val and action.dest == 'db':
+                    action(parser, args, new_val, action.option_strings)
+                    new_val = getattr(args, action.dest)
+        else:
+            if not input_value and action.required:
+                raise ValueError(
+                    'Option {0} is required when in no-input mode'.format(action.dest)
+                )
+            new_val = input_value
+            if action.dest == 'db':
+                action(parser, args, new_val, action.option_strings)
+                new_val = getattr(args, action.dest)
+        if action.dest == 'templates' and (new_val == 'no' or not os.path.isdir(new_val)):
+            new_val = False
+        if action.dest in ('bootstrap', 'starting_page'):
+            new_val = (new_val == 'yes')
+        setattr(args, action.dest, new_val)
+    return args
diff --git a/djangocms_installer/config/data.py b/djangocms_installer/config/data.py
index cd05185..1807a4c 100644
--- a/djangocms_installer/config/data.py
+++ b/djangocms_installer/config/data.py
@@ -11,36 +11,30 @@ CONFIGURABLE_OPTIONS = ['--db', '--cms-version', '--django-version', '--i18n',
                         '--permissions', '--bootstrap', '--templates',
                         '--starting-page']
 
-DJANGOCMS_DEVELOP = 'https://github.com/divio/django-cms/archive/develop.zip?%s' % time.time()
+DJANGOCMS_DEVELOP = 'https://github.com/divio/django-cms/archive/develop.zip?{bust}'.format(**bust)
 DJANGOCMS_RC = 'https://github.com/divio/django-cms/archive/3.0c2.zip'
 DJANGOCMS_BETA = 'https://github.com/divio/django-cms/archive/3.0.0.beta3.zip'
 
-if sys.version_info < (2, 7):
-    DJANGOCMS_SUPPORTED = ('2.4', '3.0', '3.1', '3.2', 'stable', 'develop')
-    DJANGOCMS_STABLE = 3.2
-elif sys.version_info >= (3, 5):
-    DJANGOCMS_SUPPORTED = ('3.0', '3.1', '3.2', 'stable', 'develop')
+if sys.version_info >= (3, 5):
+    DJANGOCMS_SUPPORTED = ('3.2', 'stable', 'develop')
     DJANGOCMS_STABLE = 3.2
 else:
-    DJANGOCMS_SUPPORTED = ('2.4', '3.0', '3.1', '3.2', 'stable', 'develop')
+    DJANGOCMS_SUPPORTED = ('3.2', 'stable', 'develop')
     DJANGOCMS_STABLE = 3.2
 
-DJANGO_DEVELOP = 'https://github.com/django/django/archive/master.zip?%s' % time.time()
-DJANGO_BETA = 'https://github.com/django/django/archive/master.zip?%s' % time.time()
-if sys.version_info < (2, 7):
-    DJANGO_SUPPORTED = ('1.4', '1.5', '1.6', 'stable')
-    DJANGO_STABLE = 1.6
-elif sys.version_info >= (3, 5):
+DJANGO_DEVELOP = 'https://github.com/django/django/archive/master.zip?{bust}'.format(**bust)
+DJANGO_BETA = 'https://github.com/django/django/archive/master.zip?{bust}'.format(**bust)
+if sys.version_info >= (3, 5):
     DJANGO_SUPPORTED = ('1.8', '1.9', 'stable')
     DJANGO_STABLE = 1.8
 elif sys.version_info >= (3, 4):
-    DJANGO_SUPPORTED = ('1.5', '1.6', '1.7', '1.8', '1.9', 'stable')
+    DJANGO_SUPPORTED = ('1.8', '1.9', 'stable')
     DJANGO_STABLE = 1.8
 elif sys.version_info >= (3, 3):
-    DJANGO_SUPPORTED = ('1.5', '1.6', '1.7', '1.8', 'stable')
+    DJANGO_SUPPORTED = ('1.8', 'stable')
     DJANGO_STABLE = 1.8
 else:
-    DJANGO_SUPPORTED = ('1.4', '1.5', '1.6', '1.7', '1.8', '1.9', 'stable')
+    DJANGO_SUPPORTED = ('1.8', '1.9', 'stable')
     DJANGO_STABLE = 1.8
 
 CMS_VERSION_MATRIX = {
@@ -56,10 +50,7 @@ DJANGO_VERSION_MATRIX = {
     'develop': 1.9
 }
 VERSION_MATRIX = {
-    2.4: (1.4, 1.5),
-    3.0: (1.4, 1.7),
-    3.1: (1.6, 1.8),
-    3.2: (1.6, 1.9),
+    3.2: (1.8, 1.9),
 }
 
 REQUIREMENTS = {
@@ -69,48 +60,17 @@ REQUIREMENTS = {
         'Pillow>=2.3',
         'django-sekizai>=0.7',
         'six',
-    ],
-    'django-legacy': [
-        'south>=1.0.0',
-    ],
-    'reversion-django-1.4': [
-        'django-reversion<1.7',
-    ],
-    'reversion-django-1.5': [
-        'django-reversion>=1.7,<1.8',
-    ],
-    'reversion-django-1.6': [
-        'django-reversion>=1.8,<1.9',
-    ],
-    'reversion-django-1.7': [
-        'django-reversion>=1.8.2,<1.9',
+        'ipdb',
     ],
     'reversion-django-1.8': [
-        'django-reversion>=1.8.7,<1.9',
+        'django-reversion>=1.10,<1.11',
     ],
     'reversion-django-1.9': [
         'django-reversion>=1.10,<1.11',
     ],
-    'cms-2.x': [
-        'django-mptt>=0.5.1,<0.5.3',
-    ],
-    'cms-3.0': [
-        'django-mptt<0.7',
-    ],
-    'cms-3.1': [
-        'django-treebeard>=2.0',
-    ],
     'cms-3.2': [
         'django-treebeard>=2.0',
     ],
-    'ckeditor-3.0': [
-        'djangocms-admin-style<0.3',
-        'djangocms-text-ckeditor<2.7.0',
-    ],
-    'ckeditor-3.1': [
-        'djangocms-admin-style<1.0',
-        'djangocms-text-ckeditor<2.8.0',
-    ],
     'ckeditor-3.2': [
         'djangocms-admin-style>=1.0.6',
         'djangocms-text-ckeditor>=2.8.1',
@@ -129,17 +89,17 @@ REQUIREMENTS = {
         'djangocms-video',
     ],
     'plugins-common-master': [
-        'https://github.com/divio/djangocms-column/archive/master.zip?%(bust)s' % bust,
-        'https://github.com/divio/djangocms-googlemap/archive/master.zip?%(bust)s' % bust,
-        'https://github.com/divio/djangocms-inherit/archive/master.zip?%(bust)s' % bust,
-        'https://github.com/divio/djangocms-link/archive/master.zip?%(bust)s' % bust,
-        'https://github.com/divio/djangocms-style/archive/master.zip?%(bust)s' % bust,
+        'https://github.com/divio/djangocms-column/archive/master.zip?{bust}'.format(**bust),
+        'https://github.com/divio/djangocms-googlemap/archive/master.zip?{bust}'.format(**bust),
+        'https://github.com/divio/djangocms-inherit/archive/master.zip?{bust}'.format(**bust),
+        'https://github.com/divio/djangocms-link/archive/master.zip?{bust}'.format(**bust),
+        'https://github.com/divio/djangocms-style/archive/master.zip?{bust}'.format(**bust),
     ],
     'plugins-basic-master': [
-        'https://github.com/divio/djangocms-file/archive/master.zip?%(bust)s' % bust,
-        'https://github.com/divio/djangocms-picture/archive/master.zip?%(bust)s' % bust,
-        'https://github.com/divio/djangocms-teaser/archive/master.zip?%(bust)s' % bust,
-        'https://github.com/divio/djangocms-video/archive/master.zip?%(bust)s' % bust,
+        'https://github.com/divio/djangocms-file/archive/master.zip?{bust}'.format(**bust),
+        'https://github.com/divio/djangocms-picture/archive/master.zip?{bust}'.format(**bust),
+        'https://github.com/divio/djangocms-teaser/archive/master.zip?{bust}'.format(**bust),
+        'https://github.com/divio/djangocms-video/archive/master.zip?{bust}'.format(**bust),
     ],
     'aldryn': [
         'django-compressor',
@@ -149,14 +109,6 @@ REQUIREMENTS = {
         'django-filer>=0.9.12',
         'cmsplugin-filer>=0.10.2',
     ],
-    'filer-cms-2.x': [
-        'easy_thumbnails',
-        'django-filer<=0.9.6',
-        'cmsplugin-filer',
-    ],
-    'apphooks-reload': [
-        'aldryn-apphook-reload>=0.2.2'
-    ]
 }
 
 TEMPLATES_1_8 = """
@@ -222,4 +174,4 @@ BASE_DIR = os.path.dirname(os.path.dirname(__file__))
 
 ALDRYN_BOILERPLATE = 'https://github.com/aldryn/aldryn-boilerplate/archive/master.zip'
 
-VERSION_WARNING = '%s version of %s is not supported and it may not work as expected'
+VERSION_WARNING = '{0} version of {1} is not supported and it may not work as expected'
diff --git a/djangocms_installer/config/ini.py b/djangocms_installer/config/ini.py
index 8f7aa03..f9feeb5 100644
--- a/djangocms_installer/config/ini.py
+++ b/djangocms_installer/config/ini.py
@@ -39,7 +39,7 @@ def parse_config_file(parser, stdin_args):
 
     config = ConfigParser()
     if not config.read(parsed_args.config_file):
-        sys.stderr.write('Config file "%s" doesn\'t exists\n' % parsed_args.config_file)
+        sys.stderr.write('Config file "{0}" doesn\'t exists\n'.format(parsed_args.config_file))
         sys.exit(7)  # It isn't used anythere.
 
     config_args = _convert_config_to_stdin(config, parser)
@@ -105,7 +105,7 @@ def _convert_config_to_stdin(config, parser):
         '--extra-settings', '--languages', '--requirements', '--template', '--timezone')
     args = []
     for key, val in config.items(SECTION):
-        keyp = '--%s' % key
+        keyp = '--{0}'.format(key)
         action = parser._option_string_actions[keyp]
 
         if action.const:
diff --git a/djangocms_installer/config/internal.py b/djangocms_installer/config/internal.py
index 5308e36..823d5d3 100644
--- a/djangocms_installer/config/internal.py
+++ b/djangocms_installer/config/internal.py
@@ -19,8 +19,8 @@ class DbAction(Action):
                 sys.stdout.write('postgis installation is not supported at the moment.\n'
                                  'You need to install and configure the backend.\n')
             setattr(namespace, self.dest, values)
-            setattr(namespace, '%s_parsed' % self.dest, parsed)
-            setattr(namespace, '%s_driver' % self.dest, DRIVERS[parsed['ENGINE']])
+            setattr(namespace, '{0}_parsed'.format(self.dest), parsed)
+            setattr(namespace, '{0}_driver'.format(self.dest), DRIVERS[parsed['ENGINE']])
         else:
             raise ValueError('Database URL not recognized, try again')
 
diff --git a/djangocms_installer/config/urls.py b/djangocms_installer/config/urls.py
index 7117edc..cd589c1 100644
--- a/djangocms_installer/config/urls.py
+++ b/djangocms_installer/config/urls.py
@@ -3,14 +3,14 @@ from __future__ import absolute_import, print_function, unicode_literals
 
 from cms.sitemaps import CMSSitemap
 from django.conf import settings
-from django.conf.urls import *  # NOQA
+from django.conf.urls import include, url
 from django.conf.urls.i18n import i18n_patterns
 from django.contrib import admin
 from django.contrib.staticfiles.urls import staticfiles_urlpatterns
 
 admin.autodiscover()
 
-urlpatterns = i18n_patterns('',
+urlpatterns = i18n_patterns(
     url(r'^admin/', include(admin.site.urls)),  # NOQA
     url(r'^sitemap\.xml$', 'django.contrib.sitemaps.views.sitemap',
         {'sitemaps': {'cmspages': CMSSitemap}}),
@@ -20,7 +20,7 @@ urlpatterns = i18n_patterns('',
 
 # This is only needed when using runserver.
 if settings.DEBUG:
-    urlpatterns = patterns('',
-        url(r'^media/(?P<path>.*)$', 'django.views.static.serve',  # NOQA
+    urlpatterns = [
+        url(r'^media/(?P<path>.*)$', 'django.views.static.serve',
             {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}),
-        ) + staticfiles_urlpatterns() + urlpatterns  # NOQA
+        ] + staticfiles_urlpatterns() + urlpatterns
diff --git a/djangocms_installer/django/__init__.py b/djangocms_installer/django/__init__.py
index cd02a24..09f7906 100644
--- a/djangocms_installer/django/__init__.py
+++ b/djangocms_installer/django/__init__.py
@@ -26,6 +26,8 @@ except ImportError:
 def create_project(config_data):
     """
     Call django-admin to create the project structure
+
+    :param config_data: configuration data
     """
     env = deepcopy(dict(os.environ))
     env[str('DJANGO_SETTINGS_MODULE')] = str('{0}.settings'.format(config_data.project_name))
@@ -42,27 +44,35 @@ def create_project(config_data):
     start_cmd = os.path.join(os.path.dirname(sys.executable), 'django-admin.py')
     cmd_args = ' '.join([sys.executable, start_cmd, 'startproject'] + args)
     if config_data.verbose:
-        sys.stdout.write('Project creation command: %s\n' % cmd_args)
+        sys.stdout.write('Project creation command: {0}\n'.format(cmd_args))
     output = subprocess.check_output(cmd_args, shell=True)
     sys.stdout.write(output.decode('utf-8'))
 
 
 def _detect_migration_layout(vars, apps):
-    SOUTH_MODULES = {}
+    """
+    Detect migrations layout for plugins
+    :param vars: installer settings
+    :param apps: installed applications
+    """
     DJANGO_MODULES = {}
 
     for module in vars.MIGRATIONS_CHECK_MODULES:
         if module in apps:
             try:
-                mod = __import__('%s.migrations_django' % module)  # NOQA
-                DJANGO_MODULES[module] = '%s.migrations_django' % module
-                SOUTH_MODULES[module] = '%s.migrations' % module
+                mod = __import__('{0}.migrations_django'.format(module))  # NOQA
+                DJANGO_MODULES[module] = '{0}.migrations_django'.format(module)
             except Exception:
                 pass
-    return DJANGO_MODULES, SOUTH_MODULES
+    return DJANGO_MODULES
 
 
 def _install_aldryn(config_data):  # pragma: no cover
+    """
+    Install aldryn boilerplate
+
+    :param config_data: configuration data
+    """
     import requests
     media_project = os.path.join(config_data.project_directory, 'dist', 'media')
     static_main = False
@@ -87,6 +97,8 @@ def copy_files(config_data):
     """
     It's a little rude actually: it just overwrites the django-generated urls.py
     with a custom version and put other files in the project directory.
+
+    :param config_data: configuration data
     """
     urlconf_path = os.path.join(os.path.dirname(__file__), '../config/urls.py')
     share_path = os.path.join(os.path.dirname(__file__), '../share')
@@ -128,6 +140,8 @@ def patch_settings(config_data):
     """
     Modify the settings file created by Django injecting the django CMS
     configuration
+
+    :param config_data: configuration data
     """
     overridden_settings = (
         'MIDDLEWARE_CLASSES', 'INSTALLED_APPS', 'TEMPLATE_LOADERS', 'TEMPLATE_CONTEXT_PROCESSORS',
@@ -136,8 +150,10 @@ def patch_settings(config_data):
     extra_settings = ''
 
     if not os.path.exists(config_data.settings_path):
-        sys.stdout.write('Error while creating target project, '
-                         'please check the given configuration: %s' % config_data.settings_path)
+        sys.stdout.write(
+            'Error while creating target project, '
+            'please check the given configuration: {0}'.format(config_data.settings_path)
+        )
         return sys.exit(5)
 
     with open(config_data.settings_path, 'r') as fd_original:
@@ -157,40 +173,19 @@ def patch_settings(config_data):
         STATICFILES_DIR = 'os.path.join(BASE_DIR, \'static\'),'
     else:
         DATA_DIR = 'DATA_DIR = os.path.dirname(os.path.dirname(__file__))\n'
-        STATICFILES_DIR = 'os.path.join(BASE_DIR, \'%s\', \'static\'),' % config_data.project_name
-
-    if original.find('BASE_DIR') == -1:
-        original = data.DEFAULT_PROJECT_HEADER + data.BASE_DIR + DATA_DIR + original
-    else:
-        original = data.DEFAULT_PROJECT_HEADER + DATA_DIR + original
-    if original.find('MEDIA_URL') > -1:
-        original = original.replace('MEDIA_URL = \'\'', 'MEDIA_URL = \'/media/\'')
-    else:
-        original += 'MEDIA_URL = \'/media/\'\n'
-    if original.find('MEDIA_ROOT') > -1:
-        original = original.replace(
-            'MEDIA_ROOT = \'\'', 'MEDIA_ROOT = os.path.join(DATA_DIR, \'media\')'
+        STATICFILES_DIR = 'os.path.join(BASE_DIR, \'{0}\', \'static\'),'.format(
+            config_data.project_name
         )
-    else:
-        original += 'MEDIA_ROOT = os.path.join(DATA_DIR, \'media\')\n'
-    if original.find('STATIC_ROOT') > -1:
-        original = original.replace(
-            'STATIC_ROOT = \'\'', 'STATIC_ROOT = os.path.join(DATA_DIR, \'static\')'
-        )
-    else:
-        original += 'STATIC_ROOT = os.path.join(DATA_DIR, \'static\')\n'
-    if original.find('STATICFILES_DIRS') > -1:
-        original = original.replace(data.STATICFILES_DEFAULT, """
-STATICFILES_DIRS = (
-    %s
-)
-""" % STATICFILES_DIR)
-    else:
-        original += """
+
+    original = data.DEFAULT_PROJECT_HEADER + DATA_DIR + original
+    original += 'MEDIA_URL = \'/media/\'\n'
+    original += 'MEDIA_ROOT = os.path.join(DATA_DIR, \'media\')\n'
+    original += 'STATIC_ROOT = os.path.join(DATA_DIR, \'static\')\n'
+    original += """
 STATICFILES_DIRS = (
-    %s
+    {0}
 )
-""" % STATICFILES_DIR
+""".format(STATICFILES_DIR)
     original = original.replace('# -*- coding: utf-8 -*-\n', '')
 
     # I18N
@@ -204,30 +199,23 @@ STATICFILES_DIRS = (
 
     if config_data.languages:
         original = original.replace(
-            'LANGUAGE_CODE = \'en-us\'', 'LANGUAGE_CODE = \'%s\'' % config_data.languages[0]
+            'LANGUAGE_CODE = \'en-us\'', 'LANGUAGE_CODE = \'{0}\''.format(config_data.languages[0])
         )
     if config_data.timezone:
         # This is for Django 1.6 which changed the default timezone
         original = original.replace(
-            'TIME_ZONE = \'UTC\'', 'TIME_ZONE = \'%s\'' % config_data.timezone
-        )
-        # This is for older django versions
-        original = original.replace(
-            'TIME_ZONE = \'America/Chicago\'', 'TIME_ZONE = \'%s\'' % config_data.timezone
+            'TIME_ZONE = \'UTC\'', 'TIME_ZONE = \'{0}\''.format(config_data.timezone)
         )
 
     for item in overridden_settings:
         if config_data.django_version >= 1.9:
-            item_re = re.compile(r'%s = [^\]]+\)' % item, re.DOTALL | re.MULTILINE)
+            item_re = re.compile(r'{0} = [^\]]+\)'.format(item), re.DOTALL | re.MULTILINE)
         else:
-            item_re = re.compile(r'%s = [^\)]+\)' % item, re.DOTALL | re.MULTILINE)
-        original = item_re.sub('', original)
-        if 'LANGUAGE_CODE' not in original:
-            raise Exception()
-    if config_data.django_version >= 1.8:
-        # TEMPLATES is special, so custom regexp needed
-        item_re = re.compile(r'TEMPLATES = .+\]$', re.DOTALL | re.MULTILINE)
+            item_re = re.compile(r'{0} = [^\)]+\)'.format(item), re.DOTALL | re.MULTILINE)
         original = item_re.sub('', original)
+    # TEMPLATES is special, so custom regexp needed
+    item_re = re.compile(r'TEMPLATES = .+\]$', re.DOTALL | re.MULTILINE)
+    original = item_re.sub('', original)
     # DATABASES is a dictionary, so different regexp needed
     item_re = re.compile(r'DATABASES = [^\}]+\}[^\}]+\}', re.DOTALL | re.MULTILINE)
     original = item_re.sub('', original)
@@ -245,86 +233,50 @@ STATICFILES_DIRS = (
 def _build_settings(config_data):
     """
     Build the django CMS settings dictionary
+
+    :param config_data: configuration data
     """
     spacer = '    '
     text = []
     vars = get_settings()
 
-    if config_data.cms_version >= 3.2:
-        vars.MIDDLEWARE_CLASSES.insert(0, vars.APPHOOK_RELOAD_MIDDLEWARE_CLASS)
-    elif config_data.apphooks_reload:
-        vars.MIDDLEWARE_CLASSES.insert(0, vars.APPHOOK_RELOAD_MIDDLEWARE_CLASS_OLD)
+    vars.MIDDLEWARE_CLASSES.insert(0, vars.APPHOOK_RELOAD_MIDDLEWARE_CLASS)
 
-    if config_data.django_version < 1.6:
-        vars.MIDDLEWARE_CLASSES.extend(vars.MIDDLEWARE_CLASSES_DJANGO_15)
+    processors = vars.TEMPLATE_CONTEXT_PROCESSORS + vars.TEMPLATE_CONTEXT_PROCESSORS_3
+    text.append(data.TEMPLATES_1_8.format(
+        loaders=(',\n' + spacer).join(['\'{0}\''.format(var) for var in vars.TEMPLATE_LOADERS]),
+        processors=(',\n' + spacer).join(['\'{0}\''.format(var) for var in processors]),
+        dirs='os.path.join(BASE_DIR, \'{0}\', \'templates\'),'.format(config_data.project_name)
+    ))
 
-    if config_data.cms_version < 3:
-        processors = vars.TEMPLATE_CONTEXT_PROCESSORS + vars.TEMPLATE_CONTEXT_PROCESSORS_2
-    else:
-        processors = vars.TEMPLATE_CONTEXT_PROCESSORS + vars.TEMPLATE_CONTEXT_PROCESSORS_3
-    if config_data.django_version < 1.8:
-        text.append('TEMPLATE_LOADERS = (\n%s%s\n)' % (
-            spacer, (',\n' + spacer).join(['\'%s\'' % var for var in vars.TEMPLATE_LOADERS])))
-
-        text.append('TEMPLATE_CONTEXT_PROCESSORS = (\n%s%s\n)' % (
-            spacer, (',\n' + spacer).join(['\'%s\'' % var for var in processors])))
-
-        if config_data.aldryn:  # pragma: no cover
-            text.append('TEMPLATE_DIRS = (\n%s%s\n)' % (
-                spacer, 'os.path.join(BASE_DIR, \'templates\'),'))
-        else:
-            text.append('TEMPLATE_DIRS = (\n%s%s\n)' % (
-                spacer, 'os.path.join(BASE_DIR, \'%s\', \'templates\'),' % config_data.project_name
-            ))
-    else:
-        text.append(data.TEMPLATES_1_8.format(
-            loaders=(',\n' + spacer).join(['\'%s\'' % var for var in vars.TEMPLATE_LOADERS]),
-            processors=(',\n' + spacer).join(['\'%s\'' % var for var in processors]),
-            dirs='os.path.join(BASE_DIR, \'%s\', \'templates\'),' % config_data.project_name
-        ))
-
-    text.append('MIDDLEWARE_CLASSES = (\n%s%s\n)' % (
-        spacer, (',\n' + spacer).join(['\'%s\'' % var for var in vars.MIDDLEWARE_CLASSES])))
+    text.append('MIDDLEWARE_CLASSES = (\n{0}{1}\n)'.format(
+        spacer, (',\n' + spacer).join(['\'{0}\''.format(var) for var in vars.MIDDLEWARE_CLASSES])
+    ))
 
     apps = list(vars.INSTALLED_APPS)
-    if config_data.cms_version == 2.4:
-        apps.extend(vars.CMS_2_APPLICATIONS)
-        apps.extend(vars.MPTT_APPS)
-    elif config_data.cms_version == 3.0:
-        apps = list(vars.CMS_3_HEAD) + apps
-        apps.extend(vars.MPTT_APPS)
-        apps.extend(vars.CMS_3_APPLICATIONS)
-    else:
-        apps = list(vars.CMS_3_HEAD) + apps
-        apps.extend(vars.TREEBEARD_APPS)
-        apps.extend(vars.CMS_3_APPLICATIONS)
+    apps = list(vars.CMS_3_HEAD) + apps
+    apps.extend(vars.TREEBEARD_APPS)
+    apps.extend(vars.CMS_3_APPLICATIONS)
 
     if not config_data.no_plugins:
-        if config_data.cms_version == 2.4:
-            if config_data.filer:
-                apps.extend(vars.FILER_PLUGINS_2)
-            else:
-                apps.extend(vars.STANDARD_PLUGINS_2)
+        if config_data.filer:
+            apps.extend(vars.FILER_PLUGINS_3)
         else:
-            if config_data.filer:
-                apps.extend(vars.FILER_PLUGINS_3)
-            else:
-                apps.extend(vars.STANDARD_PLUGINS_3)
-    if config_data.django_version <= 1.6:
-        apps.extend(vars.SOUTH_APPLICATIONS)
+            apps.extend(vars.STANDARD_PLUGINS_3)
 
     if config_data.aldryn:  # pragma: no cover
         apps.extend(vars.ALDRYN_APPLICATIONS)
-    if config_data.apphooks_reload and config_data.cms_version < 3.2:
-        apps.extend(vars.APPHOOK_RELOAD_APPLICATIONS)
     if config_data.reversion:
         apps.extend(vars.REVERSION_APPLICATIONS)
-    text.append('INSTALLED_APPS = (\n%s%s\n)' % (
-        spacer, (',\n' + spacer).join(['\'%s\'' % var for var in apps] + ['\'%s\'' % config_data.project_name])))  # NOQA
+    text.append('INSTALLED_APPS = (\n{0}{1}\n)'.format(
+        spacer, (',\n' + spacer).join(['\'{0}\''.format(var) for var in apps] +
+                                      ['\'{0}\''.format(config_data.project_name)])
+    ))
 
-    text.append('LANGUAGES = (\n%s%s\n%s%s\n)' % (
+    text.append('LANGUAGES = (\n{0}{1}\n{0}{2}\n)'.format(
         spacer, '## Customize this',
-        spacer, ('\n' + spacer).join(['(\'%s\', gettext(\'%s\')),' % (item, item) for item in config_data.languages])))  # NOQA
+        ('\n' + spacer).join(['(\'{0}\', gettext(\'{0}\')),'.format(item) for item in config_data.languages])  # NOQA
+    ))
 
     cms_langs = deepcopy(vars.CMS_LANGUAGES)
     for lang in config_data.languages:
@@ -332,26 +284,28 @@ def _build_settings(config_data):
         lang_dict.update(copy(cms_langs['default']))
         cms_langs[1].append(lang_dict)
     cms_text = ['CMS_LANGUAGES = {']
-    cms_text.append('%s%s' % (spacer, '## Customize this',))
+    cms_text.append('{0}{1}'.format(spacer, '## Customize this'))
     for key, value in iteritems(cms_langs):
         if key == 'default':
-            cms_text.append('%s\'%s\': {' % (spacer, key))
+            cms_text.append('{0}\'{1}\': {{'.format(spacer, key))
             for config_name, config_value in iteritems(value):
-                cms_text.append('%s\'%s\': %s,' % (spacer * 2, config_name, config_value))
-            cms_text.append('%s},' % spacer)
+                cms_text.append('{0}\'{1}\': {2},'.format(spacer * 2, config_name, config_value))
+            cms_text.append('{0}}},'.format(spacer))
         else:
-            cms_text.append('%s%s: [' % (spacer, key))
+            cms_text.append('{0}{1}: ['.format(spacer, key))
             for lang in value:
-                cms_text.append('%s{' % (spacer * 2))
+                cms_text.append('{0}{{'.format(spacer * 2))
                 for config_name, config_value in iteritems(lang):
                     if config_name == 'code':
-                        cms_text.append('%s\'%s\': \'%s\',' % (spacer * 3, config_name, config_value))  # NOQA
+                        cms_text.append('{0}\'{1}\': \'{2}\','.format(spacer * 3, config_name, config_value))  # NOQA
                     elif config_name == 'name':
-                        cms_text.append('%s\'%s\': gettext(\'%s\'),' % (spacer * 3, config_name, config_value))  # NOQA
+                        cms_text.append('{0}\'{1}\': gettext(\'{2}\'),'.format(spacer * 3, config_name, config_value))  # NOQA
                     else:
-                        cms_text.append('%s\'%s\': %s,' % (spacer * 3, config_name, config_value))
-                cms_text.append('%s},' % (spacer * 2))
-            cms_text.append('%s],' % spacer)
+                        cms_text.append('{0}\'{1}\': {2},'.format(
+                            spacer * 3, config_name, config_value
+                        ))
+                cms_text.append('{0}}},'.format(spacer * 2))
+            cms_text.append('{0}],'.format(spacer))
     cms_text.append('}')
 
     text.append('\n'.join(cms_text))
@@ -361,65 +315,62 @@ def _build_settings(config_data):
     else:
         cms_templates = 'CMS_TEMPLATES'
 
-    text.append('CMS_TEMPLATES = (\n%s%s\n%s%s\n)' % (
+    text.append('CMS_TEMPLATES = (\n{0}{1}\n{0}{2}\n)'.format(
         spacer, '## Customize this',
-        spacer, (',\n' + spacer).join(['(\'%s\', \'%s\')' % item for item in getattr(vars, cms_templates)])))  # NOQA
+        (',\n' + spacer).join(
+            ['(\'{0}\', \'{1}\')'.format(*item) for item in getattr(vars, cms_templates)]
+        )
+    ))
 
-    text.append('CMS_PERMISSION = %s' % vars.CMS_PERMISSION)
-    text.append('CMS_PLACEHOLDER_CONF = %s' % vars.CMS_PLACEHOLDER_CONF)
+    text.append('CMS_PERMISSION = {0}'.format(vars.CMS_PERMISSION))
+    text.append('CMS_PLACEHOLDER_CONF = {0}'.format(vars.CMS_PLACEHOLDER_CONF))
 
-    database = ['\'%s\': %s' % (key, format_val(val)) for key, val in sorted(config_data.db_parsed.items(), key=lambda x: x[0])]  # NOQA
+    database = ['\'{0}\': {1}'.format(key, format_val(val)) for key, val in sorted(config_data.db_parsed.items(), key=lambda x: x[0])]  # NOQA
     text.append(textwrap.dedent("""
-        DATABASES = {
-            'default': {
-                %s
-            }
-        }""").strip() % (',\n' + spacer * 2).join(database))  # NOQA
+        DATABASES = {{
+            'default': {{
+                {0}
+            }}
+        }}""").strip().format((',\n' + spacer * 2).join(database)))  # NOQA
 
-    DJANGO_MIGRATION_MODULES, SOUTH_MIGRATION_MODULES = _detect_migration_layout(vars, apps)
+    DJANGO_MIGRATION_MODULES = _detect_migration_layout(vars, apps)
 
-    if config_data.django_version >= 1.7:
-        text.append('MIGRATION_MODULES = {\n%s%s\n}' % (
-            spacer, (',\n' + spacer).join(['\'%s\': \'%s\'' % item for item in DJANGO_MIGRATION_MODULES.items()])))  # NOQA
-    else:
-        text.append('SOUTH_MIGRATION_MODULES = {\n%s%s\n}' % (
-            spacer, (',\n' + spacer).join(['\'%s\': \'%s\'' % item for item in SOUTH_MIGRATION_MODULES.items()])))  # NOQA
+    text.append('MIGRATION_MODULES = {{\n{0}{1}\n}}'.format(
+        spacer, (',\n' + spacer).join(
+            ['\'{0}\': \'{1}\''.format(*item) for item in DJANGO_MIGRATION_MODULES.items()]
+        )
+    ))
 
     if config_data.filer:
-        text.append('THUMBNAIL_PROCESSORS = (\n%s%s\n)' % (
-            spacer, (',\n' + spacer).join(['\'%s\'' % var for var in vars.THUMBNAIL_PROCESSORS])))
+        text.append('THUMBNAIL_PROCESSORS = (\n{0}{1}\n)'.format(
+            spacer, (',\n' + spacer).join(
+                ['\'{0}\''.format(var) for var in vars.THUMBNAIL_PROCESSORS]
+            )
+        ))
     return '\n\n'.join(text)
 
 
 def setup_database(config_data):
+    """
+    Run the migrate command to create the database schema
+
+    :param config_data: configuration data
+    """
     with chdir(config_data.project_directory):
         env = deepcopy(dict(os.environ))
         env[str('DJANGO_SETTINGS_MODULE')] = str('{0}.settings'.format(config_data.project_name))
         env[str('PYTHONPATH')] = str(os.pathsep.join(map(shlex_quote, sys.path)))
         commands = []
 
-        if config_data.django_version < 1.7:
-            try:
-                import south  # NOQA
-                commands.append(
-                    [sys.executable, '-W', 'ignore', 'manage.py', 'syncdb', '--all', '--noinput']
-                )
-                commands.append(
-                    [sys.executable, '-W', 'ignore', 'manage.py', 'migrate', '--fake'],
-                )
-            except ImportError:
-                commands.append(
-                    [sys.executable, '-W', 'ignore', 'manage.py', 'syncdb', '--noinput']
-                )
-                sys.stdout.write('south not installed, migrations skipped\n')
-        else:
-            commands.append(
-                [sys.executable, '-W', 'ignore', 'manage.py', 'migrate'],
-            )
+        commands.append(
+            [sys.executable, '-W', 'ignore', 'manage.py', 'migrate'],
+        )
 
         if config_data.verbose:
             sys.stdout.write(
-                'Database setup commands: %s\n' % ', '.join([' '.join(cmd) for cmd in commands])
+                'Database setup commands: {0}\n'.format(
+                    ', '.join([' '.join(cmd) for cmd in commands])
+                )
             )
         for command in commands:
             output = subprocess.check_output(command, env=env)
@@ -435,6 +386,8 @@ def setup_database(config_data):
 def load_starting_page(config_data):
     """
     Load starting page into the CMS
+
+    :param config_data: configuration data
     """
     with chdir(config_data.project_directory):
         env = deepcopy(dict(os.environ))
@@ -443,6 +396,6 @@ def load_starting_page(config_data):
         subprocess.check_call([sys.executable, 'starting_page.py'], env=env)
         for ext in ['py', 'pyc', 'json']:
             try:
-                os.remove('starting_page.%s' % ext)
+                os.remove('starting_page.{0}'.format(ext))
             except OSError:
                 pass
diff --git a/djangocms_installer/install/__init__.py b/djangocms_installer/install/__init__.py
index a5d35cc..42ad1d8 100644
--- a/djangocms_installer/install/__init__.py
+++ b/djangocms_installer/install/__init__.py
@@ -82,14 +82,12 @@ def requirements(requirements, pip_options='', is_file=False, verbose=False):
         args.append('-q')
     if pip_options:
         args.extend([opt for opt in pip_options.split(' ') if opt])
-    if 'Django<1.5' in requirements:
-        args += ['--no-use-wheel']
     if is_file:  # pragma: no cover
         args += ['-r', requirements]
     else:
-        args.extend(['%s' % package for package in requirements.split()])
+        args.extend(['{0}'.format(package) for package in requirements.split()])
     if verbose:
-        sys.stdout.write('Package install command: %s\n' % ' '.join(args))
+        sys.stdout.write('Package install command: {0}\n'.format(' '.join(args)))
     output = subprocess.check_output(['pip'] + args)
     sys.stdout.write(output.decode('utf-8'))
     return True
@@ -125,6 +123,7 @@ def cleanup_directory(config_data):
         else:
             sys.stdout.write('Failure occurred.\n')
         if choice or config_data.noinput:
-            sys.stdout.write('Removing everything under %s\n'
-                             '' % os.path.abspath(config_data.project_directory))
+            sys.stdout.write('Removing everything under {0}\n'.format(
+                os.path.abspath(config_data.project_directory)
+            ))
             shutil.rmtree(config_data.project_directory, True)
diff --git a/djangocms_installer/main.py b/djangocms_installer/main.py
index 8e835d4..b19adc8 100644
--- a/djangocms_installer/main.py
+++ b/djangocms_installer/main.py
@@ -52,9 +52,10 @@ def execute():
                                  'for more information.\n')
             else:
                 sys.stdout.write('All done!\n')
-                sys.stdout.write('Get into "%s" directory and type '
-                                 '"python manage.py runserver" to start your '
-                                 'project\n' % os.path.abspath(config_data.project_directory))
+                sys.stdout.write(
+                    'Get into "{0}" directory and type "python manage.py runserver" to start your '
+                    'project\n'.format(os.path.abspath(config_data.project_directory))
+                )
     except Exception:
         # Clean up your own mess
         install.cleanup_directory(config_data)
diff --git a/djangocms_installer/share/starting_page.py b/djangocms_installer/share/starting_page.py
index 1ec6075..1361f43 100644
--- a/djangocms_installer/share/starting_page.py
+++ b/djangocms_installer/share/starting_page.py
@@ -37,7 +37,6 @@ def create_pages():
     except Placeholder.DoesNotExist:
         # fallback, add it to the
         add_plugin(placeholder['main'], 'TextPlugin', lang, body=content['feature'])
-        pass
 
     # Add main content to a MultiColumnPlugin
     multi_columns_plugin = add_plugin(placeholder['main'], 'MultiColumnPlugin', lang)
diff --git a/djangocms_installer/utils.py b/djangocms_installer/utils.py
index 6bbe340..e1071f9 100644
--- a/djangocms_installer/utils.py
+++ b/djangocms_installer/utils.py
@@ -32,7 +32,7 @@ def query_yes_no(question, default=None):  # pragma: no cover
     elif default == 'no':
         prompt = ' [y/N] '
     else:
-        raise ValueError('invalid default answer: "%s"' % default)
+        raise ValueError('invalid default answer: "{0}"'.format(default))
 
     while True:
         sys.stdout.write(question + prompt)
@@ -66,7 +66,7 @@ def supported_versions(django, cms):
     except ValueError:
         try:
             django_version = DJANGO_VERSION_MATRIX[django]
-        except KeyError:
+        except KeyError:  # pragma: no cover
             pass
     try:
         if (
@@ -76,12 +76,12 @@ def supported_versions(django, cms):
         ):
             raise RuntimeError(
                 'Django and django CMS versions doesn\'t match: '
-                'Django %s is not supported by django CMS %s' % (django_version, cms_version)
+                'Django {0} is not supported by django CMS {1}'.format(django_version, cms_version)
             )
     except KeyError:
         raise RuntimeError(
             'Django and django CMS versions doesn\'t match: '
-            'Django %s is not supported by django CMS %s' % (django_version, cms_version)
+            'Django {0} is not supported by django CMS {1}'.format(django_version, cms_version)
         )
     return django_version, cms_version
 
diff --git a/tox.ini b/tox.ini
index c5914db..95175e5 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,6 +1,6 @@
 [tox]
 downloadcache = {toxworkdir}/cache
-envlist = pep8,isort,py{26,27,33,34,35},docs
+envlist = pep8,isort,py{27,33,34,35},docs
 passenv = LANG
 
 [testenv]
@@ -8,7 +8,6 @@ recreate = True
 commands = {env:COMMAND:python} setup.py test
 deps =
     -r{toxinidir}/requirements-test.txt
-    py26: unittest2
 
 [testenv:coverage]
 commands =


Test patch:
diff --git a/tests/base.py b/tests/base.py
index 6c57c25..9908f7d 100644
--- a/tests/base.py
+++ b/tests/base.py
@@ -6,18 +6,13 @@ import shutil
 import subprocess
 import sys
 import tempfile
+import unittest
 from copy import copy
 
 from six import StringIO
 
-if sys.version_info[:2] < (2, 7):
-    import unittest2 as unittest
-else:
-    import unittest
 
-if sys.version_info < (2, 7):
-    dj_ver = '1.6'
-elif sys.version_info < (3, 4):
+if sys.version_info < (3, 4):
     dj_ver = '1.8'
 else:
     dj_ver = '1.9'
diff --git a/tests/config.py b/tests/config.py
index f9f6f90..8b42e51 100644
--- a/tests/config.py
+++ b/tests/config.py
@@ -26,12 +26,8 @@ class TestConfig(BaseTestClass):
 
         self.assertEqual(conf_data.project_name, 'example_prj')
 
-        if sys.version_info < (2, 7):
-            self.assertEqual(conf_data.cms_version, 3.2)
-            self.assertEqual(conf_data.django_version, 1.6)
-        else:
-            self.assertEqual(conf_data.cms_version, 3.2)
-            self.assertEqual(conf_data.django_version, 1.8)
+        self.assertEqual(conf_data.cms_version, 3.2)
+        self.assertEqual(conf_data.django_version, 1.8)
         self.assertEqual(conf_data.i18n, 'yes')
         self.assertEqual(conf_data.reversion, 'yes')
         self.assertEqual(conf_data.permissions, 'yes')
@@ -45,10 +41,7 @@ class TestConfig(BaseTestClass):
         self.assertEqual(conf_data.requirements_file, None)
 
     def test_cli_config(self):
-        if sys.version_info < (2, 7):
-            dj_version = '1.6'
-        else:
-            dj_version = '1.8'
+        dj_version = '1.8'
         conf_data = config.parse([
             '-q',
             '--db=postgres://user:pwd@host/dbname',
@@ -65,12 +58,8 @@ class TestConfig(BaseTestClass):
 
         self.assertEqual(conf_data.project_name, 'example_prj')
 
-        if sys.version_info < (2, 7):
-            self.assertEqual(conf_data.cms_version, 3.2)
-            self.assertEqual(conf_data.django_version, 1.6)
-        else:
-            self.assertEqual(conf_data.cms_version, 3.2)
-            self.assertEqual(conf_data.django_version, 1.8)
+        self.assertEqual(conf_data.cms_version, 3.2)
+        self.assertEqual(conf_data.django_version, 1.8)
         self.assertEqual(conf_data.i18n, 'no')
         self.assertEqual(conf_data.reversion, 'no')
         self.assertEqual(conf_data.permissions, 'no')
@@ -81,12 +70,8 @@ class TestConfig(BaseTestClass):
         self.assertEqual(conf_data.db, 'postgres://user:pwd@host/dbname')
         self.assertEqual(conf_data.db_driver, 'psycopg2')
 
-        if sys.version_info < (3, 0):
-            dj_version = '1.4'
-            cms_version = '3.0'
-        else:
-            dj_version = '1.8'
-            cms_version = '3.1'
+        dj_version = '1.8'
+        cms_version = '3.2'
         conf_data = config.parse([
             '-q',
             '--db=postgres://user:pwd@host/dbname',
@@ -278,57 +263,32 @@ class TestConfig(BaseTestClass):
         self.assertEqual(less_than_version('3.0.1'), '3.1.1')
 
     def test_supported_versions(self):
-        if sys.version_info < (2, 7):
-            self.assertEqual(supported_versions('stable', 'stable'), (1.6, 3.2))
-            self.assertEqual(supported_versions('stable', '3.0'), (1.6, 3.0))
-            self.assertEqual(supported_versions('stable', '3.0.10'), (1.6, None))
-            self.assertEqual(supported_versions('stable', 'rc'), (1.6, 3.2))
-            self.assertEqual(supported_versions('stable', 'beta'), (1.6, 3.2))
-            self.assertEqual(supported_versions('stable', 'develop'), (1.6, 3.2))
-
-            with self.assertRaises(RuntimeError):
-                supported_versions('stable', '2.4'), (1.5, 2.4)
-            with self.assertRaises(RuntimeError):
-                supported_versions('1.5', 'stable'), (1.7, 3.1)
-
-            self.assertEqual(supported_versions('1.5', '2.4'), (1.5, 2.4))
-            self.assertEqual(supported_versions('1.6', 'stable'), (1.6, 3.2))
-            self.assertEqual(supported_versions('1.6.9', 'stable'), (None, 3.2))
-            self.assertEqual(supported_versions('1.7', 'stable'), (1.7, 3.2))
-            self.assertEqual(supported_versions('beta', 'stable'), (1.9, 3.2))
-            self.assertEqual(supported_versions('develop', 'stable'), (1.9, 3.2))
-        else:
-            self.assertEqual(supported_versions('stable', 'stable'), (1.8, 3.2))
-            self.assertEqual(supported_versions('stable', '3.1'), (1.8, 3.1))
-            self.assertEqual(supported_versions('stable', '3.0.10'), (1.8, None))
-            self.assertEqual(supported_versions('stable', 'rc'), (1.8, 3.2))
-            self.assertEqual(supported_versions('stable', 'beta'), (1.8, 3.2))
-            self.assertEqual(supported_versions('stable', 'develop'), (1.8, 3.2))
-
-            with self.assertRaises(RuntimeError):
-                supported_versions('stable', '2.4'), (1.5, 2.4)
-            with self.assertRaises(RuntimeError):
-                supported_versions('1.5', 'stable'), (1.8, 3.1)
-
-            self.assertEqual(supported_versions('1.5', '2.4'), (1.5, 2.4))
-            self.assertEqual(supported_versions('1.6', 'stable'), (1.6, 3.2))
-            self.assertEqual(supported_versions('1.6.9', 'stable'), (None, 3.2))
-            self.assertEqual(supported_versions('1.7', 'stable'), (1.7, 3.2))
-            self.assertEqual(supported_versions('beta', 'stable'), (1.9, 3.2))
-            self.assertEqual(supported_versions('develop', 'stable'), (1.9, 3.2))
+        self.assertEqual(supported_versions('stable', 'stable'), (1.8, 3.2))
+        self.assertEqual(supported_versions('stable', '3.1.10'), (1.8, None))
+        self.assertEqual(supported_versions('stable', 'rc'), (1.8, 3.2))
+        self.assertEqual(supported_versions('stable', 'beta'), (1.8, 3.2))
+        self.assertEqual(supported_versions('stable', 'develop'), (1.8, 3.2))
+
+        with self.assertRaises(RuntimeError):
+            supported_versions('stable', '2.4'), (1.5, 2.4)
+        with self.assertRaises(RuntimeError):
+            supported_versions('1.5', 'stable'), (1.8, 3.1)
+
+        self.assertEqual(supported_versions('1.9', 'stable'), (1.9, 3.2))
+        self.assertEqual(supported_versions('1.8', 'stable'), (1.8, 3.2))
+        self.assertEqual(supported_versions('1.8.3', 'stable'), (None, 3.2))
+        self.assertEqual(supported_versions('beta', 'stable'), (1.9, 3.2))
+        self.assertEqual(supported_versions('develop', 'stable'), (1.9, 3.2))
 
     def test_requirements(self):
         """
         Test for different configuration and package versions
         """
-        if sys.version_info < (2, 7):
-            dj_version = '1.6'
-        else:
-            dj_version = '1.8'
+        dj_version = '1.8'
         conf_data = config.parse([
             '-q',
             '--db=postgres://user:pwd@host/dbname',
-            '--cms-version=3.1',
+            '--cms-version=3.2',
             '--django-version={0}'.format(dj_version),
             '--i18n=no',
             '--apphooks-reload',
@@ -336,47 +296,15 @@ class TestConfig(BaseTestClass):
             '-p'+self.project_dir,
             'example_prj'])
 
-        self.assertTrue(conf_data.requirements.find('django-cms<3.2') > -1)
-        if sys.version_info < (2, 7):
-            self.assertTrue(conf_data.requirements.find('Django<1.7') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8,<1.9') > -1)
-        else:
-            self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8.7') > -1)
-        self.assertTrue(conf_data.requirements.find('djangocms-text-ckeditor<2.8') > -1)
-        self.assertTrue(conf_data.requirements.find('djangocms-admin-style<1.0') > -1)
+        self.assertTrue(conf_data.requirements.find('django-cms<3.3') > -1)
+        self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
+        self.assertTrue(conf_data.requirements.find('django-reversion>=1.10,<1.11') > -1)
+        self.assertTrue(conf_data.requirements.find('djangocms-text-ckeditor>=2.8.1') > -1)
+        self.assertTrue(conf_data.requirements.find('djangocms-admin-style>=1.0.6') > -1)
         self.assertTrue(conf_data.requirements.find('django-filer') > -1)
         self.assertTrue(conf_data.requirements.find('cmsplugin-filer') > -1)
         self.assertTrue(conf_data.requirements.find('djangocms-text-ckeditor') > -1)
-        self.assertTrue(conf_data.requirements.find('aldryn-apphook-reload') > -1)
-
-        if sys.version_info < (2, 7):
-            conf_data = config.parse([
-                '-q',
-                '--db=postgres://user:pwd@host/dbname',
-                '--i18n=no',
-                '--cms-version=2.4',
-                '--django-version=1.5',
-                '-f',
-                '-p'+self.project_dir,
-                'example_prj'])
-
-            self.assertTrue(conf_data.requirements.find('six') > -1)
-            self.assertTrue(conf_data.requirements.find('django-cms<2.5') > -1)
-            self.assertTrue(conf_data.requirements.find('Django<1.6') > -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-text-ckeditor') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-admin-style') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-column') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-file') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-flash') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-googlemap') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-inherit') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-link') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-picture') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-style') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-teaser') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-video') == -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.7') > -1)
+        self.assertTrue(conf_data.requirements.find('aldryn-apphook-reload') == -1)
 
         conf_data = config.parse([
             '-q',
@@ -389,12 +317,8 @@ class TestConfig(BaseTestClass):
             'example_prj'])
 
         self.assertTrue(conf_data.requirements.find('django-cms<3.3') > -1)
-        if sys.version_info < (2, 7):
-            self.assertTrue(conf_data.requirements.find('Django<1.7') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8,<1.9') > -1)
-        else:
-            self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8.7') > -1)
+        self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
+        self.assertTrue(conf_data.requirements.find('django-reversion>=1.10,<1.11') > -1)
         self.assertTrue(conf_data.requirements.find('djangocms-text-ckeditor>=2.8') > -1)
         self.assertTrue(conf_data.requirements.find('djangocms-admin-style>=1.0.6') > -1)
         self.assertTrue(conf_data.requirements.find('djangocms-column') > -1)
@@ -421,12 +345,8 @@ class TestConfig(BaseTestClass):
             'example_prj'])
 
         self.assertTrue(conf_data.requirements.find(config.data.DJANGOCMS_DEVELOP) > -1)
-        if sys.version_info < (2, 7):
-            self.assertTrue(conf_data.requirements.find('Django<1.7') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8,<1.9') > -1)
-        else:
-            self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8.7') > -1)
+        self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
+        self.assertTrue(conf_data.requirements.find('django-reversion>=1.10,<1.11') > -1)
         self.assertTrue(conf_data.requirements.find('djangocms-text-ckeditor') > -1)
         self.assertTrue(conf_data.requirements.find('djangocms-admin-style') > -1)
         self.assertTrue(conf_data.requirements.find('django-filer') > -1)
@@ -443,10 +363,7 @@ class TestConfig(BaseTestClass):
         self.assertTrue(conf_data.requirements.find('djangocms-video') == -1)
         self.assertTrue(conf_data.requirements.find('aldryn-apphook-reload') == -1)
 
-        if sys.version_info < (2, 7):
-            dj_version = '1.6'
-        else:
-            dj_version = '1.8'
+        dj_version = '1.8'
         conf_data = config.parse([
             '-q',
             '--db=postgres://user:pwd@host/dbname',
@@ -459,12 +376,8 @@ class TestConfig(BaseTestClass):
             'example_prj'])
 
         self.assertTrue(conf_data.requirements.find(config.data.DJANGOCMS_DEVELOP) > -1)
-        if sys.version_info < (2, 7):
-            self.assertTrue(conf_data.requirements.find('Django<1.7') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8,<1.9') > -1)
-        else:
-            self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8.7') > -1)
+        self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
+        self.assertTrue(conf_data.requirements.find('django-reversion>=1.10,<1.11') > -1)
         self.assertTrue(conf_data.requirements.find('django-mptt') == -1)
         self.assertTrue(conf_data.requirements.find('django-treebeard') > -1)
 
@@ -481,20 +394,13 @@ class TestConfig(BaseTestClass):
             'example_prj'])
 
         self.assertTrue(conf_data.requirements.find(config.data.DJANGOCMS_DEVELOP) > -1)
-        if sys.version_info < (2, 7):
-            self.assertTrue(conf_data.requirements.find('Django<1.7') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8,<1.9') > -1)
-        else:
-            self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8.7') > -1)
+        self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
+        self.assertTrue(conf_data.requirements.find('django-reversion>=1.10,<1.11') > -1)
         self.assertTrue(conf_data.requirements.find('djangocms-text-ckeditor') > -1)
         self.assertTrue(conf_data.requirements.find('djangocms-admin-style') > -1)
         self.assertTrue(conf_data.requirements.find('pytz') > -1)
 
-        if sys.version_info < (2, 7):
-            dj_version = '1.6'
-        else:
-            dj_version = '1.8'
+        dj_version = '1.8'
         conf_data = config.parse([
             '-q',
             '--db=postgres://user:pwd@host/dbname',
@@ -507,25 +413,14 @@ class TestConfig(BaseTestClass):
             'example_prj'])
 
         self.assertTrue(conf_data.requirements.find(config.data.DJANGOCMS_DEVELOP) > -1)
-        if sys.version_info < (2, 7):
-            self.assertTrue(conf_data.requirements.find('Django<1.7') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8,<1.9') > -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-text-ckeditor>=2.8') > -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-admin-style>=1.0.6') > -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-teaser') > -1)
-            self.assertTrue(conf_data.requirements.find('south') > -1)
-        else:
-            self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8.7') > -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-text-ckeditor>=2.8') > -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-admin-style>=1.0.6') > -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-teaser/archive/master.zip') > -1)
-            self.assertTrue(conf_data.requirements.find('south') == -1)
+        self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
+        self.assertTrue(conf_data.requirements.find('django-reversion>=1.10,<1.11') > -1)
+        self.assertTrue(conf_data.requirements.find('djangocms-text-ckeditor>=2.8') > -1)
+        self.assertTrue(conf_data.requirements.find('djangocms-admin-style>=1.0.6') > -1)
+        self.assertTrue(conf_data.requirements.find('djangocms-teaser/archive/master.zip') > -1)
+        self.assertTrue(conf_data.requirements.find('south') == -1)
 
-        if sys.version_info < (2, 7):
-            dj_version = '1.6'
-        else:
-            dj_version = '1.8'
+        dj_version = '1.8'
         conf_data = config.parse([
             '-q',
             '--db=postgres://user:pwd@host/dbname',
@@ -539,20 +434,12 @@ class TestConfig(BaseTestClass):
             'example_prj'])
 
         self.assertTrue(conf_data.requirements.find(config.data.DJANGOCMS_DEVELOP) > -1)
-        if sys.version_info < (2, 7):
-            self.assertTrue(conf_data.requirements.find('Django<1.7') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8,<1.9') > -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-text-ckeditor') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-admin-style') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-teaser') == -1)
-            self.assertTrue(conf_data.requirements.find('south') > -1)
-        else:
-            self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
-            self.assertTrue(conf_data.requirements.find('django-reversion>=1.8.7') > -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-text-ckeditor/archive/master.zip') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-admin-style/archive/master.zip') == -1)
-            self.assertTrue(conf_data.requirements.find('djangocms-teaser/archive/master.zip') == -1)
-            self.assertTrue(conf_data.requirements.find('south') == -1)
+        self.assertTrue(conf_data.requirements.find('Django<1.9') > -1)
+        self.assertTrue(conf_data.requirements.find('django-reversion>=1.10,<1.11') > -1)
+        self.assertTrue(conf_data.requirements.find('djangocms-text-ckeditor/archive/master.zip') == -1)
+        self.assertTrue(conf_data.requirements.find('djangocms-admin-style/archive/master.zip') == -1)
+        self.assertTrue(conf_data.requirements.find('djangocms-teaser/archive/master.zip') == -1)
+        self.assertTrue(conf_data.requirements.find('south') == -1)
 
     def disabled_test_aldryn_compatibility(self):
         with patch('sys.stdout', self.stdout):
@@ -665,7 +552,7 @@ class TestConfig(BaseTestClass):
                 conf_data = config.parse([
                     '-q',
                     '--db=postgres://user:pwd@host/dbname',
-                    '--django-version=1.4',
+                    '--django-version=1.8',
                     '--i18n=no',
                     '-f',
                     '-p'+self.project_dir,
@@ -679,7 +566,7 @@ class TestConfig(BaseTestClass):
                 conf_data = config.parse([
                     '-q',
                     '--db=mysql://user:pwd@host/dbname',
-                    '--django-version=1.4',
+                    '--django-version=1.8',
                     '--i18n=no',
                     '-f',
                     '-p'+self.project_dir,
@@ -816,8 +703,6 @@ class TestBaseConfig(unittest.TestCase):
             ('config-29.ini', 'apphooks_reload', True),
             ('config-30.ini', 'verbose', True),
         ]
-        if sys.version_info < (2, 7):
-            test_data[7] = ('config-09b.ini', 'django_version', 1.6)
         for filename, key, val in test_data:
             setattr(fixture, key, val)  # Change value.
             args = self.args[0:1] + [self.conf(filename)] + self.args[1:]  # Load new config.
diff --git a/tests/django.py b/tests/django.py
index 481187c..e0d6513 100644
--- a/tests/django.py
+++ b/tests/django.py
@@ -118,14 +118,14 @@ class TestDjango(IsolatedTestClass):
         # self.assertTrue(os.path.exists(static_js))
         # self.assertTrue(os.path.exists(aldryn_template))
 
-    @unittest.skipIf(sys.version_info[:2] not in ((2, 6), (2, 7), (3, 3), (3, 4)),
-                     reason="django 1.6 only supports python 2.6, 2.7, 3.3, 3.4")
-    def test_patch_16_settings(self):
+    @unittest.skipIf(sys.version_info[:2] not in ((2, 7), (3, 4), (3, 5),),
+                     reason='django 1.9 only supports python 2.7, 3.4 and 3.5')
+    def test_patch_19_settings(self):
         extra_path = os.path.join(os.path.dirname(__file__), 'data', 'extra_settings.py')
         config_data = config.parse(['--db=sqlite://localhost/test.db',
                                     '--lang=en', '--extra-settings=%s' % extra_path,
-                                    '--django-version=1.6',
-                                    '--cms-version=3.0', '--timezone=Europe/Moscow',
+                                    '--django-version=1.9',
+                                    '--cms-version=3.2', '--timezone=Europe/Moscow',
                                     '-q', '-u', '-zno', '--i18n=no',
                                     '-p' + self.project_dir, 'example_path_16_settigns'])
         install.requirements(config_data.requirements)
@@ -147,45 +147,13 @@ class TestDjango(IsolatedTestClass):
         self.assertEqual(project.settings.CMS_PERMISSION, False)
         self.assertEqual(set(project.settings.CMS_TEMPLATES), self.templates_basic)
 
-    @unittest.skipIf(sys.version_info[:2] not in ((2, 6), (2, 7), (3, 3), (3, 4)),
-                     reason="django 1.6 only supports python 2.6, 2.7, 3.3, 3.4")
-    def disable_test_patch_16_aldryn(self):
-        extra_path = os.path.join(os.path.dirname(__file__), 'data', 'extra_settings.py')
-        config_data = config.parse(['--db=sqlite://localhost/test.db',
-                                    '--lang=en', '--extra-settings=%s' % extra_path,
-                                    '--django-version=1.6',  # '-a',
-                                    '--cms-version=3.0', '--timezone=Europe/Moscow',
-                                    '-q', '-u', '-zno', '--i18n=no',
-                                    '-p' + self.project_dir, 'example_path_16_aldryn'])
-        install.requirements(config_data.requirements)
-        django.create_project(config_data)
-        django.patch_settings(config_data)
-        django.copy_files(config_data)
-        # settings is importable even in non django environment
-        sys.path.append(config_data.project_directory)
-
-        project = __import__(config_data.project_name, globals(), locals(), [str('settings')])
-
-        # checking for django options
-        self.assertEqual(project.settings.MEDIA_ROOT,
-                         os.path.join(config_data.project_directory, 'dist', 'media'))
-        self.assertEqual(project.settings.TEMPLATE_DIRS,
-                         (os.path.join(config_data.project_directory, 'templates'),))
-        self.assertEqual(project.settings.MEDIA_URL, '/media/')
-
-        # Data from external settings file
-        self.assertEqual(project.settings.CUSTOM_SETTINGS_VAR, True)
-        self.assertEqual(project.settings.CMS_PERMISSION, False)
-        self.assertEqual(set(project.settings.CMS_TEMPLATES), self.templates_basic)
-        self.assertTrue('compressor' in project.settings.INSTALLED_APPS)
-
-    @unittest.skipIf(sys.version_info[:2] not in ((2, 6), (2, 7), (3, 3), (3, 4)),
-                     reason="django 1.6 only supports python 2.6, 2.7, 3.3, 3.4")
-    def test_patch_django_16(self):
+    @unittest.skipIf(sys.version_info[:2] not in ((2, 7), (3, 4), (3, 5),),
+                     reason='django 1.9 only supports python 2.7, 3.4 and 3.5')
+    def test_patch_django_19(self):
         config_data = config.parse(['--db=sqlite://localhost/test.db',
                                     '--lang=en', '--bootstrap=yes',
-                                    '--django-version=1.6', '--apphooks-reload',
-                                    '--cms-version=3.0', '--timezone=Europe/Moscow',
+                                    '--django-version=1.9', '--apphooks-reload',
+                                    '--cms-version=3.2', '--timezone=Europe/Moscow',
                                     '-q', '-u', '-zno', '--i18n=no',
                                     '-p' + self.project_dir, 'example_path_16'])
 
@@ -227,30 +195,30 @@ class TestDjango(IsolatedTestClass):
         self.assertTrue('djangocms_style' in project.settings.INSTALLED_APPS)
         self.assertTrue('djangocms_teaser' in project.settings.INSTALLED_APPS)
         self.assertTrue('djangocms_video' in project.settings.INSTALLED_APPS)
-        self.assertTrue('aldryn_apphook_reload' in project.settings.INSTALLED_APPS)
-        self.assertTrue(
-            config.get_settings().APPHOOK_RELOAD_MIDDLEWARE_CLASS_OLD in project.settings.MIDDLEWARE_CLASSES)
-        self.assertTrue(
-            config.get_settings().APPHOOK_RELOAD_MIDDLEWARE_CLASS not in project.settings.MIDDLEWARE_CLASSES)
+        self.assertTrue('aldryn_apphook_reload' not in project.settings.INSTALLED_APPS)
         self.assertTrue(
-            'cms.context_processors.cms_settings' in project.settings.TEMPLATE_CONTEXT_PROCESSORS)
+            config.get_settings().APPHOOK_RELOAD_MIDDLEWARE_CLASS_OLD not in
+            project.settings.MIDDLEWARE_CLASSES
+        )
         self.assertTrue(
-            'cms.context_processors.media' not in project.settings.TEMPLATE_CONTEXT_PROCESSORS)
-
+            config.get_settings().APPHOOK_RELOAD_MIDDLEWARE_CLASS in
+            project.settings.MIDDLEWARE_CLASSES
+        )
         self.assertEqual(set(project.settings.CMS_TEMPLATES), self.templates_bootstrap)
 
+        self.assertTrue(project.settings.TEMPLATES)
         self.assertEqual(len(re.findall('BASE_DIR = ', settings)), 1)
         self.assertEqual(len(re.findall('STATIC_ROOT', settings)), 1)
         self.assertEqual(len(re.findall('MEDIA_ROOT =', settings)), 1)
         self.assertEqual(len(re.findall('STATICFILES_DIRS', settings)), 1)
 
-    @unittest.skipIf(sys.version_info[:2] not in ((2, 7), (3, 3), (3, 4)),
-                     reason="django 1.7 only supports python 2.7, 3.3, 3.4")
+    @unittest.skipIf(sys.version_info[:2] not in ((2, 7), (3, 3), (3, 4), (3, 5),),
+                     reason='django 1.8 only supports python 2.7, 3.3, 3.4 and 3.5')
     def test_patch_django_17_settings(self):
         extra_path = os.path.join(os.path.dirname(__file__), 'data', 'extra_settings.py')
         config_data = config.parse(['--db=sqlite://localhost/test.db',
                                     '--lang=en', '--extra-settings=%s' % extra_path,
-                                    '--django-version=1.7', '--cms-version=3.0',
+                                    '--django-version=1.8', '--cms-version=3.2',
                                     '--timezone=Europe/Moscow',
                                     '-q', '-u', '-zno', '--i18n=no',
                                     '-p' + self.project_dir, 'example_path_17_settings'])
@@ -268,80 +236,8 @@ class TestDjango(IsolatedTestClass):
         self.assertFalse('cms' in project.settings.MIGRATION_MODULES)
         self.assertFalse('djangocms_text_ckeditor' in project.settings.MIGRATION_MODULES)
 
-    @unittest.skipIf(sys.version_info[:2] not in ((2, 6), (2, 7), (3, 3), (3, 4)),
-                     reason="django 1.7 only supports python 2.6, 2.7, 3.3, 3.4")
-    def test_patch_31(self):
-        config_data = config.parse(['--db=sqlite://localhost/test.db',
-                                    '--lang=en', '--cms=develop',
-                                    '--django-version=1.6',
-                                    '--timezone=Europe/Moscow',
-                                    '-f', '-q', '-u', '-zno', '--i18n=no',
-                                    '-p' + self.project_dir, 'example_path_patch_31'])
-        install.requirements(config_data.requirements)
-        django.create_project(config_data)
-        django.patch_settings(config_data)
-        django.copy_files(config_data)
-        settings = open(config_data.settings_path).read()
-        urlconf = open(config_data.urlconf_path).read()
-
-        # settings is importable even in non django environment
-        sys.path.append(config_data.project_directory)
-
-        project = __import__(config_data.project_name, globals(), locals(), [str('settings')])
-
-        # checking mptt / treebeard
-        self.assertFalse('mptt' in project.settings.INSTALLED_APPS)
-        self.assertTrue('treebeard' in project.settings.INSTALLED_APPS)
-
-    @unittest.skipIf(sys.version_info[:2] not in ((2, 7), (3, 3), (3, 4),),
-                     reason="django 1.7 only supports python 2.7, 3.3, 3.4")
-    def test_patch_django_17_31(self):
-        extra_path = os.path.join(os.path.dirname(__file__), 'data', 'extra_settings.py')
-        config_data = config.parse(['--db=sqlite://localhost/test.db',
-                                    '--lang=en', '--extra-settings=%s' % extra_path,
-                                    '--django-version=1.7', '-f',
-                                    '--cms-version=develop', '--timezone=Europe/Moscow',
-                                    '-q', '-u', '-zno', '--i18n=no',
-                                    '-p' + self.project_dir, 'example_path_17_31_settings'])
-        install.requirements(config_data.requirements)
-        django.create_project(config_data)
-        django.patch_settings(config_data)
-        django.copy_files(config_data)
-        # settings is importable even in non django environment
-        sys.path.append(config_data.project_directory)
-
-        project = __import__(config_data.project_name, globals(), locals(), [str('settings')])
-
-        # checking for django options
-        self.assertFalse('south' in project.settings.INSTALLED_APPS)
-        self.assertFalse('filer' in project.settings.MIGRATION_MODULES)
-        self.assertFalse('djangocms_text_ckeditor' in project.settings.MIGRATION_MODULES)
-
-    @unittest.skipIf(sys.version_info[:2] not in ((2, 7), (3, 3), (3, 4), (3, 5),),
-                     reason="django 1.8 only supports python 2.7, 3.3, 3.4 and 3.5")
-    def test_patch_django_18_31(self):
-        extra_path = os.path.join(os.path.dirname(__file__), 'data', 'extra_settings.py')
-        config_data = config.parse(['--db=sqlite://localhost/test.db',
-                                    '--lang=en', '--extra-settings=%s' % extra_path,
-                                    '--django-version=1.8', '-f',
-                                    '--cms-version=stable', '--timezone=Europe/Moscow',
-                                    '-q', '-u', '-zno', '--i18n=no',
-                                    '-p' + self.project_dir, 'example_path_18_31_settings'])
-        install.requirements(config_data.requirements)
-        django.create_project(config_data)
-        django.patch_settings(config_data)
-        django.copy_files(config_data)
-        # settings is importable even in non django environment
-        sys.path.append(config_data.project_directory)
-
-        project = __import__(config_data.project_name, globals(), locals(), [str('settings')])
-
-        # checking for django options
-        self.assertTrue(project.settings.TEMPLATES)
-        self.assertFalse(getattr(project.settings, 'TEMPLATES_DIR', False))
-
     @unittest.skipIf(sys.version_info[:2] not in ((2, 7), (3, 3), (3, 4), (3, 5),),
-                     reason="django 1.8 only supports python 2.7, 3.3, 3.4 and 3.5")
+                     reason='django 1.8 only supports python 2.7, 3.3, 3.4 and 3.5')
     def test_patch_django_18_32(self):
         # On django CMS 3.2 the reload apphooks middleware is enabled by default
         extra_path = os.path.join(os.path.dirname(__file__), 'data', 'extra_settings.py')
@@ -365,12 +261,16 @@ class TestDjango(IsolatedTestClass):
         self.assertFalse(getattr(project.settings, 'TEMPLATES_DIR', False))
         self.assertTrue('aldryn_apphook_reload' not in project.settings.INSTALLED_APPS)
         self.assertTrue(
-            config.get_settings().APPHOOK_RELOAD_MIDDLEWARE_CLASS_OLD not in project.settings.MIDDLEWARE_CLASSES)
+            config.get_settings().APPHOOK_RELOAD_MIDDLEWARE_CLASS_OLD not in
+            project.settings.MIDDLEWARE_CLASSES
+        )
         self.assertTrue(
-            config.get_settings().APPHOOK_RELOAD_MIDDLEWARE_CLASS in project.settings.MIDDLEWARE_CLASSES)
+            config.get_settings().APPHOOK_RELOAD_MIDDLEWARE_CLASS in
+            project.settings.MIDDLEWARE_CLASSES
+        )
 
     @unittest.skipIf(sys.version_info[:2] not in ((2, 7), (3, 4), (3, 5),),
-                     reason="django 1.9 only supports python 2.7, 3.4 and 3.5")
+                     reason='django 1.9 only supports python 2.7, 3.4 and 3.5')
     def test_patch_django_19_32(self):
         # On django CMS 3.2 the reload apphooks middleware is enabled by default
         extra_path = os.path.join(os.path.dirname(__file__), 'data', 'extra_settings.py')
@@ -394,12 +294,16 @@ class TestDjango(IsolatedTestClass):
         self.assertFalse(getattr(project.settings, 'TEMPLATES_DIR', False))
         self.assertTrue('aldryn_apphook_reload' not in project.settings.INSTALLED_APPS)
         self.assertTrue(
-            config.get_settings().APPHOOK_RELOAD_MIDDLEWARE_CLASS_OLD not in project.settings.MIDDLEWARE_CLASSES)
+            config.get_settings().APPHOOK_RELOAD_MIDDLEWARE_CLASS_OLD not in
+            project.settings.MIDDLEWARE_CLASSES
+        )
         self.assertTrue(
-            config.get_settings().APPHOOK_RELOAD_MIDDLEWARE_CLASS in project.settings.MIDDLEWARE_CLASSES)
+            config.get_settings().APPHOOK_RELOAD_MIDDLEWARE_CLASS in
+            project.settings.MIDDLEWARE_CLASSES
+        )
 
     @unittest.skipIf(sys.version_info[:2] not in ((2, 7), (3, 3), (3, 4), (3, 5),),
-                     reason="django 1.8 only supports python 2.7, 3.3, 3.4 and 3.5,")
+                     reason='django 1.8 only supports python 2.7, 3.3, 3.4 and 3.5,')
     def test_patch_django_no_plugins(self):
         extra_path = os.path.join(os.path.dirname(__file__), 'data', 'extra_settings.py')
         config_data = config.parse(['--db=sqlite://localhost/test.db',
@@ -439,107 +343,13 @@ class TestDjango(IsolatedTestClass):
         self.assertFalse('cms.plugins.twitter' in project.settings.INSTALLED_APPS)
         self.assertFalse('cms.plugins.video' in project.settings.INSTALLED_APPS)
 
-    @unittest.skipIf(sys.version_info >= (3, 0),
-                     reason="django CMS 2.4 does not support python3")
-    def test_patch_cms_24_standard(self):
-        config_data = config.parse(['--db=sqlite://localhost/test.db',
-                                    '--lang=en',
-                                    '--django-version=1.5',
-                                    '--cms-version=2.4',
-                                    '-q', '-u', '-zno', '--i18n=no',
-                                    '-p' + self.project_dir, 'example_path_24_s'])
-
-        install.requirements(config_data.requirements)
-        django.create_project(config_data)
-        django.patch_settings(config_data)
-        django.copy_files(config_data)
-        settings = open(config_data.settings_path).read()
-        urlconf = open(config_data.urlconf_path).read()
-
-        # settings is importable even in non django environment
-        sys.path.append(config_data.project_directory)
-
-        project = __import__(config_data.project_name, globals(), locals(), [str('settings')])
-
-        # checking for django options
-        self.assertTrue(project.settings.MEDIA_ROOT,
-                        os.path.join(config_data.project_directory, 'media'))
-        self.assertEqual(project.settings.MEDIA_URL, '/media/')
-        self.assertTrue(
-            'cms.context_processors.cms_settings' not in project.settings.TEMPLATE_CONTEXT_PROCESSORS)
-        self.assertTrue(
-            'cms.context_processors.media' in project.settings.TEMPLATE_CONTEXT_PROCESSORS)
-        self.assertTrue('djangocms_file' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_flash' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_googlemap' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_inherit' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_link' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_picture' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_teaser' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_video' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('cms.plugins.file' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cms.plugins.flash' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cms.plugins.googlemap' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cms.plugins.inherit' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cms.plugins.link' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cms.plugins.picture' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cms.plugins.teaser' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cms.plugins.text' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cms.plugins.twitter' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cms.plugins.video' in project.settings.INSTALLED_APPS)
-
-    @unittest.skipIf(sys.version_info >= (3, 0),
-                     reason="django CMS 2.4 does not support python3")
-    def test_patch_cms_24_filer(self):
-        config_data = config.parse(['--db=sqlite://localhost/test.db',
-                                    '--lang=en',
-                                    '--django-version=1.5',
-                                    '--cms-version=2.4',
-                                    '-f', '-q', '-u', '-zno', '--i18n=no',
-                                    '-p' + self.project_dir, 'example_path_24_f'])
-        reqs = config_data.requirements.replace('django-mptt>=0.5.1,<0.5.3', '')
-        install.requirements(config_data.requirements)
-        django.create_project(config_data)
-        django.patch_settings(config_data)
-        django.copy_files(config_data)
-        settings = open(config_data.settings_path).read()
-        urlconf = open(config_data.urlconf_path).read()
-
-        # settings is importable even in non django environment
-        sys.path.append(config_data.project_directory)
-
-        project = __import__(config_data.project_name, globals(), locals(), [str('settings')])
-
-        # checking for django options
-        self.assertTrue(project.settings.MEDIA_ROOT,
-                        os.path.join(config_data.project_directory, 'media'))
-        self.assertEqual(project.settings.MEDIA_URL, '/media/')
-        self.assertTrue('djangocms_file' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_flash' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_googlemap' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_inherit' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_link' in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_picture' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_teaser' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('djangocms_video' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('cmsplugin_filer_image' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cms.plugins.flash' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cms.plugins.googlemap' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cms.plugins.inherit' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cmsplugin_filer_file' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cmsplugin_filer_folder' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cmsplugin_filer_link' not in project.settings.INSTALLED_APPS)
-        self.assertTrue('cmsplugin_filer_teaser' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cmsplugin_filer_utils' in project.settings.INSTALLED_APPS)
-        self.assertTrue('cmsplugin_filer_video' in project.settings.INSTALLED_APPS)
-
-    @unittest.skipIf(sys.version_info[:2] not in ((2, 6), (2, 7), (3, 3)),
-                     reason="django 1.6 only supports python 2.6, 2.7, 3.3")
+    @unittest.skipIf(sys.version_info[:2] not in ((2, 7), (3, 3), (3, 4), (3, 5),),
+                     reason='django 1.8 only supports python 2.7, 3.3, 3.4 and 3.5,')
     def test_patch(self):
         config_data = config.parse(['--db=sqlite://localhost/test.db',
                                     '--lang=en',
-                                    '--django-version=1.5',
-                                    '--cms-version=3.0', '--timezone=Europe/Moscow',
+                                    '--django-version=1.8',
+                                    '--cms-version=3.2', '--timezone=Europe/Moscow',
                                     '-f', '-q', '-u', '-zno', '--i18n=no',
                                     '-p' + self.project_dir, 'example_path_patch'])
         install.requirements(config_data.requirements)
@@ -565,15 +375,18 @@ class TestDjango(IsolatedTestClass):
         #
         # checking for standard CMS settings
         self.assertTrue(
-            'sekizai.context_processors.sekizai' in project.settings.TEMPLATE_CONTEXT_PROCESSORS)
+            'sekizai.context_processors.sekizai' in
+            project.settings.TEMPLATES[0]['OPTIONS']['context_processors']
+        )
         self.assertTrue(
-            'cms.middleware.toolbar.ToolbarMiddleware' in project.settings.MIDDLEWARE_CLASSES)
+            'cms.middleware.toolbar.ToolbarMiddleware' in project.settings.MIDDLEWARE_CLASSES
+        )
         self.assertTrue(project.settings.CMS_LANGUAGES['default']['redirect_on_fallback'])
         self.assertEqual(project.settings.CMS_LANGUAGES[1][0]['code'], 'en')
 
         # checking mptt / treebeard
-        self.assertTrue('mptt' in project.settings.INSTALLED_APPS)
-        self.assertFalse('treebeard' in project.settings.INSTALLED_APPS)
+        self.assertFalse('mptt' in project.settings.INSTALLED_APPS)
+        self.assertTrue('treebeard' in project.settings.INSTALLED_APPS)
 
         # checking for filer (optional) settings
         self.assertTrue('filer' in project.settings.INSTALLED_APPS)
@@ -600,9 +413,13 @@ class TestDjango(IsolatedTestClass):
         self.assertTrue('djangocms_video' not in project.settings.INSTALLED_APPS)
         self.assertTrue(hasattr(project.settings, 'THUMBNAIL_PROCESSORS'))
         self.assertTrue(
-            'cms.context_processors.cms_settings' in project.settings.TEMPLATE_CONTEXT_PROCESSORS)
+            'cms.context_processors.cms_settings' in
+            project.settings.TEMPLATES[0]['OPTIONS']['context_processors']
+        )
         self.assertTrue(
-            'cms.context_processors.media' not in project.settings.TEMPLATE_CONTEXT_PROCESSORS)
+            'cms.context_processors.media' not in
+            project.settings.TEMPLATES[0]['OPTIONS']['context_processors']
+        )
 
         # basic urlconf check
         self.assertTrue('cms.urls' in urlconf)
@@ -613,11 +430,11 @@ class TestDjango(IsolatedTestClass):
         del (sys.modules["%s.settings" % config_data.project_name])
 
     @unittest.skipIf(sys.version_info[:2] not in ((2, 7), (3, 3), (3, 4), (3, 5),),
-                     reason="django 1.8 only supports python 2.7, 3.3, 3.4 and 3.5,")
+                     reason='django 1.8 only supports python 2.7, 3.3, 3.4 and 3.5,')
     def test_database_setup_filer(self):
         config_data = config.parse(['--db=sqlite://localhost/test.db',
                                     '-f', '-q', '-u', '--django-version=1.8',
-                                    '--cms-version=3.1',
+                                    '--cms-version=3.2',
                                     '-p' + self.project_dir, 'cms_project'])
         install.requirements(config_data.requirements)
         django.create_project(config_data)
@@ -656,6 +473,34 @@ class TestDjango(IsolatedTestClass):
         self.assertTrue('filer' in row)
         self.assertTrue('image' in row)
 
+    @unittest.skipIf(sys.version_info[:2] not in ((2, 7), (3, 3), (3, 4), (3, 5),),
+                     reason='django 1.8 only supports python 2.7, 3.3, 3.4 and 3.5,')
+    def test_starting_page(self):
+        config_data = config.parse(['--db=sqlite://localhost/test.db',
+                                    '-q', '-u', '--django-version=1.8',
+                                    '--cms-version=3.2', '--starting-page=yes',
+                                    '-p' + self.project_dir, 'cms_project'])
+        install.requirements(config_data.requirements)
+        django.create_project(config_data)
+        django.patch_settings(config_data)
+        django.copy_files(config_data)
+        django.setup_database(config_data)
+        django.load_starting_page(config_data)
+        project_db = sqlite3.connect(os.path.join(config_data.project_directory, 'test.db'))
+
+        # Check loaded data
+        query = project_db.execute('SELECT * FROM cms_page')
+        row = query.fetchone()
+        self.assertTrue('fullwidth.html' in row)
+
+        query = project_db.execute('SELECT * FROM cms_title')
+        row = query.fetchone()
+        self.assertTrue('Home' in row)
+
+        query = project_db.execute('SELECT * FROM cms_cmsplugin')
+        row = query.fetchone()
+        self.assertTrue('TextPlugin' in row)
+
 
 class TestBaseDjango(unittest.TestCase):
     def test_build_settings(self):
diff --git a/tests/fixtures/configs/config-09b.ini b/tests/fixtures/configs/config-09b.ini
deleted file mode 100644
index e7d552b..0000000
--- a/tests/fixtures/configs/config-09b.ini
+++ /dev/null
@@ -1,30 +0,0 @@
-[djangocms_installer]
-db = postgres://user:pwd@host:54321/dbname
-i18n = no
-use-tz = no
-timezone = Europe/London
-reversion = no
-permissions = no
-languages = en,ru
-django-version = 1.6
-cms-version = stable
-parent-dir = .
-bootstrap = no
-templates = no
-starting-page = no
-list-plugins = false
-dump-requirements = false
-no-input = false
-filer = false
-requirements =
-no-deps = false
-no-db-driver = false
-no-sync = false
-no-user = false
-template =
-extra-settings =
-skip-empty-check = false
-utc = false
-no-plugins = false
-apphooks-reload = false
-verbose = false
diff --git a/tests/main.py b/tests/main.py
index b7d15c6..7881559 100644
--- a/tests/main.py
+++ b/tests/main.py
@@ -23,12 +23,8 @@ class TestMain(IsolatedTestClass):
                                        'example_prj']
                 main.execute()
         stdout = self.stdout.getvalue()
-        if sys.version_info < (2, 7):
-            self.assertTrue(stdout.find('Django<1.7') > -1)
-            self.assertTrue(stdout.find('django-reversion>=1.8,<1.9') > -1)
-        else:
-            self.assertTrue(stdout.find('Django<1.9') > -1)
-            self.assertTrue(stdout.find('django-reversion>=1.8.7,<1.9') > -1)
+        self.assertTrue(stdout.find('Django<1.9') > -1)
+        self.assertTrue(stdout.find('django-reversion>=1.10,<1.11') > -1)
         self.assertTrue(stdout.find('djangocms-text-ckeditor') > -1)
         self.assertTrue(stdout.find('djangocms-admin-style') > -1)
         self.assertTrue(stdout.find('djangocms-column') > -1)
@@ -110,31 +106,3 @@ class TestMain(IsolatedTestClass):
                                            'example_prj']
                     main.execute()
         self.assertFalse(os.path.exists(self.project_dir))
-
-    @unittest.skipIf(sys.version_info >= (3, 0),
-                     reason='django 1.4 does not support python3')
-    def test_django_1_4(self):
-        with patch('sys.stdout', self.stdout):
-            with patch('sys.stderr', self.stderr):
-                sys.argv = ['main'] + ['--db=sqlite://localhost/test.db',
-                                       '-len', '--django-version=1.4',
-                                       '--cms-version=3.0',
-                                       '-q', '-u', '-p'+self.project_dir,
-                                       'example_prj']
-                main.execute()
-                # Checking we successfully completed the whole process
-                self.assertTrue(('Get into "%s" directory and type "python manage.py runserver" to start your project' % self.project_dir) in self.stdout.getvalue())
-
-    @unittest.skipIf(sys.version_info >= (3, 0),
-                     reason='django 1.5 does not support python3')
-    def test_django_1_5(self):
-        with patch('sys.stdout', self.stdout):
-            with patch('sys.stderr', self.stderr):
-                sys.argv = ['main'] + ['--db=sqlite://localhost/test.db',
-                                       '-len', '--django-version=1.5',
-                                       '--cms-version=3.0',
-                                       '-q', '-u', '-p'+self.project_dir,
-                                       'example_prj']
-                main.execute()
-                # Checking we successfully completed the whole process
-                self.assertTrue(('Get into "%s" directory and type "python manage.py runserver" to start your project' % self.project_dir) in self.stdout.getvalue())