U
    Mdf                     @   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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S )    N)defaultdictOrderedDict)sha1)chain)Dict)Path)*)isclassZtmpz__autogen_models.pyz__autogen_models_tmp.pyc            4         s	  t jdd tjdd dd } i }tttjtddtjtj	d dd}|D ]D\}}}|
td}|
tj	d jdd	d
d d}d}|ds|dsd}ndD ]}||rd}q|rqPt|D ]}|ds|drt|| |ds|dr|dkrtd qddd |dD }	tj|	d |dd  d d}
|
j D ]4\}}t|r^t|tjjr^| ||	|| q^qqPt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r`d|_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&	  qqq|jstd!| d& |&| qd }|j#D ]}|d kr:|j'r:|j'}|j( D ]\}}||j(krn |||j!|j(|< t|tj(j)r| d'}|t*|kr||j+kr||j+|< qDt|tj(j,r.|j-s|j.st/d(| d)|j" d*|0 }||kr|j-r|j"|j1g||< n|j.r|j1|j"g||< nt|tj(j2rD|j-sf|j.sft/d(| d)|j" d*d }|j-r|j" |j34  }n4|j.r|j1st5d+| d,|j1 |j64  }|rD|| $||g qDq|rt }|7 D ]V}|D ]J} t8| t9r|&|  n,d-D ]&}!|  |!t: D ]}"|&|" q*qqq|j( D ]\}#}$|#|k|$_;qRqt <t j= dt>  }%|%?d.}&|&@d/ |&@d0 |&@d1 t|D ]}td|  || }|jsq|&@d2 |j#D ]}'|&@d3A|'j! q|&@d4A|d5d6d% |j#D  |&@d7 t|j(D ]j}#|j(|# }$|&@d8|# d9|$jB d|$jC d|$jD d:|$jC d|$jD d; |$j;d k	rD|&@d<|$j; d= qD|j+D ]}(|j+|( }t|tj(jEr$|&@d8|( d>|jF d?tjjGH|j1 d@|jI dA|jJ dB |jKr|&@dC njt|tj(jLr|&@d8|( d>|jF dD|jI dA|jJ dEd5dFd |jplg D  dG |jKr|&@dC qqt|D ]})||) }*dHd% |*D }+t9tttdId |+D },t9tttdJd |*D }-|&@d2 d}.|*D ]}/|/d	 jMrd}. q&q|&@dK|) dL |&@d7 |&@dM|. d= |&@dN|- dO |&@dP |&@dQ |&@dR|, dO |&@dS |&@dT |&@dU qt|D ]})||) }*|*\}0}1tjjGH|0}2tjjGH|1}3|&@d2 |&@dK|) dV |&@d7 |&@dW|0 dX |&@dY|2 dZ |&@dQ |&@d[|1 dX |&@d\|3 dZ |&@d] |&@d^ q|&@d= |&N  |&N  W 5 Q R X |%Ot  d S )_NT)Z
missing_okc                 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   ./cmf/make_models.pyadd_to_models_list-   s,    
	





z3make__autogen_models_py.<locals>.add_to_models_list)followlinksr    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>s   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
   
r2   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,   r-   r.   r3   r1   r0   dataclassesfieldlistr5   r   r6   dictr   r   r/   r   )r2   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   r@      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   r@   "  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)rightr?   rI   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)
)Pmodels_orig_pathunlinkmodels_tmp_pathsortedr   oswalkPROJECT_DIRr
   __path__replacersplitendswithr   printjoinsplit	importlibimport_module__dict__itemsinspectr	   r<   r   	BaseModelr7   Z	dataclassr   r9   setr3   getr,   r+   r5   r   __subclasses__addui_formr   CmfRelationBasedirr6   ZCmfM2MrH   rL   AssertionErrorm2m_model_cls_namer?   ZCmfGenericM2M
class_name
capitalize
ValueErrorbackrefvalues
isinstancer/   tupler*   	with_namer   getpidopenwriter   r)   r(   r'   ZCmfRelationZcaptionrF   rG   nullableuniqueno_aclZCmfGenericRelationr   flushrename)4r   Zmodels_dictrR   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_typer>   subre   Z	fieldnamer8   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kr#   Zright_choices_nestedZright_choicesZleft_choicesr   valZleft_model_nameZright_model_nameZleft_name_snakeZright_name_snaker   )r2   r?   r   make__autogen_models_py)   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   )r"   r?   )concrete_models_namesr   r   r@     s    
 z+make__autogen_models_ts.<locals>.<listcomp>autorF   Zclass_full_namerj   Zfield_options_list_limitZnested_fieldsZ
max_lengthstepZscaleZcommentrw   ru   Zvisibler   ZlinkablereadonlyZvirtualrm   choicesrH   rL   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   r?   r   <z | >z<(z)[]>)r<   r
   r   ZCmfTextZCmfPhoneZCmfStrZ	CmfBigIntZCmfIntZCmfBoolZCmfDateZCmfDateTimeZCmfDateRangerf   Z	CmfObjectZ
CmfM2MBaseZCmfBackrefBaseZCmfObjectListgetattrhasattrrY   )	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_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   rn   rj   r   )r"   r?   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)/r[   rO   Z
write_textrM   Z	read_textZtmp.__autogen_models_tmp__autogen_models_tmpreloadr   ra   rP   varsr   ro   typer<   r
   r`   ZBaseM2MModelr   rd   rj   __mro__r   lenrn   r   updater   rX   Zjinja2ZEnvironmentZFileSystemLoaderrQ   r   rY   ZconfigrS   ZpoliciesZget_templateZrenderr   autogen_pathrq   r   rr   ry   )r[   r   Z
all_modelsZautogen_modelsr   r?   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_tsp  s    




#                      "
(




r   c                   C   s   t   t  d S r!   )r   r   r   r   r   r   make__autogen_models8  s    r   )ZfilecmpZjsonshutilcollectionsr   r   Zhashlibr   	itertoolsr   r7   typingr   pathlibr   Z
cmf.fieldsr
   Zcmf.includer_   r	   rS   r   rM   rO   r   r   r   r   r   r   r   <module>   s(     I I