diff options
Diffstat (limited to 'hyperkitty')
-rw-r--r-- | hyperkitty/lib/store.py | 88 | ||||
-rw-r--r-- | hyperkitty/middleware.py | 50 | ||||
-rw-r--r-- | hyperkitty/templates/errors/schemaupgrade.html | 28 | ||||
-rw-r--r-- | hyperkitty/tests/test_views.py | 6 | ||||
-rw-r--r-- | hyperkitty/urls.py | 8 |
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")), |