
    h6              
         d dl m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
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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 m!Z! 	 d dl"m#Z#m$Z$ d dl%m&Z& d dl)m*Z*m+Z+  e,edd       Z- G d de      Z. G d de      Z/ ed       ed      dZ0e&r ed      e0d<    e,edd      Z1dde1v rd nd!z   d"e1v rd#nd!z   Z2e0jg                         D  ci c]  } | |  c} Z4d$e4d%<   e0jk                         D  ci c]  \  } }| e1v s| | c}} Z0 e e6e0jk                               d& ed'      d()       ed* ed+       ed,      jo                  e2      d-.       e.d$ ed/       ed0      d1.       ed% ed2       ed3      d-.      d4Z8e&r e# ee$e&d5      ed ed6      d78      e8d<    G d9 d:e      Z9 G d; d<e      Z: G d= d>e      Z;y# e'e(f$ r dZ&Y w xY wc c} w c c}} w )?    )annotationsN)apps)settings)site)SELECT2_TRANSLATIONSAutocompleteSelect)Site)models)	JSONFieldManyToOneRel)FieldMultiWidgetSelect	TextInputURLInput)get_language)gettext_lazyadmin_reverse)LinkDictget_manager)AdminFileWidgetFilerFileField)File)AnchorValidatorExtendedURLValidator#DJANGOCMS_LINK_MINIMUM_INPUT_LENGTHc                  H     e Zd Zdd fdZddZdd	dZd Zdd
 fdZ xZS )LinkAutoCompleteWidgetc                (    t         |   d d |       y N)super__init__)selfattrs	__class__s     E/home/dcms/DCMS/lib/python3.12/site-packages/djangocms_link/fields.pyr#   zLinkAutoCompleteWidget.__init__"   s    tU+    c                   g }|D ]  }|rp|j                  dd      \  }}t        j                  |j                  dd       }|j                  t	        |      j                  |      j                                u|j                  d         |S )N:   .)pk)splitr   	get_modelappendr   filterfirst)r$   valuesinternal_objvalue
model_pathr-   models          r'   get_internal_objz'LinkAutoCompleteWidget.get_internal_obj%   s     	*E!&S!!4
B
(8(8a(@A##K$6$=$=$=$D$J$J$LM##D)	* r(   c           
        d g df}|g}d}t        |      }| j                  s3| j                  s'|d   j                  | j	                  |dddd             t        || j                  |            D ]b  \  }}	t        |      |v xr |du xs | j                  }
||
z  }t        |d         }|d   }|j                  | j	                  |||	||             d |S Nr   Fr+    )	setis_requiredallow_multiple_selectedr0   create_optionzipr8   strlen)r$   namer5   attrdefaultgroupshas_selectedselected_choicesoption_valueoption_labelselectedindexsubgroups                r'   	optgroupsz LinkAutoCompleteWidget.optgroups0   s    Q-u:(D(DAJd00r2uaHI*-eT5J5J55Q*R 	&L,<(E1 %E)E)E  H$L
OEqzHOO"",6F	 r(   c                    t        d      S )Ndjangocms_link_link_urlsr   )r$   s    r'   get_urlzLinkAutoCompleteWidget.get_urlF   s    788r(   c                ^   t         t        |   ||      }|j                  dd       t	        | dt        j                  t                           }|j                  ddd| j                         dt        j                  | j                         dt        ||d   |d   rd	ndz   dz   d

       |S )z
        Set select2's AJAX attributes.

        Attributes can be set using the html5 data attribute.
        Nested attributes require a double dash as per
        https://select2.org/configuration/data-attributes#nested-subkey-options
        )extra_attrsclassr;   	i18n_nametrue   GETzadmin-autocomplete )
zdata-ajax--cachezdata-ajax--delayzdata-ajax--typezdata-ajax--urlz
data-themezdata-allow-cleardata-placeholderzdata-minimum-input-lengthlangrT   )r"   r   build_attrs
setdefaultgetattrr   getr   updaterQ   jsondumpsr=   MINIMUM_INPUT_LENGTH)r$   
base_attrsrS   r%   rU   r&   s        r'   r\   z"LinkAutoCompleteWidget.build_attrsI   s     fd/
/T"%+377G
	 	$*$'#("&,,.2$(JJ43C3C/C$D$&-A!w.3b2&'	
  r(   r!   r%   dict | None)r3   list[str | None]returnzlist[models.Model | None])rC   rA   r5   rA   rD   
str | None)rd   dictrS   rf   rh   rj   )	__name__
__module____qualname__r#   r8   rN   rQ   r\   __classcell__r&   s   @r'   r   r   !   s!    ,	,9 r(   r   c                  0     e Zd ZdZdd fdZdddZ xZS )SiteAutocompleteSelectNc                    	 ddl m} |j                  j                  d      }t        | !  |t        |       y # t        $ r$ ddlm} |j                  j                  d      }Y Bw xY w)Nr   )TreeNoder   )Page)
cms.models.pagemodelrs   _meta	get_fieldImportError
cms.modelsrt   r"   r#   r   )r$   r%   rs   fieldrt   r&   s        r'   r#   zSiteAutocompleteSelect.__init__l   sZ    	15NN,,V4E 	e,  	1'JJ((0E		1s   !: *A'&A'c           	        d g df}|g}d}t        |      }|d   j                  | j                  |dddd             t        j                  j                         }|j                  t        |      }
}	t        |	      |v xr |du xs | j                  }||z  }t        |d         }|d   }|j                  | j                  ||	|
||             |S r:   )
r<   r0   r?   r	   objectsget_currentr-   rA   r>   rB   )r$   rC   r5   rD   rE   rF   rG   rH   r   rI   rJ   rK   rL   rM   s                 r'   rN   z SiteAutocompleteSelect.optgroupsz   s    Q-u:
$,,T2r5!DE||'')%)WWc$il|$- 
E!AT%A%A 	 	 GAJ1:lL2BE	

 r(   r!   re   )rC   rA   r5   rA   rD   rf   )rk   rl   rm   no_sitesr#   rN   rn   ro   s   @r'   rq   rq   i   s    H- r(   rq   zInternal linkzExternal link/anchor)internal_linkexternal_linkz	File link	file_link!DJANGOCMS_LINK_ALLOWED_LINK_TYPES)r   r   r   anchormailtotelz
'https://'r   z, 'tel:'r;   r   z, or 'mailto:'r   r   zjs-link-widget-selectorzBNo destination selected. Use the dropdown to select a destination.)rT   	data-help)choicesr%   r   zhttps://example.com or #anchorz~Provide a link to an external URL, including the schema such as {}. Optionally, add an #anchor (including the #) to scroll to.)widgetplaceholderr   r%   zTSelect from available internal destinations. Optionally, add an anchor to scroll to.zSelect internal destination)r   r   rZ   z#anchorzProvide an anchor to scroll to.)alwaysr   r   r   idzSelect a file as destination.)r   r   )rel
admin_siter%   c                  b     e Zd ZdZi ZdZ eedd      Z G d d      Z	d	d
 fdZ
d fdZ xZS )
LinkWidgetz%djangocms_link/admin/link_widget.htmlNDJANGOCMS_LINK_SITE_SELECTORFc                      e Zd ZdZddiZy)LinkWidget.Media)zdjangocms_link/link-widget.jsall)zdjangocms_link/link-widget.cssN)rk   rl   rm   jscss r(   r'   Mediar      s    /9:r(   r   c           
        |t         j                  }t        j                         D cg c]  \  }}|dk(  st        |   t
        v r| }}}|rLdt        v rDt        d t        |      D              }|j                  |t        ddt        d      d             t        |      D ci c]!  \  }}|j                  j                  d	      |# c}}| _        t        | A  |       y c c}}w c c}}w )
Nr   r   c              3  b   K   | ]'  \  }}|j                   j                  d       dk(  r| ) yw)r   r   Nr%   r_   .0ir   s      r'   	<genexpr>z&LinkWidget.__init__.<locals>.<genexpr>   s3      Av<<##H-@    -/zjs-link-site-widgetr   zSelect site)rT   r   rZ   r   r   )r   default_site_selector_available_widgetsitems_mapping
link_typesallowed_link_typesnext	enumerateinsertrq   _r%   r_   data_posr"   r#   )r$   site_selectorkeyr   widgetsrL   r   r&   s          r'   r#   zLinkWidget.__init__   s     &<<M  2779
Vh(3-:"= 
 

 _0BB !*7!3 E
 NN&!6"(,-m,<	 <EW;M
.7aFLLX&)
 	!5
.
s    C)*&C/c                   | j                   s/dg| j                  d   j                  z   | j                  d   _        t        |   |||      }|d   d   D ci c]  }|d   j                  dd      | c}|d   d<   t        rbdt        v rZ|d   d   d= t        d t        | j                        D              }| j                  |   j                  |d	| z   ||   |      |d
<   |S c c}w )N)emptyz	---------r   r   
subwidgetsr%   zlink-type-selectorr   c              3  b   K   | ]'  \  }}|j                   j                  d       dk(  r| ) yw)r   r   Nr   r   s      r'   r   z)LinkWidget.get_context.<locals>.<genexpr>  s3      Av<<##H-< r   r   filer_widget)r=   r   r   r"   get_contextr_   r   r   r   r   render)r$   rC   r5   r%   contextr   rL   r&   s          r'   r   zLinkWidget.get_context  s   '=&>aAXAX&XDLLO#'%dE59 "(+L9+
 7O*>?G+
,' K#55!,/< !*4<<!8 E
 '+ll5&9&@&@5'{"E%L%'GN# +
s   C(r!   )r   zbool | None)rC   rA   r5   ri   r%   rj   rh   rj   )rk   rl   rm   template_namer   number_sitesr^   r   r   r   r#   r   rn   ro   s   @r'   r   r      s<    ;MHL#H.LeT; ;"@ r(   r   c                  x     e Zd ZeZ ee      gZg Zg Z	 e
       gZdi gZ fdZddZd	dZd
 fdZd Z xZS )LinkFormField)r   Nc                <   |j                  dt        d             |j                  di        |j                  dd        |j                  dd        t        |   |i | t        | j                  t              r!| j                  | j                        | _        y y )N	help_textz&Select a link type and provide a link.initialencoderdecoder)	r]   r   popr"   r#   
isinstancer   rj   prepare_valuer$   argskwargsr&   s      r'   r#   zLinkFormField.__init__,  s    +q)Q'RS)R(

9d#

9d#$)&)dllD)--dll;DL *r(   c                   t        |t              r|S t        | j                  j                        d gz  }d|v r | j                  d      }d|d<   |d   ||<   |S d|v rF| j                  d      }| j                  d      }d|d<   |d   ||<   |j                  dd      ||<   |S d|v r'd|d<   | j                  d      }t        |d         ||<   |S )Nr   r   r   r   r;   r   )r   listrB   r   r   _get_posr_   rA   )r$   r5   multi_valuepos
anchor_poss        r'   r   zLinkFormField.prepare_value5  s    eT"L$++--.$7e#--0C,KN$_5K  %--0Cx0J,KN$_5K&+ii"&=K
#
 	 E!(KN--,C"5#56Kr(   c                    |s
t               S |d   }| j                  |      }|r||   s
t               S | j                  d      }t        ||   r|||   ini       }|r|dk(  r|r||   r||   |d<   |S )z5Turn MultiWidget list data into LinkField dict formatr   r   r   )r   r   )r$   r5   	link_typer   
pos_anchorpythons         r'   	to_pythonzLinkFormField.to_pythonI  s    :!H	mmI&%*:]]8,
U3Z9eCj1RHi?2zeJFW$Z0F8r(   c                    t         D ].  }||v st        | | dg       | _        t        |   ||          0 d|v r%t        | dg       | _        t        |   |d          yy)z@Check for <link_type>_validators property and run the validators_validatorsr   anchor_validatorsN)r   r^   
validatorsr"   run_validators)r$   r5   r   r&   s      r'   r   zLinkFormField.run_validatorsY  st    # 	9IE!")$9+[0I2"N&uY'78	9 u%d,?DDOG"5?3 r(   c                L    | j                   j                  j                  |      S )z7Returns the position of the different link type widgets)r   r   r_   )r$   r   s     r'   r   zLinkFormField._get_posc  s    {{##''	22r(   )r5   rj   rh   rg   )r5   rg   rh   rj   )r5   r   )rk   rl   rm   r   r   r   r   external_link_validatorsinternal_link_validatorsfile_link_validatorsr   r   empty_valuesr#   r   r   r   r   rn   ro   s   @r'   r   r   !  sU    F0BC   "(*+":L<( 43r(   r   c                  J     e Zd ZdZ fdZ fdZ fdZ fdZ fdZ xZ	S )	LinkFieldz3A link is a JSON field with a default LinkFormFieldc                t    |j                  dt               |j                  dd       t        |   |i | y )NrE   r   -)r]   rj   r"   r#   r   s      r'   r#   zLinkField.__init__k  s5    )T*+s+$)&)r(   c                N    |j                  dt               t        |   di |S )N
form_classr   )r]   r   r"   	formfield)r$   r   r&   s     r'   r   zLinkField.formfieldp  s&    ,6w *6**r(   c                    t        |t              r@t        |   t        di |j	                         D ci c]  \  }}|dk7  s|| c}}      S t        |   |      S c c}}w )N	__cache__r   )r   rj   r"   get_prep_valuer   )r$   r5   r   valr&   s       r'   r   zLinkField.get_prep_valuet  sj    eT"7)$ +).2%S##:LS2 +   w%e,,2s   A!A!c                <    t         |   |||      }t        |      S r!   )r"   from_db_valuer   )r$   r5   
expression
connectionr&   s       r'   r   zLinkField.from_db_value|  s     %eZDr(   c                8    t         |   |      }t        |      S r!   )r"   r   r   )r$   r5   r&   s     r'   r   zLinkField.to_python  s    !%(r(   )
rk   rl   rm   __doc__r#   r   r   r   r   rn   ro   s   @r'   r   r   h  s$    =*
+- r(   r   )<
__future__r   ra   django.appsr   django.confr   django.contrib.adminr   django.contrib.admin.widgetsr   r   django.contrib.sites.modelsr	   	django.dbr
   django.db.modelsr   r   django.formsr   r   r   r   r   django.utils.translationr   r   r   cms.utils.urlutilsr   djangocms_link.helpersr   r   filer.fields.filer   r   filer.modelsr   ModuleNotFoundErrorrx   djangocms_link.validatorsr   r   r^   rc   r   rq   r   r   example_uri_schemekeysr   r   r   formatr   r   r   r   )r   r5   s   00r'   <module>r      sx   "     % Q ,  4 H H 1 6 , 8A! L x)NPQR E/ EP&/ &V '-.
 nJ{ 'N  00zb:#'99rC  !+ 12CH2$  ",!1!1!33s>P7PCJ
 Z%%'(.T
 %=>M f'(
	 ,%f !""? @
 Y<<=
;$ J &5t4!:;
'{#< <~D3E D3N	 a
 	[) Db 3s$   "G$ &
G4G9G9$	G10G1