
    KBi-5                     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                        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
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                 2   i }t         j                  j                  | ddg      D ]n  }ddi||j                  <   |j                  r0|j                  j
                  j                  ||j                     d<   |j                  s]d||j                     d<   p |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_fieldr   r   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=%%&''BOBZBZBlBlBrBr}))*+>?,,@D}))*+<=	E r   c                 j   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 ]<  }|j                  j                  r|j                  j                  r2|j                  j
                  |vrt        |j                  j                  |j                  j
                  |j                  j                  g g g |j                  j                  |j                  j                  |j                  j                  	      }|||j                  j
                  <   |j                  j                  r%|j                  |j                  j                         |j                  d
k(  rKd|j                  d
    d|j                   }||j                  j
                     d   j                  |       n5||j                  j
                     d   j                  |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   r-   )hiddenr-   Fr   )filterr   )	r,   r   r$   r   hidden_fieldshide_empty_fieldsparamsordernotypezui_form_group.*r   linkzlink::r   r1   r2   c                     | d   S )Nr4    )xs    r   <lambda>z/CmfUiForm.get_ui_group_fields.<locals>.<lambda>g   s
    q| r   )key)dictr!   CmfUiFormGroupr#   r,   r   r$   r3   r4   r5   r"   ui_form_groupr/   cmf_deletedupdateappend
hide_emptyvaluessort)
r
   r&   r'   	ui_groups_filterr?   r)   ui_groupr6   ress
             r   get_ui_group_fieldszCmfUiForm.get_ui_group_fields/   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
 =E	-55889 ..55OOM$?$?$F$FG!!V+}33F;<Am>P>P=QR-55889(CJJ4P-55889(CJJ=K]K]^##-55889/JQQR_RdRde''-55889:MNUUVcVhVhi=	j> )2(8(8(:;Hx;;+,
 <s   	L0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$   )r1   r2   r   )r1   r2   r   )rJ   r=   setitemsrA   addrB   r*   )ui_form_group_fields
form_groupgroupkv
field_name
field_meta
all_fieldsclsr   group_fields_dictr
   s          r   append_ui_form_fieldsz@CmfUiForm.get_ui_fields_inherited.<locals>.append_ui_form_fieldsw   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   rR   expandNr   )	r5   r,   r   r$   r4   r3   r1   r2   r   r   r1   r2   cf_)rM   r=   rB   discardlistrD   
startswithcmfutilget_model_by_namer   ui_metar   rA   get)rX   ui_form_list
model_namerequired_grouprequired_fieldsrZ   required_group_dict
add_fieldsrU   group_fieldsrR   rV   rW   r   rY   r
   s   `           @@@@r   get_ui_fields_inheritedz!CmfUiForm.get_ui_fields_inheritedj   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                  rM| j                  sA| j                  dk(  r2t
        j                  j                  d      }|j                  |        |S )NCmfTaskzui_form.task:default)code)obj_copy)	supersaveis_newsystemcmf_model_namer!   r   rc   r   )r   r&   r'   rI   ui_form	__class__s        r   rq   zCmfUiForm.save   s^    glD+F+;;t{{""i/ **..4J.Kd+
r   c                 "    t        |   |i |S )N)rp   _save_import)r   r&   r'   rv   s      r   rx   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$   rp   r   r!   r>   r^   )r   r$   ro   r&   r'   grprv   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)rt   crud_choicelogic_typesactivitytarget=)r   r0   
logic_typeINr~   )r0   )modelr|   r}   r~   countORzrequest_type.ui_form_creater-   zrequest_type.ui_form_viewzrequest_type.ui_form_view_innerrm   ui_form_createui_form_viewui_form_view_innerCmfSDeskRequestType)r!   CmfUiFormSchemeRuler#   r   rt   getattrr}   rB   r~   r   r|   rm   r   )r   rulesr(   rulere   r   filterslogic_type_idsltactivity_idr   rG   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   r-   )r0   include_deletedr   )r   	cmf_alertr!   r"   r^   deleter>   rp   )	r   r   r&   r'   usage_countusagefieldrR   rv   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   strr=   r*   r^   rJ   classmethodrk   rq   rx   r   r   r   __classcell__)rv   s   @r   r   r      s    ''337
 
K9 01G 2 G 3 D  ( 8 8 8 8t O$ O$b5<| .3 R Rr   r   )typingr   cmf.includecommon.fields.cmf_workflowcommonmodules.settings.fieldsr   r   r9   r   r   <module>r      s'      ! /XR%% XRr   