From f0aee82906621f7989a1e88ed2f645cf5c80ec75 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Mon, 7 Apr 2014 20:08:33 +0100 Subject: [PATCH 01/58] Add a dummy_request method to Page so that we can generate page previews without passing in the active request object (which may have undesirable side effects, e.g. may be a POST) --- wagtail/wagtailadmin/views/pages.py | 24 +++++++++++------- wagtail/wagtailcore/models.py | 39 +++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 9 deletions(-) diff --git a/wagtail/wagtailadmin/views/pages.py b/wagtail/wagtailadmin/views/pages.py index 3fb905715..4c50eaafe 100644 --- a/wagtail/wagtailadmin/views/pages.py +++ b/wagtail/wagtailadmin/views/pages.py @@ -340,12 +340,14 @@ def preview_on_edit(request, page_id): if form.is_valid(): form.save(commit=False) - # FIXME: passing the original request to page.serve is dodgy (particularly if page.serve has - # special treatment of POSTs). Ought to construct one that more or less matches what would be sent - # as a front-end GET request + # This view will generally be invoked as an AJAX request; as such, in the case of + # an error Django will return a plaintext response. This isn't what we want, since + # we will be writing the response back to an HTML page regardless of success or + # failure - as such, we strip out the X-Requested-With header to get Django to return + # an HTML error response + request.META.pop('HTTP_X_REQUESTED_WITH', None) - request.META.pop('HTTP_X_REQUESTED_WITH', None) # Make this request appear to the page's serve method as a non-ajax one, as they will often implement custom behaviour for XHR - response = page.serve(request) + response = page.serve(page.dummy_request()) response['X-Wagtail-Preview'] = 'ok' return response @@ -380,10 +382,14 @@ def preview_on_create(request, content_type_app_name, content_type_model_name, p if form.is_valid(): form.save(commit=False) - # FIXME: passing the original request to page.serve is dodgy (particularly if page.serve has - # special treatment of POSTs). Ought to construct one that more or less matches what would be sent - # as a front-end GET request - response = page.serve(request) + # This view will generally be invoked as an AJAX request; as such, in the case of + # an error Django will return a plaintext response. This isn't what we want, since + # we will be writing the response back to an HTML page regardless of success or + # failure - as such, we strip out the X-Requested-With header to get Django to return + # an HTML error response + request.META.pop('HTTP_X_REQUESTED_WITH', None) + + response = page.serve(page.dummy_request()) response['X-Wagtail-Preview'] = 'ok' return response diff --git a/wagtail/wagtailcore/models.py b/wagtail/wagtailcore/models.py index b06137b9d..5c3c50f9b 100644 --- a/wagtail/wagtailcore/models.py +++ b/wagtail/wagtailcore/models.py @@ -1,5 +1,7 @@ import sys import os +from StringIO import StringIO +from urlparse import urlparse from modelcluster.models import ClusterableModel @@ -7,6 +9,8 @@ from django.db import models, connection, transaction from django.db.models import get_model, Q from django.http import Http404 from django.core.cache import cache +from django.core.handlers.wsgi import WSGIRequest +from django.core.handlers.base import BaseHandler from django.contrib.contenttypes.models import ContentType from django.contrib.auth.models import Group from django.conf import settings @@ -501,6 +505,41 @@ class Page(MP_Node, ClusterableModel, Indexed): user_perms = UserPagePermissionsProxy(user) return user_perms.for_page(self) + def dummy_request(self): + """ + Construct a HttpRequest object that is, as far as possible, representative of ones that would + receive this page as a response. Used for previewing / moderation and any other place where we + want to display a view of this page in the admin interface without going through the regular + page routing logic. + """ + url = self.full_url + if url: + url_info = urlparse(url) + hostname = url_info.netloc + path = url_info.path + port = url_info.port or 80 + else: + hostname = 'example.com' + path = '/' + port = 80 + + request = WSGIRequest({ + 'REQUEST_METHOD': 'GET', + 'PATH_INFO': path, + 'SERVER_NAME': hostname, + 'SERVER_PORT': port, + 'wsgi.input': StringIO(), + }) + + # Apply middleware to the request - see http://www.mellowmorning.com/2011/04/18/mock-django-request-for-testing/ + handler = BaseHandler() + handler.load_middleware() + for middleware_method in handler._request_middleware: + if middleware_method(request): + raise Exception("Couldn't create request mock object - " + "request middleware returned a response") + return request + def get_navigation_menu_items(): # Get all pages that appear in the navigation menu: ones which have children, From d6cab0a10e02bd74c38fcaa1266bf9886eb7b7f9 Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Tue, 8 Apr 2014 11:36:08 +0100 Subject: [PATCH 02/58] Add get_page_modes and show_as_mode methods to Page. This abstracts out from the preview methods the details of how the page is generated. --- wagtail/wagtailadmin/views/pages.py | 8 ++++---- wagtail/wagtailcore/models.py | 20 ++++++++++++++++++++ 2 files changed, 24 insertions(+), 4 deletions(-) diff --git a/wagtail/wagtailadmin/views/pages.py b/wagtail/wagtailadmin/views/pages.py index 4c50eaafe..a29477813 100644 --- a/wagtail/wagtailadmin/views/pages.py +++ b/wagtail/wagtailadmin/views/pages.py @@ -1,8 +1,6 @@ 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.template.loader import render_to_string -from django.template import RequestContext from django.contrib import messages from django.contrib.contenttypes.models import ContentType from django.contrib.auth.decorators import permission_required @@ -347,7 +345,8 @@ def preview_on_edit(request, page_id): # an HTML error response request.META.pop('HTTP_X_REQUESTED_WITH', None) - response = page.serve(page.dummy_request()) + display_mode = page.get_page_modes()[0] + response = page.show_as_mode(display_mode) response['X-Wagtail-Preview'] = 'ok' return response @@ -389,7 +388,8 @@ def preview_on_create(request, content_type_app_name, content_type_model_name, p # an HTML error response request.META.pop('HTTP_X_REQUESTED_WITH', None) - response = page.serve(page.dummy_request()) + display_mode = page.get_page_modes()[0] + response = page.show_as_mode(display_mode) response['X-Wagtail-Preview'] = 'ok' return response diff --git a/wagtail/wagtailcore/models.py b/wagtail/wagtailcore/models.py index 5c3c50f9b..ee5d50a43 100644 --- a/wagtail/wagtailcore/models.py +++ b/wagtail/wagtailcore/models.py @@ -540,6 +540,26 @@ class Page(MP_Node, ClusterableModel, Indexed): "request middleware returned a response") return request + def get_page_modes(self): + """ + Return a list of (internal_name, display_name) tuples for the modes in which + this page can be displayed for preview/moderation purposes. Ordinarily a page + will only have one display mode, but subclasses of Page can override this - + for example, a page containing a form might have a default view of the form, + and a post-submission 'thankyou' page + """ + return [('', 'Default')] + + def show_as_mode(self, mode_name): + """ + Given an internal name from the get_page_modes() list, return an HTTP response + indicative of the page being viewed in that mode. By default this passes a + dummy request into the serve() mechanism, ensuring that it matches the behaviour + on the front-end; subclasses that define additional page modes will need to + implement alternative logic to serve up the appropriate view here. + """ + return self.serve(self.dummy_request()) + def get_navigation_menu_items(): # Get all pages that appear in the navigation menu: ones which have children, From 75b127a07c5615a5d1a245b4e032a3488d585bef Mon Sep 17 00:00:00 2001 From: Matt Westcott Date: Tue, 8 Apr 2014 16:14:30 +0100 Subject: [PATCH 03/58] Support within wagtailadmin for selecting a view mode in which to preview a page. The 'preview' option is split out from the 'save' popup menu into its own button (it was deemed appropriate to split it off since it doesn't perform any database-level actions). If the page defines multiple page modes in get_page_modes, this button becomes a popup, allowing the editor to choose a mode. Finally, preview_on_create and preview_on_edit are updated to pass the chosen mode into the page's show_as_mode method. --- .../static/wagtailadmin/js/page-editor.js | 2 +- .../pages/_preview_button_on_create.html | 4 ++++ .../pages/_preview_button_on_edit.html | 4 ++++ .../templates/wagtailadmin/pages/create.html | 20 ++++++++++++++++++- .../templates/wagtailadmin/pages/edit.html | 20 +++++++++++++++++-- wagtail/wagtailadmin/views/pages.py | 15 ++++++++++++-- 6 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/_preview_button_on_create.html create mode 100644 wagtail/wagtailadmin/templates/wagtailadmin/pages/_preview_button_on_edit.html diff --git a/wagtail/wagtailadmin/static/wagtailadmin/js/page-editor.js b/wagtail/wagtailadmin/static/wagtailadmin/js/page-editor.js index e34bbaf60..4a2dd4d65 100644 --- a/wagtail/wagtailadmin/static/wagtailadmin/js/page-editor.js +++ b/wagtail/wagtailadmin/static/wagtailadmin/js/page-editor.js @@ -318,7 +318,7 @@ $(function() { }); /* Set up behaviour of preview button */ - $('#action-preview').click(function() { + $('.action-preview').click(function() { var previewWindow = window.open($(this).data('placeholder'), $(this).data('windowname')); $.ajax({ diff --git a/wagtail/wagtailadmin/templates/wagtailadmin/pages/_preview_button_on_create.html b/wagtail/wagtailadmin/templates/wagtailadmin/pages/_preview_button_on_create.html new file mode 100644 index 000000000..d8d12a9be --- /dev/null +++ b/wagtail/wagtailadmin/templates/wagtailadmin/pages/_preview_button_on_create.html @@ -0,0 +1,4 @@ + diff --git a/wagtail/wagtailadmin/templates/wagtailadmin/pages/_preview_button_on_edit.html b/wagtail/wagtailadmin/templates/wagtailadmin/pages/_preview_button_on_edit.html new file mode 100644 index 000000000..15f35245b --- /dev/null +++ b/wagtail/wagtailadmin/templates/wagtailadmin/pages/_preview_button_on_edit.html @@ -0,0 +1,4 @@ + diff --git a/wagtail/wagtailadmin/templates/wagtailadmin/pages/create.html b/wagtail/wagtailadmin/templates/wagtailadmin/pages/create.html index 1bfc18381..11cb8a572 100644 --- a/wagtail/wagtailadmin/templates/wagtailadmin/pages/create.html +++ b/wagtail/wagtailadmin/templates/wagtailadmin/pages/create.html @@ -21,7 +21,6 @@
    -
  • {% if parent_page_perms.can_publish_subpage %}
  • {% endif %} @@ -29,6 +28,25 @@
+ +
  • + {% trans 'Preview' as preview_label %} + {% if display_modes|length > 1 %} + + {% else %} + {% include "wagtailadmin/pages/_preview_button_on_create.html" with label=preview_label %} + {% endif %} +
  • diff --git a/wagtail/wagtailadmin/templates/wagtailadmin/pages/edit.html b/wagtail/wagtailadmin/templates/wagtailadmin/pages/edit.html index c12419563..8a954ba49 100644 --- a/wagtail/wagtailadmin/templates/wagtailadmin/pages/edit.html +++ b/wagtail/wagtailadmin/templates/wagtailadmin/pages/edit.html @@ -48,13 +48,29 @@
  • {% endif %}
  • -
  • -
  • +
  • + {% trans 'Preview' as preview_label %} + {% if display_modes|length > 1 %} + + {% else %} + {% include "wagtailadmin/pages/_preview_button_on_edit.html" with label=preview_label %} + {% endif %}
  • +
  • {% if page.get_latest_revision %} diff --git a/wagtail/wagtailadmin/views/pages.py b/wagtail/wagtailadmin/views/pages.py index a29477813..c09805def 100644 --- a/wagtail/wagtailadmin/views/pages.py +++ b/wagtail/wagtailadmin/views/pages.py @@ -208,6 +208,7 @@ def create(request, content_type_app_name, content_type_model_name, parent_page_ 'page_class': page_class, 'parent_page': parent_page, 'edit_handler': edit_handler, + 'display_modes': page.get_page_modes(), }) @@ -292,6 +293,7 @@ def edit(request, page_id): 'page': page, 'edit_handler': edit_handler, 'errors_debug': errors_debug, + 'display_modes': page.get_page_modes(), }) @@ -345,7 +347,11 @@ def preview_on_edit(request, page_id): # an HTML error response request.META.pop('HTTP_X_REQUESTED_WITH', None) - display_mode = page.get_page_modes()[0] + try: + display_mode = request.GET['mode'] + except KeyError: + display_mode = page.get_page_modes()[0] + response = page.show_as_mode(display_mode) response['X-Wagtail-Preview'] = 'ok' @@ -357,6 +363,7 @@ def preview_on_edit(request, page_id): response = render(request, 'wagtailadmin/pages/edit.html', { 'page': page, 'edit_handler': edit_handler, + 'display_modes': page.get_page_modes(), }) response['X-Wagtail-Preview'] = 'error' return response @@ -388,7 +395,10 @@ def preview_on_create(request, content_type_app_name, content_type_model_name, p # an HTML error response request.META.pop('HTTP_X_REQUESTED_WITH', None) - display_mode = page.get_page_modes()[0] + try: + display_mode = request.GET['mode'] + except KeyError: + display_mode = page.get_page_modes()[0] response = page.show_as_mode(display_mode) response['X-Wagtail-Preview'] = 'ok' @@ -403,6 +413,7 @@ def preview_on_create(request, content_type_app_name, content_type_model_name, p 'page_class': page_class, 'parent_page': parent_page, 'edit_handler': edit_handler, + 'display_modes': page.get_page_modes(), }) response['X-Wagtail-Preview'] = 'error' return response From e2cf9f16e4fc57631f9fa70bbaf1d67f61efbd42 Mon Sep 17 00:00:00 2001 From: Dave Cranwell Date: Wed, 9 Apr 2014 12:00:07 +0100 Subject: [PATCH 04/58] preview buttons (and dropdowns generally) improve a little --- .../scss/components/dropdowns.scss | 38 ++++++++++++------ .../wagtailadmin/scss/components/forms.scss | 10 ++++- .../wagtailadmin/scss/fonts/wagtail.eot | Bin 12924 -> 12952 bytes .../wagtailadmin/scss/fonts/wagtail.svg | 2 +- .../wagtailadmin/scss/fonts/wagtail.ttf | Bin 12760 -> 12788 bytes .../wagtailadmin/scss/fonts/wagtail.woff | Bin 8980 -> 9092 bytes .../scss/layouts/page-editor.scss | 35 +++++++++++++--- .../pages/_preview_button_on_create.html | 2 +- .../pages/_preview_button_on_edit.html | 4 +- .../templates/wagtailadmin/pages/create.html | 4 +- .../templates/wagtailadmin/pages/edit.html | 6 +-- 11 files changed, 73 insertions(+), 28 deletions(-) diff --git a/wagtail/wagtailadmin/static/wagtailadmin/scss/components/dropdowns.scss b/wagtail/wagtailadmin/static/wagtailadmin/scss/components/dropdowns.scss index 4469a49a0..0b869f341 100644 --- a/wagtail/wagtailadmin/static/wagtailadmin/scss/components/dropdowns.scss +++ b/wagtail/wagtailadmin/static/wagtailadmin/scss/components/dropdowns.scss @@ -6,6 +6,15 @@ cursor:pointer; } + input[type=button], input[type=submit], button, .button{ + padding:1em 0; + display:block; + width:100%; + text-align:left; + padding-left:1em; + } + + ul{ @include unlist(); background-color:$color-teal; @@ -25,7 +34,6 @@ } a{ - box-sizing:border-box; white-space: nowrap; position:relative; @@ -55,7 +63,7 @@ a, input[type=submit], input[type=reset], input[type=button], .button, button{ font-size:0.95em; -webkit-font-smoothing: auto; - text-shadow:-1px -1px 1px rgba(0,0,0,0.2); + @include border-radius(0); } label{ @@ -95,16 +103,7 @@ bottom:100%; } - input[type=button], input[type=submit], button{ - padding:1em 0; - @include border-radius(0); - display:block; - width:100%; - text-align:left; - padding-left:1em; - text-shadow:-1px -1px 1px rgba(0,0,0,0.2); - } - + .button{ float:left; @@ -132,6 +131,21 @@ &.open > .button + .dropdown-toggle{ background-color:$color-teal-darker; } + + /* Styles for dropdowns which are also buttons e.g page editor */ + &.dropdown-button{ + .dropdown-toggle{ + @include border-radius(0 3px 3px 0); + } + &.open{ + > input[type=button], > input[type=submit], > button, > .button{ + @include border-radius(0 0 3px 3px); + } + .dropdown-toggle{ + @include border-radius(0 0 3px 0); + } + } + } } .dropdown.white{ diff --git a/wagtail/wagtailadmin/static/wagtailadmin/scss/components/forms.scss b/wagtail/wagtailadmin/static/wagtailadmin/scss/components/forms.scss index d4842874e..6997bd836 100644 --- a/wagtail/wagtailadmin/static/wagtailadmin/scss/components/forms.scss +++ b/wagtail/wagtailadmin/static/wagtailadmin/scss/components/forms.scss @@ -142,6 +142,7 @@ input[type=checkbox]:checked:before{ /* Core button style */ input[type=submit], input[type=reset], input[type=button], .button, button{ + font-family:Open Sans,Arial,sans-serif; @include border-radius(3px); width:auto; padding:0.7em 1em; @@ -160,6 +161,7 @@ input[type=submit], input[type=reset], input[type=button], .button, button{ overflow:hidden; position:relative; font-weight:normal; + outline:none; -moz-appearance: none; -moz-box-sizing:content-box; @@ -169,7 +171,6 @@ input[type=submit], input[type=reset], input[type=button], .button, button{ } &.button-secondary{ - border:1px solid $color-button; color:$color-button; background-color:white; } @@ -257,6 +258,13 @@ input[type=submit], input[type=reset], input[type=button], .button, button{ } } +button.icon{ + &:before, + &:after{ + line-height:0; + } +} + .multiple{ @include transition(max-height 10s ease); padding:0; diff --git a/wagtail/wagtailadmin/static/wagtailadmin/scss/fonts/wagtail.eot b/wagtail/wagtailadmin/static/wagtailadmin/scss/fonts/wagtail.eot index cdce4afabbc525a0a4fa0657c53bf13392502cd3..aaff14df569613b1e8c709e29916928c3840dbea 100644 GIT binary patch delta 553 zcmYjNJ!n%=6#iavbMtHxY?_x}S_3c5yJ@3nV)EWgn%4ZbmAuIg{(wrbwXFmjsSdh0 zh)`T4z9mBzp-4v|g9UM^P9-4XBIuy#;M75)i(eE@56|m$0;p=K`v(fK^^Tbo06<6!G zuf9mX>;hy5nEtr7Qd{o#z7R7YOn9Er1Ku;pJ*aP7sV${1cFjfM$lTk{!0|0^-D_-Y z-n6&rV?NHwW7`lo^4H$mU%z}f_ZTJQ4paoPgm5j==t7Kkd$=as0eq*EHT`~1G7rm_@MBC?%&B~Ddt zs3()EPqI@xm6^g6E(|2U&o8`>7u?30;V#6ZS$#{-?hryJgCRnkqI)br#c!0AORZ9w zQL0qRRoy66l!IaD1~lNrZ50V!|Nk>E1LdXw)pDfgRHnU2K9-wICk7YCR!sI_l(Rc~mw`b)2PoBCkY8NFUcz>gfx+MdP}vd& zMj#2q9@iH+#`D{JW#DE43NSF7Px@{Fqc<;M)MeymVDJV)a|RIxp2>HZg0cgJt1_t(m2Tl{L_d4qzd>%^WP| zjJ$2a3xs!xEEAOybrDV4?8929RuA+!Ljn^6;{pbD23ZDUAWwu%NzKH}$V`ckiJwu9 z#mJ7yo>7mPO-YYQpV5xRNRCOKk&l@%!6LxIB7ik2)LNIDn}y%VA`HQd@$)iJ$r3D4pMa{MTN~x*w^0Er*D$2lF44Zdr?_!>; nYw(NFc(R6}7LW`!{K6~FAi*HXAk3h|z``IiImF148!0RS6Mt;c diff --git a/wagtail/wagtailadmin/static/wagtailadmin/scss/fonts/wagtail.svg b/wagtail/wagtailadmin/static/wagtailadmin/scss/fonts/wagtail.svg index 82af03769..683157b11 100644 --- a/wagtail/wagtailadmin/static/wagtailadmin/scss/fonts/wagtail.svg +++ b/wagtail/wagtailadmin/static/wagtailadmin/scss/fonts/wagtail.svg @@ -62,11 +62,11 @@ - + diff --git a/wagtail/wagtailadmin/static/wagtailadmin/scss/fonts/wagtail.ttf b/wagtail/wagtailadmin/static/wagtailadmin/scss/fonts/wagtail.ttf index 865f2f8b2e9c092bcaaa1146b70fe22b5a763e99..6dbe3411fc9a0b9e75be618bc8e6192836ff5549 100644 GIT binary patch delta 623 zcmX|-OK1~O6o&tqj5jfD(6p1JEtQl>GLtq)9ww7Xn%d?ml1RmhcHx5|jg6ADk#Wy>Tl{Sk zZMBVc;i|mx%(rP+rh(x&5AGg%;l&u>krlg5WRe^SN14&?u!o|m5>{lFWMnpxq)I?N z5>oA=kr|n!$cjux+j7_)+$UesS|}H+NuMXKt!nXgL16Cw0YT_CS$q1J=_gY%=?CeI z!kC=RgB))#d@G==|exYAVI(&9QFIbSl8a58!P_+(IJB4 delta 594 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 O{`~