o
    h                     @   s  d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZmZ d d	lmZ d d
lmZ d dlmZ d dlmZ d dlmZ d dlmZ d dlmZ d dl m!Z! d dl"m#Z# d dl$m%Z% d dl&m'Z' d dl(m)Z) d dl*m+Z+m,Z,m-Z-m.Z. d dl/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z: d dl;m<Z<m=Z=m>Z>m?Z?m@Z@mAZAmBZB d dlCmDZD G dd de4e2eZEdS )    N)quote)settings)get_user_model)PermissionDenied)PrefetchQ)HttpResponse)get_object_or_404redirect)reverse)timezone)format_html)gettext)View)PublishPageRevisionAction)messages)PageActionMenu)send_notification)EditingSession)MediaContainer)EditingSessionsModule)ChecksSidePanelCommentsSidePanelPageStatusSidePanelPreviewSidePanel)get_valid_next_url_from_request)HookResponseMixin)WagtailAdminTemplateMixin)PageClassNotFoundError)	BasicLockScheduledForPublishLockWorkflowLock)COMMENTS_RELATION_NAMECommentCommentReplyPagePageSubscriptionWorkflowStateget_default_page_content_type)render_timestampc                       s8  e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Z fddZdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z!d?d@ Z"dAdB Z#dCdD Z$ fdEdFZ%dGdH Z&  Z'S )IEditViewc                 C   s   t dd| j i S )NzEditing %(page_type)s	page_type)_
page_classget_verbose_nameself r1   ^/var/www/html/ndineBlogger/venv/lib/python3.10/site-packages/wagtail/admin/views/pages/edit.pyget_page_title/   s   
zEditView.get_page_titlec                 C   
   | j  S N)pageget_admin_display_titler/   r1   r1   r2   get_page_subtitle4      
zEditView.get_page_subtitlec                 C   s   | j jrdgS dgS )Nz"wagtailadmin/pages/edit_alias.htmlzwagtailadmin/pages/edit.html)r6   alias_of_idr/   r1   r1   r2   get_template_names7   s   zEditView.get_template_namesc                 C   sP   | j rtd| j t| jjd }ntdd| j i }t| j	| d S )NzYPage '%(page_title)s' has been replaced with version from %(previous_revision_datetime)s.)
page_titleprevious_revision_datetimez'Page '%(page_title)s' has been updated.r<   )
is_revertingr,   r6   r7   r)   previous_revision
created_atr   successrequestr0   messager1   r1   r2   add_save_confirmation_message>   s   

z&EditView.add_save_confirmation_messagec                 C   s  | j jd }|j}|j}g }g }|jD ]\}}|jr#d|v r#|| d|v r,|| qg }g }	g }
|jD ]B}t|jd dg }|rK||j	|f t|jd dg }|r^|	|j	|f t|jd dg }dd	 |D }|rx|
|j	|f q6||||||	|
d
S )a,  
        Finds comments that have been changed during this request.

        Returns a tuple of 5 lists:
         - New comments
         - Deleted comments
         - Resolved comments
         - Edited comments
         - Replied comments (dict containing the instance and list of replies)
        commentsresolvedtextrepliesnew_objectsdeleted_objectschanged_objectsc                 S   s   g | ]
\}}d |v r|qS )rH   r1   ).0replychanged_fieldsr1   r1   r2   
<listcomp>z   s    z3EditView.get_commenting_changes.<locals>.<listcomp>)new_commentsdeleted_commentsresolved_commentsedited_commentsnew_repliesdeleted_repliesedited_replies)
formformsetsrJ   rK   rL   resolved_atappendformsgetattrinstance)r0   comments_formsetrQ   rR   rS   rT   changed_commentrO   rU   rV   rW   comment_formrI   r1   r1   r2   get_commenting_changesP   sH   


zEditView.get_commenting_changesc                    s
  g }| dd |d D  | dd |d D  |d s,|d s,|d s,|d s,dS tjj jd	d
d} fdd|D }tjj|d}tjj|d}t jj	 j
jjdj	|jdd	ddt|dtdi dt |iB td|dtt|d}|s|sdS dd |D }t }|D ]U\}	}
|	|v rq|	g}||	 |D ]\}||vr|
kr|| || qt|d j j
jfdd|d D fdd|d D g fdd|d D d qt|d j j
j|d |d |d dd |d D dS ) z`
        Sends notifications about any changes to comments to anyone who is subscribed.
        c                 s   s    | ]}|j V  qd S r5   pkrM   commentr1   r1   r2   	<genexpr>   s    
z9EditView.send_commenting_notifications.<locals>.<genexpr>rS   c                 s   s    | ]\}}|j V  qd S r5   rc   rM   rf   rI   r1   r1   r2   rg      s    

rU   rQ   rR   NT)r6   comment_notificationsuserc                    s    g | ]}|j  jj kr|j qS r1   )rj   rB   )rM   
subscriberr/   r1   r2   rP      s
    z:EditView.send_commenting_notifications.<locals>.<listcomp>)comment_id__in)id__inrc   user_idflat)pk__in)comment_replies__comment_id__inz
%s__pk__incomment_replies)querysetc              
   S   s@   g | ]}|t t|jjd ddtt|tjddd fqS )
comment_idTro   rd   )setlistrs   values_listr]   r"   )rM   rj   r1   r1   r2   rP      s    
updated_commentsc                       g | ]	}|j  v r|qS r1   rc   re   threadsr1   r2   rP      
    
c                    rz   r1   rc   re   r{   r1   r2   rP      r}   c                    s$   g | ]\}}|j  v r||d qS )rf   rI   rc   rh   r{   r1   r2   rP      s    
)r6   editorrQ   rS   rR   replied_commentsc                 S   s   g | ]	\}}||d qS r~   r1   rh   r1   r1   r2   rP      s    r1   )extendr&   objectsfilterr6   select_relatedr$   r#   r   excluderB   rj   rd   rx   r   r"   prefetch_relatedr   rv   addr[   r   )r0   changesrelevant_comment_idssubscribersglobal_recipient_usersrI   rF   thread_usersmailed_userscurrent_usercurrent_threadsusersrj   r1   )r0   r|   r2   send_commenting_notifications   s   










z&EditView.send_commenting_notificationsc                 C   s  |d D ]}|j || jjd q|d D ]}|j|| jjd q|d D ]}|j|| jjd q$|d D ]}|j|| jjd q4|d D ]\}}|D ]}|j || jjd qJqD|d D ]\}}|D ]}|j|| jjd qaq[|d D ]\}}|D ]}|j|| jjd qxqrd	S )
zT
        Generates log entries for any changes made to comments or replies.
        rQ   )page_revisionrj   rT   rS   rR   rU   rW   rV   N)
log_createrB   rj   log_editlog_resolve
log_delete)r0   r   revisionrf   rI   rN   r1   r1   r2   log_commenting_changes  s*   zEditView.log_commenting_changesc                 C   s   t |  tdS )NEdit)r   buttonget_edit_urlr,   r/   r1   r1   r2   get_edit_message_button$  s   z EditView.get_edit_message_buttonc                 C   s"   t jtd| jjfdtdddS )Nzwagtailadmin_pages:view_draftargsz
View draftF
new_window)r   r   r   r6   idr,   r/   r1   r1   r2   get_view_draft_message_button'  s
   z&EditView.get_view_draft_message_buttonc                 C   s   t j| jjtdddS )Nz	View liveFr   )r   r   r6   urlr,   r/   r1   r1   r2   get_view_live_message_button.  s   z%EditView.get_view_live_message_buttonc                 C   s&   t td| jjd| jjfdtdS )Nz$wagtailadmin_pages:revisions_compareliver   zCompare with live version)r   r   r   r6   r   latest_revisionr,   r/   r1   r1   r2   $get_compare_with_live_message_button1  s   z-EditView.get_compare_with_live_message_buttonc                 C   s   | j jr| j jr| jjS | j S r5   )r6   r   has_unpublished_changesreal_page_recordspecificr/   r1   r1   r2   get_page_for_status:  s   zEditView.get_page_for_statusc                 C   r4   r5   )r   get_latest_revision_as_objectr/   r1   r1   r2   
get_objectA  r9   zEditView.get_objectc                 C   s   t d| jjfdS )Nwagtailadmin_pages:editr   r   r6   r   r/   r1   r1   r2   r   D     zEditView.get_edit_urlc                    s  t tj |d| _| j | _| jj| _| jj| _	| jj
| _| jd u r7td| j d| j	j d| j	j d|d| _t| j| _d | _| jrSt | jj| jd| _|  | _| j | _| j | _| j| jj| _| j | _ | j d uo| j !| jj| _"| j# st$t%| j| _&| 'd| j| j}|r|S t(jj)| j| jjdd	id
\| _*}| j+ | _,| j,- | _.t/t0ddr| jj1p| jj23d4 | _5nd | _5t/t0dd	r| jj6| _6| 7 | _8nd | _6g | _8| j5r| j59 | _:ng | _:d | _;t< j=||fi |S )N)r   z
The page 'z>' cannot be edited because the model class used to create it (.a  ) can no longer be found in the codebase. This usually happens as a result of switching between git branches without running migrations to trigger the removal of unused ContentTypes. To edit the page, you will need to switch back to a branch where the model class is still present.revision_idbefore_edit_pageri   F)r6   rj   defaultsWAGTAIL_WORKFLOW_ENABLEDTr@   WAGTAIL_I18N_ENABLED)>r	   r%   r   prefetch_workflow_statesr   get_latest_revisionr   scheduled_revisioncached_content_typepage_content_typespecific_classr-   r   	app_labelmodelgetr   boolr>   r?   	revisionsr   r6   
get_parentparent get_scheduled_revision_as_objectscheduled_pagepermissions_for_userrB   rj   
page_permsget_locklockfor_userlocked_for_usercan_editr   r   next_urlrun_hookr&   get_or_createsubscriptionget_edit_handleredit_handlerget_form_class
form_classr]   r   current_workflow_stateworkflow_statesorder_bylastworkflow_statelocaleget_translationstranslationsall_tasks_with_statusworkflow_taskserrors_debugsuperdispatch)r0   rB   page_idkwargsresponsecreated	__class__r1   r2   r   G  sv   










zEditView.dispatchc                 O   s   | j rb| j | jj}|rbt| j tr(| j r(td|t	d| j
jfdtd}t| j trF| j rFtd|t	d| j
j| jjgdtd}t| j tsY| jrYtj| j|dd n	tj| j|dd | j| j
| j| j| jjd	| _d
| _|  | _| |  S )Nz{} <span class="buttons"><button type="button" class="button button-small button-secondary" data-action="w-action#post" data-controller="w-action" data-w-action-url-value="{}">{}</button></span>zwagtailadmin_pages:unlockr   Unlockz'wagtailadmin_pages:revisions_unschedulezCancel scheduled publishr   )
extra_tagsr^   r   parent_pager   F)r   get_messagerB   rj   
isinstancer   r   
can_unlockr   r   r6   r   r,   r    can_unscheduler   rd   r   r   warninginfor   r   r   rX   has_unsaved_changesr   page_for_statusrender_to_responseget_context_data)r0   rB   r   r   lock_messager1   r1   r2   r     sL   


zEditView.getc                 C   s8   t dd| j i }tj| j||  |  gd d S )Nz5Workflow on page '%(page_title)s' has been cancelled.r<   buttons)r,   r6   r7   r   rA   rB   r   r   rC   r1   r1   r2   (add_cancel_workflow_confirmation_message  s   

z1EditView.add_cancel_workflow_confirmation_messagec                 O   s   | j jr	tddS | j| jj| jj| j | j| j| jj	d| _
t| jjdo1| jo1| j| jj	| _| j
 rA| jsA| | j
S | | j
S )Ni  )statusr   zaction-cancel-workflow)r6   r:   r   r   rB   POSTFILESr   r   rj   rX   r   r   r   user_can_cancelis_cancelling_workflowis_validr   
form_validform_invalid)r0   rB   r   r   r1   r1   r2   post  s$   

zEditView.postc                 C   s<   | j jd | _| jj| j| j j}dd |D }| j|v S )Nzworkflow-action-namec                 S   s   g | ]\}}}|qS r1   r1   )rM   nameverbose_namemodalr1   r1   r2   rP     s    
z5EditView.workflow_action_is_valid.<locals>.<listcomp>)rB   r   workflow_actionr6   current_workflow_taskget_actionsrj   )r0   available_actionsavailable_action_namesr1   r1   r2   workflow_action_is_valid  s   

z!EditView.workflow_action_is_validc                 C   s   | j  | _| jjdr| j r|  S | jjdr&| j	 r&| 
 S | jjdrA| j	 rA| jrA| j| jjrA|  S | jjdrP|  rP|  S | jrW|  S |  S )Nzaction-publishzaction-submitzaction-restart-workflowzaction-workflow-action)rX   has_changedhas_content_changesrB   r   r   r   can_publishpublish_actioncan_submit_for_moderationsubmit_actionr   r   rj   restart_workflow_actionr  perform_workflow_actionr   cancel_workflow_actionsave_actionr0   rX   r1   r1   r2   r     s2   zEditView.form_validc                 C   s   | j j| jj d| _| j  | jj| jjd| jd}| 	  | j
r8d| j jv r8|  }| || | | | d| j| j}|rE|S |  S )NcommitTrj   
log_actionr?   rF   after_edit_page)rX   saver6   r   r   save_revisionrB   rj   r?   rE   r  rY   rb   r   r   r   redirect_and_remainr0   r   r   r   r1   r1   r2   r    s    

zEditView.save_actionc                 C   s  | j j| jj d| _| j  | jj| jjd| jd}| jj	}| 
d| j| j}|r-|S t|| jj| j| jd}|jdd | jrWd| j jv rW|  }| || | | | jjjj| jjd| _| 
d	| j| j}|rp|S |r|t kr| jrtd
t| jj| j d }n| jjrtdd| j i }ntdd| j i }tj| j||  gd n>| jrtdt| jj| j d }ntdd| j i }g }| jj d ur|!| "  |!|   tj| j||d | 
d| j| j}|r|S | # S )Nr  Tr  before_publish_page)rj   changedr?   )skip_permission_checksrF   rc   after_publish_pagezgVersion from %(previous_revision_datetime)s of page '%(page_title)s' has been scheduled for publishing.)r=   r<   zQPage '%(page_title)s' is live and this version has been scheduled for publishing.r<   z8Page '%(page_title)s' has been scheduled for publishing.r   zFVersion from %(datetime)s of page '%(page_title)s' has been published.)datetimer<   z)Page '%(page_title)s' has been published.r  )$rX   r  r6   r   r   r  rB   rj   r?   
go_live_atr   r   r  executerY   rb   r   r   r   r   r   rd   r   nowr>   r,   r)   r@   r7   r   rA   r   r   r[   r   redirect_away)r0   r   r%  r   actionr   rD   r   r1   r1   r2   r  ,  s   




zEditView.publish_actionc                 C   s   | j j| jj d| _| j  | jj| jjd| jd}| j	r4d| j j
v r4|  }| || | | | jrG| jjtjkrG| j| jj n| j }|| j| jj tdd| j i }tj| j||  |  gd | d| j| j}|r||S |  S )	Nr  Tr  rF   z8Page '%(page_title)s' has been submitted for moderation.r<   r   r  )rX   r  r6   r   r   r  rB   rj   r?   r  rY   rb   r   r   r   r   r'   STATUS_NEEDS_CHANGESresumeget_workflowstartr,   r7   r   rA   r   r   r   r(  r0   r   r   workflowrD   r   r1   r1   r2   r    s>   



	zEditView.submit_actionc                 C   s   | j j| jj d| _| j  | jj| jjd| jd}| j	r4d| j j
v r4|  }| || | | | jj| jjd | j }|| j| jj tdd| j i }tj| j||  |  gd | d	| j| j}|rr|S |  S )
Nr  Tr  rF   rj   z5Workflow on page '%(page_title)s' has been restarted.r<   r   r  )rX   r  r6   r   r   r  rB   rj   r?   r  rY   rb   r   r   r   cancelr,  r-  r,   r7   r   rA   r   r   r   r(  r.  r1   r1   r2   r    s8   



	z EditView.restart_workflow_actionc                 C   s   | j j| jj d| _| j  | jr9| jj| jjd| j	r | j
nd d}d| j jv r9|  }| || | | | jjdd}t|}| jjj| jj| jj| jfi | |   | d| j| j}|ri|S |  S )Nr  Tr  rF   zworkflow-action-extra-dataz{}r  )rX   r  r6   r   r   r  r  rB   rj   r>   r?   rY   rb   r   r   r   r   jsonloadsr  	on_actioncurrent_workflow_task_stater  rE   r   r(  )r0   r   r   extra_workflow_data_jsonextra_workflow_datar   r1   r1   r2   r    s8   


z EditView.perform_workflow_actionc                 C   s   | j j| jjd | jj| jj d| _| j  | jj	| jjd| j
d}| jr=d| jjv r=|  }| || | | |   | d| j| j}|rN|S |  S )Nr0  r  Tr  rF   r  )r   r1  rB   rj   rX   r  r6   r   r   r  r?   r  rY   rb   r   r   r   r   r  r  r1   r1   r2   r    s"   

zEditView.cancel_workflow_actionc                 C   s"   | j rt| j S td| j jS )Nwagtailadmin_explore)r   r
   r6   r   r   r/   r1   r1   r2   r(  '  s   
zEditView.redirect_awayc                 C   s(   |   }| jr|dt| j 7 }t|S )Nz?next=%s)r   r   r   r
   )r0   
target_urlr1   r1   r2   r  /  s   zEditView.redirect_and_remainc                 C   s   | j r%| jj| jjd |   | j | _| jd uo"| j	| jj| _
n| j
r2t| jtd nt| jtd| j t| jjtdd | jj D  | _d| _|  | _| |  S )Nr0  z+The page could not be saved as it is lockedz4The page could not be saved due to validation errorsc                 S   s    g | ]\}}|j r||j fqS r1   )errors)rM   r  formsetr1   r1   r2   rP   L  s    z)EditView.form_invalid.<locals>.<listcomp>T)r   r   r1  rB   rj   r   r6   r   r   r   r   r   errorr,   validation_errorrX   reprr:  rY   itemsr   r   r   r   r   r   r  r1   r1   r2   r  6  s0   


zEditView.form_invalidc                 C   s   t d| jjgdS )Nz"wagtailadmin_pages:preview_on_editr   r   r/   r1   r1   r2   get_preview_urlX  r   zEditView.get_preview_urlc                 C   s.   | j | jj}| rtd| j jgdS d S )Nzwagtailadmin_pages:historyr   )r6   r   rB   rj   can_view_revisionsr   r   )r0   permissionsr1   r1   r2   get_history_url[  s   zEditView.get_history_urlc              
   C   s   t | j| j| jj| j| j| j| j| j	 dg}| j
 r5|t| j| j|  d |t| j| j | jjrC|t| j| j t|S )N)show_schedule_publishing_togglelive_objectscheduled_objectr   r   r   )preview_url)r   r6   rB   rX   rD  r   r   r   r   r   is_previewabler[   r   r@  r   show_comments_toggler   r   )r0   side_panelsr1   r1   r2   get_side_panels`  s*   
zEditView.get_side_panelsc                 C   sd   t   t }t jj| jj|| jjt	
 d}t|tddd| jj|jfdtd|jfdg | jjS )N)rj   content_type	object_idlast_seen_atz"wagtailadmin_editing_sessions:pingwagtailcorer6   r   z%wagtailadmin_editing_sessions:release)r   cleanupr(   r   createrB   rj   r6   rd   r   r'  r   r   r   latest_revision_id)r0   rL  sessionr1   r1   r2   get_editing_sessionsx  s*   zEditView.get_editing_sessionsc                 C   s   t | jd| j| j| jdS )Nedit)viewr6   r   r   )r   rB   r6   r   r   r/   r1   r1   r2   get_action_menu  s   zEditView.get_action_menuc              	      s\  t  jdi |}| j| jj}| jj| j| j| jd}| 	 }| 
 }t|| j||gj}|i d| jd| jd| jd|d| jd|d|d	| jd
| jd|  d|  d| jd| jd| jrp| jjrp| jnd d| jjd| jottdddtd| jjfd| j st| jt o|! t| jt"o|# | j$|| % d |S )N)r^   rB   rX   r6   r   rL  r   r   action_menurJ  rX   next
action_urlhistory_urlr   page_lockedr   current_task_statepublishing_will_cancel_workflow"WAGTAIL_WORKFLOW_CANCEL_ON_PUBLISHT!confirm_workflow_cancellation_urlz0wagtailadmin_pages:confirm_workflow_cancellationr   )user_can_lockuser_can_unlockr   mediaediting_sessionsr1   )&r   r   r6   r   rB   rj   r   get_bound_panelrX   rW  rK  r   rc  updater   r   r   r   r   rC  r   r   r   	is_activer5  r   r]   r   r   r   r   r   r!   can_lockr   r   r   rT  )r0   r   context
user_permsbound_panelrX  rJ  rc  r   r1   r2   r     s~   	

#zEditView.get_context_datac                    s(    fdd j  ddddD S )Nc                    s6   g | ]}|  jj r|jtd |jgddqS )r   r   )r   r   )r   rB   rj   r   r   r   r   )rM   translationr/   r1   r2   rP     s    z-EditView.get_translations.<locals>.<listcomp>r   r   depth)r6   r   onlyr   r/   r1   r/   r2   r     s
   

zEditView.get_translations)(__name__
__module____qualname__r3   r8   r;   rE   rb   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r   r  r  r  r  r  r  r(  r  r  r@  rC  rK  rT  rW  r   r   __classcell__r1   r1   r   r2   r*   .   sJ    :~	R-
`/*'"	0r*   )Fr2  urllib.parser   django.confr   django.contrib.authr   django.core.exceptionsr   django.db.modelsr   r   django.httpr   django.shortcutsr	   r
   django.urlsr   django.utilsr   django.utils.htmlr   django.utils.translationr   r,   django.views.generic.baser   %wagtail.actions.publish_page_revisionr   wagtail.adminr   wagtail.admin.action_menur   wagtail.admin.mailr   wagtail.admin.modelsr   wagtail.admin.ui.componentsr   !wagtail.admin.ui.editing_sessionsr   wagtail.admin.ui.side_panelsr   r   r   r   wagtail.admin.utilsr   wagtail.admin.views.genericr    wagtail.admin.views.generic.baser   wagtail.exceptionsr   wagtail.locksr   r    r!   wagtail.modelsr"   r#   r$   r%   r&   r'   r(   wagtail.utils.timestampsr)   r*   r1   r1   r1   r2   <module>   s:    $	