U
    Įwh
1                     @   s8   d dl m Z  d dlT d dlZG dd dejjjjZdS )    )copy)*Nc                       s   e Zd ZdZejjjjj	ddg Z	 fddZ
 fddZ fdd	Zed' fdd	Zed( fdd	Zdd Zdd Zdd Zdd Zdd Zd) fdd	Zdd Zdd Zed*d d!Zed+d"d#Zed
d d$d%d&Z  ZS ),CmfAssetTui_getui_get_create_formc                    sj   |    |   |   |   | jjr4tddd | jsFtddd | jsXtddd t	 j
|| d S )NuQ   Нельзя добавить объект в абстрактную группуTabortu#   Не заполнена схема!u   Не заполнено имя!)	_calc_cat_calc_parent_calc_logic_type_calc_workflow	asset_catZis_abstract	cmf_alertparentnamesupersaveselfargskwargs	__class__ #./modules/asset/models/cmf_asset.pyr      s    zCmfAsset.savec                    s   |    t j|| d S N)r
   r   _save_importr   r   r   r   r      s    zCmfAsset._save_importc                    s   t   dddddg S )Nzparent.*r   zasset_cat.parentzasset_cat.default_logic_typezasset_cat.is_abstract)r   save_preload_fieldsr   r   r   r   r   "   s        zCmfAsset.save_preload_fieldsNc              
      sj   t  |}|sfddg}|tj|d7 }|tj|d7 }|tj|7 }|tj|d7 }|S )Nr   Zext_idasset_code_prefixdefault_logic_typemodel_idbar_codeproduct_information
unit_priceversion
short_name)r   )r    )r!   r"   r#   r$   r%   r&   )r   import_shop_fieldsmodelsZCmfAssetSchemeCmfAssetCatCmfAssetTypeCatCmfAssetType)clsZfields_nameresZcommon_fieldsr   r   r   r'   '   s<            zCmfAsset.import_shop_fieldsc           	         s   |dkr.|o| dd }|s g }|dd|gg}|dkr|s>g }d }|rh| di }|rd| dd }ng S |rtjj |dgd}|jr|dd	|jgg}|o| dd }|r|dd
|gg}t j|f|||d|S )Nr   	parent_idz==Zasset_typesidasset_types_catr/   fieldsasset_type_catIN=)filtermodels_listobject_fields)getr(   r)   r0   r   field_options_list)	r,   Zrelation_field_namer6   r7   r8   r   r.   Zasset_cat_idr   r   r   r   r:   M   s4    zCmfAsset.field_options_listc                 C   sN   | j sJtjjdgdddgdddggd| _ | j sJtjjdgdddgd| _ d S )Nr   systemr5   Tr   u   Оборудование)r2   r6   )r   r(   r)   r9   r   r   r   r   r	   k   s    

zCmfAsset._calc_catc                 C   s0   | j s|   | js,| jdg | j j| _d S )Nr   )r   r	   r   r3   Zload_fieldsr   r   r   r   r
   t   s
    zCmfAsset._calc_parentc                 C   s   | j s
d S | jj| _d S r   )Zis_newr   r    
logic_typer   r   r   r   r   {   s    zCmfAsset._calc_logic_typec                 C   s   | j stjjdd| _ d S )Nzasset.system:default)code)Zworkflowr(   ZCmfWorkflowr9   r   r   r   r   r      s    zCmfAsset._calc_workflowc                 C   s$   | j s|   | j j  | j jjS r   )r   r
   r   loadvaluer   r   r   r   get_code_prefix   s    zCmfAsset.get_code_prefixFc                    s   | j r| jjs|sd S | j s*t   d S |rx|  }| j j| drb| j jd|dkrxd| j	_t   d S | jjr| j j|   dsd | _ t   d S d S )N-T)
r=   r   Z
is_changedr   
_calc_coder@   r?   
startswithcountr<   )r   Zfrom_recalculate
new_prefixr   r   r   rB      s(    
,
 
zCmfAsset._calc_codec                 C   sN   d}| j dddgdd| jgdd| jggd	gd
d}|rJt|jdd }|S )Nr=   z
SIMILAR TOz
%-[0-9]+\Zr   r5   r/   z!=z-cmf_created_atT)r6   Zorder_byZinclude_deletedrA   )sgetr.   r/   intr=   split)r   Z
max_numberlastr   r   r    _get_current_code_number_from_db   s    "z)CmfAsset._get_current_code_number_from_dbc                 C   s   t j}d}| jr| jj}d| j d| }| j d| d}|jj|dd}|  z2||rl||}n|  d
 }||| W 5 z|  W nF tj	j
k
r } z$td| d|j d	|j  W 5 d }~X Y nX X | S )NZNOASSETznext_code_number-rA   z.lock   )timeoutzlock release error z, lock_name z
, timeout    )ZAPPZREDIS_DBr.   r?   
class_nameZredislockacquirerelease
exceptionsZ	LockErrorgdebugr   rM   existsZincrrK   set)r   Zredis_dbsuffixkeyZlock_keyrP   enext_code_numberr   r   r   r[      s$    
4zCmfAsset.next_code_numberc                 C   s   dd }dd }dd }||}t  }g }|}|r|j|krNtd| dd	 ||j ||sj||krz|||j t|jj|j	d
ddddgdd}q.|
  ddd|jdkrdndg}	tjj|||d|	d\}
}t|j|j|j|
|d}|S )Nc                 S   s   | j dkrdS dS )Nr)   r   r+   )rO   )	category_r   r   r   get_model_name   s    z5CmfAsset._build_asset_ui_form.<locals>.get_model_namec                 S   s    | j dkrdnd}t| |d S )Nr)   asset_ui_formasset_type_ui_formr   rO   getattrr\   Z	attr_namer   r   r   get_category_form   s    z8CmfAsset._build_asset_ui_form.<locals>.get_category_formc                 S   s   | j dkrdnd}t| |S )Nr)   asset_ui_form_children_inherit#asset_type_ui_form_children_inheritr`   rb   r   r   r   is_category_form_inherit   s    z?CmfAsset._build_asset_ui_form.<locals>.is_category_form_inherituE   Обнаружен цикл в структуре категорий Tr   tree_parent_idre   rd   r^   r_   )r/   r2   Zcache_inmemoryr   r<   r=   r)   r   r3   Z_main)
model_nameZrequired_grouprequired_fields)r   r=   Z_id	ui_fieldsui_group_fields)rW   r/   r   addappendcmfutilget_model_by_namerO   rG   rg   reverser(   Z	CmfUiFormZget_ui_fields_inheriteddictr   r=   )r,   categoryr]   rc   rf   Zui_formZcategory_setZui_form_listZcurr_categoryri   rj   rk   ui_form_jsonr   r   r   _build_asset_ui_form   sV    
        
zCmfAsset._build_asset_ui_formc                 K   sH   | dr"tjj|dddgd}ntjj|dddgd}| j|d}|S )	u:  
        Что-то вроде ui_get, но только для формы создания
        Метод нужен потому, что при создании самого актива еще не существует, и мы получаем его форму у категории актива
        zCmfAssetCat:rg   rd   r^   r1   re   r_   rr   )rC   r(   r)   rG   r*   rt   )r,   rg   _kwargstmp_objrs   r   r   r   r      s    
zCmfAsset.ui_get_create_form)r2   rh   c                O   s   |sg }|dkrd}d}d}nd}d}d}t |}| d| d	| | d	| g}	|j|d
|	i|}
t|
|}| j|d}t|}|d D ]}||d
  q|j|d
t|i|}|r||_|d |_	|d |_
|S )ux   
        fields - список мета-правил для указания какие поля грузить
        r   r   r^   rd   r3   r_   re   z.tree_parent_id.r2   ru   rk   r   r=   )rn   ro   rG   ra   rt   rW   updatelistrs   Zui_form_nameZui_form_code)r,   r2   rh   r   r   Zcat_field_nameZuiform_field_nameZchildren_inherit_field_nameZasset_modelZ
tmp_fieldsrw   rr   rs   Z
ext_fieldsgroupretr   r   r   r     s4    



zCmfAsset.ui_get)N)NNN)F)N)N)__name__
__module____qualname__Z	api_allowmodulesassetr2   	cmf_assetr   Zapi_methodsr   r   r   classmethodr'   r:   r	   r
   r   r   r@   rB   rK   r[   rt   r   r   __classcell__r   r   r   r   r      s4   %	
3r   )r   Zcmf.includeZmodules.asset.fields.cmf_assetr   r   r2   r   r   r   r   r   r   <module>   s   