U
    ~}de                     @   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replaceZ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)Z
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__r2   boolr   r   r   r   	FieldData   s
   
r9   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   )r3   r4   r5   r6   r:   r8   r7   dataclassesfieldlistr<   r   r=   dictr   r   r   r   )r9   r   r   	ModelData   s
   
rB   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)   r4   r3   rD   r   r   r   rH      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camel2snakerD   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   rE   Zvvr   r   r   rH   %  s     
 c                 s   s   | ]}|D ]
}|V  q
qd S r   r   )rE   sir   r   r   rP   &  s       c                 s   s"   | ]}|d  j r|d  jV  qdS )rQ   N)rightrG   rS   r   r   r   rP   '  s     
 rQ   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
   rC   r    r   	BaseModelr>   Z	dataclassr   r@   setr:   getr4   r3   r<   r'   __subclasses__addui_formr   CmfRelationBasedirr=   ZCmfM2MrR   rV   AssertionErrorm2m_model_cls_namerG   ZCmfGenericM2M
class_name
capitalize
ValueErrorbackrefvalues
isinstancer   tupler2   	with_namer   osgetpidopenwriter   r)   joinr1   r0   r/   ZCmfRelationZcaptionrN   rO   nullableuniqueno_aclZCmfGenericRelationr&   flushrename)-r-   Zmodels_dictr#   r1   Zobj_namer,   rB   Zmodels_dataZgm2mZm2mZabstract_modelsr0   Z
model_dataZ
model_listZ
model_typerF   subre   Z	fieldnamer?   Zid_fieldnameri   Zgm2m_keyZui_form_fieldsZui_form_groupZui_fieldZlist_keyZui_field_namer/   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   )r9   rG   r   make__autogen_models_pyY   s   

*
*













	
	











r   c                     s  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#d8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< |'d2j(|tj|||ttt)d3}|'d4j(|tj|||ttt)d3}t*d5 }|+|j, d6t!-  }|| t*d7 }|+|j, d6t!-  }|| |.| |.| d S )9Nr   ui_namec                    s   g | ]}|j  kr|qS r   )rj   )rE   rG   )concrete_models_namesr   r   rH     s    
 z+make__autogen_models_ts.<locals>.<listcomp>autorN   Zclass_full_namerj   Zfield_options_list_limitZnested_fieldsZ
max_lengthstepZscaleZcommentry   rw   Zvisibler&   ZlinkablereadonlyZvirtualrm   choicesrR   rV   maxminZplaceholderZoptions_list_paramsZoptions_list_query_allr2   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   rG   r   <z | >z<(z)[]>)rC   r    r   ZCmfTextZCmfPhoneZCmfStrZ	CmfBigIntZCmfIntZCmfBoolZCmfDateZCmfDateTimeZCmfDateRangerf   Z	CmfObjectZ
CmfM2MBaseZCmfBackrefBaseZCmfObjectListgetattrhasattrrv   )	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_paramZ
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   rn   rj   r   )rE   rG   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_kwargszautogen_models_ts.jinja2)r*   Z
cmf_fieldsmodels_by_ui_nameui_name_by_modelsfields_indexr   r   r   rC   r   r   zautogen_fields_ts.jinja2z__autogen_models.tsr   z__autogen_fields.ts)N)/r[   rY   Z
write_textrW   Z	read_textZtmp.__autogen_models_tmp__autogen_models_tmpreloadr   ra   r   varsr   ro   typerC   r    r`   ZBaseM2MModelr'   rd   rj   __mro__r   lenrn   r   updater   rZ   Zjinja2ZEnvironmentZFileSystemLoaderrr   r+   rv   ZconfigPROJECT_DIRZpoliciesZget_templateZrenderr   autogen_pathrq   r   rs   r{   )r[   r   Z
all_modelsZautogen_modelsr   rG   baser   r   Zconcrete_models_countZfields_countZfield_ui_meta_setr   r   Z	jinja_envZ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_models;  s    r   )r6   ZfilecmpZjsonshutilcollectionsr   r   Zhashlibr   	itertoolsr   r>   typingr   pathlibr   Z
cmf.fieldsr    Zcmf.includer_   r
   r   r   rW   rY   r$   r   r   r   r   r   r   r   <module>   s,   -   I