U
    3Li;                     @   sD   d dl mZ d dlT d dlZG dd dZG dd dejjjZdS )    )defaultdict)*Nc                   @   s   e Zd ZdZdS )
_NamespacezNamespace classN)__name__
__module____qualname____doc__ r	   r	   ./cmf/models/cmf_cust_field.pyr      s   r   c                       s|   e Zd Zdd Zdd ZedddZdd	 Z fd
dZdd Z	 fddZ
 fddZdd fdd
Zdd Z  ZS )CmfCustFieldc                 C   s  | j jsdS | js"tddd dS | j dkrHd| _d| _d| _d| _n| j d	krnd| _d| _d| _d| _n| j d
krd| _| j| _n| j dkrd| _| j| _nn| j dkrd| _| j| _nR| j dkrd| _| j| _n6| j dkrd| _| j| _n| j dkrd| _| j| _n| j dkr6d| _| j| _n| j dkrTd| _| j| _n| j dkrrd| _| j| _n| j dkrd| _| j| _n| j dkrd| _d| _d| _d| _n\| j d krd!| _| j| _n>| j d"krd#| _| j| _n | j d$krd%| _| j| _d&g| _n| j d'kr<d%| _| j| _d(g| _n| j d)kr`d*| _| j| _d(g| _n| j d+krd*| _| j| _d,g| _n| j d-krd*| _| j| _d.g| _nl| j d/krd0| _| j| _d1d2i| _	nF| j d3krd%| _| j| _d4g| _n"| j d5krd*| _| j| _d4g| _dS )6u-   DEPRECATED не копировать
        Nu-   Нелья менять шаблон поляTabortZchoice_cascade_multiZCmfM2MZCUSTOM_CHOICE_MODELZCmfCascadeChoiceZchoice_multitextZCmfTextstrCmfStrintZCmfIntfloatZ
CmfNumericZphoneZCmfPhoneZloginZCmfLoginZemailZCmfEmailurlZCmfUrlZ
choice_strZ	CmfChoiceZ
choice_intZCmfChoiceIntZtagsZCmfMarkdateZCmfDateZdatetimeZCmfDateTimeZcompanyCmfGenericRelationZ
CmfCompanyuserZ	CmfPersonZusersCmfGenericM2MZrolesZCmfRolegroupsZCmfPersonGroupZcheckboxZCmfBoolvalueFZassetZCmfAssetZassets)
field_custom_type
is_changedis_new	cmf_alert
field_typeleftmodelwidgetmodelsdefaultselfr	   r	   r
   _calc_custom_field_type   s    















z$CmfCustField._calc_custom_field_typec                 C   sJ   | j jsd S | j r>ttj| jj }t|tjjs>t	ddd t	d d S )Nuo   Индексация доступна лишь для полей строкого/текстового типаTr   uz   Применится только для новых объектов или при полной переиндекации)
fullsearch_indexr   varscmffieldsr   r   
issubclassr   r   )r%   Z	field_clsr	   r	   r
   _calc_fullsearch_indexh   s    z#CmfCustField._calc_fullsearch_indexNc              
      sH  |st | tjr| }| jjs d S d | _| jr:| jj | _| jrDd% fdd	 zt	| jj}W n@ tj
k
r } z td| j d| dd  W 5 d }~X Y nX |rD|stddd |dd	d
g zD |}|rt|| _dddddddh}dddddddh}t }| D ]\}}	d }
||	@ rZ|	| rVtd| j d| d|	 dd g }
||	@ r|	| rtd| j d| d|	 dd d}
t|||
 qt|d}d }|jdkrd}|jD ]}|t|j||d7 }qntd | j d!dd td"| d# W n2 tk
rB } ztd$|  W 5 d }~X Y nX d S )&Nc                    s   |d krt t}t| trTtt| D ]*}d }|dkr>| d } | | ||d q&n0t| tr| dr| d}||d  	| |S )N      )
fields_setoperz__SELF..)
r   set
isinstancelistrangelenr   
startswithsplitadd)Zbqlr/   r0   iZcur_operpartsrecursive_params_searchr	   r
   r=      s    

zBCmfCustField.check_filter_options.<locals>.recursive_params_searchu:   Не корректное значение фильтра z: Tr   uH   Данное поле не поддерживает фильтрациюr   r"   r   INzNOT INZEXISTSz
NOT EXISTSZ	MEMBER_OFZHISTORYzNOT HISTORYZLIKEzNOT LIKEZILIKEz	NOT ILIKEz
SIMILAR TOzNOT SIMILAR TOz@@u   : Со значением uF    используются несовместимые операции %)ZSELF)r   r   r   )filterfilter_contextu   Тип поля u3    не поддерживает фильтрациюuK   Фильтр корректный. Результат фильтрации u    записейu-   Ошибка проверки фильтра )NN)r3   r"   r   options_list_bqlr   options_list_paramsr   stripZjsonloadsZJSONDecodeErrorr   Zload_fieldsr4   r   itemssetattrdictr   cmfutilget_model_by_namecountr   ZCmfOrmError)Zconf_objZcust_field_objrB   erC   Z
list_opersZ
like_opersZ
obj_fieldsZctx_field_nameZfilter_oper_setZctx_field_valuerA   Z	obj_countr    r	   r<   r
   check_filter_optionst   sn    






 z!CmfCustField.check_filter_optionsc                 C   s   |  |  d S N)rM   r$   r	   r	   r
   _calc_filter_options   s    z!CmfCustField._calc_filter_optionsc                    s   ddddg}t   | S )Ndirtyr#   cmf_model_namer   )supersave_preload_fields)r%   r*   	__class__r	   r
   rS      s    z CmfCustField.save_preload_fieldsc                 C   s,   t t| jjj dkr(tddd d S )Ni@  u2   Превышен лимит в 1600 колонокTr   )r6   rI   rJ   rQ   r   r*   keysr   r$   r	   r	   r
   _check_limit   s    zCmfCustField._check_limitc                    s  | j s0| jjrtddd | jjr8tddd n|   |   |   |   | j	dshtddd | j
sddd	d
dddddddddddh}t| jdd}||@ rd| _
| jrt| jjtrd| jkrtd| j ddd d S t j||}| j
rtt| jj   |S )NuY   Нельзя менять системное имя поля, создайте новоеTr   uF   Нельзя менять тип поля, создайте новоеZcf_uY   Системное имя должно обязательно начинаться с cf_captionr   placeholdernamer'   commentr#   visiblereadonlydisabled_choiceschoicesrequiredrC   options_list_show_columnsoptions_list_search_columns)r   r   ua   Не правильный формат хранения значения по умолчанию u6   , используйте пример dict(value=None))r   rZ   r   r   r   rW   r&   r,   rO   r7   rP   r2   rV   r#   r3   r   rH   rR   saver(   r"   rQ   custom_field_sync)r%   argskwargsZcritical_fieldsZchanged_fieldsresrT   r	   r
   rc      sL                zCmfCustField.savec                    s   |    t j||}|S rN   )r&   rR   _save_import)r%   re   rf   rg   rT   r	   r
   rh      s    zCmfCustField._save_importF)TEXKOM_db_deletec                   s^   t jj| |dD ]}|j|d|i| qd| _t j|d|i| tt | jj 	  d S )N)Z
cust_fieldZinclude_deletedri   T)
r"   ZCmfCustFieldConfFieldr4   deleterP   rR   r(   rQ   r   rd   )r%   ri   re   rf   Z
conf_fieldrT   r	   r
   rj      s
    zCmfCustField.deletec                 C   sb  t | jjd}| jj|d< | jj|d< |d drL| jrDd|d< nd|d< | jr^| jj|d< | jrp| jj|d	< | j	d
 |d< | j
j|d< | jj|d< | j|d< | jjs| jj|d< | jjs| jj|d< | jjs| jj|d< | jjs| jj|d< | jjs| jj|d< | jjs| jj|d< | jjs2| jj|d< | jjsH| jj|d< | jjs^| jj|d< |S )N)
class_namerX   r   ZM2MTrightr   rY   r[   r   r#   r\   r]   r'   r`   r"   r    r_   r^   rC   ra   rb   r!   )rH   rZ   r   rX   r   endswithrl   rY   r[   r#   r\   Zfield_readonlyr'   r`   Zis_nullr"   r    r_   r^   rC   ra   rb   r!   )r%   resultr	   r	   r
   get_meta  sD    






zCmfCustField.get_meta)N)r   r   r   r&   r,   staticmethodrM   rO   rS   rW   rc   rh   rj   ro   __classcell__r	   r	   rT   r
   r      s   \]r   )	collectionsr   Zcmf.includeZcmf.fields.cmf_cust_fieldr)   r   r*   Zcmf_cust_fieldr   r	   r	   r	   r
   <module>   s   