From 94bbe40351008314aa63b266d8e8512e6637d5fa Mon Sep 17 00:00:00 2001 From: Jasper Berghoef Date: Tue, 6 Dec 2016 13:29:09 +0100 Subject: [PATCH 1/2] Setup of page listing hook Signed-off-by: Jasper Berghoef --- src/personalisation/wagtail_hooks.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/src/personalisation/wagtail_hooks.py b/src/personalisation/wagtail_hooks.py index a737448..ad42cf6 100644 --- a/src/personalisation/wagtail_hooks.py +++ b/src/personalisation/wagtail_hooks.py @@ -4,8 +4,12 @@ import logging from django.shortcuts import reverse from django.conf.urls import include, url +from django.core.urlresolvers import reverse +from django.utils.translation import ugettext_lazy as _ from wagtail.contrib.modeladmin.options import ModelAdmin, modeladmin_register from wagtail.contrib.modeladmin.views import IndexView +from wagtail.wagtailadmin.widgets import ( + Button, ButtonWithDropdownFromHook, PageListingButton) from wagtail.wagtailcore import hooks from personalisation import admin_urls @@ -68,6 +72,7 @@ def set_visit_count(page, request, serve_args, serve_kwargs): # No counters exist. Create a new counter with count value 1. create_new_counter(page, request) + @hooks.register('before_serve_page') def segment_user(page, request, serve_args, serve_kwargs): request.session['segments'] = [] @@ -172,3 +177,22 @@ def _check_for_variations(segments, page): return variation return None + + +@hooks.register('register_page_listing_buttons') +def page_listing_variant_buttons(page, page_perms, is_parent=False): + yield ButtonWithDropdownFromHook( + _('Variants'), + hook_name='register_page_listing_variant_buttons', + page=page, + page_perms=page_perms, + is_parent=is_parent, + attrs={'target': '_blank', 'title': _('Create a new variant')}, priority=100) + + +@hooks.register('register_page_listing_variant_buttons') +def page_listing_more_buttons(page, page_perms, is_parent=False): + segments = Segment.objects.all() + for segment in segments: + yield Button(segment.name, reverse('wagtailadmin_pages:copy', args=[page.id]), + attrs={"title": _('Create this variant')}) From 47eff9a4f1021047d1497ebba07644482645913b Mon Sep 17 00:00:00 2001 From: Boris Besemer Date: Tue, 6 Dec 2016 14:32:54 +0100 Subject: [PATCH 2/2] adds page copy logic to dropdown --- src/personalisation/admin_urls.py | 1 + src/personalisation/models.py | 1 + src/personalisation/views.py | 28 ++++++++++++++++++++++++++-- src/personalisation/wagtail_hooks.py | 26 ++++++++++++++++---------- 4 files changed, 44 insertions(+), 12 deletions(-) diff --git a/src/personalisation/admin_urls.py b/src/personalisation/admin_urls.py index 59fad9d..82ae40b 100644 --- a/src/personalisation/admin_urls.py +++ b/src/personalisation/admin_urls.py @@ -10,4 +10,5 @@ urlpatterns = [ name='enable'), url(r'^segment/(?P[0-9]+)/disable/$', views.disable, name='disable'), + url(r'^personalisation/(?P[0-9]+)/copy/(?P[0-9]+)$', views.copy_page_view, name='copy_page') ] diff --git a/src/personalisation/models.py b/src/personalisation/models.py index 4c6f270..46ad4d9 100644 --- a/src/personalisation/models.py +++ b/src/personalisation/models.py @@ -380,3 +380,4 @@ def get_edit_handler(cls): PersonalisablePage.get_edit_handler = get_edit_handler + diff --git a/src/personalisation/views.py b/src/personalisation/views.py index 9e719b2..fa1ac8d 100644 --- a/src/personalisation/views.py +++ b/src/personalisation/views.py @@ -1,12 +1,12 @@ from __future__ import absolute_import, unicode_literals from django.http import HttpResponseRedirect -from django.shortcuts import get_object_or_404, render +from django.shortcuts import get_object_or_404, render, reverse from django.utils.translation import ugettext_lazy as _ from wagtail.contrib.modeladmin.views import CreateView from personalisation.forms import SegmentForm -from personalisation.models import Segment +from personalisation.models import Segment, PersonalisablePage def enable(request, segment_id): @@ -33,3 +33,27 @@ class CreateSegmentView(CreateView): form_class = SegmentForm template_name = 'modeladmin/personalisation/segment/create.html' header_icon = 'folder-open-1' + + +def copy_page_view(request, page_id, segment_id): + """Copy page with selected segment""" + segment = get_object_or_404(Segment, pk=segment_id) + page = get_object_or_404(PersonalisablePage, pk=page_id) + + slug = "{}-{}".format(page.slug, segment.encoded_name()) + title = "{} ({})".format(page.title, segment.name) + update_attrs = { + 'title': title, + 'slug': slug, + 'segment': segment, + 'live': False, + 'canonical_page': page, + 'is_segmented': True, + } + + new_page = page.copy(update_attrs=update_attrs, copy_revisions=False) + + edit_url = reverse('wagtailadmin_pages:edit', args=[new_page.id]) + + return HttpResponseRedirect(edit_url) + diff --git a/src/personalisation/wagtail_hooks.py b/src/personalisation/wagtail_hooks.py index ad42cf6..1f44bb7 100644 --- a/src/personalisation/wagtail_hooks.py +++ b/src/personalisation/wagtail_hooks.py @@ -178,21 +178,27 @@ def _check_for_variations(segments, page): return None - @hooks.register('register_page_listing_buttons') def page_listing_variant_buttons(page, page_perms, is_parent=False): - yield ButtonWithDropdownFromHook( - _('Variants'), - hook_name='register_page_listing_variant_buttons', - page=page, - page_perms=page_perms, - is_parent=is_parent, - attrs={'target': '_blank', 'title': _('Create a new variant')}, priority=100) + personalisable_page = PersonalisablePage.objects.filter(pk=page.pk) + segments = Segment.objects.all() + + if personalisable_page and len(segments) > 0 and not any(item.segment for item in personalisable_page): + yield ButtonWithDropdownFromHook( + _('Variants'), + hook_name='register_page_listing_variant_buttons', + page=page, + page_perms=page_perms, + is_parent=is_parent, + attrs={'target': '_blank', 'title': _('Create a new variant')}, priority=100) @hooks.register('register_page_listing_variant_buttons') def page_listing_more_buttons(page, page_perms, is_parent=False): segments = Segment.objects.all() - for segment in segments: - yield Button(segment.name, reverse('wagtailadmin_pages:copy', args=[page.id]), + current_page = PersonalisablePage.objects.filter(pk=page.pk) + available_segments = [item for item in segments if not PersonalisablePage.objects.filter(segment=item)] + + for segment in available_segments: + yield Button(segment.name, reverse('segment:copy_page', args=[page.id, segment.id]), attrs={"title": _('Create this variant')})