
    ?i                       d dl Z d dlZd dl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Zd dlmZ d dlmZ dd	lmZ dd
lmZ i Zd"dZd Zd Zd Zd"dZd Zd"dZ d Z!d Z" G d d          Z# G d d          Z$ G d de$          Z% G d de$          Z&d#dZ' G d d          Z( G d  d!          Z)dS )$    N)defaultdict
namedtuple)deepcopy)List)g)fields)config   )	BaseModel)make_prof_pointc                    ddl mm ddl m  ddlm} 	 t          | |          r|| j        j        j        }| j	        } n|| j        j        } G fdd|j
                   ||                               |           S )Nr   )date	timedelta)datetime)Queryc                   :     e Zd Z	 	 ddZd Z fdZ xZS )%render_query.<locals>.LiteralCompilerFc                 B    |                      |j        |j                  S N)render_literal_valuevaluetype)self	bindparamwithin_columns_clauseliteral_bindskwargss        ./cmf/data_providers/base.pyvisit_bindparamz5render_query.<locals>.LiteralCompiler.visit_bindparam/   s    ,,Y_inMMM    c                      t          |t                    r%dd                     fd|D                       z  S                      |          S )Nz{%s},c                 <    g | ]}                     |          S  )render_array_value).0x	item_typer   s     r   
<listcomp>zLrender_query.<locals>.LiteralCompiler.render_array_value.<locals>.<listcomp>5   s*    )])])]TU$*A*A!Y*O*O)])])]r    )
isinstancelistjoinr   )r   valr(   s   ` `r   r%   z8render_query.<locals>.LiteralCompiler.render_array_value3   s]    #t$$ _)])])])])]Y\)])])] ^ ^^^,,S)<<<r    c                     t          |t                    rt          |          S t          |f          rd|                    d          z  S t          |          r&dt	          |                              dd          z  S t          |t                    r%dd                     fd|D                       z  S t                     	                    |          S )Nz'%s'z%Y-%m-%d %H:%M:%S'z''z'{%s}'r"   c                 F    g | ]}                     |j                  S r$   )r%   r(   )r&   r'   r   type_s     r   r)   zNrender_query.<locals>.LiteralCompiler.render_literal_value.<locals>.<listcomp>A   s,    ,h,h,h]^T-D-DQ-X-X,h,h,hr    )
r*   intreprstrftimestrreplacer+   r,   superr   )r   r   r1   LiteralCompiler	__class__r   r   r   s   ` `r   r   z:render_query.<locals>.LiteralCompiler.render_literal_value8   s    %%% kE{{"ED(#344 k/B C CCCE9-- kE

 2 23 = ===E4(( k388,h,h,h,h,hbg,h,h,h#i#ijj$//DDUERRRr    )FF)__name__
__module____qualname__r   r%   r   __classcell__)r9   r8   r   r   r   s   @r   r8   r   -   s        CH*/	N 	N 	N 	N	= 	= 	=

	S 
	S 
	S 
	S 
	S 
	S 
	S 
	S 
	S 
	S 
	S 
	S 
	Sr    r8   )r   r   r   sqlalchemy.ormr   r*   sessionbinddialect	statementstatement_compilerprocess)rB   rA   r   r8   r   r   r   s      @@@@r   render_queryrE      s    ((((((((!!!!!!$$$$$$ )U## )?',4G'			.(S S S S S S S S S S'4 S S S. ?7I..66yAAAr    c                 6    t                               |           S )uK   Вернём драйвер по имени источника данных)ds_registryget)ds_names    r   get_ddrJ   G   s    ??7###r    c                      t           rt          d          d} t          j                                        D ]F\  }}|                    d          dk    r| ddlm} |} | |d<   t          ||          t           |<   GdS )uY   Инициализация всех источников данных из конфигаuZ   Источники данных нельзя инициализировать дваждыNzsqlalchemy.poolclass	QueuePoolr   )rL   )name)	rG   	Exceptionr	   data_sourcesitemsrH   sqlalchemy.poolrL   new_dd)
queue_poolrI   	ds_configrL   s       r   init_dsrU   L   s     vtuuuJ$17799 ? ?==/00K??!555555&
0:I,-  &ig>>>G? ?r    c                      t                                           D ]K\  } }t          d|             	 |                                 -# t          $ r t          d           Y Hw xY wdS )u=   Инициализация, миграция схемы БД.zInit DB u        не реализовано.N)rG   rP   printinit_dbNotImplementedError)rI   ds_dds     r   rX   rX   \   s    %++-- 7 7"""###	7MMOOOO" 	7 	7 	7566666	7	7 7s   AA#"A#c                 &   |                      d          }|s|                      d          }|dk    rd}|st          d||           |                    dd          \  }}t          j        |          }t          ||          } || |	          S )
Nclassr   
sqlalchemyz2cmf.data_providers.sqlalchemy:SQLAlchemyDataDriverzDYou must specify valid "type" or "class" in datasource configuration:   )maxsplitrT   rM   )rH   
ValueErrorsplit	importlibimport_modulegetattr)rT   rM   dd_mod_classdd_typedd_module_namedd_class_name	dd_moduledd_classs           r   rR   rR   g   s    ==))L P--''l""OL s`bfhqrrr$0$6$6sQ$6$G$G!NM'77Iy-00H8id3333r    c                  f    t                                           D ]} |                                  d S r   )rG   valuesbefore_requestdds    r   ro   ro   v   s<      ""  
 r    c                     | r)t          t          d          rt          j        d           t                                          D ]-}| r|                                 |                                 .d S )NdebugROLLBACK)hasattrr   rs   rG   rn   rollbackcommit)	exceptionrq   s     r   commit_all_dsry   |   s{      1g 	 GJ  ""   	 KKMMMM IIKKKK r    c                      t                                           D ]-} t          j        d|             |                                  .d S )Nz	ROLLBACK )rG   rn   r   rs   rv   rp   s    r   rollback_all_dsr{      sO      ""  	 B  !!!
 r    c                  t    ddl m}  t                                          D ]}|                    |            dS )zmake_models hookr   modelsN)cmf.includer~   rG   rn   make_models)r~   rq   s     r   r   r      sN    """"""  ""  
v r    c                       e Zd ZdZddddZd Zd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zd Zd Zd Zd Zd Zd Zd ZdS )BaseDataDriver Nra   c                "    || _         || _        d S r   )r	   rM   )r   rT   rM   _args_kwargss        r   __init__zBaseDataDriver.__init__   s    			r    c                     d S r   r$   r   modelargsr   s       r   rH   zBaseDataDriver.get       r    c                     d S r   r$   r   instancer   r   s       r   createzBaseDataDriver.create   r   r    c                     d S r   r$   r   s       r   deletezBaseDataDriver.delete   r   r    c                     d S r   r$   r   s       r   updatezBaseDataDriver.update   r   r    c                     d S r   r$   r   s       r   r+   zBaseDataDriver.list   r   r    c                     d S r   r$   r   s       r   countzBaseDataDriver.count   r   r    c                     d S r   r$   r   s    r   rw   zBaseDataDriver.commit   r   r    c                     d S r   r$   r   s    r   rv   zBaseDataDriver.rollback   r   r    c                     d S r   r$   r   s    r   ro   zBaseDataDriver.before_request   r   r    c                     d S r   r$   )r   	cmf_models     r   dp_modelzBaseDataDriver.dp_model   r   r    c                     d S r   r$   )r   sa_models     r   r   zBaseDataDriver.cmf_model   r   r    c                     d S r   r$   )r   dp_instances     r   is_instancezBaseDataDriver.is_instance   r   r    c                     d S r   r$   )r   models_s     r   r   zBaseDataDriver.make_models   r   r    c                     dS )u,   Вернём кастомный запросNr$   r   r   r   s      r   query_deprecatedzBaseDataDriver.query_deprecated         r    c                     t           )u2   Создание/миграция схемы БД.rY   r   s    r   rX   zBaseDataDriver.init_db   s    !!r    c                     dS )u8   Закрываем текущие подключенияNr$   r   s    r   close_all_sessionsz!BaseDataDriver.close_all_sessions   s    r    )r:   r;   r<   __doc__r   rH   r   r   r   r+   r   rw   rv   ro   r   r   r   r   r   rX   r   r$   r    r   r   r      s'       
F)-D                               ; ; ;" " "    r    r   c                   H    e Zd Zd ZddZd Zd Zd	dZed	d            Z	dS )

BaseMapperc                     dS )u  
        Вызывать по завершению маппинга всех объектов в запросе, постобработка.
        Обычно должен вызывать тот, кто создал экземпляр маппера.
        Nr$   r   s    r   post_mapping_hookzBaseMapper.post_mapping_hook   r   r    Nc                     t           r   r   )r   obj
cmf_entityr   
model_namefull_fields_loads         r   object_to_cmfzBaseMapper.object_to_cmf       !!r    c                     t           r   r   )r   r   r   s      r   cmf_to_objectzBaseMapper.cmf_to_object   r   r    c           	      x   |sdS fd|j         D             }t          dt          f|          }|                                |_         |j         D ]i}|                     d          rOd                    |                    d          dd                   }t          ||t          ||                     j|S )u  
        TODO: создание промежуточного объекта плохо для производительности, нужно маппить напрямую из ResultSet
          да и в целом можно зарефакторить
        Nc                     i | ]K}|                      d           d                    |                    d          dd                   dLS )_sub__r_   N)
startswithr,   rc   )r&   field
field_names     r   
<dictcomp>z4BaseMapper.obj_from_result_query.<locals>.<dictcomp>   si     6 6 6: 3 3 3446IIekk$''+,,d6 6 6r    CmfObjr   r   r_   )	_fieldsr   objectkeysr   r,   rc   setattrrf   )r   result_queryr   
obj_fieldsresr   attnames     `    r   obj_from_result_queryz BaseMapper.obj_from_result_query   s    
  	46 6 6 6%-6 6 6
 8fZ44 oo''!) 	D 	DE: 3 3 344 D))EKK$5$5abb$9::WglE&B&BCCC
r    c                 (      fd|D             S )Nc                 @    g | ]}                     |           S )r   r   )r   )r&   r   r   r   r   s     r   r)   z*BaseMapper.list_to_cmf.<locals>.<listcomp>   s0    ggg\_""3eFV"WWgggr    r$   )r   lstr   r   s   ` ``r   list_to_cmfzBaseMapper.list_to_cmf   s&    ggggggcfggggr    c                     |st                      S |dk    rt                      S t          |t                    r|S t	          |t                    r
 |            S t          d          )u   
        :param mapper: тип маппера
        :type mapper: None, str, Mapper subclass, Mapper instance
        :return: экземпляр маппера
        :rtype:  Mapper
        simplezInvalid mapper)MapperSimpleMapperr*   r   
issubclassrb   )clsmappers     r   
get_mapperzBaseMapper.get_mapper   sm      	88OX>>!fj)) 	Mfj)) 	688O)***r    NNNNr   )
r:   r;   r<   r   r   r   r   r   classmethodr   r$   r    r   r   r      s          " " " "" " "  (h h h h + + + [+ + +r    r   c                        e Zd ZdZ ej                     G d d                      Z edg d          Z fdZ	d Z
d
d	Z xZS )r   u   
    Dataclass as model, для лёгкой сериализации в json
    fill class_name
    TODO fill meta для api, но вероятно это драйвер будет делать, там дешевле
    c                   $    e Zd ZU dZeed<   d ZdS )SimpleMapper.SimpleModelNidc                     t          | d          r| j         d| j         d| j         dS | j         dt	          | dd            dS )NrM   (z: )r   )ru   
class_namecoderM   rf   r   s    r   __repr__z!SimpleMapper.SimpleModel.__repr__  s_    tV$$ F/EEDIEEEEEEoDDdD(A(ADDDDr    )r:   r;   r<   r   r5   __annotations__r   r$   r    r   SimpleModelr     s9          C	E 	E 	E 	E 	Er    r   VirtualInitDatar   r   
field_listc                 V    t                                                       g | _        d S r   )r7   r   _virtual_init_list)r   r9   s    r   r   zSimpleMapper.__init__  s'    "$r    c                    i }t          | j                  D ]}|                    |j        j                  }|r|j        |_        n*|                    |j                  }|||j        j        <   |j        D ]>}t          ||j                  }d|_	        t          |j        |j        |j                   ?g | _        dS )uN   Вычислим все запрошенные виртуальные поля)simple_objectN)reversedr   rH   r   r   r   r   r   rf   _valuer   r   )r   cmf_instances	init_datacmf_wrapper	field_clsvirtual_fields         r   r   zSimpleMapper.post_mapping_hook$  s     "$"9:: 	U 	UI'++IO,FGGK H,5,<))'ooI<LoMM<Gio89&1 U U	 'Y5I J J'+$	()*>@STTTTU #%r    Nc           
         ddl m} |s2|s |j                            d          d         }t	          ||          }|s&t
                                          }|j        |_        nt          d||          g }|p|j	        D ]Q}d|v r!t          ||t	          ||d                     (|j	                            |          }	|	sE|	j        r!|s	|	j        dv r|                    |	           mt          |	t          j        t          j        f          rt	          ||	                                d          }
|
du r|
d}n|o|                    |          }|rBt	          || d	d          ,|                     |                     ||          |
          }nHt          |	t          j        t          j        t          j        f          rPt	          ||d          }|du rgt          |	t          j                  rF|                     ||o|                    |          t	          ||	j        d                             }nyt          |	t          j                  r/|r-|j        s%|                    t:          j        j                  }n0t          |	t          j                   r|rtC          j"        |          }t          |||           S|r5| j#                            t
          $                    |||                     |S )u  
        отображение obj -> simple_model
        если cmf_entity не указан, то создадим новый на основе модели cmf_model или её имени model_name
        возвращаем simple_model
        r   r}   r^   uI   Передан cmf_entity в SimpleMapper, вероятно это багr   .)defaultalwaysN_sub__id)r   tzinfor   )%r   r~   r   rc   rf   r   r   r   rb   r   r   rH   virtual	load_modeappendr   CmfRelationCmfGenericRelationid_fieldnamer   r   
CmfM2MBaseCmfBackrefBaseCmfDateRangeCmfObjectListr   CmfDateTimer   r6   r   timezoneutcCmfJsonujsonloadsr   r   )r   r   r   r   r   r   r~   virtual_fieldsr   r   obj_related_idfield_valuesub_ffls                r   r   zSimpleMapper.object_to_cmf7  sd    	'&&&&&  	0 2 V\\#..q1
FJ//E 	{%1133J$)$4J!!hjtvyzzz*:el 6	9 6	9Jz!!
JZ0M0MNNN((44I   &6 ):MQf:f:f%%i000)f&8&:S%TUU <!(i.D.D.F.F!L!L!S((!)"&KK.S3C3G3G
3S3SG ! #3:(?(?(?FFR*.*<*< $ : :3
 K K18 += +: +:KK % I(96;PRXRe'fgg <%c:s;;c!!)V%9:: 	7"..!1!V6F6J6J:6V6VFI$4Q$788: : Iv'9:: 7{ 7") T"-"5"5X=N=R"5"S"SKIv~66 7; 7#k+66J
K8888 	i#**,,JeXf,ggi i ir    r   )r:   r;   r<   r   dataclasses	dataclassr   r   r   r   r   r   r=   )r9   s   @r   r   r   	  s         
 [
E 
E 
E 
E 
E 
E 
E 
E !j!24U4U4UVVO% % % % %
% % %&P P P P P P P Pr    r   c                       e Zd ZddZd ZdS )r   Nc           
      	   ddl m} |sC|s2|s |j                            d          d         }t	          ||          } |d          }d}nd}|st          |          }|}|r|}	n|j                                        }	|	D ]}
|j                            |
          x}s |j	        r,|s|j
        dk    rt	          ||
          }d|_        d|_        St          |t          j        t          j        t          j        f          rt	          ||
d	          }t          |t          j                  rJ|d	u r|                     ||o|                    |
          t	          ||j        d                             }t          |t          j        t          j        f          rt	          ||                                d	          }|d	u rI|d}n|o|                    |
          }|rt	          ||
 d
d          dk    rt	          ||
 d
          rt          |t          j                  r|                    d          d         n|j        }t	          ||d          }|r-|                     |                     ||
          ||          }nd}n|d	u rt          |t          j                  r.|r,|j        s%|                    t8          j        j                  }t          |t          j                  r|                     |          }n0t          |t          j!                  r|rtE          j#        |          }t          |t          j$                  r|
%                    d          r||
dd         |	vrptM          ||
dd                   rX|'                    |          }|r||
dd                  j        d	u r|||
dd                  _        |||
dd                  _        t	          ||
          }|r	|j        d	u rRtQ          |tR          tT          tV          t          d          tX          f          r||_        nt[          |          |_        ||_        d|_.        |/                                 |S )u  
        отображение obj -> cmf_entity
        если cmf_entity не указан, то создадим новый на основе модели cmf_model или её имени model_name
        возвращаем ссылку на cmf_entity
        r   r}   r^   T)emptyFr   N.r   r   r   _id)0r   r~   r   rc   rf   r   r   r   rH   r   r   r   _oldr   r  r  r  r  r   r   r  r  r   r   r   r  r   r6   r   r  r	  CmfIPv4NetworkListdb_castr
  jsonr  CmfTUUIDendswithru   make_ellipsis_idobjr*   r5   r2   floatboolr   is_newmark_exists_in_db)r   r   r   r   r   r   r~   cmf_is_existsr   r   kr   r   r  r  r  	model_subelipsis_obj	field_objs                      r   r   zMapper.object_to_cmf  s    	'&&&&& 	! 4! 6!$c!2!21!5J
33T***J!MM M 	%$$E 	'#DD<$$&&D W	+ W	+A!&!1!1!!4!44I   &6 ):MQY:Y:Y
A..#!
 )f&79NPVPc%dee !#q#..K)V%9:: u#%%"..!1!M6F6J6J16M6MwW]_h_opq_rOsOsu u )f&8&:S%TUU !!(i.D.D.F.F!L!L!S((!)"&KK.J3C3G3G3J3JG !"<ADDJJwWchiesesesOtOtJIST]_e_xIyIy *5)=)=c)B)B1)E)E%._ '(/
D(I(II  ) 3.2.@.@$($>$>|Q$O$O*3g /A /O /O /3$  c!!)V%788 T[ T") T"-"5"5X=N=R"5"S"SK)V%>?? 6'//<<Iv~66 6; 6"j55 )V_55 < ::e$$ <3B3t););
TUVYWYVYTZ@[@[);","@"@"M"MK( >Jq"v,>,Cs,J,J2=
1SbS6*/0;Jq"v&-  
A..I ! ;INc$9$9kCeT$ZZ+NOO ;%0INN%-k%:%:IN*I!
$$&&&r    c           	         t          |          }|j                                        D ]O\  }}t          |t          j                  r!t          |t          j                  r<t          |t          j                  rWt          |t          j                  rrt          |t          j                  rt          |t          j	                  rt          |t          j
                  rt          ||          }t          |t          j                  r5|j        du s|j        r|j        s	|j        s|                                }|du rt'          d| d| d|           t)          |||           Q|S )N.u%   Попытка update field=Ellipsis  )r   r   rP   r   r   r  CmfM2MCmfGenericM2M
CmfBackrefr  CmfGenericBackrefrf   r*   CmfTyper   r   
is_changed	orm_dirty	db_formatrN   r   )r   r   r   r   r%  vvvs          r   r   zMapper.cmf_to_object  s   Z  L&&(( 	  	 DAq!V/00 !V677 !V]++ !V122 !V.// !V011 !V566 Q''B"fn-- 	$9##rz#
 } R\ \\^^Syy ]
 ] ]UV ] ]Y[ ] ]^^^CB
r    r   )r:   r;   r<   r   r   r$   r    r   r   r     s<        t t t tl! ! ! ! !r    r   selectc                    	 dt           vrt          t                    t           _        n# t          $ r}Y d}~dS d}~ww xY wt           j                            dt          t                               t           j        d                             | d           t           j        d         | xx         dz  cc<   t           j        d                             dd           t           j        d         dxx         dz  cc<   dS )uK   
    Глобальный счетчик запросов
    :return:
    profiler_dataNselect_countr   r_   total)r   r   dictr7  rN   
setdefault)actiones     r   inc_select_countr>  %  s    !##)$//AO    O~{4/@/@AAAON#..vq999ON#F+++q0+++ON#..w:::ON#G,,,1,,,,,s   '* 
??c                       e Zd ZdZ ej        d          ZddZed             Z	ddddddZ
d	d
dZd Zd Zd ZdddZd Zd Zd Zd ZddZd ZddddddZdddddZdddZdS )DataProvideruV   Объект, связывающий модель с источником данныхz"\b(?P<table>\w+)\.(?P<field>\w+)\bNc                 H    || _         || _        d | _        t          | _        d S r   )r   data_source_ddr   
mapper_cls)r   rB  r   s      r   r   zDataProvider.__init__<  s#    
& r    c                 P    | j         st          | j                  | _         | j         S r   )rC  rJ   rB  r   s    r   data_driverzDataProvider.data_driverB  s%    x 	0d.//DHxr    F)no_cacheTECHCOM_nocache
for_updatecache_inmemoryc                   |rt          d          | j        j        p=|p;t          j        p/|p-t
          j        j                            | j        j	                  }| 
                    | j        |          |d<   fdt          j        r	 t          j        j        j        | j        j	         dg|R d	|i|}|rd}	n&t
          j        j                            ||
          }	t                       |	dk    r9t
          j                            t
          j        j        j        d|            dS |	9t
          j                            t
          j        j        j        d|            |	S t
          j                            t
          j        j        j        d|             | j        j        | j        g|R d|i|}
| j        j        dk    r|
S |r	|
rd|
_        |r|
S t
          j        j                            ||
| j        j	         |                     | j        |d         |                    d          |                    d                    |           |
S )zF
        :param args:
        :param kwargs:
        :return:
        8   no_cache запрещен и будет удален osvfilterc                     |                                 D ]3\  }}|| vr||         | |<   | |         |k    r | |         |           4d S r   )rP   )_fields_grow_cache_full_fields_loadr%  r3  _grow_merges       r   rQ  z%DataProvider.get.<locals>._grow_merge\  st    )//11 > >1...,=a,@&q)))!,11#$6q$91===> >r    F)
CmfProjectCmfWorkflowCmfLogicTypeCmfSchemeWfCmfSchemeWfRuleCmfActivityr   Nz.getrJ  rJ  EmptyzDP: get() cache Empty zDP: get() cache zDP: get() NOcache rI  rdiskTorder_bygroup_byquery_paramsrJ  )rN   r   TEXKOM_no_cacher   import_modecmfapp	CMF_CACHEcache_is_lockedr:   _get_filterTEXCOM_ENABLE_GROWCACHE_HACKtexcom_growcache_hack_cacherH   hashr>  print_debugDEBUGrF  rM   readonlyadd_query_params)r   rG  rH  rI  rJ  r   r   fields_grow_cachekeycachedb_resrQ  s              @r   rH   zDataProvider.getH  s     	XVWWW:- M MAM MU_ Mg'77
8KLL 	  ++DJ??x	> 	> 	> 	> 	> ) 	? 	? g$
(;%A%A%ArDrrrYgrkqrr 	NEEG%))#n)MMEGG 1 79WRU9W9WXXX4G 1 79QC9Q9QRRRLG 1 79Sc9S9STTT)T%)$*]t]]]
]V\]]F $// '& '"&  G!!V
 35!//
F8<LfjjYcNdNdflfpfpq{f|f|}}- "   
 Mr    T)
invalidatec                   t          d            | j        j        |g|R i |}| j        j        dk    r|S |s|S |'t          j        j                            |d           d S t          j        j                            |d           |S )NinsertrZ  r   )r>  rF  r   rM   ra  rb  rc  rr  )r   r   rr  r   r   r   s         r   r   zDataProvider.create  s    """%d%h@@@@@@  G++J 	J;G((8<<<4$$S(333
r    c                 H    t          d            | j        j        |i |}|S )Nr   )r>  rF  bulk_deleter   r   r   r   s       r   rv  zDataProvider.bulk_delete  s/    """*d*D;F;;
r    c                     t          d           t          j        d| d| d|             | j        j        |g|R i |}t          j        d           |S )Nrt  zbulk_insert start model= args= kwargs=zbulk_insert end)r>  r   rs   rF  bulk_insert)r   r   r   r   r   s        r   r{  zDataProvider.bulk_insert  st    """	N5NNNNfNNOOO*d*5B4BBB6BB	"###
r    c           	      ~   dd l }ddlm} dd l}t	          d           t          j        d| d| d|             | j        j        |g|R i |}t          j        d           |j	        s |j                     }t          |          dk    r+t          j        j                            |j        d            n,|r*t          j        j                            |j        |            |j                     |z
  dz  }	|                    d	t          |           d
| d|	dd           |	dk    r |d|	dd           |S )Nr   	cmf_alertr   zbulk_update start model=ry  rz  zbulk_update endi  u)   Инвалидировали кеш по u$    обьектам у таблицы u    за z.2fu    мс   u2   DEV: Инвалидация кэша заняла )timer   r~  loggingr>  r   rs   rF  bulk_updater_  lenra  rb  rc  invalidate_idsr   warning)
r   r   r   r   r  r~  r  r   
start_timeelapsed_times
             r   r  zDataProvider.bulk_update  s   ))))))"""	N5NNNNfNNOOO*d*5B4BBB6BB	"###$ 	h"J3xx$!001A4HHHH H!001A3GGG%DIKK*4<LOO  [C  [  [v{  [  [  DP  [  [  [  [  \  \  \c!!	f|ffffggg
r    )rG  c                V   t          d           | j        j        st          j        d|j                     | j        j        |g|R i |}| j        j        st          j        d|j                    |rt          d          | j        j        }| j        j	        dk    r|S |s|
                    dd          rld}d|j        v r|j        j        r|j        rd	nd
}|j        rd
}t          j        j                            ||           t          j        d|j                    |S )Nr   z+Run self.data_driver.update(), instance_id=z+End self.data_driver.update(), instance_id=rL  rZ  rr  Tcmf_deletedr   r   z0End cmf.app.CMF_CACHE.invalidate(), instance_id=)r>  r   r_  r   rs   r   rF  r   rN   rM   rH   r   r  r0  r"  ra  rb  rc  rr  )r   r   rG  r   r   r   r<  s          r   r   zDataProvider.update  sX   """z) 	QGO(+OOPPP%d%h@@@@@@z) 	QGO(+OOPPP 	XVWWW:-  G++J 	VFJJ|T:: 	VF//H4H4S/%-%9Gx "!G((f555GTx{TTUUU
r    c                 *     | j         j        |i |}|S r   )rF  rw   )r   r   r   rets       r   rw   zDataProvider.commit  s!    %d%t6v66
r    c                 &     | j         j        |i |S r   )rF  rv   r   s      r   rv   zDataProvider.rollback  s    (t($9&999r    c                      | j         j        |i |}| j         j        dk    r|S t          j        j                            |d           |S )u   
        Logical delete. Реализация в провайдере или в модели?
        self.deleted = 1
        self.update()
        rZ  r   )rF  r   rM   ra  rb  rc  rr  rw  s       r   r   zDataProvider.delete  sV     &d%t6v66  G++J$$S(333
r    c                   
 ddl mmmmmmmm ddl	m
 ddlm}m}m}m} dddddfd	dfd		dfd
	dfd	dfd	dfd	dfd	dfd	d
ddddddddddd

|                    dg           }|g }|                    d          si t!          |t"                    rt%          j        |          }|r|g}|                                                                D ]J\  }}	||j        v r<||= t!          |	t,          j                  r|	j        }	|                    |d|	g           Kfd
fddt"          ffdfd |          }|S )u   
        Преобразуем обычные kwargs в продвинутый фильтр для однообразной логики фильтрования
        :param model:
        :param kwargs:
        :return:
        r   )start_of_day
end_of_daystart_of_weekend_of_weekstart_of_monthend_of_monthstart_of_yearend_of_year)str_to_timedelta)r   r   r  r   Nc                 *    t          j        |           S r   )r   nowoffsets    r   <lambda>z*DataProvider._get_filter.<locals>.<lambda>  s    AE&MM r    c                 *    t          j        |           S r   )r   r   r  s    r   r  z*DataProvider._get_filter.<locals>.<lambda>  s    AF6NN r    c                      |           S r   r$   )r  r  s    r   r  z*DataProvider._get_filter.<locals>.<lambda>      LL4H4H r    c                      |           S r   r$   )r  r  s    r   r  z*DataProvider._get_filter.<locals>.<lambda>  s    JJv4F4F r    c                      |           S r   r$   )r  r  s    r   r  z*DataProvider._get_filter.<locals>.<lambda>      MM&4I4I r    c                      |           S r   r$   )r  r  s    r   r  z*DataProvider._get_filter.<locals>.<lambda>	      KK4G4G r    c                      |           S r   r$   )r  r  s    r   r  z*DataProvider._get_filter.<locals>.<lambda>
  s    NN64J4J r    c                      |           S r   r$   )r  r  s    r   r  z*DataProvider._get_filter.<locals>.<lambda>  r  r    c                      |           S r   r$   )r  r  s    r   r  z*DataProvider._get_filter.<locals>.<lambda>  r  r    c                      |           S r   r$   )r  r  s    r   r  z*DataProvider._get_filter.<locals>.<lambda>  r  r    )
__G_NOW__G_DATE__START_OF_DAY__END_OF_DAY__START_OF_WEEK__END_OF_WEEK__START_OF_MONTH__END_OF_MONTH__START_OF_YEAR__END_OF_YEARdwMy)
r  r  r  r  r  r  r  r  r  r  rM  filter_context==c                     t          | t                    r| vrdS | dk    rd}n| dk    rd}nd}|r<t          t          dd          s|nt	          t          j        |          t          _         |                      S )z plain '__G_NOW' / '__G_DATE' Nr  ,  r  ip  jscache_timelife)r*   r5   rf   r   minr  )sttl_TIME_BASE_FUNCSs     r   _maybe_time_plain_stringz:DataProvider._get_filter.<locals>._maybe_time_plain_string.  s    a%% 2B)B)BtI~~j! w07;Mt0T0T%vSSZ]^_^pruZvZv"&#A&(((r    c                 (   dt           dt          fd}t          | t                    r| sdS | d         }t          |t                     r|vrdS t	          |           dk    r |                     S | d         }t          |t                     s't          d| dt          |          j                    ||          r                    |          }|r| | }|	                                s |                     S  |         |          S )	u!    ['KEY'] или ['KEY','offset'] r  returnc                     | pd                                 } t          |           o&|                     d                                          S )Nr   z+-)stripr!  lstripisdigit)r  s    r   _is_plain_intzIDataProvider._get_filter.<locals>._maybe_time_list.<locals>._is_plain_int?  s<    W"OO%%Aww;188D>>#9#9#;#;;r    Nr   r_   u   Offset для u9    должен быть строкой, получено: )
r5   r!  r*   r+   r  rb   r   r:   rH   r  )noder  ro  r  unit_NATURAL_UNITr  s        r   _maybe_time_listz2DataProvider._get_filter.<locals>._maybe_time_list=  sn   < < < < < < dD))  tq'Cc3'' 36F+F+Ft4yyA~~,',...!WFfc** I   "H#  "H  "Hptu{p|p|  qF  "H  "H  I  I  I}V$$ /$((-- / &...F<<>> /,',...(#C(000r    r  c                 f   t          | t                    sd S t          j        dt          j                  }|                    |                                           }|sd S d}t          t          dd           s|nt          t          j
        |          t          _
        dd l}|j                                                                        }|                    d          pd}|                                s|                    |j        j                  S t          j        d          }d}|}	|                    |          D ]L\  }
}}|
p|}
|
}|sd	}|                                }|d
k    rd}n|dk    rd}n|}|	 |
 | |           z  }	M|	                    |j        j                  S )NzE^\s*now\(\)\s*(?P<tail>(?:\s*[+-]?\s*\d+\s*(?:y|M|min|[wdhms]))*)\s*$r  r  r   tailr   z([+-]?)\s*(\d+)\s*([A-Za-z]+)?+r  r  mr  )r*   r5   recompileI	fullmatchr  rf   r   r  r  r   r  
astimezonegroupr  r	  findalllower)r  _NOW_CALL_POSTFIX_REr  r  _dt
base_localr  token_re	last_sign	base_calcsignnumr  ulnormr  s                  r   _maybe_time_call_stringz9DataProvider._get_filter.<locals>._maybe_time_call_stringZ  s   a%% t#%:X$ $  %..qwwyy99A t C,3A7I4,P,P!rVYZ[ZlnqVrVrA #"""))++6688J776??(bD::<< ?!,,S\-=>>>z"CDDHI"I#+#3#3D#9#9 D Dc4(y 	 DZZ\\;;DD3YYDDD--.Bs.BD.B.BCCC		''(8999r    c                     |           }||S t          | t                    rfd| D             S  |           }||S  |           }||S t          | t                    r/|                     d          rdfd	 | dd                    S t          | t                    r| dk    rt          j        j        j        S | S )Nc                 &    g | ]} |          S r$   r$   )r&   i_recursive_params_replaces     r   r)   zODataProvider._get_filter.<locals>._recursive_params_replace.<locals>.<listcomp>  s%    EEE11!44EEEr    z__SELF.c                     |                      d          \  }}}|t          ||d           }n|         }|r ||          }|S )N.)r   )	partitionrf   )pathr   headsepr  r  get_ctx_attrs        r   r  zQDataProvider._get_filter.<locals>._recursive_params_replace.<locals>.get_ctx_attr  s_    &*nnS&9&9OD#t( 'tT : : .t 4 @ ,T ? ? ? Lr    r
   __G_CURRENT_USERr   )r*   r+   r5   r   r   current_userr   r   )rM  r3  r  r  r  r  r  r  s     @r   r  z;DataProvider._get_filter.<locals>._recursive_params_replace  s     ((A} &$'' FEEEEfEEEE )(00A} ('//A} &#&& 
06+<+<Y+G+G 
0! ! ! ! ! ! ! $|F122J///&#&& /65G+G+G~(..Mr    r   )r   r  r  r  r  r  r  r  r  cmf.util.cmfutilr  r   r   r  r   rH   r*   r5   r  r  copyrP   r   r/  r   r   )r   r   r   r   r   r  r   smart_filterr%  r3  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  s             @@@@@@@@@@@@@@@@r   re  zDataProvider._get_filter  s    	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I  	I555555<<<<<<<<<<<< A A A B B B H H H H H F F F F F I I I I I G G G G G J J J J J H H H H H I I I I I G G G G G
 
  "3"S #s"S
 
 zz(B//L$455 	 NlC(( 	4:l33L 	,(+LKKMM'')) 	2 	2DAqEL  1Ia00  A##QaL111	) 	) 	) 	) 	)	1 	1 	1 	1 	1 	1:+	:s +	: +	: +	: +	: +	: +	:`$	 $	 $	 $	 $	 $	 $	 $	 $	L 10>>r    ANDc                    ddl m} ddl m} t          g g i           }|r|D ]}}	|	dk    r	|	                    d          r|	d d         |j        v r
|	d d         }	|	                    d          r
|	d	d          }	|d
                             |j         d|	            ~|rZ|D ]W}
|
                    d          r|
d d         |j        v r
|
d d         }
|d
                             |j         d|
            X|s|S t          |d         t                    rt|D ]o}|                     |||                                          D ]B\  }}|dk    r||                             |           '||                             |           Cpn1|d         dv r}|                     ||d	d          |d                                                   D ]B\  }}|dk    r||                             |           '||                             |           Cn|d         dk    rt          |          dk    s
|d	         dvrt!          d          |d         D ]^}	|	dk    r	|	                    d          r|	d d         |j        v r
|	d d         }	|d
                             |j         d|	            _n	t          |          dk    rd }|d                             d          }|d	                             d          }d }d }|d         dk    r|S |d         dk    rd|d<   |d         |j        v r?|d	         }|j        |d                  }|d         }t          |          d	k    r|d	         }nM|d         |j        v r>|d         }|j        |d                  }|d         }t          |          d	k    r|d	         }d}|                    d          r|d d         |j        v r|d d         }d}|rN|                    d          r9|                                }|r|d d         |d         j        v r|d d         }d}|rf|s|dv r|dk    r|d         }t          |t&                    rt          |          }t          |t                    s|g}g }|D ]s}t)          t+          |          t
          j                  r|j        }t)          t+          |          t0                    r|j        j        }|                    |           t|dk    r/|d                             |g                               |           ||j        v r/|d                             |g                               |           |dk    rt)          |t
          j                  rrd}|D ]i}t          |t:                    rP|                    d          d	k    r7t;          |                              d          d         t?          |          v sd}j|rd}t)          |t
          j                   r4|j        dk    r)|j        !                    |j        d d                   p|}t)          |t
          j                  rg|dk    ra|                                D ]L}|s!|d                             |j                    |r%|d
                             |j         d|            Mt)          |t
          j                  r|dk    r|                                D ]s}|                     ||d                                                   D ]B\  }}|dk    r||                             |           '||                             |           Ct|d
                             |j         d|            n |d| d d!           |S )"Nr   r}  r}   )r~   r   cache_clustersr   r  r  -r_   r   r  )parent_operr  )r  ORr[     )=r  ut   Операция order_by в фильтре должна быть в формате: ["order_by", "=", [поля..]]r
   r  ANYtextFT)r  r  INr  parentr^   r~   EXISTSuP   Ошибка  при выполнении UBQL - неверный запрос. uM    Проверьте правильность введенных данных.)abort)"r   r~  r~   r:  r  r   r   r   r   r*   r+   rm  rP   r   extendr  rN   rc   related_modelssetr   r   r/  r   r   r   r;  cache_cluster_fields
CmfRelBaser5   r   varsr  rH   )r   r   
obj_filterobj_order_byobj_group_byr  r~  r~   r   r[  r\  filt_lsro  r-   r   obj_filter0obj_filter1field__field_namer   operfield_is_tuuid
_relmodelsrule_values_dirtyrule_valuesrvmaybe_field_is_tuuid_vrmodels                               r   rm  zDataProvider._query_params  sD	   
 	*)))))&&&&&&"R;;; 		G( G Gt##$$U++ -"0M0M'}H&&s++ ,'|HH$$(8%E%E8%E%EFFFF 	G( G G$$U++ -"0M0M'}HH$$(8%E%E8%E%EFFFF 	JjmT** Q	P% - - $ 2 25'{ 2 [ [ a a c c - -HC...C,,,,C,,,,-- ]m++ ..ujnR\]^R_.``ffhh ) )S***HOOC((((HOOC(((() ]j((:!##z!}K'G'G  !W  X  X  X 'qM G Gt##$$U++ -"0M0M'}HH$$(8%E%E8%E%EFFFFG __!!E$Q---c22K$Q---c22K $J 1~..
1~&& "(A1~--!!}[^4(^
{##A%%(3A%Q5<//!!}[^4(^
{##A%%(3A%"N""5)) &j"o.M.M'_
!%  *%6%?%?%F%F *"1133
! *%6ss%;z!}?S%S%S(9#2#(>%%)N HI( /2T5F-F-F;Z^K^K^(21%!"3S99 D,01B,C,C)%&7>> @->,?)"$K/ / /%d2hh?? *!#B%d2hh	:: -!#B#**2....!X--,-88RHHOOP[\\\!U%???,-88RHHOOP[\\\* "X--*UFDU2V2V-/3,"- = =B$.r3$7$7 =BHHSMMQ<N<NSVWYSZSZS`S`adSeSefgShlpqwlxlxSxSx7< 4/ 2-1NeV_55 M%:Jd:R:R!L,,U-=crc-BCCLuEeV%677 	a "X--&+&:&:&<&< a aF#1 M #H 4 48I5K L L L0 a #H 4 48I5_5_L]5_5_ ` ` `eV%677 5DH<L<L"'"6"6"8"8 5 5(,(:(:6:a=(Q(Q(W(W(Y(Y 5 5HC"&666 #C 4 4 4 4 #C 4 4 4 45 H$$(8%G%G:%G%GHHH I  Cis  C  C  C  KO  P  P  P  P
r    c                    ddg dg dggdgg dg g g dgg ddgd	gg g d
gdgg dg dgg g g dgg ddgddgg g g dgg dg dgg ddgg g g dgg dgg dgg g g dgg dgg dgg g g dgg dgg dgg g g dgg dgdgddgg g g dgg dgg ddgg g g dgg dgdgddgg g g dgg dg d gg dd!gg g g dgg d"gg dgg g g dgg d#gdgdgg g g dgg}d$d%l m} |D ]g\  }}|j        j                            |j        |          }||k    r7t          d&| d'           t          d(|            t          d)|            hd*S )+ug   
        Тестирование
        Запуск: models.CmfTask.dp._test_query_params()
        listsr  )cache_status_typer  IN_PROGRESS)logic_prefixr  zlist.agile_sprintCmfList)zCmfList.cache_status_typezCmfList.logic_prefixCmfTask.lists)r~   r   parentsr  r  )r  r  {   r  r  )rM   r  qwezCmfTask.name)zcmf_owner.idr  zCmfPerson:12312321	CmfPersonzCmfPerson.idzCmfTask.cmf_ownerzCmfTask.cache_status_typezCmfTask.logic_prefix)ext_idLIKEz
%::qwe::%%zCmfTask.ext_id)r"  r  ::qwe::)zparent.ext_idr  r$  zCmfTask.parent)zstatus.ext_idr  r$  	CmfStatuszCmfStatus.ext_idzCmfTask.status)zstatus.status_code_idr  12345zCmfStatus.status_code)zstatus.status_coder  r&  )rM   r  r   )r   r  	qweqweqwez
CmfTask.id)zparent.project.namer  r   )statusr  r   r   r}   uC   Ошибка в результате _query_params(models.CmfTask, r   u   Факт:        u   Должно быть: N)r   r~   CmfTaskdprm  rW   )r   f_listr~   fres_origr   s         r   _test_query_paramszDataProvider._test_query_paramsd  s    h!J!J!JLvLvLv wx!{.t.t.t  BD  XZ  eg  h  h	

 !  !{.?Bbdpsotuu
 "!!n%5"XZeghh
 988#}AT0Ubdxz  FH  I  I
 7668b8b8bc&ACY%Zgi}  KM  N  N
 .--. &6%7BZ\gijj
 (''( &6%7BZ\gijj
 /../&6%7BZ\gijj
 /../ $}1CEU0Vcey{  GI  J  J
 5445&=?O%P]_su  AC  D  D
 2112#}1HJZ0[hj  A  LN  O  O
 "!!#;#;#;<nl%CPRfhsuvv
 1001&6%7BZ\gijj	
 $##$#}1A0Bregrtuu
s=
@ 	'&&&&&! 	< 	<KAx.#11&.!DDCh`\]```aaa/#//000:::;;;r    c                b   |rt          d          | j        j        p=|p;t          j        p/|p-t
          j        j                            | j        j	                  }t                       |                     | j        |          |d<   t          j        j        j        | j        j	         dg|R d|i|}|rd}n@t          dd          }	t
          j        j                            ||          } |	             |d	k    r9t
          j                            t
          j        j        j        d
|            g S |9t
          j                            t
          j        j        j        d|            |S t
          j                            t
          j        j        j        d|            t#          j                    }
t          dd          }	 | j        j        | j        g|R d|i|} |	             | j        j        dk    r|S |r|D ]	}d|_        
|st          dd          }	|                     | j        |d         |                    d          |                    d                    }t
          j        j                            ||| j        j	         ||            |	             |S )u   
        Пробросили сюда relation_load и relation_load_only для реализации join и подселектов в будущем
        :param args:
        :param kwargs:
        :return:
        rL  rM  z.listrJ  NzDataProvider.list_cache.getr  rX  rY  zlist() From cache  Empty zlist() From cache zDP: list() From NOcache z'DataProvider.list_self.data_driver.listi  rI  rZ  TzDataProvider.list_cache.addr[  r\  r]  )rN   r   r_  r   r`  ra  rb  rc  rd  r:   r>  re  rh  r   rH   ri  rj  r  rF  r+   rM   rk  rm  rl  )r   rG  rH  rI  rJ  r   r   ro  rp  
prof_pointprof_strq  r  r^  s                 r   r+   zDataProvider.list  s     	XVWWW:- M MAM MV` Mg'77
8KLL 	++DJ??xg$
(;%B%B%BsTsssZhslrss 	EE()FLLJG%))#n)MMEJLLLGG 1 79ZUX9Z9Z[[[IG 1 79Sc9S9STTTLG 1 79YTW9Y9YZZZikkG()RTWXXJ*T%*4:^^^^^W]^^FJLLL $// & & &A!%AJJ  ,-JCPP
#11$*fX>NPVPZPZ[ePfPfhnhrhrs}h~h~!%%c6dj6I3KZf  xF%  G  G  G
Mr    )rG  rH  rJ  c                    |rt          d          | j        j        p;|p9t          j        p-t
          j        j                            | j        j	                  }t                       |                     | j        |          |d<   t          j        j        j        | j        j	         dg|R d|i|}|rd }n&t
          j        j                            ||          }|dk    rFt
          j                            t
          j        j        j        d|            t!          d          |9t
          j                            t
          j        j        j        d	|            |S t                        | j        j        | j        g|R i |}|s}|                     | j        |d         |                    d
          |                    d                    }	t
          j        j                            ||| j        j	         |	|           |S )NrL  rM  z.countrJ  rX  rY  zcount() From cache Empty z$BUG: count() cache can not be empty!zcount() From cache r[  r\  r]  )rN   r   r_  r   r`  ra  rb  rc  rd  r:   r>  re  rh  rH   ri  rj  rb   rF  r   rm  rl  )
r   rG  rH  rJ  r   r   ro  rp  rq  r^  s
             r   r   zDataProvider.count  s    	XVWWW:- M MAM Mg'77
8KLL 	++DJ??xg$
(;%C%C%Ctdttt[itmstt 	NEEG%))#n)MMEGG 1 79ZUX9Z9Z[[[CDDDG 1 79Ts9T9TUUUL+T%+DJHHHHHHF G#11$*fX>NPVPZPZ[ePfPfhnhrhrs}h~h~!%%c6dj6I3KZf  xF%  G  G  Gr    )r   c                \    t           | j        j        |i || j        | j        |          S Nrq   r   r   )
QueryProxyrF  queryr   )r   r   r   r   s       r   r   zDataProvider.query_deprecated  sC    "D"D3F338HPTPZcik k k 	kr    )NN)NNr  )r:   r;   r<   r   r  r  TABLE_FIELD_REr   propertyrF  rH   r   rv  r{  r  r   rw   rv   r   re  rm  r.  r+   r   r   r$   r    r   r@  r@  8  s       ``RZ EFFN! ! ! !   X
 #(%`e H H H H HT 26     &      . 05     2  
: : :  y y yxn n n n`L L L^ $)$5af 2 2 2 2 2h %*4PU     4 .2 k k k k k k kr    r@  c                   h    e Zd ZdZddZd ZddZd Zd Zd Z	d	 Z
d
 Zd Zed             Zd ZdS )r6  u   
    Оборачиваем кастомный запрос и добавляем возможность извлекать данные с автомаппингом.
    TODO: Проверить слайсы query[a:b]
    Nc                     || _         || _        || _        t          |t                     | _        t                              |          | _        d S r   )_queryrC  r   r*   r   _mapper_is_myr   _mapper)r   r7  rq   r   r   s        r   r   zQueryProxy.__init__  sE    
!+FJ!?!??!,,V44r    c                       fd}|S )u   Обёртка для методов, которые возвращают новый запрос на основании текущего.c                  ~     t          j                  | i |}t          |j        j        j                  S r4  )rf   r<  r6  rC  r   r>  )r   r   	new_queryitemr   s      r   method_proxyz,QueryProxy.__getattr__.<locals>.method_proxy  s@    2T22DCFCCIiDHDJt|\\\\r    r$   )r   rB  rC  s   `` r   __getattr__zQueryProxy.__getattr__  s0    	] 	] 	] 	] 	] 	] r    c                     | j                             | j        | j        |||          }t	          || j         | j        | j                  S )uR   
        Логика сортировки на основе модели
        )r   r[  sliceaggregate_selectr5  )rC  order_queryr<  r   r6  r>  )r   r[  rF  rG  rA  s        r   rH  zQueryProxy.order_query  sO     H((KtzHE\l ) n n	)
4<XXXXr    c                     | j         r[| j                             |          rA| j                            || j                             t          |                              }|S )u6   Автоконвертация объектов в CMF)r   )rC  r   r>  r   r   r   )r   r   s     r   
_map_valuezQueryProxy._map_value"  s[    8 	],,U33 	]L..uDH<N<NtTY{{<[<[.\\Er    c                      t          |t                    rt           fd|D                       S                      |          S )Nc              3   B   K   | ]}                     |          V  d S r   )rJ  )r&   colr   s     r   	<genexpr>z&QueryProxy._map_row.<locals>.<genexpr>+  s/      ==#--======r    )r*   tuplerJ  )r   rows   ` r   _map_rowzQueryProxy._map_row(  sJ    c5!! 	(==========??3'''r    c                 n    t           j                  }d}t          j        j                            ||          }t          j        j                             j        j                  rd}n$t          j        j        	                    |          }t                       |dk    r9t          j                            t          j        j        j        d|            g S |9t          j                            t          j        j        j        d|            |S t          j                            t          j        j        j        d|             fd j        D             }t          j        j                            || j        j                     j        r j                                         |S )uo   Метод извлечения всех данных из текущего запрос с маппингом.
custom_allNrY  zall() From cache Empty zall() From cache zDP: all() From NOcache c                 :    g | ]}                     |          S r$   )rQ  )r&   rP  r   s     r   r)   z"QueryProxy.all.<locals>.<listcomp>D  s%    @@@SdmmC((@@@r    )rE   r<  ra  rb  rc  rh  rd  r   r:   rH   r>  ri  rj  rl  r=  r>  r   r   sql_kro  rp  rq  s   `     r   allzQueryProxy.all/  sz   4;''g$$R-- 7,,TZ-@AA 	/EEG%))#..EGG 1 79XSV9X9XYYYIG 1 79RS9R9RSSSLG 1 79XSV9X9XYYY@@@@DK@@@FG!!#v$*2E/GHHH! 1..000Mr    c                    t          | j                  }d}t          j        j                            ||          }t          j        j                            | j        j                  rd}n$t          j        j        	                    |          }t                       |dk    r9t          j                            t          j        j        j        d|            dS |9t          j                            t          j        j        j        d|            |S t          j                            t          j        j        j        d|            | j                                        }|                     |          }t          j        j                            ||| j        j                    | j        r| j                                         |S )uP   Метод извлечения первой строки с маппингом.custom_firstNrY  zDP: first() From cache Empty zDP: first() From cache zDP: first() From NOcache )rE   r<  ra  rb  rc  rh  rd  r   r:   rH   r>  ri  rj  firstrQ  rl  r=  r>  r   )r   rV  rW  ro  rp  rP  rq  s          r   r[  zQueryProxy.firstJ  s   4;''g$$R-- 7,,TZ-@AA 	/EEG%))#..EGG 1 79^Y\9^9^___4G 1 79XSV9X9XYYYLG 1 79ZUX9Z9Z[[[+##%%C]]3''FG!!#v$*2E/GHHH! 1..000Mr    c                 N   t                       t          | j                  }d}t          j        j                            ||          }t          j        j                            | j        j	                  rd }n$t          j        j        
                    |          }t                       |dk    r9t          j                            t          j        j        j        d|            d S |9t          j                            t          j        j        j        d|            |S t          j                            t          j        j        j        d           | j                                        }t          j        j                            ||| j        j	                    |S )Ncustom_countrY  zDP: count() From cache Empty zDP: count() From cache zDP: count() From NOcache TODO)r>  rE   r<  ra  rb  rc  rh  rd  r   r:   rH   ri  rj  r   rl  rU  s         r   r   zQueryProxy.countf  sV   4;''g$$R-- 7,,TZ-@AA 	/EEG%))#..EGW  !2!8:_Z]:_:_```DW  !2!8:YTW:Y:YZZZ\G 1 79YZZZ[&&((FG!!#v$*2E/GHHHr    c                 *     | j         j        |i |}|S r   )r<  r   )r   r   r   rq  s       r   r   zQueryProxy.delete  s     ##T4V44r    c                     | j         S r   )r<  r   s    r   dd_queryzQueryProxy.dd_query  s
    {r    c                 D    t          |                                           S )u+   Чтение строк из запроса)iterrX  r   s    r   __iter__zQueryProxy.__iter__  s    DHHJJr    )NNN)r:   r;   r<   r   r   rD  rH  rJ  rQ  rX  r[  r   r   r9  r`  rc  r$   r    r   r6  r6    s         5 5 5 5  Y Y Y Y  ( ( (  6  8  4  
   X         r    r6  r   )r5  )*r   rd   r  r  r  r  collectionsr   r   r  r   typingr   r  flaskr   cmf.appra  r   r   r	   models.base_modelr   util.cmfutilr   rG   rE   rJ   rU   rX   rR   ro   ry   r{   r   r   r   r   r   r>  r@  r6  r$   r    r   <module>rj     s             				  / / / / / / / /                                 ) ) ) ) ) ) * * * * * * *B *B *B *BZ$ $ $
? ? ? 7 7 74 4 4 4         6 6 6 6 6 6 6 6r4+ 4+ 4+ 4+ 4+ 4+ 4+ 4+n~ ~ ~ ~ ~: ~ ~ ~BX X X X XZ X X Xv2 2 2 2&Kk Kk Kk Kk Kk Kk Kk Kk^D  D  D  D  D  D  D  D  D  D r    