diff --git a/mediagoblin/templates/mediagoblin/utils/messages.html b/mediagoblin/templates/mediagoblin/utils/messages.html
new file mode 100644
index 00000000..52d03daa
--- /dev/null
+++ b/mediagoblin/templates/mediagoblin/utils/messages.html
@@ -0,0 +1,32 @@
+{#
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 Free Software Foundation, Inc
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see
.
+#}
+
+{# Display any queued messages #}
+{% set messages = fetch_messages(request) %}
+{% if messages %}
+
+{% endif %}
+
diff --git a/mediagoblin/tests/test_messages.py b/mediagoblin/tests/test_messages.py
new file mode 100644
index 00000000..4cd9381a
--- /dev/null
+++ b/mediagoblin/tests/test_messages.py
@@ -0,0 +1,44 @@
+# GNU MediaGoblin -- federated, autonomous media hosting
+# Copyright (C) 2011 Free Software Foundation, Inc
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program 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 Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see
.
+
+from mediagoblin.messages import fetch_messages, add_message
+from mediagoblin.tests.tools import setup_fresh_app
+from mediagoblin import util
+
+
+@setup_fresh_app
+def test_messages(test_app):
+ """
+ Added messages should show up in the request.session,
+ fetched messages should be the same as the added ones,
+ and fetching should clear the message list.
+ """
+ # Aquire a request object
+ test_app.get('/')
+ context = util.TEMPLATE_TEST_CONTEXT['mediagoblin/root.html']
+ request = context['request']
+
+ # The message queue should be empty
+ assert request.session.get('messages', []) == []
+
+ # Adding a message should modify the session accordingly
+ add_message(request, 'herp_derp', 'First!')
+ test_msg_queue = [{'text': 'First!', 'level': 'herp_derp'}]
+ assert request.session['messages'] == test_msg_queue
+
+ # fetch_messages should return and empty the queue
+ assert fetch_messages(request) == test_msg_queue
+ assert request.session.get('messages') == []
diff --git a/mediagoblin/user_pages/views.py b/mediagoblin/user_pages/views.py
index 67a57d97..399d2020 100644
--- a/mediagoblin/user_pages/views.py
+++ b/mediagoblin/user_pages/views.py
@@ -15,9 +15,11 @@
# along with this program. If not, see
.
from webob import exc
+
+from mediagoblin import messages
from mediagoblin.db.util import DESCENDING, ObjectId
-from mediagoblin.util import Pagination, render_to_response, redirect, \
- clean_html
+from mediagoblin.util import (
+ Pagination, render_to_response, redirect, cleaned_markdown_conversion)
from mediagoblin.user_pages import forms as user_forms
from mediagoblin.decorators import uses_pagination, get_user_media_entry, \
@@ -25,7 +27,6 @@ from mediagoblin.decorators import uses_pagination, get_user_media_entry, \
from werkzeug.contrib.atom import AtomFeed
-import markdown
@uses_pagination
def user_home(request, page):
@@ -101,6 +102,7 @@ def media_home(request, media, **kwargs):
'pagination': pagination,
'comment_form': comment_form})
+
@require_active_login
def media_post_comment(request):
"""
@@ -111,18 +113,19 @@ def media_post_comment(request):
comment['author'] = request.user['_id']
comment['content'] = request.POST['comment']
- md = markdown.Markdown(
- safe_mode = 'escape')
- comment['content_html'] = clean_html(
- md.convert(
- comment['content']))
+ comment['content_html'] = cleaned_markdown_conversion(comment['content'])
comment.save()
+ messages.add_message(
+ request, messages.SUCCESS,
+ 'Comment posted!')
+
return redirect(request, 'mediagoblin.user_pages.media_home',
media = request.matchdict['media'],
user = request.matchdict['user'])
+
ATOM_DEFAULT_NR_OF_UPDATED_ITEMS = 5
def atom_feed(request):
diff --git a/mediagoblin/util.py b/mediagoblin/util.py
index 91fbee0a..a20e87c4 100644
--- a/mediagoblin/util.py
+++ b/mediagoblin/util.py
@@ -32,6 +32,7 @@ from lxml.html.clean import Cleaner
import markdown
from mediagoblin import mg_globals
+from mediagoblin import messages
from mediagoblin.db.util import ObjectId
TESTS_ENABLED = False
@@ -104,6 +105,10 @@ def get_jinja_env(template_loader, locale):
mg_globals.translations.gettext,
mg_globals.translations.ngettext)
+ # All templates will know how to ...
+ # ... fetch all waiting messages and remove them from the queue
+ template_env.globals['fetch_messages'] = messages.fetch_messages
+
if exists(locale):
SETUP_JINJA_ENVS[locale] = template_env