premier commit
authormarc.nachin <you@example.commarc.nachin@auf.org>
Wed, 29 Jan 2014 17:06:49 +0000 (18:06 +0100)
committermarc.nachin <you@example.commarc.nachin@auf.org>
Wed, 29 Jan 2014 17:06:49 +0000 (18:06 +0100)
13 files changed:
.gitignore [new file with mode: 0644]
bootstrap.py [new file with mode: 0644]
buildout.cfg [new file with mode: 0644]
db.sqlite [new file with mode: 0644]
devel.cfg [new file with mode: 0644]
project/__init__.py [new file with mode: 0644]
project/dashboard.py [new file with mode: 0644]
project/development.py [new file with mode: 0644]
project/mysql_ram.py [new file with mode: 0644]
project/production.py [new file with mode: 0644]
project/settings.py [new file with mode: 0644]
project/urls.py [new file with mode: 0644]
versions.cfg [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..c8c4403
--- /dev/null
@@ -0,0 +1,31 @@
+# binaires
+*.pyc
+*.pyo
+
+# Fichier temporaires:
+.*.swp
+*~
+\#*#
+src/*
+
+# DB de dev
+*.db
+
+# restants de merge
+*.orig
+*.rej
+
+# Configuration du projet - par environnement
+conf.py
+django.wsgi
+
+# buildout
+.installed.cfg
+bin
+develop-eggs
+downloads
+eggs
+log
+parts
+tmp
+sitestatic
diff --git a/bootstrap.py b/bootstrap.py
new file mode 100644 (file)
index 0000000..d5e8be1
--- /dev/null
@@ -0,0 +1,277 @@
+##############################################################################
+#
+# Copyright (c) 2006 Zope Foundation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Bootstrap a buildout-based project
+
+Simply run this script in a directory containing a buildout.cfg.
+The script accepts buildout command-line options, so you can
+use the -c option to specify an alternate configuration file.
+"""
+
+import os, shutil, sys, tempfile, urllib, urllib2, subprocess
+from optparse import OptionParser
+
+if sys.platform == 'win32':
+    def quote(c):
+        if ' ' in c:
+            return '"%s"' % c  # work around spawn lamosity on windows
+        else:
+            return c
+else:
+    quote = str
+
+# See zc.buildout.easy_install._has_broken_dash_S for motivation and comments.
+stdout, stderr = subprocess.Popen(
+    [sys.executable, '-Sc',
+     'try:\n'
+     '    import ConfigParser\n'
+     'except ImportError:\n'
+     '    print 1\n'
+     'else:\n'
+     '    print 0\n'],
+    stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate()
+has_broken_dash_S = bool(int(stdout.strip()))
+
+# In order to be more robust in the face of system Pythons, we want to
+# run without site-packages loaded.  This is somewhat tricky, in
+# particular because Python 2.6's distutils imports site, so starting
+# with the -S flag is not sufficient.  However, we'll start with that:
+if not has_broken_dash_S and 'site' in sys.modules:
+    # We will restart with python -S.
+    args = sys.argv[:]
+    args[0:0] = [sys.executable, '-S']
+    args = map(quote, args)
+    os.execv(sys.executable, args)
+# Now we are running with -S.  We'll get the clean sys.path, import site
+# because distutils will do it later, and then reset the path and clean
+# out any namespace packages from site-packages that might have been
+# loaded by .pth files.
+clean_path = sys.path[:]
+import site  # imported because of its side effects
+sys.path[:] = clean_path
+for k, v in sys.modules.items():
+    if k in ('setuptools', 'pkg_resources') or (
+        hasattr(v, '__path__') and
+        len(v.__path__) == 1 and
+        not os.path.exists(os.path.join(v.__path__[0], '__init__.py'))):
+        # This is a namespace package.  Remove it.
+        sys.modules.pop(k)
+
+is_jython = sys.platform.startswith('java')
+
+setuptools_source = 'http://peak.telecommunity.com/dist/ez_setup.py'
+distribute_source = 'http://python-distribute.org/distribute_setup.py'
+distribute_source = 'https://bitbucket.org/pypa/setuptools/raw/f657df1f1ed46596d236376649c99a470662b4ba/distribute_setup.py'
+
+# parsing arguments
+def normalize_to_url(option, opt_str, value, parser):
+    if value:
+        if '://' not in value:  # It doesn't smell like a URL.
+            value = 'file://%s' % (
+                urllib.pathname2url(
+                    os.path.abspath(os.path.expanduser(value))),)
+        if opt_str == '--download-base' and not value.endswith('/'):
+            # Download base needs a trailing slash to make the world happy.
+            value += '/'
+    else:
+        value = None
+    name = opt_str[2:].replace('-', '_')
+    setattr(parser.values, name, value)
+
+usage = '''\
+[DESIRED PYTHON FOR BUILDOUT] bootstrap.py [options]
+
+Bootstraps a buildout-based project.
+
+Simply run this script in a directory containing a buildout.cfg, using the
+Python that you want bin/buildout to use.
+
+Note that by using --setup-source and --download-base to point to
+local resources, you can keep this script from going over the network.
+'''
+
+parser = OptionParser(usage=usage)
+parser.add_option("-v", "--version", dest="version",
+                          help="use a specific zc.buildout version")
+parser.add_option("-d", "--distribute",
+                   action="store_true", dest="use_distribute", default=False,
+                   help="Use Distribute rather than Setuptools.")
+parser.add_option("--setup-source", action="callback", dest="setup_source",
+                  callback=normalize_to_url, nargs=1, type="string",
+                  help=("Specify a URL or file location for the setup file. "
+                        "If you use Setuptools, this will default to " +
+                        setuptools_source + "; if you use Distribute, this "
+                        "will default to " + distribute_source + "."))
+parser.add_option("--download-base", action="callback", dest="download_base",
+                  callback=normalize_to_url, nargs=1, type="string",
+                  help=("Specify a URL or directory for downloading "
+                        "zc.buildout and either Setuptools or Distribute. "
+                        "Defaults to PyPI."))
+parser.add_option("--eggs",
+                  help=("Specify a directory for storing eggs.  Defaults to "
+                        "a temporary directory that is deleted when the "
+                        "bootstrap script completes."))
+parser.add_option("-t", "--accept-buildout-test-releases",
+                  dest='accept_buildout_test_releases',
+                  action="store_true", default=False,
+                  help=("Normally, if you do not specify a --version, the "
+                        "bootstrap script and buildout gets the newest "
+                        "*final* versions of zc.buildout and its recipes and "
+                        "extensions for you.  If you use this flag, "
+                        "bootstrap and buildout will get the newest releases "
+                        "even if they are alphas or betas."))
+parser.add_option("-c", None, action="store", dest="config_file",
+                   help=("Specify the path to the buildout configuration "
+                         "file to be used."))
+
+options, args = parser.parse_args()
+
+if options.eggs:
+    eggs_dir = os.path.abspath(os.path.expanduser(options.eggs))
+else:
+    eggs_dir = tempfile.mkdtemp()
+
+if options.setup_source is None:
+    if options.use_distribute:
+        options.setup_source = distribute_source
+    else:
+        options.setup_source = setuptools_source
+
+if options.accept_buildout_test_releases:
+    args.insert(0, 'buildout:accept-buildout-test-releases=true')
+
+try:
+    import pkg_resources
+    import setuptools  # A flag.  Sometimes pkg_resources is installed alone.
+    if not hasattr(pkg_resources, '_distribute'):
+        raise ImportError
+except ImportError:
+    ez_code = urllib2.urlopen(
+        options.setup_source).read().replace('\r\n', '\n')
+    ez = {}
+    exec ez_code in ez
+    setup_args = dict(to_dir=eggs_dir, download_delay=0)
+    if options.download_base:
+        setup_args['download_base'] = options.download_base
+    if options.use_distribute:
+        setup_args['no_fake'] = True
+        if sys.version_info[:2] == (2, 4):
+            setup_args['version'] = '0.6.32'
+    ez['use_setuptools'](**setup_args)
+    if 'pkg_resources' in sys.modules:
+        reload(sys.modules['pkg_resources'])
+    import pkg_resources
+    # This does not (always?) update the default working set.  We will
+    # do it.
+    for path in sys.path:
+        if path not in pkg_resources.working_set.entries:
+            pkg_resources.working_set.add_entry(path)
+
+cmd = [quote(sys.executable),
+       '-c',
+       quote('from setuptools.command.easy_install import main; main()'),
+       '-mqNxd',
+       quote(eggs_dir)]
+
+if not has_broken_dash_S:
+    cmd.insert(1, '-S')
+
+find_links = options.download_base
+if not find_links:
+    find_links = os.environ.get('bootstrap-testing-find-links')
+if not find_links and options.accept_buildout_test_releases:
+    find_links = 'http://downloads.buildout.org/'
+if find_links:
+    cmd.extend(['-f', quote(find_links)])
+
+if options.use_distribute:
+    setup_requirement = 'distribute'
+else:
+    setup_requirement = 'setuptools'
+ws = pkg_resources.working_set
+setup_requirement_path = ws.find(
+    pkg_resources.Requirement.parse(setup_requirement)).location
+env = dict(
+    os.environ,
+    PYTHONPATH=setup_requirement_path)
+
+requirement = 'zc.buildout'
+version = options.version
+if version is None and not options.accept_buildout_test_releases:
+    # Figure out the most recent final version of zc.buildout.
+    import setuptools.package_index
+    _final_parts = '*final-', '*final'
+
+    def _final_version(parsed_version):
+        for part in parsed_version:
+            if (part[:1] == '*') and (part not in _final_parts):
+                return False
+        return True
+    index = setuptools.package_index.PackageIndex(
+        search_path=[setup_requirement_path])
+    if find_links:
+        index.add_find_links((find_links,))
+    req = pkg_resources.Requirement.parse(requirement)
+    if index.obtain(req) is not None:
+        best = []
+        bestv = None
+        for dist in index[req.project_name]:
+            distv = dist.parsed_version
+            if distv >= pkg_resources.parse_version('2dev'):
+                continue
+            if _final_version(distv):
+                if bestv is None or distv > bestv:
+                    best = [dist]
+                    bestv = distv
+                elif distv == bestv:
+                    best.append(dist)
+        if best:
+            best.sort()
+            version = best[-1].version
+
+if version:
+    requirement += '=='+version
+else:
+    requirement += '<2dev'
+
+cmd.append(requirement)
+
+if is_jython:
+    import subprocess
+    exitcode = subprocess.Popen(cmd, env=env).wait()
+else:  # Windows prefers this, apparently; otherwise we would prefer subprocess
+    exitcode = os.spawnle(*([os.P_WAIT, sys.executable] + cmd + [env]))
+if exitcode != 0:
+    sys.stdout.flush()
+    sys.stderr.flush()
+    print ("An error occurred when trying to install zc.buildout. "
+           "Look above this message for any errors that "
+           "were output by easy_install.")
+    sys.exit(exitcode)
+
+ws.add_entry(eggs_dir)
+ws.require(requirement)
+import zc.buildout.buildout
+
+# If there isn't already a command in the args, add bootstrap
+if not [a for a in args if '=' not in a]:
+    args.append('bootstrap')
+
+
+# if -c was provided, we push it back into args for buildout's main function
+if options.config_file is not None:
+    args[0:0] = ['-c', options.config_file]
+
+zc.buildout.buildout.main(args)
+if not options.eggs:  # clean up temporary egg directory
+    shutil.rmtree(eggs_dir)
diff --git a/buildout.cfg b/buildout.cfg
new file mode 100644 (file)
index 0000000..1e9a230
--- /dev/null
@@ -0,0 +1,37 @@
+[buildout]
+extends = versions.cfg
+versions = versions
+unzip = true
+parts = filebrowser django
+versions = versions
+
+find-links = http://pypi.auf.org/simple/auf.recipe.django
+    http://pypi.auf.org/simple/auf.django.piwik
+
+eggs =
+    auf.recipe.django
+    auf.django.piwik
+    django
+    south
+    django-admin-tools
+    django-cms
+    django-pagination
+    django-tinymce
+    raven
+
+[filebrowser]
+recipe = hexagonit.recipe.download
+url=https://github.com/smacker/django-filebrowser-no-grappelli/archive/master.zip
+strip-top-level-dir = true
+
+[django]  
+recipe = auf.recipe.django 
+wsgi=true  
+settings=production 
+project = project
+initialization =
+    import os
+    os.environ['DJANGO_SETTINGS_MODULE'] = '${django:project}.${django:settings}'
+extra-paths = project
+    parts/filebrowser
+eggs = ${buildout:eggs}
diff --git a/db.sqlite b/db.sqlite
new file mode 100644 (file)
index 0000000..029f080
Binary files /dev/null and b/db.sqlite differ
diff --git a/devel.cfg b/devel.cfg
new file mode 100644 (file)
index 0000000..4a47508
--- /dev/null
+++ b/devel.cfg
@@ -0,0 +1,11 @@
+[buildout]
+extends=buildout.cfg
+extensions = buildout-versions
+buildout_versions_file = versions.cfg
+
+[django]
+wsgi=false
+settings=development
+eggs = ${buildout:eggs}
+    django-debug-toolbar
+
diff --git a/project/__init__.py b/project/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/project/dashboard.py b/project/dashboard.py
new file mode 100644 (file)
index 0000000..649674a
--- /dev/null
@@ -0,0 +1,27 @@
+# -*- encoding: utf-8 -*
+
+from django.utils.translation import ugettext_lazy as _
+from admin_tools.dashboard import modules, Dashboard
+
+
+class CustomIndexDashboard(Dashboard):
+    """
+    Custom index dashboard
+    """
+
+    def init_with_context(self, context):
+
+        # append an app list module for "Applications"
+        self.children.append(modules.AppList(
+            _('Applications'),
+            exclude=('django.contrib.*',),
+        ))
+
+        # append an app list module for "Administration"
+        self.children.append(modules.AppList(
+            _('Administration'),
+            models=('django.contrib.*',),
+        ))
+
+        # append a recent actions module
+        self.children.append(modules.RecentActions(_('Recent Actions'), 5))
diff --git a/project/development.py b/project/development.py
new file mode 100644 (file)
index 0000000..ce0c0f8
--- /dev/null
@@ -0,0 +1,13 @@
+# -*- encoding: utf-8 -*-
+
+from project.settings import *
+DEBUG=True
+TEMPLATE_DEBUG=DEBUG
+
+# Décommentez ces lignes pour activer la debugtoolbar
+#INTERNAL_IPS = ('127.0.0.1',)
+#INSTALLED_APPS += ('debug_toolbar',)
+#MIDDLEWARE_CLASSES += ('debug_toolbar.middleware.DebugToolbarMiddleware',)
+
+AUTH_PASSWORD_REQUIRED = False
+
diff --git a/project/mysql_ram.py b/project/mysql_ram.py
new file mode 100644 (file)
index 0000000..71e73e4
--- /dev/null
@@ -0,0 +1,47 @@
+#encoding UTF-8
+# -*- encoding: utf-8 -*-
+
+"""
+Configuration du site pour faire fonctionner les tests unitaires avec
+MySQL en RAM.
+"""
+
+from production import *
+
+DATABASES['default']['HOST'] = '/var/run/mysqld/mysqld-ram.sock'
+
+host = "mysql --socket=%s -uroot -e" % DATABASES['default']['HOST']
+db = "unittests_%s" % DATABASES['default']['NAME']
+DATABASES['default']['NAME'] = db
+DATABASES['default']['TEST_NAME'] = db
+user = DATABASES['default']['USER']
+pwd = DATABASES['default']['PASSWORD']
+
+cmd_creer_bd = "%(host)s \
+        'CREATE DATABASE %(db)s;'" % {
+                'host': host,
+                'db': db,
+                }
+
+cmd_creer_user = """%(host)s \
+        "GRANT USAGE ON *.* TO %(user)s@localhost \
+        IDENTIFIED BY '%(pwd)s';" """ % {
+                'host': host,
+                'user': user,
+                'pwd': pwd,
+                }
+
+cmd_creer_privileges = "%(host)s \
+        'GRANT ALL PRIVILEGES ON *.* TO %(user)s@localhost ;'" % {
+                'host': host,
+                'user': user,
+                }
+
+
+# La bd non préfixée par "test_" a besoin d'exister pour lancer les tests.
+# Cette commande ne modifie rien, si la table existe déjà.
+os.system(cmd_creer_bd)
+
+# Création de l'accès à la base "test_xxx" en fonction de conf.py
+os.system(cmd_creer_user)
+os.system(cmd_creer_privileges)
diff --git a/project/production.py b/project/production.py
new file mode 100644 (file)
index 0000000..ee6bb2e
--- /dev/null
@@ -0,0 +1,9 @@
+# -*- encoding: utf-8 -*-
+
+# En production, rediriger la sortie terminal on disponible en WSGI
+# vers la sortie fichier errorlog.
+import sys
+sys.stdout = sys.stderr
+
+from project.settings import *
+
diff --git a/project/settings.py b/project/settings.py
new file mode 100644 (file)
index 0000000..3124c91
--- /dev/null
@@ -0,0 +1,148 @@
+# -*- encoding: utf-8 -*-
+
+import os
+import socket
+from django.conf.global_settings import TEMPLATE_CONTEXT_PROCESSORS as \
+        DEFAULT_TEMPLATE_CONTEXT_PROCESSORS
+from django.conf.global_settings import MIDDLEWARE_CLASSES as \
+        DEFAULT_MIDDLEWARE_CLASSES
+from django.conf.global_settings import AUTHENTICATION_BACKENDS as \
+        DEFAULT_AUTHENTICATION_BACKENDS
+
+# Rapports d'erreurs
+SERVER_EMAIL = 'ne-pas-repondre@auf.org'
+EMAIL_SUBJECT_PREFIX = '[ific - %s] ' % socket.gethostname()
+ADMINS = ()
+
+MANAGERS = ADMINS
+
+TIME_ZONE = 'America/Montreal'
+
+LANGUAGE_CODE = 'fr-ca'
+
+PROJECT_ROOT = os.path.dirname(__file__)
+SITE_ROOT = os.path.dirname(PROJECT_ROOT)
+
+MEDIA_ROOT = os.path.join(PROJECT_ROOT, 'media')
+MEDIA_URL = '/media/'
+
+STATIC_ROOT = os.path.join(SITE_ROOT, 'sitestatic')
+STATIC_URL = '/static/'
+STATICFILES_DIRS = (
+    os.path.join(PROJECT_ROOT, 'static'),
+)
+
+ROOT_URLCONF = 'project.urls'
+
+INSTALLED_APPS = (
+    'filebrowser',
+    'admin_tools',
+    'admin_tools.theming',
+    'admin_tools.menu',
+    'admin_tools.dashboard',
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.sites',
+    'django.contrib.messages',
+    'django.contrib.staticfiles',
+    'django.contrib.admin',
+    'south',
+    'raven.contrib.django',
+    
+    # django-cms
+    'cms',
+    'mptt',
+    'menus',
+    'south',
+    'sekizai',
+    'pagination',
+    'tinymce',
+
+    # django-cms plugins
+    'cms.plugins.text',
+)
+
+TEMPLATE_CONTEXT_PROCESSORS = DEFAULT_TEMPLATE_CONTEXT_PROCESSORS + (
+    'django.core.context_processors.static',
+    'django.core.context_processors.request',
+    'cms.context_processors.media',
+    'sekizai.context_processors.sekizai',
+)
+
+MIDDLEWARE_CLASSES = DEFAULT_MIDDLEWARE_CLASSES + (
+    'auf.django.piwik.middleware.TrackMiddleware',
+    'cms.middleware.page.CurrentPageMiddleware',
+    'cms.middleware.user.CurrentUserMiddleware',
+    'cms.middleware.toolbar.ToolbarMiddleware',
+    'pagination.middleware.PaginationMiddleware',
+    'auf.django.piwik.middleware.TrackMiddleware'
+)
+
+AUTHENTICATION_BACKENDS = DEFAULT_AUTHENTICATION_BACKENDS
+
+TEMPLATE_DIRS = (
+    os.path.join(os.path.dirname(__file__), "templates"),
+)
+
+SOUTH_TESTS_MIGRATE = False
+
+LOGGING = {
+    'version': 1,
+    'disable_existing_loggers': True,
+    'root': {
+        'level': 'WARNING',
+        'handlers': ['sentry'],
+    },
+    'formatters': {
+        'verbose': {
+            'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s'
+        },
+    },
+    'handlers': {
+        'sentry': {
+            'level': 'WARNING',
+            'class': 'raven.contrib.django.handlers.SentryHandler',
+        },
+        'console': {
+            'level': 'DEBUG',
+            'class': 'logging.StreamHandler',
+            'formatter': 'verbose'
+        }
+    },
+    'loggers': {
+        'django.db.backends': {
+            'level': 'ERROR',
+            'handlers': ['console'],
+            'propagate': False,
+        },
+        'raven': {
+            'level': 'DEBUG',
+            'handlers': ['console'],
+            'propagate': False,
+        },
+        'sentry.errors': {
+            'level': 'DEBUG',
+            'handlers': ['console'],
+            'propagate': False,
+        },
+    },
+}
+
+ADMIN_TOOLS_INDEX_DASHBOARD = 'project.dashboard.CustomIndexDashboard'
+
+from conf import *
+
+TINYMCE_DEFAULT_CONFIG = {
+    'theme': "advanced",
+    'theme_advanced_buttons1' : "formatselect,|,bold,italic,underline,|,bullist,numlist,|,undo,redo,|,link,unlink,image,|,backcolor,|removeformat,visualaid,code,",
+    'theme_advanced_buttons2' : "",
+    'theme_advanced_buttons3' : "",
+    'theme_advanced_statusbar_location' : "bottom",
+    'theme_advanced_toolbar_align' : "left",
+    'width' : "800",
+    'height' : "200",
+    'theme_advanced_resizing' : "true",
+    'custom_undo_redo_levels': 10,
+    'theme_advanced_toolbar_location' : 'top',
+}
diff --git a/project/urls.py b/project/urls.py
new file mode 100644 (file)
index 0000000..78a811f
--- /dev/null
@@ -0,0 +1,29 @@
+# -*- encoding: utf-8 -*
+
+from django.conf.urls.defaults import patterns, include, \
+        handler500, handler404, url
+from django.conf import settings
+from django.contrib import admin
+from django.contrib.staticfiles.urls import staticfiles_urlpatterns
+from filebrowser.sites import site
+
+admin.autodiscover()
+
+handler404
+handler500 # Pyflakes
+
+urlpatterns = patterns('',
+    url(r'^tinymce/', include('tinymce.urls')),
+    (r'^admin/filebrowser/', include(site.urls)),
+    (r'^admin/', include(admin.site.urls)),
+    url(r'^admin_tools/', include('admin_tools.urls')),
+    url(r'^', include('cms.urls')),
+)
+
+if settings.DEBUG:
+    urlpatterns += staticfiles_urlpatterns()
+    urlpatterns += patterns('',
+        url(r'^media/(?P<path>.*)$',
+        'django.views.static.serve', {
+        'document_root': settings.MEDIA_ROOT, }),
+        )
diff --git a/versions.cfg b/versions.cfg
new file mode 100644 (file)
index 0000000..6ea5f94
--- /dev/null
@@ -0,0 +1,27 @@
+[versions]
+django = 1.4.5
+django-cms = 2.3.7
+auf.recipe.django = 2.2
+auf.django.piwik = 1.9
+djangorecipe = 1.5
+django-debug-toolbar = 0.9.4
+raven = 2.0.7.1
+south = 0.7.5
+zc.recipe.egg = 2.0
+zc.buildout = 1.5.2
+simplejson = 2.5.2
+
+# Added by Buildout Versions at 2014-01-29 16:15:30.940286
+buildout-versions = 1.7
+django-admin-tools = 0.5.1
+django-classy-tags = 0.4
+django-mptt = 0.5.2
+django-pagination = 1.0.7
+django-sekizai = 0.7
+django-tinymce = 1.5.2
+hexagonit.recipe.download = 1.7
+setuptools = 2.1
+
+# Required by:
+# django-cms==2.3.7
+html5lib = 1.0b3