U
    {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                       s   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 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+d, Zd-d. Zd/d0 Zd1d2 Zd3d4 Zd5d6 Zd7d8 Zd9d: Zd;d< Z d=d> Z! fd?d@Z"dAdB Z#  Z$S )CEditViewc                 C   s   t dd| j i S )NzEditing %(page_type)sZ	page_type)_
page_classZget_verbose_nameself r/   f/var/www/dating/data/www/fatepal.com/env/lib/python3.8/site-packages/wagtail/admin/views/pages/edit.pyget_page_title/   s     zEditView.get_page_titlec                 C   s
   | j  S N)pageget_admin_display_titler-   r/   r/   r0   get_page_subtitle4   s    zEditView.get_page_subtitlec                 C   s   | j jrdgS dgS d S )Nz"wagtailadmin/pages/edit_alias.htmlzwagtailadmin/pages/edit.html)r3   alias_of_idr-   r/   r/   r0   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.r8   )
is_revertingr+   r3   r4   r)   previous_revision
created_atr   successrequestr.   messager/   r/   r0   add_save_confirmation_message>   s    
 z&EditView.add_save_confirmation_messagec                 C   s  | j jd }|j}|j}g }g }|jD ]2\}}|jrFd|krF|| d|kr&|| q&g }g }	g }
|jD ]}t|jd dg }|r||j	|f t|jd dg }|r|	|j	|f t|jd dg }dd	 |D }|rl|
|j	|f ql||||||	|
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)
        commentsZresolvedtextrepliesnew_objectsdeleted_objectschanged_objectsc                 S   s   g | ]\}}d |kr|qS )rC   r/   ).0replychanged_fieldsr/   r/   r0   
<listcomp>z   s     z3EditView.get_commenting_changes.<locals>.<listcomp>)new_commentsdeleted_commentsresolved_commentsedited_commentsnew_repliesdeleted_repliesedited_replies)
formformsetsrE   rF   rG   Zresolved_atappendZformsgetattrinstance)r.   Zcomments_formsetrL   rM   rN   rO   Zchanged_commentrJ   rP   rQ   rR   Zcomment_formrD   r/   r/   r0   get_commenting_changesP   sD    

zEditView.get_commenting_changesc                    s  g }| dd |d D  | dd |d D  |d sX|d sX|d sX|d sXd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f dt |iB td|dtt|d}|s|sdS dd |D }t }|D ]\}	}
|	|kr:q$|	g}||	 |D ]2\}||krN|
krN|| || qNt|d j j
jfdd|d D fdd|d D g fdd|d D d q$t|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 r2   pkrH   commentr/   r/   r0   	<genexpr>   s    z9EditView.send_commenting_notifications.<locals>.<genexpr>rN   c                 s   s   | ]\}}|j V  qd S r2   rY   rH   r\   rD   r/   r/   r0   r]      s    rP   rL   rM   NT)r3   comment_notificationsuserc                    s    g | ]}|j  jj kr|j qS r/   )r`   r>   )rH   
subscriberr-   r/   r0   rK      s   z:EditView.send_commenting_notifications.<locals>.<listcomp>)Zcomment_id__in)Zid__inrY   Zuser_idZflat)Zpk__in)Zcomment_replies__comment_id__inz
%s__pk__incomment_replies)Zquerysetc              
   S   s@   g | ]8}|t t|jjd ddtt|tjddd fqS )Z
comment_idTrb   rZ   )setlistrc   values_listrV   r"   )rH   r`   r/   r/   r0   rK      s   
 Zupdated_commentsc                    s   g | ]}|j  kr|qS r/   rY   r[   threadsr/   r0   rK      s   
c                    s   g | ]}|j  kr|qS r/   rY   r[   rg   r/   r0   rK      s   
c                    s$   g | ]\}}|j  kr||d qS )r\   rD   rY   r^   rg   r/   r0   rK      s
   
)r3   ZeditorrL   rN   rM   Zreplied_commentsc                 S   s   g | ]\}}||d qS ri   r/   r^   r/   r/   r0   rK      s   )extendr&   objectsfilterr3   select_relatedr$   r#   r   excluder>   r`   rZ   rf   r   r"   Zprefetch_relatedr   rd   addrU   r   )r.   changesZrelevant_comment_idsZsubscribersZglobal_recipient_usersrD   rB   Zthread_usersZmailed_usersZcurrent_userZcurrent_threadsZusersr`   r/   )r.   rh   r0   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 qH|d D ]}|j|| jjd qh|d D ]$\}}|D ]}|j || jjd qq|d D ]$\}}|D ]}|j|| jjd qq|d D ]$\}}|D ]}|j|| jjd qqd	S )
zT
        Generates log entries for any changes made to comments or replies.
        rL   )Zpage_revisionr`   rO   rN   rM   rP   rR   rQ   N)Z
log_creater>   r`   Zlog_editZlog_resolveZ
log_delete)r.   rp   revisionr\   rD   rI   r/   r/   r0   log_commenting_changes  s"    zEditView.log_commenting_changesc                 C   s   t td| jjfdtdS )Nwagtailadmin_pages:editargsZEditr   buttonr   r3   idr+   r-   r/   r/   r0   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_draftru   z
View draftFZ
new_windowrw   r-   r/   r/   r0   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   rx   r3   urlr+   r-   r/   r/   r0   get_view_live_message_button0  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liveru   zCompare with live version)r   rx   r   r3   ry   latest_revisionr+   r-   r/   r/   r0   $get_compare_with_live_message_button3  s    z-EditView.get_compare_with_live_message_buttonc                 C   s"   | j jr| j jr| jjS | j S d S r2   )r3   r   Zhas_unpublished_changesreal_page_recordZspecificr-   r/   r/   r0   get_page_for_status<  s    zEditView.get_page_for_statusc                    s  t tj |d| _| j | _| jj| _| jj| _	| jj
| _| jd krntd| j d| j	j d| j	j d| j | _| j | _| j | _| j| jj| _| j | _| jd k	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)t*d
drj| jj+pd| jj,-d. | _/nd | _/t)t*ddr| jj0| _0| 1 | _2nd | _0g | _2| j/r| j/3 | _4ng | _4d | _5t6 7|S )Nry   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.Zbefore_edit_pager_   F)r3   r`   defaultsZWAGTAIL_WORKFLOW_ENABLEDTr<   ZWAGTAIL_I18N_ENABLED)8r	   r%   rk   Zprefetch_workflow_statesr   Zget_latest_revisionr   scheduled_revisionZcached_content_typepage_content_typespecific_classr,   r   Z	app_labelmodelZget_latest_revision_as_objectr3   
get_parentparentZ get_scheduled_revision_as_objectscheduled_pagepermissions_for_userr>   r`   
page_permsget_locklockfor_userlocked_for_usercan_editr   r   next_urlrun_hookr&   Zget_or_createsubscriptionZget_edit_handleredit_handlerZget_form_class
form_classrV   r   Zcurrent_workflow_stateZworkflow_statesZorder_bylastworkflow_statelocaleget_translationstranslationsZall_tasks_with_statusworkflow_taskserrors_debugsuperdispatch)r.   r>   Zpage_idresponsecreated	__class__r/   r0   r   C  sd     



 

 

zEditView.dispatchc                 C   s   | j r| j | jj}|rt| j trP| j rPtd|t	d| j
jfdtd}t| j tr| j rtd|t	d| j
j| jjgdtd}t| j ts| jrt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:unlockru   ZUnlockz'wagtailadmin_pages:revisions_unschedulezCancel scheduled publishr   )Z
extra_tagsrW   r   Zparent_pager   F)r   Zget_messager>   r`   
isinstancer   r   
can_unlockr   r   r3   ry   r+   r    Zcan_unscheduler   rZ   r   r   warninginfor   r   r   rS   has_unsaved_changesr   page_for_statusrender_to_responseget_context_data)r.   r>   Zlock_messager/   r/   r0   get  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.r8   buttons)r+   r3   r4   r   r=   r>   r|   rz   r?   r/   r/   r0   (add_cancel_workflow_confirmation_message  s     z1EditView.add_cancel_workflow_confirmation_messagec                 C   s   | j jrtddS | j| jj| jj| j | j| j| jj	d| _
t| jjdob| job| j| jj	| _| j
 r| js| | j
S | | j
S d S )Ni  )statusr   zaction-cancel-workflow)r3   r6   r   r   r>   POSTZFILESr   r   r`   rS   boolr   r   user_can_cancelis_cancelling_workflowZis_validr   
form_validform_invalid)r.   r>   r/   r/   r0   post  s$    

zEditView.postc                 C   s<   | j jd | _| jj| j| j j}dd |D }| j|kS )Nzworkflow-action-namec                 S   s   g | ]\}}}|qS r/   r/   )rH   nameZverbose_nameZmodalr/   r/   r0   rK     s    z5EditView.workflow_action_is_valid.<locals>.<listcomp>)r>   r   workflow_actionr3   current_workflow_taskZget_actionsr`   )r.   Zavailable_actionsZavailable_action_namesr/   r/   r0   workflow_action_is_valid  s     z!EditView.workflow_action_is_validc                 C   s   t | jjd| _| jr6t| jj| jjdd| _| j	
 | _| jjdrb| j rb|  S | jjdr| j r|  S | jjdr| j r| jr| j| jjr|  S | jjdr|  r|  S | jr|  S |  S d S )Nrr   r   zaction-publishzaction-submitzaction-restart-workflowzaction-workflow-action)r   r>   r   r   r:   r	   r3   Z	revisionsr;   rS   Zhas_changedhas_content_changesr   Zcan_publishpublish_actionZcan_submit_for_moderationsubmit_actionr   r   r`   restart_workflow_actionr   perform_workflow_actionr   cancel_workflow_actionsave_actionr.   rS   r/   r/   r0   r     s>     zEditView.form_validc                 C   s   | j j| jj d| _| j  | jj| jjd| jr:| j	nd d}| 
  | jrzd| j jkrz|  }| || | | | d| j| j}|r|S |  S )NcommitTr`   Z
log_actionr;   rB   after_edit_page)rS   saver3   r   r   save_revisionr>   r`   r:   r;   rA   r   rT   rX   rs   rq   r   redirect_and_remainr.   rr   rp   r   r/   r/   r0   r     s     

zEditView.save_actionc                 C   s(  | j j| jj d| _| j  | jj| jjd| jr:| j	nd d}| jj
}| d| j| j}|rd|S t|| jj| j| jr~| j	nd d}|jdd | jrd| j jkr|  }| || | | | jjjj| jjd| _| d	| j| j}|r|S |r|t kr| jr2td
t| j	j| j d }n8| jjrTt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 k	r|!| "  |!|   tj| j||d | d| j| j}|r |S | # S )Nr   Tr   Zbefore_publish_page)r`   changedr;   )Zskip_permission_checksrB   rY   Zafter_publish_pagezgVersion from %(previous_revision_datetime)s of page '%(page_title)s' has been scheduled for publishing.)r9   r8   zQPage '%(page_title)s' is live and this version has been scheduled for publishing.r8   z8Page '%(page_title)s' has been scheduled for publishing.r   zFVersion from %(datetime)s of page '%(page_title)s' has been published.)datetimer8   z)Page '%(page_title)s' has been published.r   )$rS   r   r3   r   r   r   r>   r`   r:   r;   
go_live_atr   r   r   executerT   rX   rs   rq   r   rk   r   rZ   r   nowr+   r)   r<   r4   r   r=   rz   r}   rU   r~   redirect_away)r.   rr   r   r   actionrp   r@   r   r/   r/   r0   r   )  s    



  
 zEditView.publish_actionc                 C   s  | j j| jj d| _| j  | jj| jjd| jr:| j	nd d}| j
rrd| j jkrr|  }| || | | | jr| jjtjkr| 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   rB   z8Page '%(page_title)s' has been submitted for moderation.r8   r   r   )rS   r   r3   r   r   r   r>   r`   r:   r;   r   rT   rX   rs   rq   r   r   r'   ZSTATUS_NEEDS_CHANGESresumeget_workflowstartr+   r4   r   r=   r|   rz   r   r   r.   rr   rp   Zworkflowr@   r   r/   r/   r0   r     sB    


 	zEditView.submit_actionc                 C   s   | j j| jj d| _| j  | jj| jjd| jr:| j	nd d}| j
rrd| j jkrr|  }| || | | | jj| jjd | j }|| j| jj tdd| j i }tj| j||  |  gd | d	| j| j}|r|S |  S )
Nr   Tr   rB   r`   z5Workflow on page '%(page_title)s' has been restarted.r8   r   r   )rS   r   r3   r   r   r   r>   r`   r:   r;   r   rT   rX   rs   rq   r   cancelr   r   r+   r4   r   r=   r|   rz   r   r   r   r/   r/   r0   r     s:    


 	z EditView.restart_workflow_actionc                 C   s   | j j| jj d| _| j  | jrr| jj| jjd| j	r@| j
nd d}d| j jkrr|  }| || | | | jjdd}t|}| jjj| jj| jj| jf| |   | d| j| j}|r|S |  S )Nr   Tr   rB   zworkflow-action-extra-dataz{}r   )rS   r   r3   r   r   r   r   r>   r`   r:   r;   rT   rX   rs   rq   r   r   jsonloadsr   Z	on_actioncurrent_workflow_task_stater   rA   r   r   )r.   rr   rp   Zextra_workflow_data_jsonZextra_workflow_datar   r/   r/   r0   r     s:    

 
z EditView.perform_workflow_actionc                 C   s   | j j| jjd | jj| jj d| _| j  | jj	| jjd| j
rL| jnd d}| jrd| jjkr|  }| || | | |   | d| j| j}|r|S |  S )Nr   r   Tr   rB   r   )r   r   r>   r`   rS   r   r3   r   r   r   r:   r;   r   rT   rX   rs   rq   r   r   r   r   r/   r/   r0   r   	  s"    

zEditView.cancel_workflow_actionc                 C   s&   | j rt| j S td| j jS d S )NZwagtailadmin_explore)r   r
   r3   r   ry   r-   r/   r/   r0   r   $  s    
zEditView.redirect_awayc                 C   s2   t d| jjgd}| jr*|dt| j 7 }t|S )Nrt   ru   z?next=%s)r   r3   ry   r   r   r
   )r.   
target_urlr/   r/   r0   r   ,  s    zEditView.redirect_and_remainc                 C   s   | j rJ| jj| jjd |   | j | _| jd k	oD| j	| jj| _
n0| j
rdt| jtd nt| jtd| j t| jjtdd | jj D  | _d| _|  | _| |  S )Nr   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 r/   )errors)rH   r   Zformsetr/   r/   r0   rK   I  s   z)EditView.form_invalid.<locals>.<listcomp>T)r   r   r   r>   r`   r   r3   r   r   r   r   r   errorr+   Zvalidation_errorrS   reprr   rT   itemsr   r   r   r   r   r   r   r/   r/   r0   r   3  s2     

zEditView.form_invalidc                 C   s   t d| jjgdS )Nz"wagtailadmin_pages:preview_on_editru   )r   r3   ry   r-   r/   r/   r0   get_preview_urlU  s    zEditView.get_preview_urlc                 C   s.   | j | jj}| r*td| j jgdS d S )Nzwagtailadmin_pages:historyru   )r3   r   r>   r`   Zcan_view_revisionsr   ry   )r.   Zpermissionsr/   r/   r0   get_history_urlX  s    zEditView.get_history_urlc              	   C   s   t | j| j| jj| j| j| j| jdg}| j	 rb|
t| j| j|  d |
t| j| j | jjr~|
t| j| j t|S )N)show_schedule_publishing_toggleZlive_objectZscheduled_objectr   r   )Zpreview_url)r   r3   r>   rS   r   r   r   r   r   Zis_previewablerU   r   r   r   Zshow_comments_toggler   r   )r.   side_panelsr/   r/   r0   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)r`   content_typeZ	object_idZlast_seen_atz"wagtailadmin_editing_sessions:pingZwagtailcorer3   ru   z%wagtailadmin_editing_sessions:release)r   cleanupr(   rk   creater>   r`   r3   rZ   r   r   r   r   ry   Zlatest_revision_id)r.   r   sessionr/   r/   r0   get_editing_sessionst  s*    zEditView.get_editing_sessionsc                    s  t  jf |}| j| jj}| jj| j| j| jd}t	| jd| j| j
| jd}|  }t|| j||gj}|| j| j| j|| j||| j| j|  | j| j| jr| jjr| jnd | jj| jottddtd| jjfd| j
 st| j
to|  t| j
t!o|" | j#|| $ d |S )	N)rW   r>   rS   Zedit)viewr3   r   r   Z"WAGTAIL_WORKFLOW_CANCEL_ON_PUBLISHTz0wagtailadmin_pages:confirm_workflow_cancellationru   )r3   r   r   r   r   action_menur   rS   nextZhistory_urlr   Zpage_lockedr   Zcurrent_task_stateZpublishing_will_cancel_workflowZ!confirm_workflow_cancellation_urlZuser_can_lockZuser_can_unlockr   mediaZediting_sessions)%r   r   r3   r   r>   r`   r   Zget_bound_panelrS   r   r   r   r   r   r   updater   r   r   r   r   r   r   Z	is_activer   r   rV   r   r   ry   r   r!   Zcan_lockr   r   r   r   )r.   kwargscontextZ
user_permsZbound_panelr   r   r   r   r/   r0   r     sf      
"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 )rt   ru   )r   r}   )r   r>   r`   r   r   r   ry   )rH   translationr-   r/   r0   rK     s
   z-EditView.get_translations.<locals>.<listcomp>ry   r   depth)r3   r   onlyrm   r-   r/   r-   r0   r     s    

  zEditView.get_translations)%__name__
__module____qualname__r1   r5   r7   rA   rX   rq   rs   rz   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   __classcell__r/   r/   r   r0   r*   .   sB   :~	K-
#`/*'"5r*   )Fr   urllib.parser   Zdjango.confr   Zdjango.contrib.authr   Zdjango.core.exceptionsr   Zdjango.db.modelsr   r   Zdjango.httpr   Zdjango.shortcutsr	   r
   Zdjango.urlsr   Zdjango.utilsr   Zdjango.utils.htmlr   Zdjango.utils.translationr   r+   Zdjango.views.generic.baser   Z%wagtail.actions.publish_page_revisionr   Zwagtail.adminr   Zwagtail.admin.action_menur   Zwagtail.admin.mailr   Zwagtail.admin.modelsr   Zwagtail.admin.ui.componentsr   Z!wagtail.admin.ui.editing_sessionsr   Zwagtail.admin.ui.side_panelsr   r   r   r   Zwagtail.admin.utilsr   Zwagtail.admin.views.genericr   Z wagtail.admin.views.generic.baser   Zwagtail.exceptionsr   Zwagtail.locksr   r    r!   Zwagtail.modelsr"   r#   r$   r%   r&   r'   r(   Zwagtail.utils.timestampsr)   r*   r/   r/   r/   r0   <module>   s8   $	