3
3
from collections import namedtuple
4
4
import json
5
5
import sys
6
+ import uuid
6
7
7
8
8
9
import django
35
36
from django .views .decorators .http import require_POST
36
37
from django .http import QueryDict
37
38
39
+ from cms import operations
38
40
from cms .admin .change_list import CMSChangeList
39
41
from cms .admin .forms import (
40
42
AdvancedSettingsForm ,
52
54
)
53
55
from cms .models import Page , Title , CMSPlugin , PagePermission , GlobalPagePermission , StaticPlaceholder
54
56
from cms .plugin_pool import plugin_pool
57
+ from cms .signals import pre_obj_operation , post_obj_operation
55
58
from cms .toolbar_pool import toolbar_pool
56
59
from cms .utils import permissions , get_language_from_request , copy_plugins
57
60
from cms .utils import page_permissions
@@ -114,6 +117,26 @@ def get_urls(self):
114
117
url_patterns += super (PageAdmin , self ).get_urls ()
115
118
return url_patterns
116
119
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
+
117
140
def save_model (self , request , obj , form , change ):
118
141
"""
119
142
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):
387
410
response ._headers ['location' ] = (location [0 ], "%s?language=%s" % (location [1 ], tab_language ))
388
411
return response
389
412
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
+
390
429
def get_copy_dialog (self , request , page_id ):
391
430
if not get_cms_setting ('PERMISSION' ):
392
431
return HttpResponse ('' )
@@ -697,7 +736,23 @@ def move_page(self, request, page_id, extra_context=None):
697
736
force_text (_ ("Error! You don't have permissions to move "
698
737
"this page. Please reload the page" ))))
699
738
739
+ operation_token = self ._send_pre_page_operation (
740
+ request ,
741
+ operation = operations .MOVE_PAGE ,
742
+ obj = page ,
743
+ )
744
+
700
745
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
+ )
701
756
return jsonify_request (HttpResponse (status = 200 ))
702
757
703
758
def get_permissions (self , request , page_id ):
@@ -757,6 +812,7 @@ def copy_language(self, request, page_id):
757
812
758
813
if not target_language or not target_language in get_language_list ():
759
814
return HttpResponseBadRequest (force_text (_ ("Language must be set to a supported language!" )))
815
+
760
816
for placeholder in placeholders :
761
817
plugins = list (
762
818
placeholder .get_plugins (language = source_language ).order_by ('path' ))
@@ -841,28 +897,69 @@ def copy_page(self, request, page_id, extra_context=None):
841
897
@require_POST
842
898
@transaction .atomic
843
899
def publish_page (self , request , page_id , language ):
900
+ all_published = True
901
+
844
902
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
+ )
846
908
except Page .DoesNotExist :
847
909
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
+
856
911
statics = request .GET .get ('statics' , '' )
912
+
857
913
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
+
859
937
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
+
863
951
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
+ )
864
960
if not published :
865
961
all_published = False
962
+
866
963
if page :
867
964
if all_published :
868
965
if page .get_publisher_state (language ) == PUBLISHER_STATE_PENDING :
@@ -1008,6 +1105,13 @@ def delete_translation(self, request, object_id, extra_context=None):
1008
1105
if perms_needed :
1009
1106
raise PermissionDenied
1010
1107
1108
+ operation_token = self ._send_pre_page_operation (
1109
+ request ,
1110
+ operation = operations .DELETE_PAGE_TRANSLATION ,
1111
+ obj = obj ,
1112
+ translation = titleobj ,
1113
+ )
1114
+
1011
1115
message = _ ('Title and plugins with language %(language)s was deleted' ) % {
1012
1116
'language' : force_text (get_language_object (language )['name' ])
1013
1117
}
@@ -1023,6 +1127,14 @@ def delete_translation(self, request, object_id, extra_context=None):
1023
1127
if public :
1024
1128
public .save ()
1025
1129
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
+
1026
1138
if not self .has_change_permission (request , None ):
1027
1139
return HttpResponseRedirect (admin_reverse ('index' ))
1028
1140
return HttpResponseRedirect (admin_reverse ('cms_page_changelist' ))
0 commit comments