From 58f9f68fe4e0755c1b591eb5dfca0794c85ba67b Mon Sep 17 00:00:00 2001 From: Dave Cranwell Date: Fri, 7 Nov 2014 16:09:42 +0000 Subject: [PATCH] converted uses of django.contrib.messages to wagtail.wagtailadmin.messages to allow better styling and interactivity in notifications --- wagtail/contrib/wagtailstyleguide/views.py | 17 +++++++++--- wagtail/wagtailadmin/messages.py | 26 +++++++++++++++++++ .../wagtailadmin/scss/components/forms.scss | 4 +-- .../wagtailadmin/scss/components/listing.scss | 4 +++ .../scss/components/messages.scss | 16 ++++++++++++ .../wagtailadmin/shared/messages.html | 9 +++++++ wagtail/wagtailadmin/views/pages.py | 14 +++++++--- wagtail/wagtaildocs/views/documents.py | 11 +++++--- wagtail/wagtailimages/views/images.py | 10 ++++--- wagtail/wagtailredirects/views.py | 11 +++++--- wagtail/wagtailsearch/views/editorspicks.py | 11 +++++--- wagtail/wagtailsites/views.py | 12 ++++++--- wagtail/wagtailsnippets/views/snippets.py | 13 +++++++--- wagtail/wagtailusers/views/groups.py | 11 +++++--- wagtail/wagtailusers/views/users.py | 11 +++++--- 15 files changed, 144 insertions(+), 36 deletions(-) create mode 100644 wagtail/wagtailadmin/messages.py create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/shared/messages.html diff --git a/wagtail/contrib/wagtailstyleguide/views.py b/wagtail/contrib/wagtailstyleguide/views.py index 927a17442..d987644b0 100644 --- a/wagtail/contrib/wagtailstyleguide/views.py +++ b/wagtail/contrib/wagtailstyleguide/views.py @@ -1,7 +1,7 @@ from django import forms from django.shortcuts import render from django.utils.translation import ugettext as _ -from django.contrib import messages +from wagtail.wagtailadmin import messages from django.contrib.auth.decorators import permission_required from wagtail.wagtailadmin.forms import SearchForm @@ -28,9 +28,18 @@ def index(request): example_form = ExampleForm() - messages.success(request, _("Success message")) - messages.warning(request, _("Warning message")) - messages.error(request, _("Error message")) + messages.success(request, _("Success message"), buttons = [ + messages.button('', _('View live')), + messages.button('', _('Edit')) + ]) + messages.warning(request, _("Warning message"), buttons = [ + messages.button('', _('View live')), + messages.button('', _('Edit')) + ]) + messages.error(request, _("Error message"), buttons = [ + messages.button('', _('View live')), + messages.button('', _('Edit')) + ]) fake_pagination = { 'number': 1, diff --git a/wagtail/wagtailadmin/messages.py b/wagtail/wagtailadmin/messages.py new file mode 100644 index 000000000..ab6dbdc98 --- /dev/null +++ b/wagtail/wagtailadmin/messages.py @@ -0,0 +1,26 @@ +from django.contrib import messages +from django.template.loader import render_to_string + +def render(message, buttons): + return render_to_string('wagtailadmin/shared/messages.html', { + 'message': message, + 'buttons': buttons + }) + +def debug(request, message, buttons = None): + return messages.debug(request, render(message, buttons)) + +def info(request, message, buttons = None): + return messages.info(request, render(message, buttons)) + +def success(request, message, buttons = None): + return messages.success(request, render(message, buttons)) + +def warning(request, message, buttons = None): + return messages.warning(request, render(message, buttons)) + +def error(request, message, buttons = None): + return messages.error(request, render(message, buttons)) + +def button(url, text): + return url, text diff --git a/wagtail/wagtailadmin/static/wagtailadmin/scss/components/forms.scss b/wagtail/wagtailadmin/static/wagtailadmin/scss/components/forms.scss index 1246a0b85..fd0832b70 100644 --- a/wagtail/wagtailadmin/static/wagtailadmin/scss/components/forms.scss +++ b/wagtail/wagtailadmin/static/wagtailadmin/scss/components/forms.scss @@ -218,7 +218,7 @@ input[type=submit], input[type=reset], input[type=button], .button, button{ &.button-secondary{ color:$color-button; - background-color:white; + background-color:transparent; } &.icon.text-replace:before{ @@ -260,7 +260,7 @@ input[type=submit], input[type=reset], input[type=button], .button, button{ border-color:transparent; background-color: $color-button-no-hover; } - } + } &.bicolor{ border:0; diff --git a/wagtail/wagtailadmin/static/wagtailadmin/scss/components/listing.scss b/wagtail/wagtailadmin/static/wagtailadmin/scss/components/listing.scss index 4c448087a..af23d45d8 100644 --- a/wagtail/wagtailadmin/static/wagtailadmin/scss/components/listing.scss +++ b/wagtail/wagtailadmin/static/wagtailadmin/scss/components/listing.scss @@ -207,6 +207,10 @@ ul.listing{ color:white; } } + + .button-secondary{ + background-color:white; + } .moderate-actions form{ float:left; diff --git a/wagtail/wagtailadmin/static/wagtailadmin/scss/components/messages.scss b/wagtail/wagtailadmin/static/wagtailadmin/scss/components/messages.scss index 7a05d31f8..53bc58428 100644 --- a/wagtail/wagtailadmin/static/wagtailadmin/scss/components/messages.scss +++ b/wagtail/wagtailadmin/static/wagtailadmin/scss/components/messages.scss @@ -10,6 +10,10 @@ z-index:5; background-color:$color-grey-1; + .buttons{ + margin-left:1em; + } + ul{ @include unlist(); padding-left:10px; @@ -56,6 +60,18 @@ content:"9"; } } + + .success .button:hover{ + background-color:$color-teal-dark; + } + .button-secondary{ + border-color:rgba(255,255,255,0.5); + color:rgba(255,255,255,0.8); + &:hover{ + border-color:transparent; + color:white; + } + } } .messages.new ul{ diff --git a/wagtail/wagtailadmin/templates/wagtailadmin/shared/messages.html b/wagtail/wagtailadmin/templates/wagtailadmin/shared/messages.html new file mode 100644 index 000000000..50c6f71cd --- /dev/null +++ b/wagtail/wagtailadmin/templates/wagtailadmin/shared/messages.html @@ -0,0 +1,9 @@ +{{ message }} + +{% if buttons %} + + {% for button in buttons %} + {{ button.1 }} + {% endfor %} + +{% endif %} diff --git a/wagtail/wagtailadmin/views/pages.py b/wagtail/wagtailadmin/views/pages.py index d890ddaa6..032ed920f 100644 --- a/wagtail/wagtailadmin/views/pages.py +++ b/wagtail/wagtailadmin/views/pages.py @@ -3,10 +3,11 @@ import warnings from django.http import Http404, HttpResponse from django.shortcuts import render, redirect, get_object_or_404 from django.core.exceptions import ValidationError, PermissionDenied -from django.contrib import messages +#from django.contrib import messages from django.contrib.contenttypes.models import ContentType from django.contrib.auth.decorators import permission_required from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger +from django.core.urlresolvers import reverse from django.utils import timezone from django.utils.translation import ugettext as _ from django.utils.http import is_safe_url @@ -21,6 +22,7 @@ from wagtail.wagtailadmin import tasks, signals from wagtail.wagtailcore import hooks from wagtail.wagtailcore.models import Page, PageRevision, get_navigation_menu_items +from wagtail.wagtailadmin import messages @permission_required('wagtailadmin.access_admin') def explorer_nav(request): @@ -325,9 +327,15 @@ def edit(request, page_id): # Notifications if is_publishing: - messages.success(request, _("Page '{0}' published.").format(page.title)) + messages.success(request, _("Page '{0}' published.").format(page.title), buttons = [ + messages.button(page.url, _('View live')), + messages.button(reverse('wagtailadmin_pages_edit', args=(page_id,)), _('Edit')) + ]) elif is_submitting: - messages.success(request, _("Page '{0}' submitted for moderation.").format(page.title)) + messages.success(request, _("Page '{0}' submitted for moderation.").format(page.title), buttons = [ + messages.button(reverse('wagtailadmin_pages_view_draft', args=(page_id,)), _('View draft')), + messages.button(reverse('wagtailadmin_pages_edit', args=(page_id,)), _('Edit')) + ]) tasks.send_notification.delay(page.get_latest_revision().id, 'submitted', request.user.id) else: messages.success(request, _("Page '{0}' updated.").format(page.title)) diff --git a/wagtail/wagtaildocs/views/documents.py b/wagtail/wagtaildocs/views/documents.py index 51a759ae4..8e104d1a3 100644 --- a/wagtail/wagtaildocs/views/documents.py +++ b/wagtail/wagtaildocs/views/documents.py @@ -1,5 +1,4 @@ from django.shortcuts import render, redirect, get_object_or_404 -from django.contrib import messages from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.contrib.auth.decorators import permission_required from django.core.exceptions import PermissionDenied @@ -9,11 +8,11 @@ from django.core.urlresolvers import reverse from wagtail.wagtailadmin.forms import SearchForm from wagtail.wagtailsearch.backends import get_search_backends +from wagtail.wagtailadmin import messages from wagtail.wagtaildocs.models import Document from wagtail.wagtaildocs.forms import DocumentForm - @permission_required('wagtaildocs.add_document') @vary_on_headers('X-Requested-With') def index(request): @@ -89,7 +88,9 @@ def add(request): for backend in get_search_backends(): backend.add(doc) - messages.success(request, _("Document '{0}' added.").format(doc.title)) + messages.success(request, _("Document '{0}' added.").format(doc.title), buttons = [ + messages.button(reverse('wagtaildocs_edit_document', args=(doc.id,)), _('Edit')) + ]) return redirect('wagtaildocs_index') else: messages.error(request, _("The document could not be saved due to errors.")) @@ -123,7 +124,9 @@ def edit(request, document_id): for backend in get_search_backends(): backend.add(doc) - messages.success(request, _("Document '{0}' updated").format(doc.title)) + messages.success(request, _("Document '{0}' updated").format(doc.title), buttons = [ + messages.button(reverse('wagtaildocs_edit_document', args=(doc.id,)), _('Edit')) + ]) return redirect('wagtaildocs_index') else: messages.error(request, _("The document could not be saved due to errors.")) diff --git a/wagtail/wagtailimages/views/images.py b/wagtail/wagtailimages/views/images.py index 8b658db96..9c3f122ee 100644 --- a/wagtail/wagtailimages/views/images.py +++ b/wagtail/wagtailimages/views/images.py @@ -1,7 +1,6 @@ import json from django.shortcuts import render, redirect, get_object_or_404 -from django.contrib import messages from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.contrib.auth.decorators import permission_required from django.core.exceptions import PermissionDenied @@ -12,6 +11,7 @@ from django.http import HttpResponse from wagtail.wagtailcore.models import Site from wagtail.wagtailadmin.forms import SearchForm +from wagtail.wagtailadmin import messages from wagtail.wagtailsearch.backends import get_search_backends from wagtail.wagtailimages.models import get_image_model, Filter @@ -103,7 +103,9 @@ def edit(request, image_id): for backend in get_search_backends(): backend.add(image) - messages.success(request, _("Image '{0}' updated.").format(image.title)) + messages.success(request, _("Image '{0}' updated.").format(image.title), buttons = [ + messages.button(reverse('wagtailimages_edit_image', args=(image.id,)), _('Edit again')) + ]) return redirect('wagtailimages_index') else: messages.error(request, _("The image could not be saved due to errors.")) @@ -228,7 +230,9 @@ def add(request): for backend in get_search_backends(): backend.add(image) - messages.success(request, _("Image '{0}' added.").format(image.title)) + messages.success(request, _("Image '{0}' added.").format(image.title), buttons = [ + messages.button(reverse('wagtailimages_edit_image', args=(image.id,)), _('Edit')) + ]) return redirect('wagtailimages_index') else: messages.error(request, _("The image could not be created due to errors.")) diff --git a/wagtail/wagtailredirects/views.py b/wagtail/wagtailredirects/views.py index 2a57ae57b..4030a564b 100644 --- a/wagtail/wagtailredirects/views.py +++ b/wagtail/wagtailredirects/views.py @@ -1,12 +1,13 @@ from django.shortcuts import render, redirect, get_object_or_404 -from django.contrib import messages from django.contrib.auth.decorators import permission_required from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.utils.translation import ugettext as _ from django.views.decorators.vary import vary_on_headers +from django.core.urlresolvers import reverse from wagtail.wagtailadmin.edit_handlers import ObjectList from wagtail.wagtailadmin.forms import SearchForm +from wagtail.wagtailadmin import messages from wagtail.wagtailredirects import models @@ -68,7 +69,9 @@ def edit(request, redirect_id): form = form_class(request.POST, request.FILES, instance=theredirect) if form.is_valid(): form.save() - messages.success(request, _("Redirect '{0}' updated.").format(theredirect.title)) + messages.success(request, _("Redirect '{0}' updated.").format(theredirect.title), buttons = [ + messages.button(reverse('wagtailredirects_edit_redirect', args=(theredirect.id,)), _('Edit')) + ]) return redirect('wagtailredirects_index') else: messages.error(request, _("The redirect could not be saved due to errors.")) @@ -109,7 +112,9 @@ def add(request): theredirect.site = request.site theredirect.save() - messages.success(request, _("Redirect '{0}' added.").format(theredirect.title)) + messages.success(request, _("Redirect '{0}' added.").format(theredirect.title), buttons = [ + messages.button(reverse('wagtailredirects_edit_redirect', args=(theredirect.id,)), _('Edit')) + ]) return redirect('wagtailredirects_index') else: messages.error(request, _("The redirect could not be created due to errors.")) diff --git a/wagtail/wagtailsearch/views/editorspicks.py b/wagtail/wagtailsearch/views/editorspicks.py index fe45a7c56..f448c31f0 100644 --- a/wagtail/wagtailsearch/views/editorspicks.py +++ b/wagtail/wagtailsearch/views/editorspicks.py @@ -1,13 +1,14 @@ from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.decorators import permission_required -from django.contrib import messages +from django.core.urlresolvers import reverse from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.utils.translation import ugettext as _ from django.views.decorators.vary import vary_on_headers from wagtail.wagtailsearch import models, forms from wagtail.wagtailadmin.forms import SearchForm +from wagtail.wagtailadmin import messages @permission_required('wagtailadmin.access_admin') @@ -80,7 +81,9 @@ def add(request): # Save editors picks editors_pick_formset = forms.EditorsPickFormSet(request.POST, instance=query) if save_editorspicks(query, query, editors_pick_formset): - messages.success(request, _("Editor's picks for '{0}' created.").format(query)) + messages.success(request, _("Editor's picks for '{0}' created.").format(query), buttons = [ + messages.button(reverse('wagtailsearch_editorspicks_edit', args=(query.id,)), _('Edit')) + ]) return redirect('wagtailsearch_editorspicks_index') else: if len(editors_pick_formset.non_form_errors()): @@ -114,7 +117,9 @@ def edit(request, query_id): # Save editors picks if save_editorspicks(query, new_query, editors_pick_formset): - messages.success(request, _("Editor's picks for '{0}' updated.").format(new_query)) + messages.success(request, _("Editor's picks for '{0}' updated.").format(new_query), buttons = [ + messages.button(reverse('wagtailsearch_editorspicks_edit', args=(query.id,)), _('Edit')) + ]) return redirect('wagtailsearch_editorspicks_index') else: if len(editors_pick_formset.non_form_errors()): diff --git a/wagtail/wagtailsites/views.py b/wagtail/wagtailsites/views.py index b7d8b988d..848413bb5 100644 --- a/wagtail/wagtailsites/views.py +++ b/wagtail/wagtailsites/views.py @@ -1,11 +1,11 @@ from django.shortcuts import render, redirect, get_object_or_404 -from django.contrib import messages from django.contrib.auth.decorators import permission_required, user_passes_test from django.utils.translation import ugettext as _ +from django.core.urlresolvers import reverse from wagtail.wagtailcore.models import Site from wagtail.wagtailsites.forms import SiteForm - +from wagtail.wagtailadmin import messages def user_has_site_model_perm(user): for verb in ['add', 'change', 'delete']: @@ -28,7 +28,9 @@ def create(request): form = SiteForm(request.POST) if form.is_valid(): site = form.save() - messages.success(request, _("Site '{0}' created.").format(site.hostname)) + messages.success(request, _("Site '{0}' created.").format(site.hostname), buttons = [ + messages.button(reverse('wagtailsites_edit', args=(site.id,)), _('Edit')) + ]) return redirect('wagtailsites_index') else: messages.error(request, _("The site could not be created due to errors.")) @@ -48,7 +50,9 @@ def edit(request, site_id): form = SiteForm(request.POST, instance=site) if form.is_valid(): site = form.save() - messages.success(request, _("Site '{0}' updated.").format(site.hostname)) + messages.success(request, _("Site '{0}' updated.").format(site.hostname), buttons = [ + messages.button(reverse('wagtailsites_edit', args=(site.id,)), _('Edit')) + ]) return redirect('wagtailsites_index') else: messages.error(request, _("The site could not be saved due to errors.")) diff --git a/wagtail/wagtailsnippets/views/snippets.py b/wagtail/wagtailsnippets/views/snippets.py index 4e146b6fa..798cbedda 100644 --- a/wagtail/wagtailsnippets/views/snippets.py +++ b/wagtail/wagtailsnippets/views/snippets.py @@ -3,7 +3,6 @@ from django.shortcuts import get_object_or_404, render, redirect from django.utils.encoding import force_text from django.utils.text import capfirst from django.contrib.contenttypes.models import ContentType -from django.contrib import messages from django.contrib.auth.decorators import permission_required from django.core.exceptions import PermissionDenied from django.utils.translation import ugettext as _ @@ -14,7 +13,7 @@ from wagtail.wagtailadmin.edit_handlers import ObjectList, extract_panel_definit from wagtail.wagtailsnippets.models import get_snippet_content_types from wagtail.wagtailsnippets.permissions import user_can_edit_snippet_type - +from wagtail.wagtailadmin import messages # == Helper functions == @@ -129,7 +128,10 @@ def create(request, content_type_app_name, content_type_model_name): _("{snippet_type} '{instance}' created.").format( snippet_type=capfirst(get_snippet_type_name(content_type)[0]), instance=instance - ) + ), + buttons = [ + messages.button(reverse('wagtailsnippets_edit', args=(content_type_app_name,content_type_model_name,instance.id,)), _('Edit')) + ] ) return redirect('wagtailsnippets_list', content_type.app_label, content_type.model) else: @@ -170,7 +172,10 @@ def edit(request, content_type_app_name, content_type_model_name, id): _("{snippet_type} '{instance}' updated.").format( snippet_type=capfirst(snippet_type_name), instance=instance - ) + ), + buttons = [ + messages.button(reverse('wagtailsnippets_edit', args=(content_type_app_name,content_type_model_name,instance.id,)), _('Edit')) + ] ) return redirect('wagtailsnippets_list', content_type.app_label, content_type.model) else: diff --git a/wagtail/wagtailusers/views/groups.py b/wagtail/wagtailusers/views/groups.py index 07a475c77..21eb08c76 100644 --- a/wagtail/wagtailusers/views/groups.py +++ b/wagtail/wagtailusers/views/groups.py @@ -2,11 +2,12 @@ from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.models import Group from django.contrib.auth.decorators import permission_required, user_passes_test from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger -from django.contrib import messages +from django.core.urlresolvers import reverse from django.utils.translation import ugettext as _ from django.views.decorators.vary import vary_on_headers from django.forms.models import inlineformset_factory +from wagtail.wagtailadmin import messages from wagtail.wagtailadmin.forms import SearchForm from wagtail.wagtailusers.forms import GroupForm, BaseGroupPagePermissionFormSet from wagtail.wagtailcore.models import GroupPagePermission @@ -91,7 +92,9 @@ def create(request): group = form.save() formset.instance = group formset.save() - messages.success(request, _("Group '{0}' created.").format(group)) + messages.success(request, _("Group '{0}' created.").format(group), buttons = [ + messages.button(reverse('wagtailusers_groups_edit', args=(group.id,)), _('Edit')) + ]) return redirect('wagtailusers_groups_index') else: messages.error(request, _("The group could not be created due to errors.")) @@ -120,7 +123,9 @@ def edit(request, group_id): if form.is_valid() and formset.is_valid(): group = form.save() formset.save() - messages.success(request, _("Group '{0}' updated.").format(group)) + messages.success(request, _("Group '{0}' updated.").format(group), buttons = [ + messages.button(reverse('wagtailusers_groups_edit', args=(group.id,)), _('Edit')) + ]) return redirect('wagtailusers_groups_index') else: messages.error(request, _("The group could not be saved due to errors.")) diff --git a/wagtail/wagtailusers/views/users.py b/wagtail/wagtailusers/views/users.py index 427106789..56310ddd7 100644 --- a/wagtail/wagtailusers/views/users.py +++ b/wagtail/wagtailusers/views/users.py @@ -2,11 +2,12 @@ from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth import get_user_model from django.contrib.auth.decorators import permission_required from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger -from django.contrib import messages +from django.core.urlresolvers import reverse from django.db.models import Q from django.utils.translation import ugettext as _ from django.views.decorators.vary import vary_on_headers +from wagtail.wagtailadmin import messages from wagtail.wagtailadmin.forms import SearchForm from wagtail.wagtailusers.forms import UserCreationForm, UserEditForm from wagtail.wagtailcore.compat import AUTH_USER_APP_LABEL, AUTH_USER_MODEL_NAME @@ -82,7 +83,9 @@ def create(request): form = UserCreationForm(request.POST) if form.is_valid(): user = form.save() - messages.success(request, _("User '{0}' created.").format(user)) + messages.success(request, _("User '{0}' created.").format(user), buttons = [ + messages.button(reverse('wagtailusers_users_edit', args=(user.id,)), _('Edit')) + ]) return redirect('wagtailusers_users_index') else: messages.error(request, _("The user could not be created due to errors.") ) @@ -101,7 +104,9 @@ def edit(request, user_id): form = UserEditForm(request.POST, instance=user) if form.is_valid(): user = form.save() - messages.success(request, _("User '{0}' updated.").format(user)) + messages.success(request, _("User '{0}' updated.").format(user), buttons = [ + messages.button(reverse('wagtailusers_users_edit', args=(user.id,)), _('Edit')) + ]) return redirect('wagtailusers_users_index') else: messages.error(request, _("The user could not be saved due to errors."))