summaryrefslogtreecommitdiffstats
path: root/hyperkitty
diff options
context:
space:
mode:
Diffstat (limited to 'hyperkitty')
-rw-r--r--hyperkitty/lib/store.py88
-rw-r--r--hyperkitty/middleware.py50
-rw-r--r--hyperkitty/templates/errors/schemaupgrade.html28
-rw-r--r--hyperkitty/tests/test_views.py6
-rw-r--r--hyperkitty/urls.py8
5 files changed, 85 insertions, 95 deletions
diff --git a/hyperkitty/lib/store.py b/hyperkitty/lib/store.py
deleted file mode 100644
index 400fb9a..0000000
--- a/hyperkitty/lib/store.py
+++ /dev/null
@@ -1,88 +0,0 @@
-# -*- coding: utf-8 -*-
-# Copyright (C) 1998-2012 by the Free Software Foundation, Inc.
-#
-# This file is part of HyperKitty.
-#
-# HyperKitty is free software: you can redistribute it and/or modify it under
-# the terms of the GNU General Public License as published by the Free
-# Software Foundation, either version 3 of the License, or (at your option)
-# any later version.
-#
-# HyperKitty is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
-# more details.
-#
-# You should have received a copy of the GNU General Public License along with
-# HyperKitty. If not, see <http://www.gnu.org/licenses/>.
-#
-# Author: Aurelien Bompard <abompard@fedoraproject.org>
-#
-
-"""
-WSGI and Django middlewares for KittyStore
-
-Inspired by http://pypi.python.org/pypi/middlestorm
-"""
-
-from threading import local
-
-from django.conf import settings
-import kittystore
-
-
-class KittyStoreWSGIMiddleware(object):
- """WSGI middleware.
- Add KittyStore object in environ['kittystore.store']. Each thread contains
- own store.
- """
-
- def __init__(self, app):
- """Create WSGI middleware.
- :param app: top level application or middleware.
- :param database: instance of Database returned create_database.
- """
- self._app = app
- self._local = local()
-
- def __call__(self, environ, start_response):
- try:
- environ['kittystore.store'] = self._local.store
- except AttributeError:
- environ['kittystore.store'] = \
- self._local.__dict__.setdefault('store',
- kittystore.get_store(settings))
- try:
- return self._app(environ, start_response)
- finally:
- environ['kittystore.store'].rollback()
- #environ['kittystore.store'].close()
-
-
-class KittyStoreDjangoMiddleware(object):
- """Django middleware.
- Add KittyStore object in environ['kittystore.store']. Each thread contains
- own store.
- """
-
- def __init__(self):
- """Create Django middleware."""
- self._local = local()
-
- def process_request(self, request):
- try:
- request.environ['kittystore.store'] = self._local.store
- except AttributeError:
- request.environ['kittystore.store'] = \
- self._local.__dict__.setdefault('store',
- kittystore.get_store(settings))
-
- def process_response(self, request, response):
- if "kittystore.store" in request.environ:
- # kittystore.store could be absent on automatic redirects for ex.
- request.environ['kittystore.store'].commit()
- #request.environ['kittystore.store'].close()
- return response
-
- def process_exception(self, request, exception):
- request.environ['kittystore.store'].rollback()
diff --git a/hyperkitty/middleware.py b/hyperkitty/middleware.py
index 823dd88..4f48e37 100644
--- a/hyperkitty/middleware.py
+++ b/hyperkitty/middleware.py
@@ -20,6 +20,10 @@
# Author: Aurelien Bompard <abompard@fedoraproject.org>
#
+
+from django.conf import settings
+
+
class PaginationMiddleware(object):
"""
Inserts a variable representing the current page onto the request object if
@@ -33,9 +37,52 @@ class PaginationMiddleware(object):
+# KittyStore
+
+from threading import local
+from django.shortcuts import redirect
+from django.core.urlresolvers import reverse
+import kittystore
+
+class KittyStoreDjangoMiddleware(object):
+ """Django middleware.
+ Add KittyStore object in environ['kittystore.store']. Each thread contains
+ own store.
+ Inspired by http://pypi.python.org/pypi/middlestorm
+ """
+
+ def __init__(self):
+ """Create Django middleware."""
+ self._local = local()
+
+ def process_request(self, request):
+ if request.path == reverse("error_schemaupgrade"):
+ return # Display the error page
+ try:
+ request.environ['kittystore.store'] = self._local.store
+ except AttributeError:
+ try:
+ store = kittystore.get_store(settings)
+ except kittystore.SchemaUpgradeNeeded:
+ return redirect("error_schemaupgrade")
+ else:
+ request.environ['kittystore.store'] = \
+ self._local.__dict__.setdefault('store', store)
+
+ def process_response(self, request, response):
+ if "kittystore.store" in request.environ:
+ # kittystore.store could be absent on automatic redirects for ex.
+ request.environ['kittystore.store'].commit()
+ #request.environ['kittystore.store'].close()
+ return response
+
+ def process_exception(self, request, exception):
+ request.environ['kittystore.store'].rollback()
+
+
+
# http://stackoverflow.com/questions/2799450/django-https-for-just-login-page
-from django.conf import settings
from django.http import HttpResponsePermanentRedirect
SSL = 'SSL'
@@ -97,7 +144,6 @@ class TimezoneMiddleware(object):
from mailmanclient import Client as MailmanClient
from mailmanclient import MailmanConnectionError
-from django.conf import settings
class MailmanUserMetadata(object):
diff --git a/hyperkitty/templates/errors/schemaupgrade.html b/hyperkitty/templates/errors/schemaupgrade.html
new file mode 100644
index 0000000..f23281b
--- /dev/null
+++ b/hyperkitty/templates/errors/schemaupgrade.html
@@ -0,0 +1,28 @@
+{% extends "base.html" %}
+{% load url from future %}
+
+
+{% block title %}
+Error: the database schema needs an upgrade
+ - {{ app_name|title }}
+{% endblock %}
+
+{% block content %}
+
+<div class="row-fluid">
+
+ <div class="span2">
+ </div>
+
+ <div class="span7">
+ <p class="text-error">
+ The database schema needs to be upgraded. Please refer to
+ <a href="http://hyperkitty.readthedocs.org/en/latest/install.html#upgrading">the documentation</a>
+ to perform this task.
+ </p>
+ <p>When you're done, <a href="{% url 'root' %}">go back</a> to the front page.</p>
+ </div>
+
+</div>
+
+{% endblock %}
diff --git a/hyperkitty/tests/test_views.py b/hyperkitty/tests/test_views.py
index af829c2..e522f07 100644
--- a/hyperkitty/tests/test_views.py
+++ b/hyperkitty/tests/test_views.py
@@ -91,7 +91,7 @@ class LastViewsTestCase(TestCase):
def setUp(self):
self.user = User.objects.create_user('testuser', 'test@example.com', 'testPass')
self.client.login(username='testuser', password='testPass')
- store = kittystore.get_store(SettingsModule(), debug=False)
+ store = kittystore.get_store(SettingsModule(), debug=False, auto_create=True)
ml = FakeList("list@example.com")
ml.subject_prefix = u"[example] "
# Create 3 threads
@@ -267,7 +267,7 @@ class ReattachTestCase(TestCase):
self.user = User.objects.create_user('testuser', 'test@example.com', 'testPass')
self.user.is_staff = True
self.client.login(username='testuser', password='testPass')
- self.store = kittystore.get_store(SettingsModule(), debug=False)
+ self.store = kittystore.get_store(SettingsModule(), debug=False, auto_create=True)
ml = FakeList("list@example.com")
ml.subject_prefix = u"[example] "
# Create 2 threads
@@ -424,7 +424,7 @@ class PrivateArchivesTestCase(TestCase):
#self.client.login(username='testuser', password='testPass')
settings = SettingsModule()
settings.KITTYSTORE_SEARCH_INDEX = self.tmpdir
- self.store = kittystore.get_store(settings, debug=False)
+ self.store = kittystore.get_store(settings, debug=False, auto_create=True)
ml = FakeList("list@example.com")
ml.subject_prefix = u"[example] "
ml.archive_policy = ArchivePolicy.private
diff --git a/hyperkitty/urls.py b/hyperkitty/urls.py
index b1eda96..efee204 100644
--- a/hyperkitty/urls.py
+++ b/hyperkitty/urls.py
@@ -111,11 +111,15 @@ urlpatterns = patterns('hyperkitty.views',
SearchResource.as_view(), name="api_search"),
url(r'^api/tag\/', TagResource.as_view(), name="api_tag"),
- # Uncomment the admin/doc line below to enable admin documentation:
- # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
+ # Errors
+ url(r'^error/schemaupgrade$',
+ TemplateView.as_view(template_name="errors/schemaupgrade.html"),
+ name="error_schemaupgrade"),
# Admin
url(r'^admin/', include(admin.site.urls), {"SSL": True}),
+ # Uncomment the admin/doc line below to enable admin documentation:
+ # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
# Robots.txt
url(r'^robots\.txt$', TextTemplateView.as_view(template_name="robots.txt")),