Skip to content

Commit e82cc3f

Browse files
committed
Added placeholder & page operation signals
1 parent 9e508ff commit e82cc3f

25 files changed

+2004
-510
lines changed

CHANGELOG.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
* Removed the deprecated ``add_url()``, ``edit_url()``, ``move_url()``, ``delete_url()``, ``copy_url()`` properties of
2828
CMSPlugin model.
2929
* Deprecated ``frontend_edit_template`` of CMSPluginBase.
30+
* Introduced placeholder operation signals.
3031

3132

3233
=== 3.4.1 (2016-10-04) ===

cms/admin/forms.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,7 @@ class PluginAddValidationForm(forms.Form):
751751
required=False,
752752
)
753753
plugin_type = forms.CharField(required=True)
754+
cms_path = forms.CharField(required=True)
754755

755756
def clean_plugin_type(self):
756757
plugin_type = self.cleaned_data['plugin_type']

cms/admin/pageadmin.py

Lines changed: 125 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
from collections import namedtuple
44
import json
55
import sys
6+
import uuid
67

78

89
import django
@@ -35,6 +36,7 @@
3536
from django.views.decorators.http import require_POST
3637
from django.http import QueryDict
3738

39+
from cms import operations
3840
from cms.admin.change_list import CMSChangeList
3941
from cms.admin.forms import (
4042
AdvancedSettingsForm,
@@ -52,6 +54,7 @@
5254
)
5355
from cms.models import Page, Title, CMSPlugin, PagePermission, GlobalPagePermission, StaticPlaceholder
5456
from cms.plugin_pool import plugin_pool
57+
from cms.signals import pre_obj_operation, post_obj_operation
5558
from cms.toolbar_pool import toolbar_pool
5659
from cms.utils import permissions, get_language_from_request, copy_plugins
5760
from cms.utils import page_permissions
@@ -114,6 +117,26 @@ def get_urls(self):
114117
url_patterns += super(PageAdmin, self).get_urls()
115118
return url_patterns
116119

120+
def _send_pre_page_operation(self, request, operation, **kwargs):
121+
token = str(uuid.uuid4())
122+
pre_obj_operation.send(
123+
sender=self.__class__,
124+
operation=operation,
125+
request=request,
126+
token=token,
127+
**kwargs
128+
)
129+
return token
130+
131+
def _send_post_page_operation(self, request, operation, token, **kwargs):
132+
post_obj_operation.send(
133+
sender=self.__class__,
134+
operation=operation,
135+
request=request,
136+
token=token,
137+
**kwargs
138+
)
139+
117140
def save_model(self, request, obj, form, change):
118141
"""
119142
Move the page in the tree if necessary and save every placeholder
@@ -387,6 +410,22 @@ def change_view(self, request, object_id, form_url='', extra_context=None):
387410
response._headers['location'] = (location[0], "%s?language=%s" % (location[1], tab_language))
388411
return response
389412

413+
def delete_model(self, request, obj):
414+
operation_token = self._send_pre_page_operation(
415+
request,
416+
operation=operations.DELETE_PAGE,
417+
obj=obj,
418+
)
419+
420+
super(PageAdmin, self).delete_model(request, obj)
421+
422+
self._send_post_page_operation(
423+
request,
424+
operation=operations.DELETE_PAGE,
425+
token=operation_token,
426+
obj=obj,
427+
)
428+
390429
def get_copy_dialog(self, request, page_id):
391430
if not get_cms_setting('PERMISSION'):
392431
return HttpResponse('')
@@ -697,7 +736,23 @@ def move_page(self, request, page_id, extra_context=None):
697736
force_text(_("Error! You don't have permissions to move "
698737
"this page. Please reload the page"))))
699738

739+
operation_token = self._send_pre_page_operation(
740+
request,
741+
operation=operations.MOVE_PAGE,
742+
obj=page,
743+
)
744+
700745
page.move_page(tb_target, tb_position)
746+
747+
# Fetch updated tree attributes from the database
748+
page.refresh_from_db()
749+
750+
self._send_post_page_operation(
751+
request,
752+
operation=operations.MOVE_PAGE,
753+
token=operation_token,
754+
obj=page,
755+
)
701756
return jsonify_request(HttpResponse(status=200))
702757

703758
def get_permissions(self, request, page_id):
@@ -757,6 +812,7 @@ def copy_language(self, request, page_id):
757812

758813
if not target_language or not target_language in get_language_list():
759814
return HttpResponseBadRequest(force_text(_("Language must be set to a supported language!")))
815+
760816
for placeholder in placeholders:
761817
plugins = list(
762818
placeholder.get_plugins(language=source_language).order_by('path'))
@@ -841,28 +897,69 @@ def copy_page(self, request, page_id, extra_context=None):
841897
@require_POST
842898
@transaction.atomic
843899
def publish_page(self, request, page_id, language):
900+
all_published = True
901+
844902
try:
845-
page = Page.objects.get(id=page_id, publisher_is_draft=True)
903+
page = Page.objects.get(
904+
id=page_id,
905+
title_set__language=language,
906+
publisher_is_draft=True,
907+
)
846908
except Page.DoesNotExist:
847909
page = None
848-
# ensure user has permissions to publish this page
849-
all_published = True
850-
if page:
851-
if not self.has_publish_permission(request, obj=page):
852-
return HttpResponseForbidden(force_text(_("You do not have permission to publish this page")))
853-
published = page.publish(language)
854-
if not published:
855-
all_published = False
910+
856911
statics = request.GET.get('statics', '')
912+
857913
if not statics and not page:
858-
raise Http404("No page or stack found for publishing.")
914+
raise Http404("No page or static placeholder found for publishing.")
915+
916+
# ensure user has permissions to publish this page
917+
if page and not self.has_publish_permission(request, obj=page):
918+
return HttpResponseForbidden(force_text(_("You do not have permission to publish this page")))
919+
920+
if page:
921+
operation_token = self._send_pre_page_operation(
922+
request,
923+
operation=operations.PUBLISH_PAGE_TRANSLATION,
924+
obj=page,
925+
translation=page.get_title_obj(language=language),
926+
)
927+
all_published = page.publish(language)
928+
page = page.reload()
929+
self._send_post_page_operation(
930+
request,
931+
operation=operations.PUBLISH_PAGE_TRANSLATION,
932+
token=operation_token,
933+
obj=page,
934+
translation=page.get_title_obj(language=language),
935+
)
936+
859937
if statics:
860-
static_ids = statics .split(',')
861-
for pk in static_ids:
862-
static_placeholder = StaticPlaceholder.objects.get(pk=pk)
938+
static_ids = statics.split(',')
939+
static_placeholders = StaticPlaceholder.objects.filter(pk__in=static_ids)
940+
941+
for static_placeholder in static_placeholders.iterator():
942+
# TODO: Maybe only send one signal...
943+
# this would break the obj signal format though
944+
operation_token = self._send_pre_page_operation(
945+
request,
946+
operation=operations.PUBLISH_STATIC_PLACEHOLDER,
947+
obj=static_placeholder,
948+
target_language=language,
949+
)
950+
863951
published = static_placeholder.publish(request, language)
952+
953+
self._send_post_page_operation(
954+
request,
955+
operation=operations.PUBLISH_STATIC_PLACEHOLDER,
956+
token=operation_token,
957+
obj=static_placeholder,
958+
target_language=language,
959+
)
864960
if not published:
865961
all_published = False
962+
866963
if page:
867964
if all_published:
868965
if page.get_publisher_state(language) == PUBLISHER_STATE_PENDING:
@@ -1008,6 +1105,13 @@ def delete_translation(self, request, object_id, extra_context=None):
10081105
if perms_needed:
10091106
raise PermissionDenied
10101107

1108+
operation_token = self._send_pre_page_operation(
1109+
request,
1110+
operation=operations.DELETE_PAGE_TRANSLATION,
1111+
obj=obj,
1112+
translation=titleobj,
1113+
)
1114+
10111115
message = _('Title and plugins with language %(language)s was deleted') % {
10121116
'language': force_text(get_language_object(language)['name'])
10131117
}
@@ -1023,6 +1127,14 @@ def delete_translation(self, request, object_id, extra_context=None):
10231127
if public:
10241128
public.save()
10251129

1130+
self._send_post_page_operation(
1131+
request,
1132+
operation=operations.DELETE_PAGE_TRANSLATION,
1133+
token=operation_token,
1134+
obj=obj,
1135+
translation=titleobj,
1136+
)
1137+
10261138
if not self.has_change_permission(request, None):
10271139
return HttpResponseRedirect(admin_reverse('index'))
10281140
return HttpResponseRedirect(admin_reverse('cms_page_changelist'))

0 commit comments

Comments
 (0)