
    hQ                        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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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#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/m0Z0 d dl1m2Z3 d dl4m5Z5 d dl6m7Z7m8Z8 d dl9m:Z:m;Z; d dl<m=Z=m>Z> d dl?m@Z@ dZA e5j                  e       e5j                  d      kD  ZB e5j                  e       e5j                  d      k\  ZC G d de      ZD G d  d!e      ZE G d" d#e      ZFd$ ZG eGeeE        eGeeD        eGeeF       y%)&    )OrderedDict)copy)Optional)__version__)ADD_PAGE_LANGUAGE_BREAKLANGUAGE_MENU_IDENTIFIERBasicToolbarPageToolbarPlaceholderToolbar)REFRESH_PAGE)PageContent)RIGHTBreak
ButtonListTemplateItem)get_object_preview_url)toolbar_pool)page_permissions)get_cms_setting)get_language_dictget_language_tuple)add_url_parametersadmin_reverse)apps)settings)get_permission_codename)ContentType)reverse)	urlencode)gettext_lazy)version)ALLOW_DELETING_VERSIONSLOCK_VERSIONS)DRAFT	PUBLISHED)!get_latest_admin_viewable_contentversion_list_url)Versionr!   z4.1.4z4.2c                   t     e Zd Zd Zd Zd Zd Z fdZddZd Z	d Z
dd	Zd
 Zd Zd Zd Z fdZ xZS )VersioningToolbarc                     t        j                  d      j                  }|j                  | j                  j
                  j                     S )zYHelper method to get the versionable for the content type
        of the version
        djangocms_versioning)r   get_app_configcms_extensionversionables_by_contenttoolbarobj	__class__selfversioning_extensions     Q/home/dcms/DCMS/lib/python3.12/site-packages/djangocms_versioning/cms_toolbars.py_get_versionablez"VersioningToolbar._get_versionable-   s=      $223IJXX#;;DLL<L<L<V<VWW    c                     t        j                  d      j                  }|j                  | j                  j
                  j                        S )zWHelper method to check if the model has been registered for
        versioning
        r,   )r   r-   r.   is_content_model_versionedr0   r1   r2   r3   s     r6   _is_versionedzVersioningToolbar._is_versioned4   sB      $223IJXX#>>LL&&
 	
r8   c                 6    | j                         j                  S )zWHelper method to get the proxy model class for the content
        model class
        )r7   version_model_proxyr4   s    r6   _get_proxy_modelz"VersioningToolbar._get_proxy_model=   s     $$&:::r8   c                 &   | j                         sy| j                  j                  rt        | j                  j                        }| j                         }t        j                  j                  | j                  j                        }t        d|j                  j                   d|j                  j                          d|j                  f      }|j!                  t#        d      |dg d	
       | j                  j%                  |       yy)=Helper method to add a publish button to the toolbar
        Nsideadmin:__publishargsPublishF)cms-btn-actioncms-form-post-methodzcms-versioning-js-publish-btnurldisabledextra_classes)r;   r0   edit_mode_activer   r   r?   r(   objectsget_for_contentr1   r   _meta	app_label__name__lowerpk
add_buttonrE   add_item)r4   itemproxy_modelr!   publish_urls        r6   _add_publish_buttonz%VersioningToolbar._add_publish_buttonC   s     !!#<<((4<<#5#56D//1Koo55dll6F6FGG!**445Q{7K7K7Q7Q7S6TT\]jj]K OO)i	   LL!!$' )r8   c                     | j                         st        | 	         S | j                          | j	                          y)zX
        Only override the CMS versioning button when the object is versionable
        N)r;   superadd_edit_button_add_edit_button_add_unlock_buttonr4   r2   s    r6   r`   z!VersioningToolbar.add_edit_buttonZ   s7     !!#7*,,!r8   c                 x   t        | j                  j                        }| j                         }t        j
                  j                  | j                  j                        }|j                  j                  | j                  j                        r't        d|j                  j                   d|j                  j!                          d|j"                  f      }|j$                  j'                  |j(                        j+                  dd      }t,        j
                  j/                  |j(                        }t        j
                  j1                  ||t2        	      j5                         }|j7                  |rt9        d
      n
t9        d      ||g d       | j                  j;                  |       yy);Helper method to add an edit button to the toolbar
        rB   rD   rE   _edit_redirectrG   rW   T)flat)object_id__incontent_typestateEditz	New Draft)rJ   rK   zcms-versioning-js-edit-btnrL   N)r   r0   r   r?   r(   rQ   rR   r1   check_edit_redirectas_boolrequestuserr   rS   rT   rU   rV   rW   versionablefor_content_grouping_valuescontentvalues_listr   get_for_modelfilterr$   existsrX   rE   rY   )	r4   rN   rZ   r[   r!   edit_urlpks_for_grouperri   draft_existss	            r6   ra   z"VersioningToolbar._add_edit_buttond   sa    t||112++-//11$,,2B2BC&&..t||/@/@A**445Q{7K7K7Q7Q7S6TTbcjj]H &11MMk$Tk*  '..<<W__ML"??11-LPU 2 fh  OO)&	q~!f	   LL!!$'% Br8   c                    t         r| j                         rqt        | j                  j                        }| j                         }t        j                  j                  | j                  j                        j                  t              j                         }|r|j                  j                  | j                  j                         rt#        d|j$                  j&                   d|j(                  j+                          d|j,                  f      }| j                  j                   j/                  d      }|rg d}nd	g}|j1                  t3        d
      |r|nd| |       | j                  j5                  |       yyyyy)re   rB   )rj   rD   rE   _unlockrG   z'djangocms_versioning.delete_versionlock)rJ   rK   cms-versioning-js-unlock-btnr|   Unlock#rL   N)r#   r;   r   r0   r   r?   r(   rQ   !filter_by_content_grouping_valuesr1   ru   r$   firstcheck_unlockrm   rn   ro   r   rS   rT   rU   rV   rW   has_permrX   rE   rY   )r4   rZ   r[   r!   
unlock_url
can_unlockrO   s          r6   rb   z$VersioningToolbar._add_unlock_button~   sI    T//14<<#5#56D//1KooGGHXHXY``gl`mssuG7//778I8IJ$[..889;;O;O;U;U;W:XX_`!**
 "\\..778ab
%M &D$DMhK&0
c!+^"/	    %%d+) Kw	 2=r8   c                 *   | j                         rt        r|| j                  j                  set        j
                  j                  | j                  j                        }t        dd|it              }| j                  j                  |d       y y y y )Nz.djangocms_versioning/admin/lock_indicator.htmlr!   )templateextra_contextrC   r   position)r;   r#   r0   rP   r(   rQ   rR   r1   r   r   rY   )r4   r!   lock_messages      r6   _add_lock_messagez#VersioningToolbar._add_lock_message   sv    M$,,:W:Woo55dll6F6FGG'I('2L
 LL!!,!; ;XMr8   c                 N   | j                         syt        | j                  j                        }| j	                         }t
        j                  j                  | j                  j                        }|j                  j                  | j                  j                        rt        d|j                  j                   d|j                  j                    d|j"                  f      }|j%                  t'        d      ||dg	       | j                  j)                  |       yy)
z=Helper method to add a revert button to the toolbar
         NrB   rD   rE   _revertrG   RevertrJ   rL   )r;   r   r0   r   r?   r(   rQ   rR   r1   check_revertrm   rn   ro   r   rS   rT   
model_namerW   rX   rE   rY   )r4   rN   rZ   r[   r!   
revert_urls         r6   _add_revert_buttonz$VersioningToolbar._add_revert_button   s     !!#t||112++-//11$,,2B2BC''(9(9: **445Q{7H7H7S7S6TT[\jj]J OO(!/0	   LL!!$' ;r8   c           
         | j                         syt        j                  j                  | j                  j
                        }|y |j                         }| j                  j                  t        |d      } |j                         }| j                  j                  j                  dj                  |j                  j                  t!        d|j                                    rt#        |j$                        }|j'                  t)        d      |       |j*                  rt)        d	      j                  t)        |j*                  j                               
      }| j-                         }t/        d|j                  j                   d|j0                  j3                          d|j*                  j4                  f      }|dt7        |j4                  | j                  j8                  d      z   z  }|j;                  ||       |j<                  j?                  | j                  j                        r|jA                  tC                      |j;                  t)        d      t/        d|j                  j                   d|j0                  j3                          d|j4                  f             yyyy)z: Helper method to add version menu in the toolbar
        NF)rN   z{app_label}.{codename}change)rT   codenamezManage VersionsrM   zCompare to {source})sourcerD   rE   _comparerG   ?)
compare_tobackzDiscard Changes_discard)"r;   r(   rQ   rR   r0   r1   
short_nameget_or_create_menuVERSIONING_MENU_IDENTIFIERconvert_to_proxyrn   ro   r   formatrS   rT   r   r'   rr   add_sideframe_itemrE   r   r?   r   rU   rV   rW   r   request_pathadd_link_itemcheck_discardrm   rY   r   )r4   r!   version_menu_labelversioning_menurM   namer[   s          r6   _add_versioning_menuz&VersioningToolbar._add_versioning_menu   sY    !!#//11$,,2B2BC?/W//1,,99&(:U : 
 +'**,<<%%$++!--1107==I , 
 #7??3C..q1B/C.M~~./66a@Y@Y@[>\6]"335[..889;;O;O;U;U;W:XX`a!..++-
 sY")** LL55(     --d-<((001B1BC#,,UW5#11+,#$[%6%6%@%@$A;CWCWC]C]C_B``hi")** 2  D 
r8   c                    | j                   }t        | j                  j                  t              r| j
                  syt        j                  j                  | j
                  |t              j                  d      j                         S )zFReturns a published page if one exists for the toolbar object
        N)pagelanguageversions__stater   )current_lang
isinstancer0   r1   r   r   _original_managerru   r%   select_relatedr   )r4   r   s     r6   _get_published_page_versionz-VersioningToolbar._get_published_page_version   sg     $$ $,,**K8		,,33Xy 4 

.
 	)r8   c                    | j                         sy| j                         }|syt        |d      r|j                         nd}|r| j                  j
                  s| j                  j                  r\t        | j                  j                        }|j                  t        d      |dddg       | j                  j                  |       yyy)	rA   Nget_absolute_urlrB   zView PublishedFzcms-btnzcms-btn-switch-saverL   )r;   r   hasattrr   r0   rP   preview_mode_activer   r   rX   rE   rY   )r4   published_versionrM   rZ   s       r6   _add_view_published_buttonz,VersioningToolbar._add_view_published_button   s     !!# !<<> 6=>OQc6d002jnDLL11T\\5U5U4<<#5#56DOO"#(*?@	   LL!!$' 6V3r8   c                     | j                         rt        ry| j                  j                  s(| j                  j                  s| j                          yyy)zMHelper method to add a preview button to the toolbar when not in preview modeN)r;   CMS_ADDS_PREVIEW_BUTTONr0   r   rP   add_preview_buttonr>   s    r6   _add_preview_buttonz%VersioningToolbar._add_preview_button  sF     !!#'>||//8U8U ##% 9V/r8   c                     t         |           | j                          | j                          | j	                          | j                          | j                          | j                          y N)r_   post_template_populater   r   r   r   r]   r   rc   s    r6   r   z(VersioningToolbar.post_template_populate  sV    &(   "'')!  "!!#r8   )F)rU   
__module____qualname__r7   r;   r?   r]   r`   ra   rb   r   r   r   r   r   r   r   __classcell__r2   s   @r6   r*   r*   ,   sP    X
;(."(4,:<(,/b)(.	&$ $r8   r*   c                   L     e Zd ZdZ fdZd	dee   defdZd Z	d Z
d Z xZS )
VersioningPageToolbarz
    Overriding the original Page toolbar to ensure that draft and published pages
    can be accessed and to allow full control over the Page toolbar for versioned pages.
    c                 2    d | _         t        |   |i | y r   )page_contentr_   __init__)r4   rH   kwargsr2   s      r6   r   zVersioningPageToolbar.__init__+  s    37$)&)r8   r   returnc                 B   |s| j                   }t        | j                  t              r%| j                  j                  |k(  r| j                  S | j
                  j                         }t        |t              r|j                  |k(  r|S t        | j                  |d      S )NT)r   include_unpublished_archived)	r   r   r   r   r   r0   
get_objectr&   r   )r4   r   toolbar_objs      r6   get_page_contentz&VersioningPageToolbar.get_page_content/  s     ((Hd''5$:K:K:T:TX`:`$$$ll--/k;/K4H4HH4T 5TYYptuur8   c                     | j                   j                  | _        | j                  r| j                         nd | _        t        d      | _        | j                          | j                          | j                          y )N
PERMISSION)
rn   current_pager   r   r   r   permissions_activatedchange_admin_menuadd_page_menuchange_language_menur>   s    r6   populatezVersioningPageToolbar.populate@  s]    LL--	7;yyD113d%4\%B" !!#r8   c                    | j                   j                  t        t        d            }t        j
                  r|r| j                  rt        |j                        D ]  }|j                  |        t        | j                  j                        D ]Q  \  }}| j                  j                  |      }|s%t        ||      }|j                  ||| j                   |k(         S yyyy)z
        Override the default language menu for pages that are versioned.
        The default language menu is too generic so for pages we need to replace it.
        Language)rZ   r   rM   activeN)r0   get_menur   rE   r   USE_I18Nr   r   itemsremove_itemr   current_siterW   get_admin_contentr   r   r   )r4   language_menu_itemcoder   r   rM   s          r6   override_language_menuz,VersioningPageToolbar.override_language_menuI  s     --.F*V499m112 6))u)56 11B1B1E1EF a
d#yy::D:I0tDC!//#dFWFW[_F_/`a 4=r8   c                 j     j                   j                  rM j                  rAt        j                   j
                  j                   j                   j                        }nd}|r8 j                   j                  t              }|sy t         j                  j                         j                  j                         D cg c]  }|v r|j                  ||      f }}j                         D cg c]  }||vr|
 }}j                         D cg c]  \  }}| j                  k7  r
||f|v r||f  }}}|r|j!                  t"               |j%                  t         dt'        d            }t)        d      }	|D ]:  \  }}t+        |	 j                  j                  |      }
|j-                  ||
       < |rt.        rt0        r|j%                  t         dt'        d	            }t3        |      d
k(  }|D ]  \  }} j                  j5                  |      s%t)        dj                  f      }t+        ||      }
t6        } j                   j9                         k(  r<|s:t;         fd j                  j                         D        d       }t=        |      }|j-                  ||
||        |r|j%                  t         dt'        d            }t'        d      }t'        d      }d}|D ]  \  }} j                  j5                  |      }|rWt)        d|j                  f      }|j?                  ||z  || j                  d||z   j                   j6                         d}|r~|jA                  t'        d      dd        y y y c c}w c c}w c c}}w )N)ro   r   siteFz-addzAdd Translationcms_pagecontent_add)cms_pager   r   z-delzDelete Translation   r   cms_pagecontent_deleterG   c              3   z   K   | ]2  }|j                   k7  r!|v rj                  j                  |       4 y wr   )r   r   r   ).0lang	languagespagecontentr4   s     r6   	<genexpr>z=VersioningPageToolbar.change_language_menu.<locals>.<genexpr>  s>      !Xt$(K,@,@$@TYEV "&!<!<T!B !Xs   8;)rM   rN   on_closez-copyzCopy all pluginszfrom %sz2Are you sure you want to copy all plugins from %s?cms_pagecontent_copy_language)source_languagetarget_language)actiondataquestion
on_successTzNo other language availabler~   )rM   rN   )!r0   rP   r   r   user_can_change_pagern   ro   r   r   r   r   rW   get_languagesgetr   r   	add_breakr   r   rE   r   r   add_modal_itemr"   "CMS_SUPPORTS_DELETING_TRANSLATIONSlenr   r   r   nextr   add_ajax_itemr   )r4   
can_changer   r   removeaddr   r   add_plugins_menupage_add_urlrM   remove_plugins_menurN   translation_delete_urlr   other_contentcopy_plugins_menutitler   
item_addedr   page_copy_urlr   r   s   `                     @@r6   r   z*VersioningPageToolbar.change_language_menu\  s   <<((TYY)>>\\&&TYYT=N=NJ J LL112JKM )$*;*;*>*>?I !II3359$ y}}T401F  &OO-v% C  #,//"3D$4,,,$1G tD  ''(?@#0#C#C/05q9J7K$   --BC"% CJD$,$tyy||dC %33Dc3B	C 16X&3&F&F/05q9M7N'# v;!+"( pJD$"&))"="=t"="LK"1>?W_j_m_m^o1p.01GRVW#/<<224CH,0!XtyyOfOfOh !XY]-_M (>m'LH+::4SS[fn:op $1$D$D/06:L8M%! )QR"
"& JD$#'99#>#>#>#ML#(56U]i]l]l\n(o)77!DL59dN_N_!`%-_AZAZ 8 
 &*
%)77;< #%) 8  o 

s   	N%<N*#N/r   )rU   r   r   __doc__r   r   strr   r   r   r   r   r   r   s   @r6   r   r   %  s8    
*v# v+ v"$a&Vr8   r   c                        e Zd Z fdZ xZS )VersioningBasicToolbarc                    t         j                  r| j                  j                  st        |           yt        | j                  j                        }t        |      dk  ry| j                  j                  t        t        d      d      }|D ]Q  \  }}| j                  j                  |      }|s%t!        ||      }|j#                  ||| j$                  |k(         S y)z
        Originally did override the default language menu for pages that are versioned.
        Now creates the menu from scratch, since VersiongBasicToolbar prevents the
        core from creating the too generic default language menu.
        N   r   r   r   r   )r   r   rn   r   r_   add_language_menur   r   rW   r  r0   r   r   rE   r   r   r   r   r   )r4   r   r   r   r   r   rM   r2   s          r6   r  z(VersioningBasicToolbar.add_language_menu  s       (A(AG%'&t'8'8';';<	y>A77$a
mb 8 
 $ 	]JD$99666EL,\4@++Dc$BSBSW[B[+\	]r8   )rU   r   r   r  r   r   s   @r6   r  r    s    ] ]r8   r  c                    dj                  j                  j                  f      dj                  | j                  | j                  f      t        fdt        j
                  j                         D              t        _        y)zYReplace `old` toolbar class with `new` class, while keeping its position in toolbar_pool..c              3   >   K   | ]  \  }}|k(  rfn||f  y wr    )r   r   r0   newnew_nameold_names      r6   r   z"replace_toolbar.<locals>.<genexpr>  s1      (D'  8+3$@(s   N)joinr   rU   r   r   toolbarsr   )oldr  r  r  s    `@@r6   replace_toolbarr"    sb    xx67Hxx67H' ()2288:( Lr8   N)Hcollectionsr   r   typingr   cmsr   cms_versioncms.cms_toolbarsr   r   r	   r
   r   cms.constantsr   
cms.modelsr   cms.toolbar.itemsr   r   r   r   cms.toolbar.utilsr   cms.toolbar_poolr   	cms.utilsr   cms.utils.confr   cms.utils.i18nr   r   cms.utils.urlutilsr   r   django.appsr   django.confr   django.contrib.authr   "django.contrib.contenttypes.modelsr   django.urlsr   django.utils.httpr   django.utils.translationr    rE   	packagingr!   djangocms_versioning.confr"   r#   djangocms_versioning.constantsr$   r%   djangocms_versioning.helpersr&   r'   djangocms_versioning.modelsr(   r   r   r   r*   r   r  r"  r  r8   r6   <module>r=     s   #   *  ' " D D 4 ) & * @ @    7 :  ' 6  L ; 0& %4W__[%AOGOOT[D\%\ ")'//+6/'//%:PP v$* v$rMK M`]\ ]6 2 3 "$5 6 4 5r8   