U
    -dGm                     @   s   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Zd dlT d dlmZ dd	 Zd
d Zdd ZdS )    N)defaultdictOrderedDict)sha1)chain)Dict)*)isclassc            ;         sf
  ddl m}  | td }| td }tj|r:t| tj|rPt| dd }i }tttj	tddtj	t
jd dd}|D ]L\}}}|td	}|t
jd jd
ddd d	}d}	|ds|dsd}	ndD ]}
||
rd}	q|	rqt|D ]}|ds |drt|| |dsB|drX|dkrXtd qddd |dD }tj|d |dd  d d}|j D ]4\}}t|rt|t
jjr||||| qqqtjG dd d tjG  fddd}t|}tt}i }t  }|D ]}|| }|| }td |  d|_!d!D ]x}|| D ]hj"d"drd|_!td#j# dj$ d$j# dj$ d%	 fd&d'|j%D |_%|j%& q\qP|j%D ]Z}|' D ]J}|j$|j$krd|_!td#|j# d|j$ d$|j# d|j$ d(	  qАqܐq|j!sRtd#| d( |(| q"d }|j%D ]}|d krz|j)rz|j)}|j* D ]\}}||j*kr |||j#|j*|< t|t
j*j+r| d)}|t,|kr||j-kr||j-|< qt|t
j*j.rn|j/s(|j0s(t1d*| d+|j$ d,|2 }||kr|j/rT|j$|j3g||< n|j0r|j3|j$g||< nt|t
j*j4r|j/s|j0st1d*| d+|j$ d,d } |j/r|j$ |j56  } n4|j0r|j3st7d-| d.|j3 |j86  } | r||  &||g qq\|r"t  }!|9 D ]V}"|"D ]J}#t:|#t;rT|!(|# n,d/D ]&}$|#"|$t< D ]}%|!(|% qjqXq8q0|j* D ]\}&}'|&|!k|'_=qq"d}(tjt|(dt>   })t?|)d0}*|*@d1 |*@d2 |*@d3 t|D ]}td |  || }|j!s(q |*@d4 |j%D ]}+|*@d5A|+j# q8|*@d6A|d7d8d' |j%D  |*@d9 t|j*D ]j}&|j*|& }'|*@d:|& d;|'jB d|'jC d|'jD d<|'jC d|'jD d= |'j=d k	r|*@d>|'j= d? q|j-D ]},|j-|, }t|t
j*jErj|*@d:|, d@|jF dAt
jjGH|j3 dB|jI dC|jJ dD |jKr|*@dE njt|t
j*jLr|*@d:|, d@|jF dF|jI dC|jJ dGd7dHd |jpg D  dI |jKr|*@dE qq t|D ]}-||- }.dJd' |.D }/t;ttt dKd |/D }0t;ttt dLd |.D }1|*@d4 d}2|.D ]}3|3d jMrNd}2 qlqN|*@dM|- dN |*@d9 |*@dO|2 d? |*@dP|1 dQ |*@dR |*@dS |*@dT|0 dQ |*@dU |*@dV |*@dW qt|D ]}-||- }.|.\}4}5t
jjGH|4}6t
jjGH|5}7|*@d4 |*@dM|- dX |*@d9 |*@dY|4 dZ |*@d[|6 d\ |*@dS |*@d]|5 dZ |*@d^|7 d\ |*@d_ |*@d` q|*@d? |*N  |*N  W 5 Q R X tjOtjt|(}8tjP|8
rtQ|8jR}9nda}9tQ|)jR}:|9|:k
rX|9dak
r@t|8 tST|)tjt|( n
t|) d S )bNr   Path__autogen_models.py__autogen_models_tmp.pyc                 S   s   || krg g g g g d| |< | dr*d S | drH| | d | n| drf| | d | nh| dr| | d | nJ| dr| | d | n,| dr| | d | ntd|d S )	N)cmfcommonmodulespluginscustomzcmf.contribr   r   r   r   r   ub   Неизвестный источник для импорта полей для моделей: {})
startswithappend	Exceptionformat)models_listpathnameobj r   ./make_models.pyadd_to_models_list,   s,    
	





z3make__autogen_models_py.<locals>.add_to_models_listT)followlinks z/cmf   )maxsplitFfieldsmodels)z./.git/z/.git/z./venv/z/venv/z./node_modules/z/node_modules/z./cmf/contrib/z/cmf/contrib/z./.idea/z/.idea/z
./vassals/z	/vassals/z./tests/z/tests/z.pyz.pycz./cmf/z/cmf/)zbase_fields.pyzbase_model.pyz__init__.pyzbase_fields.pyczbase_model.pycz__init__.pyczSkip system file.c                 s   s   | ]}|r|V  qd S Nr   ).0vr   r   r   	<genexpr>r   s      z*make__autogen_models_py.<locals>.<genexpr>/)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__str__annotations__r-   boolr   r   r   r   	FieldData}   s
   
r5   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!   )r.   r/   r0   r1   r6   r4   r3   dataclassesfieldlistr8   r   r9   dictr!   r   r2   r   )r5   r   r   	ModelData   s
   
r>   zmodel_name )r   r   r   r   r   ZabstractzSkip model z due z is abstract!c                    s   g | ]}t  |s|qS r   )
issubclassr%   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   r/   r.   r@   r   r   r   rC      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camel2snaker@   r   r   r   r'     s     z+]
        visible=False
        index=True
c                 S   s    g | ]}|d  j r|d  jqS )r   )leftr"   r%   Zvvr   r   r   rC   "  s     
 c                 s   s   | ]}|D ]
}|V  q
qd S r$   r   )r%   sir   r   r   r'   #  s       c                 s   s"   | ]}|d  j r|d  jV  qdS )r   N)rightrB   rL   r   r   r   r'   $  s     
 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)
)Upathlibr
   PROJECT_DIRosr   isfileremovesortedr   walkr   __path__replacersplitendswithr   printjoinsplit	importlibimport_module__dict__itemsinspectr   r?   r"   	BaseModelr:   Z	dataclassr   r<   setr6   getr/   r.   r8   r   __subclasses__addui_formr!   CmfRelationBasedirr9   ZCmfM2MrK   rO   AssertionErrorm2m_model_cls_namerB   ZCmfGenericM2M
class_name
capitalize
ValueErrorbackrefvalues
isinstancer2   tupler-   getpidopenwriter   r,   r+   r*   ZCmfRelationZcaptionrI   rJ   nullableuniqueno_aclZCmfGenericRelationr   flushabspathexistsstatst_sizeshutilmove);r
   Zmodels_orig_rmZmodels_tmp_rmr   Zmodels_dictrW   dirnamedirnames	filenamesZskip_dirZignoire_prefixfilenameZmodule_pathr,   Zobj_namer   r>   Zmodels_dataZgm2mZm2mZabstract_modelsr+   Z
model_dataZ
model_listZ
model_typerA   subri   Z	fieldnamer;   Zid_fieldnamerm   Zgm2m_keyZui_form_fieldsZui_form_groupZui_fieldZlist_keyZui_field_namer*   Z
field_dataZautogen_file_nameZtmp_file_nameZ
model_fileZ	imp_modelZid_field_namekr&   Zright_choices_nestedZright_choicesZleft_choicesr   valZleft_model_nameZright_model_nameZleft_name_snakeZright_name_snakeZautogen_file_pathZ	filesize1Z	filesize2r   )r5   rB   r   make__autogen_models_py$   s   

 	

 
*
*













	
	














r   c                     sL  dd l } ddlm} |td }| rht|2}t|td d}||  W 5 Q R X W 5 Q R X dd l}| 	t
 i }t  g }tt|D ]p}tt
|}	t|	trt|	tj
jrt|	tj
jrq||	  |	j |	jD ]}
t|
tj
jr|
||
j< qqi }i }|D ],}	t|	dd r|	j||	j< |	j||	j< qt|} 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d0gd1d2}d3d1d4|j'd5< |(d6j)|tj|||ttt*d7}|(d8j)|tj|||ttt*d7}|td9 }|+|j, d:t#-  }|.| |td; }|+|j, d:t#-  }|.| |/| |/| d S )=Nr   r	   r   r   wui_namec                    s   g | ]}|j  kr|qS r   )rn   )r%   rB   )concrete_models_namesr   r   rC     s    
 z+make__autogen_models_ts.<locals>.<listcomp>autorI   Zclass_full_namern   Zfield_options_list_limitZnested_fieldsZ
max_lengthstepZscaleZcommentrz   rx   Zvisibler   ZlinkablereadonlyZvirtualrq   choicesrK   rO   maxminZplaceholderZoptions_list_paramsZoptions_list_query_allr-   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"   rB   r   <z | >z<(z)[]>)r?   r   r!   ZCmfTextZCmfPhoneZCmfStrZ	CmfBigIntZCmfIntZCmfBoolZCmfDateZCmfDateTimeZCmfDateRangerj   Z	CmfObjectZ
CmfM2MBaseZCmfBackrefBaseZCmfObjectListgetattrhasattrr]   )	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_metarb   )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   )	partitionr2   r   encodeZ	hexdigest)r   r   Z
field_type_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!   rr   rn   r   )r%   rB   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   r?   r   r   zautogen_fields_ts.jinja2z__autogen_models.tsr#   z__autogen_fields.ts)N)0r_   rQ   r
   rR   r}   rv   rw   read__autogen_models_tmpreloadr"   re   rV   varsr   rs   typer?   r   rd   ZBaseM2MModelr   rh   rn   __mro__r   lenrr   r!   updater   r\   Zjinja2ZEnvironmentZFileSystemLoaderrS   r   r]   ZconfigZpoliciesZget_templateZrenderr   Z	with_namer   ru   Z
write_textrename)r_   r
   Zmodels_origZmodels_orig_fdZmodels_work_fdr   Z
all_modelsZautogen_modelsr   rB   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_ts  s    
"




#                      "
(




r   c                   C   s   t   t  d S r$   )r   r   r   r   r   r   make__autogen_modelsT  s    r   )ZfilecmpZjsonr   collectionsr   r   Zhashlibr   	itertoolsr   r:   typingr   Z
cmf.fieldsr   Zcmf.includerc   r   r   r   r   r   r   r   r   <module>   s      g L