- {% cache 60 catalogue-menu LANGUAGE_CODE %}
- {% catalogue_menu %}
- {% endcache %}
+ {% catalogue_menu %}
diff --git a/fabfile.py b/fabfile.py
index 30bce6655..6a92b7e91 100644
--- a/fabfile.py
+++ b/fabfile.py
@@ -1,6 +1,7 @@
from __future__ import with_statement # needed for python 2.5
from fabric.api import *
from fabric.contrib import files
+from fabric.context_managers import path
import os
@@ -30,6 +31,7 @@ def production():
env.python = '/usr/bin/python'
env.virtualenv = '/usr/bin/virtualenv'
env.pip = 've/bin/pip'
+ env.restart_webserver = restart_gunicorn_debian
# =========
# = Tasks =
@@ -72,6 +74,7 @@ def deploy():
migrate()
collectstatic()
restart_webserver()
+ restart_celery()
def deploy_version(version):
"Specify a specific version to be made live"
@@ -81,6 +84,7 @@ def deploy_version(version):
run('rm releases/previous; mv releases/current releases/previous;', pty=True)
run('ln -s %(version)s releases/current' % env, pty=True)
restart_webserver()
+ restart_celery()
def rollback():
"""
@@ -94,6 +98,7 @@ def rollback():
run('mv releases/previous releases/current;', pty=True)
run('mv releases/_previous releases/previous;', pty=True)
restart_webserver()
+ restart_celery()
# =====================================================================
@@ -168,9 +173,24 @@ def collectstatic():
with cd('%(path)s/releases/current/%(project_name)s' % env):
run('../../../ve/bin/python manage.py collectstatic --noinput' % env, pty=True)
+def restart_gunicorn_debian():
+ """Restarts gunicorn server using debian script."""
+ print '>>> restart gunicorn'
+ require('project_name', provided_by=[staging, production])
+ with path('/sbin'):
+ sudo('gunicorn-debian restart %(project_name)s' % env, shell=False)
+
def restart_webserver():
- "Restart the web server"
- print '>>> restart webserver'
- run('touch %(path)s/%(project_name)s.wsgi' % env)
+ """Restarts the web server."""
+ if hasattr(env, 'restart_webserver'):
+ env.restart_webserver()
+ else:
+ require('project_name', provided_by=[staging, production])
+ print '>>> restart webserver'
+ run('touch %(path)s/%(project_name)s.wsgi' % env)
+
+def restart_celery():
+ """Restarts the Celery task queue manager."""
print '>>> restart Celery'
+ require('project_name', provided_by=[staging, production])
sudo('supervisorctl restart celery.%(project_name)s:' % env, shell=False)
diff --git a/lib/librarian b/lib/librarian
index 1ffcf32a8..375498933 160000
--- a/lib/librarian
+++ b/lib/librarian
@@ -1 +1 @@
-Subproject commit 1ffcf32a8d795681f54bd125ca45e908da5ed3fb
+Subproject commit 3754989331c91f1d78cd5c1904f768a4cf80f07a
diff --git a/lib/realip_middleware.py b/lib/realip_middleware.py
new file mode 100644
index 000000000..9f97b7f13
--- /dev/null
+++ b/lib/realip_middleware.py
@@ -0,0 +1,7 @@
+class SetRemoteAddrFromXRealIP(object):
+ """Sets REMOTE_ADDR from the X-Real-IP header, as set by Nginx."""
+ def process_request(self, request):
+ try:
+ request.META['REMOTE_ADDR'] = request.META['HTTP_X_REAL_IP']
+ except KeyError:
+ return None
diff --git a/wolnelektury/settings/__init__.py b/wolnelektury/settings/__init__.py
index db6ba4584..46e61bd85 100644
--- a/wolnelektury/settings/__init__.py
+++ b/wolnelektury/settings/__init__.py
@@ -38,6 +38,7 @@ MIDDLEWARE_CLASSES = [
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
+ 'realip_middleware.SetRemoteAddrFromXRealIP',
]
ROOT_URLCONF = 'wolnelektury.urls'
diff --git a/wolnelektury/wsgi.py b/wolnelektury/wsgi.py
new file mode 100644
index 000000000..46ea2fd01
--- /dev/null
+++ b/wolnelektury/wsgi.py
@@ -0,0 +1,22 @@
+import os
+import os.path
+import sys
+
+ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
+
+# Add apps and lib directories to PYTHONPATH
+sys.path = [
+ ROOT,
+ os.path.join(ROOT, 'wolnelektury'),
+ os.path.join(ROOT, 'apps'),
+ os.path.join(ROOT, 'lib'),
+ os.path.join(ROOT, 'lib/librarian'),
+] + sys.path
+
+
+os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings")
+
+# This application object is used by the development server
+# as well as any WSGI server configured to use this file.
+from django.core.wsgi import get_wsgi_application
+application = get_wsgi_application()