U
    Eh,4                     @   s>   d dl mZ d dlT d dlZd dlmZ G dd dejZdS )    )Dict)*N)cmf_ui_formc                       s   e Zd Zejjdg Zdd Zeedddd Z	ee
edd	d
Zee
edddZedddZ fddZ fddZd fdd	Zdd Zdd fdd
Z  ZS )	CmfUiFormcopyc                 C   s   d| j ji}td| dS )uK   
        Сбрасываем кеш настройки полей
        
ui_form_idCmfUiForm:changedN)idvalueZcmf_emit_server_event)selfdata r   (./modules/settings/models/cmf_ui_form.pyinvalidate_cache   s    zCmfUiForm.invalidate_cacher   )Zchannelc                 K   s   | d t jkrt j| d = d S )Nr   )ZAPPZcache_cust_field_config_scheme)r   _kwargsr   r   r   on_ui_form_change   s    zCmfUiForm.on_ui_form_change)r   returnc                 O   s4   i }t jj| dgdD ]}|jrddi||j< q|S )u   Список полей с точечными настройками

        Args:
            ui_form_id (str): ид экрана

        Returns:
            dict: Словарь настроенный полей

        r   parentfieldsrequired_changeT)modelsCmfUiFormFieldslistr   name)r   argskwargsresultui_form_fieldr   r   r   ui_fields_json   s
    zCmfUiForm.ui_fields_jsonc           
      O   s  t  }dddgdd| gdddgg}tjj|dgdD ]0}t |j|j|jg g g |j|j|j	d		||j< q4tj
j| dd
gdD ]
}|jjrqz|jjrqz|jj|krt |jj|jj|jjg g g |jj|jj|jj	d		}|||jj< |jjr||jj |j	dkr0d|jd  d|j }||jj d | n||jj d |j |jrh||jj d |j |jrz||jj d |j qzdd | D }	|	jdd d |	S )u   Группы и поля как должны отображаться на форме

        Args:
            ui_form_id (str): ид экрана

        Returns:
            list: Список групп на форме с полями
        action==Zclickr   hiddenFr   )filterr   )	r    r	   r   r   hidden_fieldshide_empty_fieldsparamsordernotypezui_form_group.*r   linkzlink::r   r$   r%   c                 S   s   g | ]}|qS r   r   ).0ui_groupr   r   r   
<listcomp>b   s     z1CmfUiForm.get_ui_group_fields.<locals>.<listcomp>c                 S   s   | d S )Nr'   r   )xr   r   r   <lambda>c       z/CmfUiForm.get_ui_group_fields.<locals>.<lambda>)key)dictr   CmfUiFormGroupr   r    r	   r   r&   r'   r(   r   ui_form_groupr"   Zcmf_deletedupdateappendZ
hide_emptyvaluessort)
r   r   r   Z	ui_groups_filterr4   r   r,   r)   resr   r   r   get_ui_group_fields+   sZ    
zCmfUiForm.get_ui_group_fieldsNc                    sH  i i t    fdd}|rHtddd|di t  t  g d	|< |D ]
|  qL|r|r| }g }|D ]6}||d kr|| |d	 | |d
 | qp|r||d  |d< t }	|	D ]$}
t|
d	 |
d	< t|
d
 |
d
< q|r@ D ]B}|dsqt|j	| j
 }||i  ||< q|	fS )u+  
        Возвращаем ui_fields и ui_group_fields для ui_form_json.
        На основе списка форм с логикой наследования.
        Первая форма самая общая(базовая), последняя - самая частная.
        c                     s    } | D ]}|d kr8tt t g d|d < |d  }| D ]`\}}|dkrl|| | qL|dkr|D ](} | ||| krx|| | qxqL|||< qLq D ]&\}}|kri |< | | qd S )Nr   )r$   r%   r   )r$   r%   r   )r;   r2   setitemsr5   addr6   r   )Zui_form_group_fieldsZ
form_groupgroupkv
field_name
field_metaZ
all_fieldsclsr   Zgroup_fields_dictr   r   r   append_ui_form_fieldss   s,    
  
z@CmfUiForm.get_ui_fields_inherited.<locals>.append_ui_form_fieldsr?   expandNr   )	r(   r    r	   r   r'   r&   r$   r%   r   r   r$   r%   Zcf_)r<   r2   r6   discardlistr7   
startswithZcmfutilZget_model_by_namer   Zui_metar   r5   get)rE   Zui_form_list
model_nameZrequired_groupZrequired_fieldsrF   Zrequired_group_dictZ
add_fieldsrB   Zgroup_fieldsr?   rC   r   rD   r   get_ui_fields_inheritedf   sP           


z!CmfUiForm.get_ui_fields_inheritedc                    sB   t  j||}| jr>| js>| jdkr>tjjdd}|j| d |S )NCmfTaskzui_form.task:default)code)obj_copy)	supersaveZis_newsystemcmf_model_namer   r   rK   r   )r   r   r   r:   Zui_form	__class__r   r   rR      s    
zCmfUiForm.savec                    s   t  j||S )N)rQ   _save_import)r   r   r   rU   r   r   rW      s    zCmfUiForm._save_importc                    sV   |s*|sd| j  }t j|d|i|}tjj| dgdD ]}|j||j d q<|S )u   
        Копируем экран с настройкой полей

        Args:
            name (строка): имя нового экрана
        u   Копия r   r   r   )r   r   )r   rQ   r   r   r3   rI   )r   r   rP   r   r   grprU   r   r   r      s    zCmfUiForm.copyc              	   C   sF  t jjddddgdd| jggd}g }|D ]}|j}tt |}g }d }|jrldd	 |jD }|d
d|g d }|jr|jj}|dd|g |j	|d}	|||j
|||	d q*ddd| gdd| gdd| gg}
t jj	|
d}	|	r|dd g d |	d ddd| gdd| gdd| gg}
t jj	|
d}	|	rB|dd g d |	d |S )NrT   crud_choicelogic_typesactivitytarget=)r   r#   c                 S   s   g | ]
}|j qS r   )r	   )r+   ltr   r   r   r-      s     z)CmfUiForm.usage_stats.<locals>.<listcomp>Z
logic_typeIN)r#   )modelrY   rZ   r[   countORzrequest_type.ui_form_creater!   zrequest_type.ui_form_viewzrequest_type.ui_form_view_innerrN   Zui_form_createZui_form_viewZui_form_view_innerCmfSDeskRequestType)r   ZCmfUiFormSchemeRuler   r	   rT   getattrrZ   r6   r[   ra   rY   rN   rc   )r   Zrulesr   ZrulerL   r`   filtersZlogic_type_idsZactivity_idra   r9   r   r   r   usage_stats   sh    




zCmfUiForm.usage_statsF)TEXKOM_db_deletec                   s   d}|   D ]}||d 7 }q|r6td| ddd tjjdd| g|d	D ]}|j|d
|i| qLtjjdd| g|d	D ]}|j|d
|i| q|t j|d
|i|S )Nr   ra   u}   Невозможно удалить используемый экран. Данный экран используется в u    объектахT)abortr   r!   )r#   Zinclude_deletedrg   )rf   Z	cmf_alertr   r   rI   deleter3   rQ   )r   rg   r   r   Zusage_countusageZfieldr?   rU   r   r   ri     s    zCmfUiForm.delete)NNN)NN)__name__
__module____qualname__r   r   Zapi_methodsr   staticmethodZon_server_eventr   strr2   r   rI   r;   classmethodrM   rR   rW   r   rf   ri   __classcell__r   r   rU   r   r      s$   :Q	>r   )typingr   Zcmf.includeZcommon.fields.cmf_workflowcommonZmodules.settings.fieldsr   r   r   r   r   r   <module>   s   