
    h&                     @   d dl Z 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 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 Z! G d d      Z"ddZ#d Z$d Z%d Z& eee'      Z(d Z)d Z*d Z+d Z,d Z- G d d      Z.y)     N)SLUG_REGEXP)CMSPluginBase)get_cms_setting)apps)	AdminForm)ObjectDoesNotExist)render)TemplateDoesNotExist)select_template)re_path)lazy)	mark_safe)gettext_lazy)settings)FRAMEWORK_PLUGIN_INFOc                     	 t        j                  | |   d         }|j                  j                  | |   d         }|S # t        t
        t        f$ r d}Y |S w xY w)zU
    Returns the related field, referenced by the content of a ModelChoiceField.
    modelpkr   N)r   	get_modelobjectsgetr   LookupError	TypeError)scope
field_nameModelrelobjs       J/home/dcms/DCMS/lib/python3.12/site-packages/djangocms_frontend/helpers.pyget_related_objectr       si    uZ09:""eJ&7&="> M Y7 Ms   =A AAc                       e Zd ZdZd Zd Zy)get_relatedz?Descriptor lazily getting related objects from the config dict.c                     || _         y N)key)selfr%   s     r   __init__zget_related.__init__%   s	        c                 x    t        |j                  | j                        }|t        || j                  |       |S r$   )r    configr%   setattr)r&   instanceownerobjs       r   __get__zget_related.__get__(   s0     $((;?Hdhh,
r(   N)__name__
__module____qualname____doc__r'   r/    r(   r   r"   r"   "   s    Ir(   r"   c                 X   |
t               }|Qt        |dk7  r| d| n|       |t        |       dkD  rdndt        |      d|fgz   t        |dk7  r| |d ng       z   }|S t        j                  | |         }|d   d   }|dk\  r0t        |d|       t        |      z   t        ||d       z   |d   d<   nCt        |dk7  r|d|dz    n|      t        |      z   t        |dk7  r||dz   d ng       z   |d   d<   t        |dk7  r| d| n|       |gz   t        |dk7  r| |dz   d ng       z   }|S )	z
    creates a copy of fieldsets inserting the new fields either in the indexed block at the position,
    or - if no block is given - at the end
    Nr   )collapser4   )classesfields   r9   )dictlistlencopydeepcopy)		fieldsets
new_fieldsblockposition	blockname
blockattrsfsmodifyr9   s	            r   insert_fieldsrH   /   s   
 V
}R9H%YG 47	NQ4F=B"&z"2 %	
 8r>9XY'rBC 	 	]]9U+,FAYx F1}"6)8#45Z8HH4PVW_W`PaKbbq	( 8r>(Q,'vF:HN6(Q,-(CD 	q	( 	%2+Yv9=(	
y$
<	= 
 Ir(   c                 n    | D ]0  \  }}t        |t        t        f      s|c S t        |      }|.|c S  y r$   )
isinstancetupler<   first_choice)choicesvalueverbosefirsts       r   rL   rL   X   sB    ! w'E4=1L )E  r(   c           	      <    dt         j                   d|  d| d| d	S )Nzdjangocms_frontend//z.html)r   	framework)prefixtemplatenames      r   get_template_pathrW   c   s*     !3!3 4AfXQxj$uUUr(   c                     t        | dt        |            }t        |||      }	 t        |g       |S # t        $ r t        |d|      }Y |S w xY w)NrU   default)getattrrL   rW   r   r
   )r,   rT   rV   	templatesrU   template_paths         r   get_plugin_templater]   g   sb    x\)-DEH%fh=MC(
 	   C)&)TB	Cs   3 AAc                     t        j                  | i       j                  |d       }|r$t        t        d      j	                  |            S y )NzDRead more in the <a href="{link}" target="_blank">documentation</a>.)link)r   r   mark_safe_lazy_format)ui_itemtopicr_   s      r   link_to_framework_docre   z   sN     $$Wb155eTBDTU\\bf\g
 	
 r(   c                     t        | d      r| j                  |       y|j                  r-|xj                  |j                  j                  dz   z  c_        n|xj                  dz  c_        |j	                          y)z:CMS version-save function to add a plugin to a placeholder
add_pluginr:   N)hasattrrg   parentrC   save)placeholderplugins     r   rg   rg      sU    {L)v&==OOv}}5599OOOq Or(   c                 8    | j                   j                  |       S )zUCMS version save function to delete a plugin (and its descendants) from a placeholder)rk   delete_plugin)rl   s    r   rn   rn      s    ++F33r(   c                     t        | j                  d      r| j                  |j                  dz   k(  S | j                  dk(  S )Nrg   r:   r   )rh   rk   rC   )r,   ri   s     r   is_first_childrp      s=    x##\2  FOOa$777  A%%r(   c                 L    	 t        j                  |       S # t        $ r Y yw xY w)z=Force value to be converted to decimal.Decimal or return NoneN)decimalDecimalr   )rN   s    r   coerce_decimalrt      s(    u%% s    	##c                   2     e Zd ZdZg Z fdZd Zd Z xZS )FrontendEditableAdminMixinz
    Adding ``FrontendEditableAdminMixin`` to  models admin class allows to open that admin
    in the frontend by double-clicking on fields rendered with the ``render_model`` template
    tag.
    c                       j                   j                  j                   d j                   j                  j                    fd} |dt        z   j
                        g}|t                  z   S )zA
        Register the url for the single field edit view
        ra   c                 p    t        | j                  j                  |       d|j                         S )Nra   )rV   )r   
admin_site
admin_viewr0   )regexfninfor&   s     r   patz0FrontendEditableAdminMixin.get_urls.<locals>.pat   s4    5$//"<"<R"@$qQSQ\Q\P]G^__r(   zedit-field/(%s)/([a-z\-]+)/$)r   _meta	app_label
model_namer   
edit_fieldsuperget_urls)r&   r~   url_patternsr}   	__class__s   `  @r   r   z#FrontendEditableAdminMixin.get_urls   so     **"",,-Qtzz/?/?/J/J.KL	` /+=tO
 eg.000r(   c                     	 | j                   j                  }	 |j	                  |      j                  |      S # t        $ r | j                   j                  }Y Cw xY w# t        $ r |j                  |      cY S w xY w)Nr   )r   admin_managerAttributeErrorr   languager   )r&   	object_idr   managers       r   _get_object_for_single_fieldz7FrontendEditableAdminMixin._get_object_for_single_field   s{    	)jj..G	-##H-11Y1??	  	)jj((G	)
  	-;;);,,	-s    :  A AAA=<A=c                 J   | j                  ||      }|j                  j                  }d}|j                  j	                  dd      }|j
                  j	                  d      }|j                  d      D 	cg c]  }	|	| j                  v s|	 }
}	|
s|t        d      |z  d}t        |d|      S |j                  j                  | j                  j                  j                   d| j                  j                  j                         s|t        d	      d}t        |d|      S | j                  |||

      }|s]|j                   dk(  rN |||j                        }|j#                         r3|j%                  d      }| j'                  |||d       d}n	 ||      }t)        |d d|
ifgi |       }| j*                  |j*                  z   }t-        d      |j.                  d d |dd||ddddd}|r |j1                  ddi       t        |d|      S |s}|j                   dk(  rn|rlt3        | t4              rOt7        |j8                  d      r'|j8                  j;                  |j<                  d       | j?                  ||      S t        |d|      S t        |d|      S c c}	w )NF_canceledit_fields,zField %s not found)optsmessagez%admin/cms/page/plugin/error_form.htmlz.change_z,You do not have permission to edit this item)r9   POST)r,   data)commitT)change)r,   r9   )r@   prepopulated_fieldsmodel_admin	MEDIA_URL
   )CMS_MEDIA_URLtitlerl   	plugin_id	adminformaddis_popupmediar   r   save_ashas_add_permissionwindow_close_timeoutcancelz'admin/cms/page/plugin/confirm_form.htmlmark_as_dirty)clear_cachez&admin/cms/page/plugin/change_form.html) r   r   r   r   r   GETsplitfrontend_editable_fieldsra   r	   userhas_permr   r   r   get_formmethodis_validrj   
save_modelr   r   r   verbose_nameupdaterJ   r   rh   rk   r   r   render_close_frame)r&   requestr   r   r.   r   saved_successfullycancel_clicked
raw_fieldsfieldr9   context
form_classform
new_object
admin_formr   s                    r   r   z%FrontendEditableAdminMixin.edit_field   s   //	8D}}""" )))U;[[__]3
%/%5%5c%:eEetGdGd>d%ee#2F0G*0TUG'#JGTT||$$

(8(8(B(B'C8DJJL\L\LgLgKh%ij#2`0abG'#JGTT ]]7C]?
'..F":s>D}}!YYeY4
T$G%)"s+Dt&7I0J/Kacquv


Z---,[9&&#"'$&
 NNd
 '#LgVV'..F":?Q$.3??O<OO11#,,E1R..w<<'#LgVVgGQQg fs   5J 	J )	r0   r1   r2   r3   r   r   r   r   __classcell__)r   s   @r   rv   rv      s       "1-9Rr(   rv   )Nr6   NN)/r>   rr   cms.constantsr   cms.plugin_baser   cms.utils.confr   django.appsr   django.contrib.admin.helpersr   django.db.modelsr   django.shortcutsr	   django.template.exceptionsr
   django.template.loaderr   django.urlsr   django.utils.functionalr   django.utils.safestringr   django.utils.translationr   ra   djangocms_frontendr   djangocms_frontend.settingsr   r    r"   rH   rL   rW   r]   strr`   re   rg   rn   rp   rt   rv   r4   r(   r   <module>r      s      % ) *  2 / # ; 2  ( - 6 ' =	
 
&RV
  i%	4
&^R ^Rr(   