a
    Dg                     @   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)sZ	page_type)_
page_classZget_verbose_nameself r/   ]/var/www/lab.imftr.de/x/nb_venv/lib/python3.9/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|v rF|| d|v 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 |v 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 i dt |iB td|dtt|d}|s|sdS dd |D }t }|D ]\}	}
|	|v r>q(|	g}||	 |D ]2\}||vrR|
krR|| || qRt|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  v r|qS r/   rY   r[   threadsr/   r0   rK      s   
c                    s   g | ]}|j  v r|qS r/   rY   r[   rg   r/   r0   rK      s   
c                    s$   g | ]\}}|j  v 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S )NZEdit)r   buttonget_edit_urlr+   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_draftargsz
View draftFZ
new_window)r   rt   r   r3   idr+   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 liveFry   )r   rt   r3   urlr+   r-   r/   r/   r0   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liverw   zCompare with live version)r   rt   r   r3   rz   latest_revisionr+   r-   r/   r/   r0   $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 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                 C   s
   | j  S r2   )r   Zget_latest_revision_as_objectr-   r/   r/   r0   
get_objectA  s    zEditView.get_objectc                 C   s   t d| jjfdS )Nwagtailadmin_pages:editrw   r   r3   rz   r-   r/   r/   r0   ru   D  s    zEditView.get_edit_urlc                    s  t tj |d| _| j | _| jj| _| jj| _	| jj
| _| jd u rntd| j d| j	j d| j	j d|d| _t| j| _d | _| jrt | jj| jd| _|  | _| j | _| j | _| j| jj| _| j | _ | j d uo| j !| jj| _"| j# st$t%| j| _&| 'd| j| j}|r:|S t(jj)| j| jjdd	id
\| _*}| j+ | _,| j,- | _.t/t0ddr| jj1p| jj23d4 | _5nd | _5t/t0dd	r| jj6| _6| 7 | _8nd | _6g | _8| j5r| j59 | _:ng | _:d | _;t< j=||fi |S )N)rz   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_idZbefore_edit_pager_   F)r3   r`   defaultsZWAGTAIL_WORKFLOW_ENABLEDTr<   ZWAGTAIL_I18N_ENABLED)>r	   r%   rk   Zprefetch_workflow_statesr   Zget_latest_revisionr   scheduled_revisionZcached_content_typepage_content_typespecific_classr,   r   Z	app_labelmodelgetr   boolr:   r;   Z	revisionsr   r3   
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kwargsresponsecreated	__class__r/   r0   r   G  sv    










zEditView.dispatchc                 O   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:unlockrw   ZUnlockz'wagtailadmin_pages:revisions_unschedulezCancel scheduled publishr   )Z
extra_tagsrW   r   parent_pager   F)r   Zget_messager>   r`   
isinstancer   r   
can_unlockr   r   r3   rz   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>   rx   r   Zlock_messager/   r/   r0   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.r8   buttons)r+   r3   r4   r   r=   r>   r{   rv   r?   r/   r/   r0   (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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   r   r   r   user_can_cancelis_cancelling_workflowZis_validr   
form_validform_invalid)r.   r>   rx   r   r/   r/   r0   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 r/   r/   )rH   nameZverbose_name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   | j  | _| jjdr,| j r,|  S | jjdrL| j	 rL| 
 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 )Nzaction-publishzaction-submitzaction-restart-workflowzaction-workflow-action)rS   Zhas_changedhas_content_changesr>   r   r   r   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     s2    zEditView.form_validc                 C   s   | j j| jj d| _| j  | jj| jjd| jd}| 	  | j
rpd| j jv rp|  }| || | | | d| j| j}|r|S |  S )NcommitTr`   Z
log_actionr;   rB   after_edit_page)rS   saver3   r~   r   save_revisionr>   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d}| jj	}| 
d| j| j}|rZ|S t|| jj| j| jd}|jdd | jrd| j jv r|  }| || | | | jjjj| jjd| _| 
d	| j| j}|r|S |rp|t krp| jrtd
t| jj| j d }n8| jjr@t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   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;   
go_live_atr   r   r   executerT   rX   rs   rq   r   rk   r   rZ   r   nowr:   r+   r)   r<   r4   r   r=   rv   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d}| j	rhd| j j
v rh|  }| || | | | 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   rT   rX   rs   rq   r   r   r'   ZSTATUS_NEEDS_CHANGESresumeget_workflowstartr+   r4   r   r=   r{   rv   r   r   r.   rr   rp   Zworkflowr@   r   r/   r/   r0   r     s@    



	zEditView.submit_actionc                 C   s   | j j| jj d| _| j  | jj| jjd| jd}| j	rhd| j j
v rh|  }| || | | | 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   rT   rX   rs   rq   r   cancelr   r   r+   r4   r   r=   r{   rv   r   r   r   r/   r/   r0   r     s8    



	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v rr|  }| || | | | jjdd}t|}| jjj| jj| jj| jfi | |   | 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     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rzd| jjv rz|  }| || | | |   | d| j| j}|r|S |  S )Nr   r   Tr   rB   r   )r   r   r>   r`   rS   r   r3   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   rz   r-   r/   r/   r0   r   '  s    
zEditView.redirect_awayc                 C   s(   |   }| jr |dt| j 7 }t|S )Nz?next=%s)ru   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 u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   L  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   6  s0    


zEditView.form_invalidc                 C   s   t d| jjgdS )Nz"wagtailadmin_pages:preview_on_editrw   r   r-   r/   r/   r0   get_preview_urlX  s    zEditView.get_preview_urlc                 C   s.   | j | jj}| r*td| j jgdS d S )Nzwagtailadmin_pages:historyrw   )r3   r   r>   r`   Zcan_view_revisionsr   rz   )r.   Zpermissionsr/   r/   r0   get_history_url[  s    zEditView.get_history_urlc              
   C   s   t | j| j| jj| j| j| j| j| j	 dg}| j
 rj|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   r   )Zpreview_url)r   r3   r>   rS   r   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   rw   z%wagtailadmin_editing_sessions:release)r   cleanupr(   rk   creater>   r`   r3   rZ   r   r   r   r   rz   Zlatest_revision_id)r.   r   sessionr/   r/   r0   get_editing_sessionsx  s*    zEditView.get_editing_sessionsc                 C   s   t | jd| j| j| jdS )NZedit)viewr3   r   r   )r   r>   r3   r   r   r-   r/   r/   r0   get_action_menu  s    zEditView.get_action_menuc                    s  t  jf i |}| j| jj}| jj| 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"WAGTAIL_WORKFLOW_CANCEL_ON_PUBLISHTz0wagtailadmin_pages:confirm_workflow_cancellationrw   )r3   r   r   r   r   action_menur   rS   nextZ
action_urlZ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   updater   r   r   r   ru   r   r   r   r   Z	is_activer   r   rV   r   r   rz   r   r   r!   Zcan_lockr   r   r   r   )r.   r   contextZ
user_permsZbound_panelr   r   r   r   r/   r0   r     sX    
#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   rw   )r   r|   )r   r>   r`   r   r   r   rz   )rH   translationr-   r/   r0   rK     s
   z-EditView.get_translations.<locals>.<listcomp>rz   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   rv   r{   r}   r   r   r   ru   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*   .   sH   :~	R-
`/*'"	0r*   )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   $	