
    G&j;                     X    d dl mZ d dl d dlZd dlmZ  G d dej                        Zy)    )Dict)*N)cmf_ui_formc                   R    e Zd Zej                  j
                  dgz   Zd Ze ed      d               Z	ede
defd       Zedefd	       Zede
fd
       Zede
ddfd       Zede
ddfd       Zede
defd       Zedd       Z fdZ fdZd fd	Zd Zdd fd
Z xZS )	CmfUiFormcopyc                 L    d| j                   j                  i}t        d|       y)uK   
        Сбрасываем кеш настройки полей
        
ui_form_idCmfUiForm:changedN)idvaluecmf_emit_server_event)selfdatas     (./modules/settings/models/cmf_ui_form.pyinvalidate_cachezCmfUiForm.invalidate_cache   s!     dggmm,148    r   )channelc                 X    | d   t         j                  v rt         j                  | d   = y y )Nr
   )APPcache_cust_field_config_scheme)r   _kwargss     r   on_ui_form_changezCmfUiForm.on_ui_form_change   s0     !C!CC2243EF Dr   r
   returnc                 0   i }t         j                  j                  | ddg      D ]m  }ddi||j                  <   |j                  r/t        |j                  j                        ||j                     d<   |j                  s\d||j                     d<   o |S )u   Список полей с точечными настройками

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

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

        r   zcust_field.field_custom_typeparentfieldsfield_custom_typeNTrequired_change)modelsCmfUiFormFieldslistname
cust_fieldstrr   r    )r
   argskwargsresultui_form_fields        r   ui_fields_jsonzCmfUiForm.ui_fields_json   s     #2288!30N*O 9 Q 	EM*=t)DF=%%&''BEmF^F^FpFpBq}))*+>?,,@D}))*+<=	E r   c                     | j                   j                  d      xs t        j                  }|t        j                  k(  S )uK   Использует ли группа двухколоночный layout.
tab_layout)paramsget	constantsTAB_LAYOUT_1COLTAB_LAYOUT_2COL)ui_form_groupr-   s     r   _is_two_column_ui_groupz!CmfUiForm._is_two_column_ui_group/   s6     #))--l;Xy?X?X
Y6666r   c                 v    | j                   dk(  rd| j                  d    d| j                   S | j                  S )u>    Возвращает имя поля для ui_group_fields. linkzlink::)typer.   r$   )r*   s    r   _get_ui_form_field_namez!CmfUiForm._get_ui_form_field_name5   sD     '=//78-:L:L9MNN!!!r   
field_nameNc                 ,    | d   j                  |       y)uK    Добавляет поле в одноколоночную группу. r   N)append)ui_groupr:   s     r   _append_field_to_one_columnz%CmfUiForm._append_field_to_one_column<   s     	!!*-r   c                     |j                   j                  d      xs t        j                  }|t        j                  k(  r| d   j                  |       y| d   j                  |       y)ug    Добавляет поле в нужную колонку двухколоночной группы. col_nocol2col1N)r.   r/   r0   COLUMN_FIRSTCOLUMN_SECONDr<   )r=   r*   r:   r@   s       r   _append_field_to_two_columnsz&CmfUiForm._append_field_to_two_columnsA   sY     %%))(3My7M7MY,,,V##J/V##J/r   c                    t               }g ddd| gg dg}t        j                  j                  |dg      D ]_  }t        |j                  |j
                  |j                  g g g |j                  |j                  |j                  	      ||j
                  <   a t        j                  j                  | ddg	      D ]X  }|j                  j                  r|j                  j                  r2|j                  j
                  |vrt        |j                  j                  |j                  j
                  |j                  j                  g g |j                  j                  |j                  j                  |j                  j                  
      }t        j                  |j                        rg g c|d<   |d<   ng |d<   |||j                  j
                  <   |j                  j                  r%|j!                  |j                  j                         t        j#                  |      }||j                  j
                     }t        j                  |j                        rt        j%                  |||       nt        j'                  ||       |j                  r5||j                  j
                     d   j)                  |j                         |j*                  s$||j                  j
                     d   j)                  |j                         [ |j-                         D cg c]  }| }	}|	j/                  d        |	S c c}w )u   Группы и поля как должны отображаться на форме

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

        Returns:
            list: Список групп на форме с полями
        )action==clickr   rH   )hiddenrH   Fr   )filterr   )	rG   r   r$   r   hidden_fieldshide_empty_fieldsr.   ordernor8   zui_form_group.*r   )rG   r   r$   rL   rM   r.   rN   r8   rB   rA   r   rL   rM   c                     | d   S )NrN    )xs    r   <lambda>z/CmfUiForm.get_ui_group_fields.<locals>.<lambda>   s
    q| r   )key)dictr!   CmfUiFormGroupr#   rG   r   r$   r.   rN   r8   r"   r3   rJ   cmf_deletedr   r4   updater9   rE   r>   r<   
hide_emptyvaluessort)
r
   r'   r(   	ui_groups_filterr3   r*   r=   r:   ress
             r   get_ui_group_fieldszCmfUiForm.get_ui_group_fieldsJ   s    F	,hj-IKbc#2288QTPU8V 	M*.$++ ##"'' "$$++%--"''
+Im&&'	 $2288
TWYjSk8l '	jM**11**66**--Y>(66==$2255&4499"$&((66==)77??&4499	 44]5P5PQ9;R6HV$hv&6)+HX&<D	-55889 ..55OOM$?$?$F$FG"::=IJ !<!<!?!?@H001L1LM66xPZ[55h
K##-55889/JQQR_RdRde''-55889:MNUUVcVhVhiO'	jP )2(8(8(:;Hx;;+,
 <s   ,	Mc                     i i t                fd}|r't        ddd|di t               t               g 	      |<   |D ]	   |         |r]|r[|   }g }|D ]B  }||d   vr|j                  |       |d   j                  |       |d	   j                  |       D |r||d   z   |d<   t	        j                               }	|	D ]$  }
t	        |
d         |
d<   t	        |
d	         |
d	<   & |ryD ]t  }|j                  d
      st        j                  |      j                  |   j                  j                         }|j                  j                  |i              ||<   v |	fS )u+  
        Возвращаем ui_fields и ui_group_fields для ui_form_json.
        На основе списка форм с логикой наследования.
        Первая форма самая общая(базовая), последняя - самая частная.
        c                     j                        } | D ]  }|d   
vr$t        t               t               g       
|d   <   
|d      }|j                         D ]]  \  }}|dv r||   j	                  |       |dk(  r5|D ]/  }j                  |       |||   vs||   j                  |       1 Y|||<   _  j                        j                         D ]"  \  }}|	vri 	|<   	|   j	                  |       $ y )Nr$   )rL   rM   r   )rL   rM   r   )r^   rT   setitemsrW   addr<   r+   )ui_form_group_fields
form_groupgroupkvr:   
field_meta
all_fieldsclsr   group_fields_dictr
   s          r   append_ui_form_fieldsz@CmfUiForm.get_ui_fields_inherited.<locals>.append_ui_form_fields   s0   #&#:#::#F 2 %
f%->><@&)esuR=Q%j&89)*V*<=&,,. %DAqBB a*h*+ <J&NN:6)q9 %a
 ;< $%a%%, +.*<*<Z*H*N*N*P 6&
JV+)+F:&z"))*56r   rf   expandNr   )	r8   rG   r   r$   rN   r.   rL   rM   r   r   rL   rM   cf_)ra   rT   r<   discardlistrY   
startswithcmfutilget_model_by_namer   ui_metar   rW   r/   )rk   ui_form_list
model_namerequired_grouprequired_fieldsrm   required_group_dict
add_fieldsr:   group_fieldsrf   ri   rj   r   rl   r
   s   `           @@@@r   get_ui_fields_inheritedz!CmfUiForm.get_ui_fields_inherited   s     .0U
	6 	6< 04X$^UV^`!esuR1In-
 ' 	$J!#	$ o"3N"CJ- M
%8%BB%%j1#O4<<ZH#$78@@L	M
 0:=PQY=Z0Z#H- -4467! 	JE%)%*@%AE/")-e4G.H)IE%&	J
 ( 0
!,,U3$66zBII*U]]bbd
!!&**Z"<=%/z"0 |##r   c                 <   t        |   |i |}| j                  s&| j                  j                  r| j                          | j                  rM| j                  sA| j                  dk(  r2t        j                  j                  d      }|j                  |        |S )NCmfTaskzui_form.task:default)code)obj_copy)supersaveis_newr.   
is_changedr   systemcmf_model_namer!   r   r/   r   )r   r'   r(   r]   ui_form	__class__s        r   r   zCmfUiForm.save   s}    glD+F+{{t{{55!!#;;t{{""i/ **..4J.Kd+
r   c                 "    t        |   |i |S )N)r   _save_import)r   r'   r(   r   s      r   r   zCmfUiForm._save_import   s    w#T4V44r   c                     |s"|sd| j                    }t        |   |d|i|}t        j                  j                  | dg      D ]  }|j                  ||j                          ! |S )u   
        Копируем экран с настройкой полей

        Args:
            name (строка): имя нового экрана
        u   Копия r$   r   r   )r   r$   )r$   r   r   r!   rU   rq   )r   r$   r   r'   r(   grpr   s         r   r   zCmfUiForm.copy   ss     $TYYK0w|???H((--T8*-M 	5CHHH388H4	5r   c           	      @   t         j                  j                  g ddd| j                  gg      }g }|D ]  }|j                  }t        t         |      }g }d }|j                  r7|j                  D cg c]  }|j                   }}|j                  dd|g       d }	|j                  r*|j                  j                  }	|j                  dd|	g       |j                  |      }
|j                  ||j                  ||	|
d	        d
dd| gdd| gdd| gg}t         j                  j                  |      }
|
r|j                  dd g d |
d	       d
dd| gdd| gdd| gg}t         j                  j                  |      }
|
r|j                  dd g d |
d	       |S c c}w )N)r   crud_choicelogic_typesactivitytarget=)r   rK   
logic_typeINr   )rK   )modelr   r   r   countORzrequest_type.ui_form_createrH   zrequest_type.ui_form_viewzrequest_type.ui_form_view_innerr   ui_form_createui_form_viewui_form_view_innerCmfSDeskRequestType)r!   CmfUiFormSchemeRuler#   r   r   getattrr   r<   r   r   r   r   r   )r   rulesr)   rulerw   r   filterslogic_type_idsltactivity_idr   r\   s               r   usage_statszCmfUiForm.usage_stats   s   **00OsDGG,- 1 
  	D,,JFJ/EG "N262B2B!CB"%%!C!CdNCD K}}"mm..
C=>KKwK/EMM##//-' )	8 6dC0t<6tTBD nn""'"2MM&#'#% $"  )46#D$/)$57 ((..g.>MM2#'#% $"  Y "Ds   3FF)TEXKOM_db_deletec                ~   d}| j                         D ]
  }||d   z  } |rt        d| dd       t        j                  j	                  dd| g|	      D ]  } |j
                  |d
|i|  t        j                  j	                  dd| g|	      D ]  } |j
                  |d
|i|  t        |   |d
|i|S )Nr   r   u}   Невозможно удалить используемый экран. Данный экран используется в u    объектахT)abortr   rH   )rK   include_deletedr   )r   	cmf_alertr!   r"   rq   deleterU   r   )	r   r   r'   r(   usage_countusagefieldrf   r   s	           r   r   zCmfUiForm.delete=  s   %%' 	*E5>)K	*  V  Wb  Vc  ct  u "**//$7M_o/p 	MEELL$L1ALVL	M**//$7M_o/p 	MEELL$L1ALVL	Mw~tQ6FQ&QQr   )NNN)NN)__name__
__module____qualname__r   r   api_methodsr   staticmethodon_server_eventr   r&   rT   r+   boolr4   r9   r>   rE   rq   r^   classmethodr}   r   r   r   r   r   __classcell__)r   s   @r   r   r      sK   ''337
 
K9 01G 2 G 3 D  ( 7$ 7 7
 "# " " .# .$ . . 0# 0RV 0 0 A A A AF O$ O$b5<| .3 R Rr   r   )typingr   cmf.includecommon.fields.cmf_workflowcommonmodules.settings.fieldsr   r   rP   r   r   <module>r      s'      ! /@R%% @Rr   