U
    gg                     @   s   d Z ddlZddlZddlZddlmZmZ ddlmZ ddl	m
Z
 ddlZddlmZ ddlmZ ddlZddlT dd	lmZ eed
 Zed Zed Zdd Zdd Zdd Zdd ZdS )zP
    SPEC: https://bcrm.carbonsoft.ru/project/Document/DOC-011091#spec-011090-b
    N)defaultdictOrderedDict)sha1)chain)DictPath)*)isclassZtmpz__autogen_models.pyz__autogen_models_tmp.pyc                  c   s   t ddd} t ddd}t df| t dt df| t d	| t d
| t d}|D ]"}||D ]}|dkrvqh|V  qhq\d S )N)dir_pathc                 s   s0   |   sd S t|  D ]}|  r|V  qd S N)is_dirsortediterdir)r   Zsub_path r   ./cmf/make_models.pyget_sub_dirs5   s
    z)iter_models_modules.<locals>.get_sub_dirsc                 s   sv   | d | d fD ]`}|  sqt| D ]D}| r*|jdksBq*|jdrPq*t|j	ddd |j
 V  q*qd S )Nfieldsmodels)z.pyz.pyc_/.)r   r   r   is_filesuffixname
startswithstrparentreplacestem)r   Zmodules_dir_pathZmodule_pathr   r   r   get_modules<   s    z(iter_models_modules.<locals>.get_modulescmfzcmf/modulescommonmoduleszcustom/pluginszcustom/modules)zcmf.fields.base_fieldszcmf.models.base_modelr   )r   r    Zbase_dir_pathsZbase_dir_pathmodule_namer   r   r   iter_models_modules,   s     	



	r%   c            -         s  t jdd tjdd dd } i }t D ]T}t| tj|d d}|j D ].\}}t	
|rNt|tjjrN| |||| qNq*tjG dd d tjG  fdd	d	}t|}tt}i }	t }
|D ]~}|| }|| }td
|  d|_dD ]v}|| D ]hjddrHd|_tdj dj dj dj d	 fdd|jD |_|j qq|jD ]Z}| D ]J}|j|jkrd|_td|j d|j d|j d|j d	  qvqqv|jstd| d |
| qd }|jD ]}|d kr|jr|j}|j D ]\}}||jkrR |||j|j|< t|tjjr| d}|t|kr||j kr||j |< q(t|tjj!r|j"s|j#st$d| d|j d|% }||	kr|j"r|j|j&g|	|< n|j#r|j&|jg|	|< nt|tjj'r(|j"sJ|j#sJt$d| d|j dd }|j"rl|j |j()  }n4|j#r|j&st*d| d|j& |j+)  }|r(|| ||g q(q |rt }|, D ]V}|D ]J}t-|t.r|| n,dD ]&}||t/ D ]}|| qqqڐq|j D ]\}}||k|_0q4qt 1t j2 dt34  }|5d}|6d |6d |6d t7|D ]}td
|  || }|jsq|6d  |jD ]} |6d!8| j q|6d"8|d#9d$d |jD  |6d% t7|jD ]j}|j| }|6d&| d'|j: d|j; d|j< d(|j; d|j< d) |j0d k	r$|6d*|j0 d+ q$|j D ]}!|j |! }t|tjj=r|6d&|! d,|j> d-tjj?@|j& d.|jA d/|jB d0 |jCrn|6d1 njt|tjjDr|6d&|! d,|j> d2|jA d/|jB d3d#9d4d5 |jpLg D  d6 |jCr|6d1 qqt7|D ]}"||" }#d7d |#D }$t.tt7td8d5 |$D }%t.tt7td9d5 |#D }&|6d  d}'|#D ]}(|(d: jErd}' qq|6d;|" d< |6d% |6d=|' d+ |6d>|& d? |6d@ |6dA |6dB|% d? |6dC |6dD |6dE q~t7|	D ]}"|	|" }#|#\})}*tjj?@|)}+tjj?@|*},|6d  |6d;|" dF |6d% |6dG|) dH |6dI|+ dJ |6dA |6dK|* dH |6dL|, dJ |6dM |6dN q|6d+ |F  |F  W 5 Q R X |Gt  d S )ONT)
missing_okc                 S   s   || krg g g g g d| |< | dr:| | d | n| drX| | d | nh| drv| | d | nJ| dr| | d	 | n,| d
r| | d | ntd|d S )N)r!   r"   r#   pluginscustomzcmf.r!   zcommon.r"   zmodules.r#   zcustom.plugins.r'   zcustom.modules.r(   ub   Неизвестный источник для импорта полей для моделей: {})r   append	Exceptionformat)models_listpathr   objr   r   r   add_to_models_list]   s$    
	




z3make__autogen_models_py.<locals>.add_to_models_list)packagec                   @   s6   e Zd ZU dZeed< eed< eed< dZeed< dS )z*make__autogen_models_py.<locals>.FieldDatau$   Данные поля для autogen
field_name
model_namemodel_moduleNui_form_visible)__name__
__module____qualname____doc__r   __annotations__r4   boolr   r   r   r   	FieldData   s
   
r;   c                       sb   e Zd ZU dZdZeed< eje	dZ
e	ed< ejedZeed< ejedZee f ed< dS )z*make__autogen_models_py.<locals>.ModelDatau(   Данные модели для autogenNautogen)default_factory	hierarchy	id_fieldsr   )r5   r6   r7   r8   r<   r:   r9   dataclassesfieldlistr>   r   r?   dictr   r   r   r   )r;   r   r   	ModelData   s
   
rD   zmodel_name )r(   r'   r#   r"   r!   ZabstractFzSkip model r   z due z is abstract!c                    s   g | ]}t  |s|qS r   )
issubclass.0m)modelr   r   
<listcomp>   s     
 z+make__autogen_models_py.<locals>.<listcomp>!Z_idzfield z of z$ should have left=True or right=Trueu   У поля u-    не указана модель field.model)r   Zcol1Zcol2zw+z+# Autogenerated by manage.py make_models. 
zfrom cmf import fields
zfrom cmf import modelsz


z
import {}
zclass {}({}):
,c                 S   s   g | ]}d  |j|jqS )z{}.{})r+   r6   r5   rF   r   r   r   rJ      s     z    abstract = False
z
    class (z):
        """z
 field"""
z        ui_form_visible = 
z&(fields.CmfTUUID):
        caption = "z ID"
        foreign_key = "z.id"
        nullable = z
        unique = z.
        visible = False
        index = True
z        no_acl = True
z ID"
        nullable = z
        foreign_keys = [c                 s   s$   | ]}d t jj| dV  qdS )'z.id'N)r!   r   
base_modelcamel2snakerF   r   r   r   	<genexpr>  s     z*make__autogen_models_py.<locals>.<genexpr>z+]
        visible=False
        index=True
c                 S   s    g | ]}|d  j r|d  jqS )   )leftr   rG   Zvvr   r   r   rJ   %  s     
 c                 s   s   | ]}|D ]
}|V  q
qd S r   r   )rG   sir   r   r   rR   &  s       c                 s   s"   | ]}|d  j r|d  jV  qdS )rS   N)rightrI   rU   r   r   r   rR   '  s     
 rS   zclass z(models.CmfGM2MModel):
z    custom = uR       left = fields.Field(fields.CmfGenericRelation, caption="Объект", models=z)
ud       left_id = fields.Field(fields.CmfTUUID, caption="ID Объекта", nullable=True, index=True)
uQ       # TODO: TODO1 сделать update *_cache при обновлении name
uU       right = fields.Field(fields.CmfGenericRelation, caption="Элемент", models=ug       right_id = fields.Field(fields.CmfTUUID, caption="ID Элемента", nullable=True, index=True)
ue       left_name_cache = fields.Field(fields.CmfStr256, caption="Имя объекта", nullable=True)
uh       right_name_cache = fields.Field(fields.CmfStr256, caption="Имя элемента", nullable=True)
z(models.CmfM2MModel):
uV       left = fields.Field(fields.CmfRelation, caption="Левый Объект", model="z")
uc       left_id = fields.Field(fields.CmfTUUID, caption="ID Левого Объекта", foreign_key="z!.id", nullable=True, index=True)
uY       right = fields.Field(fields.CmfRelation, caption="Правый Объект", model="uf       right_id = fields.Field(fields.CmfTUUID, caption="ID Правого Объекта", foreign_key="ur       left_name_cache = fields.Field(fields.CmfStr256, caption="Имя левого объекта", nullable=True)
uu       right_name_cache = fields.Field(fields.CmfStr256, caption="Имя правого объекта", nullable=True)
)Hmodels_orig_pathunlinkmodels_tmp_pathr%   print	importlibimport_module__dict__itemsinspectr
   rE   r!   r   	BaseModelr@   Z	dataclassr   rB   setr<   getr6   r5   r>   r)   __subclasses__addui_formr   CmfRelationBasedirr?   ZCmfM2MrT   rX   AssertionErrorm2m_model_cls_namerI   ZCmfGenericM2M
class_name
capitalize
ValueErrorbackrefvalues
isinstancer   tupler4   	with_namer   osgetpidopenwriter   r+   joinr3   r2   r1   ZCmfRelationZcaptionrP   rQ   nullableuniqueno_aclZCmfGenericRelationr(   flushrename)-r/   Zmodels_dictr$   r3   Zobj_namer.   rD   Zmodels_dataZgm2mZm2mZabstract_modelsr2   Z
model_dataZ
model_listZ
model_typerH   subrg   Z	fieldnamerA   Zid_fieldnamerk   Zgm2m_keyZui_form_fieldsZui_form_groupZui_fieldZlist_keyZui_field_namer1   Z
field_dataZmodels_orig_tmp_pathZ
model_fileZ	imp_modelZid_field_namekvZright_choices_nestedZright_choicesZleft_choicesr(   valZleft_model_nameZright_model_nameZleft_name_snakeZright_name_snaker   )r;   rI   r   make__autogen_models_pyY   s   

*
*













	
	











r   c                     sX  dd l } tt  dd lm} | t i }t	  g }t
t|D ]p}tt|}t|trFt|tjjrFt|tjjr|qF||  |j |jD ]}t|tjjr|||j< qqFi }i }|D ](}t|dd r|j||j< |j||j< qt|}	 fdd| D | }ddddd	d
dddddhddhdddddddddddddddhdhd d! fd"d#d;fd$d%	d}
t	 }|D ]2}|
t|j7 }
|j D ]}||j qqfd&d'|D }td(t| d)|	 d*|
 d+t|  tjt t!j"#t$j%d,gd-d.}d/d-d0|j&d1< |D ]`}|j' D ]N\}}|d2krDzt()| W n*   td3|j d4| d5|   Y nX qDq6|*d6j+|tj|||ttt,d7}|*d8j+|tj|||ttt,d7}t-d9 }|.|j/ d4t!0  }|| t-d: }|.|j/ d4t!0  }|| |1| |1| d S )<Nr   ui_namec                    s   g | ]}|j  kr|qS r   )rl   )rG   rI   )concrete_models_namesr   r   rJ     s    
 z+make__autogen_models_ts.<locals>.<listcomp>autorP   Zclass_full_namerl   Zfield_options_list_limitZnested_fieldsZ
max_lengthstepZscaleZcommentr{   ry   Zvisibler(   ZlinkablereadonlyZvirtualro   choicesrT   rX   maxminZplaceholderZoptions_list_paramsZoptions_list_query_allr4   c                 S   s  d}t | tjjrd}nt | tjjr,d}nt | tjjr@d}nt | tjjrTd}nt | tjjrhd}nt | tjjr|d}nzt | tjj	tjj
frd}n^t | tjjrd	}nJt | tjjtjjfrd
}n.t | tjjrd}nt | tjjtjjfrd}t| dd pt| dot| dg}|r0|d d kr4|S t | tjjtjjfrb| dd| dS t | tjjtjjtjjfr| dd| dS |S )NZCmfFieldZCmfTextFieldZCmfPhoneFieldZCmfStrFieldZCmfBigIntFieldZCmfIntFieldZCmfBoolFieldZCmfDateTimeFieldZCmfDateTimeRangeFieldZCmfRelationFieldZCmfM2MFieldZCmfBackrefFieldr   rI   r   <z | >z<(z)[]>)rE   r!   r   ZCmfTextZCmfPhoneZCmfStrZ	CmfBigIntZCmfIntZCmfBoolZCmfDateZCmfDateTimeZCmfDateRangerh   Z	CmfObjectZ
CmfM2MBaseZCmfBackrefBaseZCmfObjectListgetattrhasattrrx   )	field_clsZts_classZrel_models_listr   r   r   ts_field_class  sB    z/make__autogen_models_ts.<locals>.ts_field_classc                    sb   i }| j  D ]N\}}|kr"qn2|kr2|r2qn"| krB|sBqn|krT|dkrTq|||< q|S )ub   Вернём мету без имён и неважных для фронта параметровN)ui_metar`   )r   r   Z
meta_param
meta_value)params_def_falseparams_def_noneparams_def_trueparams_to_stripr   r   
strip_meta  s    
z+make__autogen_models_ts.<locals>.strip_metac                    sN   |d kr | }|  d\}}}t|}|d t|d d d  S )Nr   :zutf-8   )	partitionr   r   encodeZ	hexdigest)r   r   Z
field_typer   Z_field_type_paramsZhash_key)r   r   r   r   
field_hash  s
    z+make__autogen_models_ts.<locals>.field_hashc                    s2   i | ]*}|j  D ]}|jd s ||qqS )Zcf_)r   rp   rl   r   )rG   rI   r   )r   r   r   
<dictcomp>  s     z+make__autogen_models_ts.<locals>.<dictcomp>zmodels_count: z, concrete_models_count: z
, fields: z, uniq_fields zcmf/templatesT)loaderZkeep_trailing_newlineF)Zensure_asciiZ	sort_keyszjson.dumps_kwargs)r   Zui_form_customuD   Ошибка в метаданых, неправильный тип r   r   zautogen_models_ts.jinja2)r,   Z
cmf_fieldsmodels_by_ui_nameui_name_by_modelsfields_indexr   r   r   rE   r   r   zautogen_fields_ts.jinja2z__autogen_models.tsz__autogen_fields.ts)N)2r]   r[   
write_textrY   	read_textZtmp.__autogen_models_tmp__autogen_models_tmpreloadr   rc   r   varsr   rq   typerE   r!   rb   ZBaseM2MModelr)   rf   rl   __mro__r   lenrp   r   updater   r\   Zjinja2ZEnvironmentZFileSystemLoaderrt   r-   rx   ZconfigPROJECT_DIRZpoliciesr`   jsondumpsZget_templateZrenderr   autogen_pathrs   r   ru   r}   )r]   r   Z
all_modelsZautogen_modelsr   rI   baser   r   Zconcrete_models_countZfields_countZfield_ui_meta_setr   r   Z	jinja_envZ	meta_namer   Zautogen_models_textZautogen_fields_textZprev_models_fileZtemp_models_fileZprev_fields_fileZtemp_fields_filer   )r   r   r   r   r   r   r   r   r   make__autogen_models_tss  s    




#                      "
(





r   c                   C   s   t   t  d S r   )r   r   r   r   r   r   make__autogen_modelsE  s    r   )r8   Zfilecmpr   shutilcollectionsr   r   Zhashlibr   	itertoolsr   r@   typingr   pathlibr   Z
cmf.fieldsr!   Zcmf.includera   r
   r   r   rY   r[   r%   r   r   r   r   r   r   r   <module>   s,   -   S