
    li             
       0   d dl Z d dlZd dlmZ d dlmZmZmZmZmZ d dlm	Z	m
Z
mZ d dlmZmZ d dlmZmZmZ d dlZd dlZd dlmZmZ d dlmZmZmZmZ d d	lmZ d d
l m!Z!  e
dd          Z" G d d          Z#dde	e"         de$de%de	e"         fdZ& G d de'          Z( G d de(          Z) G d de)          Z* G d de)          Z+ G d d e)          Z, G d! d"e,          Z- G d# d$e,          Z. G d% d&e)          Z/ G d' d(e)          Z0 G d) d*e)          Z1 G d+ d,e1          Z2 G d- d.e1          Z3 G d/ d0e1          Z4 G d1 d2e1          Z5 G d3 d4e1          Z6 G d5 d6e1          Z7 G d7 d8e4          Z8 G d9 d:e)          Z9 G d; d<e8          Z: G d= d>e)          Z; G d? d@e3          Z< G dA dBe4          Z= G dC dDe4          Z> G dE dFe7          Z? G dG dHe)          Z@ G dI dJe)          ZA G dK dLe)          ZB G dM dNeB          ZC G dO dPe*          ZD G dQ dReD          ZE G dS dTeD          ZF G dU dVeF          ZG G dW dXe*          ZH G dY dZeH          ZI G d[ d\eH          ZJ G d] d^e*          ZK G d_ d`eK          ZL G da dbeK          ZM G dc ddeE          ZN G de dfe3          ZO G dg dhe,          ZP G di dje6          ZQ G dk dle4          ZR G dm dneQ          ZS G do dpe4          ZT G dq dre2          ZU G ds dte2          ZV G du dve7          ZW G dw dxeW          ZX G dy dze)          ZY G d{ d|e)          ZZ G d} d~e)          Z[ G d de)          Z\ G d deY          Z] G d deY          Z^ G d deY          Z_ G d deY          Z` G d deY          Za G d de4          Zb G d de5          Zceddk    r0d e1d          dz   k    sJ dd e1d          z   k    sJ d e1d           e1d          z   k    sJ  e1d          dk     sJ  e1d           e1d          k     sJ d e1d          k     sJ  e1d          dk    sJ  e1d           e1d          k    sJ d e1d          k    sJ  e1d          dk    sJ  e1d           e1d          k    sJ d e1d          k    sJ  e1d          dk    sJ  e1d           e1d          k    sJ d e1d          k    sJ  e1d          dk    sJ  e1d           e1d          k    sJ d e1d          k    sJ  e1d          dk    sJ  e1d           e1d          k    sJ d e1d          k    sJ  e]            Ze e8d          e8gZf e8d           e8d          gee_g        eejg         e8d           e8d          gk    sJ eejg        ddgk    sJ eBh                                Zeeji        k    sJ dS dS )    N)copy)datedatetime	timedeltatimezonetime)TypeTypeVarUnion)UUIDuuid1)DecimalROUND_CEILINGlocalcontext)dumpsloads)CmfCastErrorCmfOrmErrorCmfOrmImplicitLazyLoadCmfValidationError)htmldiffgTCmfModel)boundc                   ,    e Zd Zddee         defdZdS )	FieldDataNbasecaptionc                     || _         |(| j         j        r| j         j        }nt          d          || _        || _        d S )N   Укажите caption)r   r    	Exceptionkwargs)selfr   r    r$   s       ./cmf/fields/base_fields.py__init__zFieldData.__init__   sH    	?y  :)+ 8999    N)__name__
__module____qualname__r	   r   strr'    r(   r&   r   r      s?         T!W s      r(   r   Fr   r    readonlyreturnc                 "    t          | |fd|i|S )Nr/   )r   )r   r    r/   r$   s       r&   Fieldr2   "   s    T7@@X@@@@r(   c                   4     e Zd Z fdZd ZddZddZ xZS )CmfTypeMetac                     t                                          | |||          }d|vr|j        du rt          d          d|vr|j        du rt          d          |S )Nr    .r"   internal_typeu   Укажите internal_type)super__new__r    AttributeErrorr6   )mcsnamebases	namespacer	__class__s        r&   r8   zCmfTypeMeta.__new__'   ss    GGOOCui88 I%%yC$%=>>>)++#%%$%CDDDr(   c                    | j         | _        | j        rd| j        vrd| _        | j                            d          rd| _        i | _        t          |           D ]b}|                    d          r|| j	        v r"t          | |          }t          |t                    rHt          |          rX|| j        |<   cd S )N	load_modelazycf_T_)r*   
class_namevirtual__dict__rA   
startswithcustomui_metadirui_meta_skipgetattr
isinstancepropertycallable)clsargsr$   kvs        r&   r'   zCmfTypeMeta.__init__4   s     ; 	#;cl::"CM>$$U++ 	CJS 
	 
	A||C   C$$$QA!X&& {{ CKNN
	 
	r(   Nc                 .    |                      ||          S r)   )getrQ   instanceowners      r&   __get__zCmfTypeMeta.__get__K       wwx'''r(   c                 .    |                      ||          S r)   )setrW   s      r&   __set__zCmfTypeMeta.__set__O   r[   r(   r)   )r*   r+   r,   r8   r'   rZ   r^   __classcell__r?   s   @r&   r4   r4   &   so              .( ( ( (( ( ( ( ( ( ( (r(   r4   c                   <   e Zd ZU 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ZdZdZdZdZdZdZdZdZdZeed<   dZ eed	<   dZ!eed
<   dZ"dZ#dZ$dZ%eed<   dZ&d Z'd Z(d Z)d Z*d|dZ+d Z,d Z-d Z.d Z/e0d             Z1e0d             Z2e2j3        d             Z2d Z4e1j3        d             Z1d Z5e0d             Z6e0d             Z7e0d             Z8e0d             Z9e0d              Z:e;d}d!            Z<e;d"             Z=d# Z>d$ Z?d% Z@d& ZAd' ZBe;d(             ZCd~d)ZDd* ZEd+ ZFd, ZGd- ZHd. ZId/ ZJd0 ZKd1 ZLd2 ZMd3 ZNd4 ZOd5 ZPd6 ZQd7 ZRd8 ZSd9 ZTd: ZUd; ZVd< ZWd= ZXd> ZYd? ZZd@ Z[dA Z\dB Z]dC Z^dD Z_dE Z`d}dFZadG ZbdH ZcdI ZddJ ZedK ZfdL ZgdM ZhdN ZidO ZjdP ZkdQ ZldR ZmdS Znd}dTZodU ZpdV ZqdW ZrdX ZsdY ZtdZ Zud[ Zvd\ Zwd] Zxd^ Zyd_ Zzd` Z{d}daZ|db Z}dc Z~dd Zde Zdf Zdg Zdh Zdi Zdj Zdk Zdl Zdm Zdn Zd}doZdp Zdq Zdr Zds Zdt Zdu Zdv Zdw Zdx Zdy Zdz Zd{ ZdS )CmfTypeu  
    load_mode
        load_mode=default, грузим по
            [] - id code name
            [*] - Первый уровень
            [**] - +FK +GFK
            [***] - +M2M + GM2M
        load_mode=always, грузим поле всегда, даже если его не указали в списке полей.
            Например: status_color, status_type, person_login. Как замена backref_load_mode = "load"
        load_mode=lazy, никогда не грузим по *, кроме явного указания в списке полей. Например: Photo, Blob

    subclassed_relation, всегда ленивая, если явно указали, то грузится отдельным запросом, а не через join
    . NTFdefaultoptions_list_query_allno_acl	api_allowcolumn_history)rJ   rL   r6   db_namedb_aliasrd   primary_keyuniqueindex	lazy_loadrA   instance_classrequired_fieldsc                     | j         | j        | j        | j        j        | j        j        j        | j        j        j        dS )N)
from_valueto_value
field_namecmf_model_nameobjobj_code)oldnewrE   rX   idvaluecoder%   s    r&   historyzCmfType.history   s?    "hDH"o"&-":}'-4=;M;SU U 	Ur(   c                     d S r)   r.   r%   r{   s     r&   validatezCmfType.validate       r(   c                 p    ||S | j         *t          || j                   s|                      |          S |S r)   )r6   rN   r   s     r&   castzCmfType.cast   sC    =L)eT%788 1))%000r(   c                     | j         S r)   r{   r}   s    r&   	db_formatzCmfType.db_format   s
    zr(   c                 |    |r	 | j         rd| _        d| _        n"| j                            | j        g|           | S )u+   fields относительно филда.N)fieldsforce)rF   _value_oldrX   load_fieldsrE   )r%   r   r   r$   s       r&   loadzCmfType.load   sO     	 < 	MDKDIIM%%do->e%LLLr(   c                     d S r)   r.   r%   rR   r$   s      r&   savezCmfType.save   s    r(   c                     d| _         | j        | _        t          | j        t          t
          f          rt          | j                  | _        d S d S NF)
is_changedr   r   rN   listdictr   r   s      r&   flushzCmfType.flush   sI    ;	dkD$<00 	)DK((DIII	) 	)r(   c                     	 t          | j        d| j         | j                  }nF# t          $ r9}ddlm} dd l} |j        d| d|	                                            |d }~ww xY w|S )NrD   r   r   u5   DEV: ошибка рассчета virtual-поля: 
)
rM   rX   rE   r   r#   flaskr   	tracebackdebug
format_exc)r%   reser   r   s        r&   virtual_getterzCmfType.virtual_getter   s    	$-)>T_)>)>LLCC 	 	 	AGiAiiQZQeQeQgQgiijjjG		
 
s   #& 
A)4A$$A)c                     t          t          | j                  d| j                   j        s%ddlm}  |j        d| j        | j        |           d S t          | j        d| j         |          S )NrD   r   r   u   Не получилось выполнить присвоение, т.к. нет сеттера у виртуального поля)	rM   typerX   rE   fsetr   r   r   setattr)r%   r   r   s      r&   virtual_setterzCmfType.virtual_setter   s    tDM**,A,A,ABBG 	AG W	   Ft}&;$/&;&;VDDDr(   c                 *    |                                  S r)   )
_get_valuer}   s    r&   r{   zCmfType.value   s       r(   c                     | j         dus| j        r| j        j        r| j         S t          d| j        j         d| j         d          )N.u$   old не загружен из БД .ud    загрузите явно поле в save_preload_fields или в field_loads или field.load)r   rX   is_newr   rE   r}   s    r&   rx   zCmfType.old   sl    9Ct}8L9$t4=3K t tdo t t tu u 	ur(   c                      t          d          )Nu=   Нельзя устанавливать .old значения)r#   r   s     r&   rx   zCmfType.old   s    WXXXr(   c                 F   | j         dus| j        r| j        j        r"| j        r|                                 S | j         S ddlm} ddlm} ddl	m
} t          |dd           r^ |j        d| j        j         d| j                    |                     d	g
           | j        r|                                 S | j         S  |j        d| j        j         d| j                    |j        ro|j        sgdd l}ddl	m}m} d }|j        r |j                            |j                  }|rd| j        j         d| j         d}|d                    |                                d d                   z  }|dt          |dd            z  }|dt          |dd            z  }dt3           ||                     d}|j        j                            d| j        j         d| j         d|d|j        j        |j        j                   | j        r$t?          | j        j         d| j         d          t?          | j        j         d| j                   | j                             d| j         dg
           | j        r|                                 S | j         S )N.r   r   )escapeconfigdisable_raise_lazyloaduH   TODO2 if is_new: load_fields ЛЕНИВАЯ ПОДГРУЗКА ПОЛЯ r   *r   u>   ПРОИЗОШЛА ЛЕНИВАЯ ПОДГРУЗКА ПОЛЯ 	cmf_alertmodels)r|   zField: r   z
jsurl: jsurlz
api_method: 
api_methodz<pre>z</pre>zRaise CmfOrmImplicitLazyLoad u    #Очередь0 #bug   )r;   textpriorityresponsible_idcmf_owner_iduf    загрузите явно само виртуальное поле и его зависимостиz**z.*)!r   rX   r   rF   r   r   r   
markupsafer   cmf.includer   rM   r   rE   r   RAISE_LAZYLOADinteractive_shellr   r   r   CMF_ADMIN_CODE	CmfPersonrV   joinformat_stackr-   CmfTask	auto_taskdelayrz   r{   r   r   )	r%   r   r   r   r   r   r   admin	task_infos	            r&   r   zCmfType._get_value   sp   ;c!!!$-:N!| -**,,,;%%%%%%&&&&&& 1.55 	AG E0E E37?E E F F FIIcUI###| -**,,,;}QUQ^Qi}}lpl{}}~~~   	Z)< 	Z55555555 E$ I(,,&2G,HH 	PTdm&>TTTTT	TYYy'='='?'?'DEEE	DGT)B)BDDD	Ngat.L.LNNN	BCy(9(9$:$:BBB	(..{9Q{{TXTc{{{"Q#(8> / P P P | ,}/ ~ ~$/ ~ ~ ~   )DM,D)X)Xt)X)XYYY!!$4?0F0F0F)G!HHH< 	)&&((({r(   c                 ,    |                      |          S r)   )
_set_valuer   s     r&   r{   zCmfType.value/  s    u%%%r(   c                 :   | j         r|                     |          S |du r3t          d| j        o| j        j         d| j         d| j                   t          |t                    r|j        }| 	                    |          }|=| j
        du r3t          d| j        o| j        j         d| j         d| j                   n|                     |           | j        dur| j        |k    | _        nd| _        | j        r| j        rd| j        _        || _        d S )N.u-   Нельзя убирать значение r    Fu7   Не могу присвоить значение None T)rF   r   r   rX   rE   r    rN   rb   r{   r   nullabler   r   r   r   r   s     r&   r   zCmfType._set_value3  s   < 	.&&u---C<<$bM>dm&>b bAEb bSWS_b bc c c eW%% 	 KE		%  =}%%(fB$-*Bf fEI_f fW[Wcf fg g g & MM%   
 9C"i50DOO"DO? 	,t} 	,'+DM$ r(   c                     | j         S r)   r   r}   s    r&   ry   zCmfType.new[  s
    zr(   c                 \    t          | j        t                    r| j        j        S | j        S r)   )rN   r{   rb   r}   s    r&   jsonzCmfType.json_  s+     dj'** 	$:##zr(   c                     | j         dS t          | j        t          t          f          rt          | j                  dk    rdS dS )NTr   F)r{   rN   r   r   r   lenr}   s    r&   is_nullzCmfType.is_nullf  sG     :4dkD$<00 	S5E5E5J5J4ur(   c                     | j          S r)   )r   r}   s    r&   is_not_nullzCmfType.is_not_nullo  s    <r(   c                     | j         duS N.)r   r}   s    r&   
is_definedzCmfType.is_defineds  s    {#%%r(   c                     || S | j         |j        vr-t          dt          |          j         d| j         d          |j        | j                  S )N'z' object has no attribute ')r*   rG   r9   r   r,   rW   s      r&   rV   zCmfType.get{  sp    J<x000 =X3 = =),)9= = =    ..r(   c                 8    |j         | j                 }||_        d S r)   )rG   r*   r{   )rQ   rX   r{   fields       r&   r]   zCmfType.set  s    !#,/r(   c                      t          |          S r)   r-   r   s     r&   _format_for_html_diffzCmfType._format_for_html_diff  s    5zzr(   c                     |                      |          }|                      |          }|sd}|sd}| j         d| d| dS )N   Не указаноz: <del>u   </del> ➔ <ins>z</ins>)r   r    )r%   	old_value	new_values      r&   _simple_html_diffzCmfType._simple_html_diff  sc    ..y99	..y99	 	.-I 	.-I,SSySS)SSSSr(   c                 B    |                      | j        | j                  S r)   r   rx   ry   r}   s    r&   
_html_diffzCmfType._html_diff      %%dh999r(   c                 <    | j         sdS |                                 S Nrc   )r   r   r}   s    r&   	html_diffzCmfType.html_diff  s!     	2   r(   c                 2    | j         si S | j        | j        dS )A   
        Данные для таблицы аудита
        rx   ry   r   rx   ry   r}   s    r&   
audit_diffzCmfType.audit_diff  s,      	I88
 
 	
r(   c                     | j         pg S r)   )rp   rQ   s    r&   get_required_fieldszCmfType.get_required_fields  s    "(b(r(   c                     d| _         d| _        d | _        d| _        d| _        |dur|| _        | j        s(| j        r!| j        s| j	        dd         dk    sd| _        | j        s	d| _        d S d S )NF.r      cache_r   r   )
r   	orm_dirtyrX   r   r   r{   	log_levelvisiblerF   rE   r   s     r&   r'   zCmfType.__init__  s    	DJ~ 	$, 	t| 	DO\]^_\_L`dlLlLlDN~ 	 DNNN	  	 r(   c                 v    t          |t                    r|j        } t          | j        |          |          S r)   )rN   rb   r{   rM   )r%   fnothers      r&   _comparezCmfType._compare  s7    eW%% 	 KE&wtz2&&u---r(   c                 Z    t          |           j         dt          | j                   dS )N())r   r,   reprr   r}   s    r&   __repr__zCmfType.__repr__  s,    t**)@@D,=,=@@@@r(   c                 *    t          | j                  S r)   r-   r{   r}   s    r&   __str__zCmfType.__str__      4:r(   c                 4    | j                                         S r)   )r{   	__bytes__r}   s    r&   r
  zCmfType.__bytes__      z##%%%r(   c                 N    | j          t          |           |          j         k     S r)   r{   r   r%   r   s     r&   __lt__zCmfType.__lt__  "    zJDJJu--333r(   c                 N    | j          t          |           |          j         k    S r)   r  r  s     r&   __le__zCmfType.__le__  "    zZT$ZZ..444r(   c                     |t          |t                    r|j        r	| j        sdS | j         t          |           |          j        k    S r   )rN   rb   r   r   r{   r   r  s     r&   __eq__zCmfType.__eq__  sH    MZw77MEMMSWS`M5zZT$ZZ..444r(   c                 N    | j          t          |           |          j         k    S r)   r  r  s     r&   __gt__zCmfType.__gt__  r  r(   c                 N    | j          t          |           |          j         k    S r)   r  r  s     r&   __ge__zCmfType.__ge__  r  r(   c                 *    t          | j                  S r)   )hashr{   r}   s    r&   __hash__zCmfType.__hash__  s    DJr(   c                 f    | j         r| j         j        r| j        du rdS t          | j                  S )N.F)rX   r   r   boolr{   r}   s    r&   __bool__zCmfType.__bool__  s9    = 	T]1 	dkS6H6H5DJr(   c                 *    t          | j                  S r)   )r   r{   r}   s    r&   __len__zCmfType.__len__  r  r(   c                 4    | j                                         S r)   )r{   __length_hint__r}   s    r&   r#  zCmfType.__length_hint__  s    z))+++r(   c                     | j         |         S r)   r   r%   keys     r&   __getitem__zCmfType.__getitem__"  s    z#r(   c                 @    |                      |          | j        |<   d S r)   )r   r{   )r%   r&  r{   s      r&   __setitem__zCmfType.__setitem__%  s    ))E**
3r(   c                     | j         |= d S r)   r   r%  s     r&   __delitem__zCmfType.__delitem__(  s    JsOOOr(   c                 6    | j                             |          S r)   )r{   __missing__r%  s     r&   r-  zCmfType.__missing__+  s    z%%c***r(   c                 4    | j                                         S r)   )r{   __iter__r}   s    r&   r/  zCmfType.__iter__.      z""$$$r(   c                 *    t          | j                  S r)   )reversedr{   r}   s    r&   __reversed__zCmfType.__reversed__1  s    
###r(   c                     || j         v S r)   r   )r%   items     r&   __contains__zCmfType.__contains__4  s     tz!!r(   c                 L    | j          t          |           |          j         z   S r)   r  r  s     r&   __add__zCmfType.__add__:  "    zJDJJu--333r(   c                 L    | j          t          |           |          j         z
  S r)   r  r  s     r&   __sub__zCmfType.__sub__=  r9  r(   c                 L    | j          t          |           |          j         z  S r)   r  r  s     r&   __mul__zCmfType.__mul__@  r9  r(   c                 L    | j          t          |           |          j         z  S r)   r  r  s     r&   
__matmul__zCmfType.__matmul__C  r9  r(   c                 L    | j          t          |           |          j         z  S r)   r  r  s     r&   __truediv__zCmfType.__truediv__F  r9  r(   c                 L    | j          t          |           |          j         z  S r)   r  r  s     r&   __floordiv__zCmfType.__floordiv__I  "    zZT$ZZ..444r(   c                 L    | j          t          |           |          j         z  S r)   r  r  s     r&   __mod__zCmfType.__mod__L  r9  r(   c                 b    t          | j         t          |           |          j                  S r)   )divmodr{   r   r  s     r&   
__divmod__zCmfType.__divmod__O  s'    dj*$t**U"3"3"9:::r(   c                 d    t          | j         t          |           |          j        |          S r)   )powr{   r   r%   r   modulos      r&   __pow__zCmfType.__pow__R  s)    4:ztDzz%006???r(   c                 L    | j          t          |           |          j         z  S r)   r  r  s     r&   
__lshift__zCmfType.__lshift__U  rD  r(   c                 L    | j          t          |           |          j         z	  S r)   r  r  s     r&   
__rshift__zCmfType.__rshift__X  rD  r(   c                 L    | j          t          |           |          j         z  S r)   r  r  s     r&   __and__zCmfType.__and__[  r9  r(   c                 L    | j          t          |           |          j         z  S r)   r  r  s     r&   __xor__zCmfType.__xor__^  r9  r(   c                 L    | j          t          |           |          j         z  S r)   r  r  s     r&   __or__zCmfType.__or__a  r9  r(   c                 L     t          |           |          j        | j        z   S r)   r   r{   r  s     r&   __radd__zCmfType.__radd__d  s$     tDzz%  &33r(   c                 L     t          |           |          j        | j        z
  S r)   rZ  r  s     r&   __rsub__zCmfType.__rsub__j  "    tDzz%  &33r(   c                 L     t          |           |          j        | j        z  S r)   rZ  r  s     r&   __rmul__zCmfType.__rmul__m  r^  r(   c                 L     t          |           |          j        | j        z  S r)   rZ  r  s     r&   __rmatmul__zCmfType.__rmatmul__p  r^  r(   c                 L     t          |           |          j        | j        z  S r)   rZ  r  s     r&   __rtruediv__zCmfType.__rtruediv__s  r^  r(   c                 L     t          |           |          j        | j        z  S r)   rZ  r  s     r&   __rfloordiv__zCmfType.__rfloordiv__v  "    tDzz%  &$*44r(   c                 L     t          |           |          j        | j        z  S r)   rZ  r  s     r&   __rmod__zCmfType.__rmod__y  r^  r(   c                 b    t           t          |           |          j        | j                  S r)   )rH  r   r{   r  s     r&   __rdivmod__zCmfType.__rdivmod__|  s'    jd4jj''-tz:::r(   c                 d    t           t          |           |          j        | j        |          S r)   )rK  r   r{   rL  s      r&   __rpow__zCmfType.__rpow__  s)    :4::e$$*DJ???r(   c                 L     t          |           |          j        | j        z  S r)   rZ  r  s     r&   __rlshift__zCmfType.__rlshift__  rg  r(   c                 L     t          |           |          j        | j        z	  S r)   rZ  r  s     r&   __rrshift__zCmfType.__rrshift__  rg  r(   c                 L     t          |           |          j        | j        z  S r)   rZ  r  s     r&   __rand__zCmfType.__rand__  r^  r(   c                 L     t          |           |          j        | j        z  S r)   rZ  r  s     r&   __rxor__zCmfType.__rxor__  r^  r(   c                 L     t          |           |          j        | j        z  S r)   rZ  r  s     r&   __ror__zCmfType.__ror__  r^  r(   c                 \    | xj          t          |           |          j         z  c_         | S r)   r  r  s     r&   __iadd__zCmfType.__iadd__  *    

jd4jj''--

r(   c                 \    | xj          t          |           |          j         z  c_         | S r)   r  r  s     r&   __isub__zCmfType.__isub__  rz  r(   c                 \    | xj          t          |           |          j         z  c_         | S r)   r  r  s     r&   __imul__zCmfType.__imul__  rz  r(   c                 \    | xj          t          |           |          j         z  c_         | S r)   r  r  s     r&   __imatmul__zCmfType.__imatmul__  rz  r(   c                 \    | xj          t          |           |          j         z  c_         | S r)   r  r  s     r&   __itruediv__zCmfType.__itruediv__  rz  r(   c                 \    | xj          t          |           |          j         z  c_         | S r)   r  r  s     r&   __ifloordiv__zCmfType.__ifloordiv__  s*    

ztDzz%((..

r(   c                 \    | xj          t          |           |          j         z  c_         | S r)   r  r  s     r&   __imod__zCmfType.__imod__  rz  r(   c                 n    | j                              t          |           |          j         |          S r)   )r{   __ipow__r   rL  s      r&   r  zCmfType.__ipow__  s-    z"":4::e#4#4#:FCCCr(   c                 l    | j                              t          |           |          j                   S r)   )r{   __ilshift__r   r  s     r&   r  zCmfType.__ilshift__  +    z%%jd4jj&7&7&=>>>r(   c                 l    | j                              t          |           |          j                   S r)   )r{   __irshift__r   r  s     r&   r  zCmfType.__irshift__  r  r(   c                 l    | j                              t          |           |          j                   S r)   )r{   __iand__r   r  s     r&   r  zCmfType.__iand__  +    z"":4::e#4#4#:;;;r(   c                 l    | j                              t          |           |          j                   S r)   )r{   __ixor__r   r  s     r&   r  zCmfType.__ixor__  r  r(   c                 l    | j                              t          |           |          j                   S r)   )r{   __ior__r   r  s     r&   r  zCmfType.__ior__  s+    z!!*$t**U"3"3"9:::r(   c                 4    | j                                         S r)   )r{   __neg__r}   s    r&   r  zCmfType.__neg__      z!!###r(   c                 4    | j                                         S r)   )r{   __pos__r}   s    r&   r  zCmfType.__pos__  r  r(   c                 4    | j                                         S r)   )r{   __abs__r}   s    r&   r  zCmfType.__abs__  r  r(   c                 4    | j                                         S r)   )r{   
__invert__r}   s    r&   r  zCmfType.__invert__      z$$&&&r(   c                 4    | j                                         S r)   )r{   __complex__r}   s    r&   r  zCmfType.__complex__  s    z%%'''r(   c                 4    | j                                         S r)   )r{   __int__r}   s    r&   r  zCmfType.__int__  r  r(   c                 4    | j                                         S r)   )r{   	__float__r}   s    r&   r  zCmfType.__float__  r  r(   c                 4    | j                                         S r)   )r{   	__index__r}   s    r&   r  zCmfType.__index__  r  r(   c                 6    | j                             |          S r)   )r{   	__round__)r%   ndigitss     r&   r  zCmfType.__round__  s    z##G,,,r(   c                 4    | j                                         S r)   )r{   	__trunc__r}   s    r&   r  zCmfType.__trunc__  r  r(   c                 4    | j                                         S r)   )r{   	__floor__r}   s    r&   r  zCmfType.__floor__  r  r(   c                 4    | j                                         S r)   )r{   __ceil__r}   s    r&   r  zCmfType.__ceil__  r0  r(   c                 4    | j                                         S r)   )r{   	__enter__r}   s    r&   r  zCmfType.__enter__  r  r(   c                 :    | j                             |||          S r)   )r{   __exit__r%   exc_type	exc_valuer   s       r&   r  zCmfType.__exit__  s    z""8Y	BBBr(   c                 4    | j                                         S r)   )r{   	__await__r}   s    r&   r  zCmfType.__await__  r  r(   c                 4    | j                                         S r)   )r{   	__aiter__r}   s    r&   r  zCmfType.__aiter__  r  r(   c                 4    | j                                         S r)   )r{   	__anext__r}   s    r&   r  zCmfType.__anext__  r  r(   c                 4    | j                                         S r)   )r{   
__aenter__r}   s    r&   r  zCmfType.__aenter__  r  r(   c                 :    | j                             |||          S r)   )r{   	__aexit__r  s       r&   r  zCmfType.__aexit__  s    z##HiCCCr(   c                 4    | j                                         S r)   )rG   r   r}   s    r&   __getstate__zCmfType.__getstate__  s    }!!###r(   c                 :    | j                             |           d S r)   )rG   update)r%   states     r&   __setstate__zCmfType.__setstate__  s    U#####r(   r   r)   ).)r*   r+   r,   __doc__r    r6   placeholdercommentri   rj   r   rd   rk   rl   rm   index_usingr   r   r/   rA   widgetro   rF   virtual_cache_timelifeautorI   fullsearch_indexrp   options_list_paramsre   r  __annotations__rf   rg   TEXKOM_group_by_allowrJ   ui_form_visiblerh   rL   r~   r   r   r   r   r   r   r   r   rO   r{   rx   setterr   r   ry   r   r   r   r   classmethodrV   r]   r   r   r   r   r   r   r'   r   r  r  r
  r  r  r  r  r  r  r  r!  r#  r'  r)  r+  r-  r/  r3  r6  r8  r;  r=  r?  rA  rC  rF  rI  rN  rP  rR  rT  rV  rX  r[  r]  r`  rb  rd  rf  ri  rk  rm  ro  rq  rs  ru  rw  ry  r|  r~  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r.   r(   r&   rb   rb   W   s_          GM KGGHHGKFEKGIHIFNG!DFO $)D(((FDIt! GON4L U U U           ) ) )  *
E 
E 
E ! ! X! u u Xu 	ZY Y ZY1 1 1f \& & \&& & &P   X   X   X     X  & & X& 
/ 
/ 
/ [
/   [  T T T: : :! ! !	
 	
 	
 ) ) [)       . . .A A A  & & &4 4 45 5 55 5 54 4 45 5 5          \  , , ,  + + +  + + +% % %$ $ $" " "4 4 44 4 44 4 44 4 44 4 45 5 54 4 4; ; ;@ @ @ @5 5 55 5 54 4 44 4 44 4 44 4 44 4 44 4 44 4 44 4 45 5 54 4 4; ; ;@ @ @ @5 5 55 5 54 4 44 4 44 4 4              D D D D? ? ?? ? ?< < << < <; ; ;$ $ $$ $ $$ $ $' ' '( ( ($ $ $& & && & &- - - -& & && & &% % %& & &C C C& & && & && & &' ' 'D D D$ $ $$ $ $ $ $r(   rb   )	metaclassc                        e Zd ZdZdZdZdZdZdZdZ	dZ
dZej        dz   Zd Zd Z fdZe fd	            Zed
             Z fdZddddZd Z xZS )
CmfRelBase.NFT)options_list_bqloptions_list_bql_exclusivec                 n    d| _         | j        rd| j        _         | j                            |           d S NT)r   rX   r{   appendr%   rv   s     r&   r  zCmfRelBase.append  9    = 	,'+DM$
#r(   c                 n    d| _         | j        rd| j        _         | j                            |           d S r  )r   rX   r{   remover  s     r&   r  zCmfRelBase.remove  r  r(   c                 H     t                      j        |i | d | _        d S r)   )r7   r'   _all_nested_cacher%   rR   r$   r?   s      r&   r'   zCmfRelBase.__init__  s-    $)&)))!%r(   c                 p    t                                          ||           d || j                 _        d S r)   )r7   r]   r*   r  rQ   rX   r{   r?   s      r&   r]   zCmfRelBase.set  s0    He$$$37000r(   c                     t           r)   NotImplementedErrorr   s    r&   related_modelszCmfRelBase.related_models!      !!r(   c                 ~   ddl m} t          |t                    rpd|v rjt	          t          |           dd           dk    rt	          |d          nt          |d                   j        }|                    |d         dd          S nt          |t                    rL|
                    d          }d }t	          t          |           dd           dk    rt	          |d          }n*t          |          d	k    rt	          ||d         d           }|r|                    |dd          x}r|S |                                 D ]#}|                    d
d|gdd          }|r|c S $|                                 D ]!}|                    dd|g          }|r|c S "d|j        j        v r=|j        |                                 v r"|j                            dd|g          }|r|S n/t          |t                    r|j                            |          S t                                          |          S )Nr   r   rz   modelCmfRFileT)include_deletedinclude_dummy:r   r|   z==)filterr  r  r;   )r  employee_number)r   r   rN   r   rM   r   CmfTUUIDr  rV   r-   splitr   r  r   r   r7   r   )r%   r{   r   r  id_partsrv   r   r?   s          r&   r   zCmfRelBase.cast%  sr   &&&&&&eT"" 	*u}}7>tDzz7TX7Y7Y]g7g7g
333!%+..4 yytdRVyWWW	 
 s## 	*{{3''HEtDzz7D11Z??
33X!##T:: ))E4t)TTT3 J,,..  iie'<dbfigg JJJ,,..  iie'<i== JJJ F$4$;;;@PTXTgTgTiTi@i@i&**3DdE2R*SS Jx(( 	*;??5)))ww||E"""r(   r   )rE   r   c                   t          |          t          |          z   }| j        r|| j        v r| j        |         S ni | _        ddlm} |j                            | j        j        j        | j	        |o|g          }g }|
                                D ]C\  }	}
t          ||	          }|                    |                    dd|
g|d                     D|| j        |<   |S )Nr   r  )child_modelsrz   INT)r  r   include_system)r-   r  r   r   RelationCacheget_children_dictrX   rz   r{   rE   itemsrM   extendr   )r%   rE   r   _args_kwargsall_nested_cache_keyr   children_dictresult
model_nameids_listr  s               r&   
all_nestedzCmfRelBase.all_nestedI  s   ":s6{{:! 	(#t'===-.BCC > &(D"&&&&&&,>>M"DO*B]R\Q] ? _ _$1$7$7$9$9 	i 	i JFJ//EMM%**T4,B6bf*gghhhh7=34r(   c                    | j         si S t          | j        t                    s5| j        r| j        j        j        nd | j        r| j        j        j        nd dS g }g }| j        D ]*}|| j        vr|                    |j        j                   +| j        D ]*}|| j        vr|                    |j        j                   +|s|si S ||dS )Nr   )appendeddeleted)r   rN   r{   r   rx   rz   ry   r  )r%   r  r	  rv   s       r&   r   zCmfRelBase.audit_diff_  s     	I$*d++ 	,0H>tx{(($.2jBtz}**d   8 	- 	-C$(""sv|,,,8 	. 	.C$(""--- 	 	I 
 
 	
r(   )r*   r+   r,   r    r6   nested_fieldsnested_fields_is_edge_parentlinkableoptions_list_search_columnsoptions_list_show_columnsr  r  rb   rL   r  r  r'   r  r]   r  r   r  r   r_   r`   s   @r&   r  r    s       GMM#( H"& $!%'*\\L    & & & & & 8 8 8 8 [8 " " ["!# !# !# !# !#H -8     ,
 
 
 
 
 
 
r(   r  c                   (    e Zd ZdZeZd ZdZdZd Z	dS )CmfBool.Fc                 @    |du rdS |du rdS |dS t          d          )NTu   ДаFu   Нетr   u)   Некорректное значение)
ValueErrorr   s     r&   r   zCmfBool._format_for_html_diff}  s8    D==6e^^8]((HIIIr(   N)
r*   r+   r,   r    r  r6   r  r   rd   r   r.   r(   r&   r  r  v  sA        GMFHGJ J J J Jr(   r  c                   Z     e Zd ZdZeZdZdZd Z fdZ	 fdZ
 fdZ fdZ fdZ xZS )CmfInt.Nc                 &   |dk    rd S t                                          |          }t          | dd           }|S|Q||k     rKdd l}t	          j        d| j         d| dd                    |                                                      |S )Nrc   TEXKOM_warn_minr   zDEV: TEXKOM_warn_min: : z 
)	r7   r   rM   r   r   r   r    r   r   )r%   r{   r  r   r?   s       r&   r   zCmfInt.cast  s    B;;4U##!$(94@@'!''GjT\jjUjjrwwyOeOeOgOgGhGhjjkkkr(   c                     t           j        r) t          |           |          }| j        r
|dk    rdS dS t	                                          |          S Nr   TFr   relaxed_bz_python_moder   r   r7   r  r%   r   or?   s      r&   r  zCmfInt.__lt__  V    # 	T

5!!A| q554uww~~e$$$r(   c                     t           j        r) t          |           |          }| j        r
|dk    rdS dS t	                                          |          S r  r   r  r   r   r7   r  r  s      r&   r  zCmfInt.__le__  V    # 	T

5!!A| 664uww~~e$$$r(   c                     t           j        r) t          |           |          }| j        r
|dk     rdS dS t	                                          |          S r  r   r  r   r   r7   r  r  s      r&   r  zCmfInt.__gt__  V    # 	T

5!!A| q554uww~~e$$$r(   c                     t           j        r) t          |           |          }| j        r
|dk    rdS dS t	                                          |          S r  r   r  r   r   r7   r  r  s      r&   r  zCmfInt.__ge__  V    # 	T

5!!A| 664uww~~e$$$r(   )r*   r+   r,   r    intr6   minmaxr  r   r  r  r  r  r_   r`   s   @r&   r  r    s        GM
C
CF    &% % % % %% % % % %% % % % %% % % % % % % % %r(   r  c                       e Zd ZdZdS )	CmfBigInt.Nr*   r+   r,   r    r.   r(   r&   r,  r,            GGGr(   r,  c                       e Zd ZdZdZd ZdS )CmfIntervalu3   Интервал времени в секундах.Nr*   r+   r,   r  r    r  r.   r(   r&   r0  r0    s        ==GFFFr(   r0  c                   N     e Zd ZdZeZdZdZd Ze	d             Z
 fdZd Z xZS )CmfTime.Nc                 <    | j         rd S t          | j                  S r)   r   r-   r{   r}   s    r&   r   zCmfTime.json      < 	44:r(   c                     t          |t                    r1t          j                            |                                          S t                                          |          S r)   )rN   r-   dateutilparserparser   r7   r   r%   r{   r?   s     r&   r   zCmfTime.cast  M    eS!! 	7?((//44666ww||E"""r(   c                     | j         si S | j        r| j                            d          nd | j        r| j                            d          nd dS )Nz%H:%M:%Sr   )r   rx   strftimer{   r}   s    r&   r   zCmfTime.audit_diff  s^     	I48HF48$$Z000$6:jJ4:&&z222d
 
 	
r(   )r*   r+   r,   r    r   r6   r)  r*  r  rO   r   r   r   r_   r`   s   @r&   r3  r3    sy        GM
C
CF  X
# # # # #

 
 
 
 
 
 
r(   r3  c                       e Zd ZdZeZdZdZdS )CmfBytes.NCmfStr)r*   r+   r,   r    bytesr6   
max_lengthr  r.   r(   r&   r@  r@    s"        GMJFFFr(   r@  c                   z    e Zd ZU dZeZdZdZej	        e
d<   dZd Zej        dz   Zd Zd Zd Zd	efd
Zd	efdZdS )rA  .Nregexu^   Значение {} не удовлетворяет регулярному выражению.)rE  regex_error_msgc                     | j         r| j         dk    rdS t          | j         pd| j        pd          }|sdS | j         d| S )Nrc   r  )rx   r   ry   r    )r%   diffs     r&   r   zCmfStr._html_diff  s[    x 	48r>> 2BB77 	2,(($(((r(   c                     | j         r*t          |          | j         k    rt          d|           | j        rA| j                            |          s)t          | j                            |                    d S d S )Nu,   Слишком длинная строка: )rC  r   r   rE  	fullmatchrF  formatr   s     r&   r   zCmfStr.validate  s    ? 	a5zzDO++()_X])_)_```: 	M:''.. M()=)D)DU)K)KLLL	M 	MM Mr(   c                 &     | j         j        |i |S r)   r{   r  r   s      r&   r  zCmfStr.split  s    tz0000r(   r0   c                 8    | j         rdS  | j        j        |i |S r   )r   r{   rH   r   s      r&   rH   zCmfStr.startswith  s+    < 	5$tz$d5f555r(   c                 8    | j         rdS  | j        j        |i |S r   )r   r{   endswithr   s      r&   rP  zCmfStr.endswith   s+    < 	5"tz"D3F333r(   )r*   r+   r,   r    r-   r6   rC  rE  rePatternr  rF  r  rb   rL   r   r   r  r  rH   rP  r.   r(   r&   rA  rA    s         GMJE2:vOF' + L
) ) )M M M1 1 16T 6 6 6 644 4 4 4 4 4 4r(   rA  c                       e Zd ZdZd ZdS )CmfText.Nr*   r+   r,   r    r  r.   r(   r&   rT  rT  '  s        GFFFr(   rT  c                       e Zd ZdZdZdS )CmfStr32.    Nr*   r+   r,   r    rC  r.   r(   r&   rW  rW  ,          GJJJr(   rW  c                       e Zd ZdZdZdS )CmfStr64.@   NrY  r.   r(   r&   r\  r\  1  rZ  r(   r\  c                       e Zd ZdZdZdS )	CmfStr256.   NrY  r.   r(   r&   r_  r_  6          GJJJr(   r_  c                       e Zd ZdZdZdS )	CmfStr128.   NrY  r.   r(   r&   rc  rc  ;  ra  r(   rc  c                       e Zd ZdZdZdS )
CmfStr4096.i   NrY  r.   r(   r&   rf  rf  @  s        GJJJr(   rf  c                        e Zd ZdZdZdZej        dz   Zed             Z	ed             Z
ed             Zed             Zed             Z fd	Ze fd
            Z xZS )r  .N)foreign_keyforeign_keysc                 B    | j                             d          d         S )Nr  r   rM  r}   s    r&   	type_namezCmfTUUID.type_nameL  s    z$$Q''r(   c                 \    t          | j                            d          d                   S )Nr     )r   r{   r  r}   s    r&   uuidzCmfTUUID.uuidP  s%    DJ$$S))!,---r(   c                 \    ddl m} t          |t          | j                  j                  S Nr   r  )r   r   rM   r  r{   rk  )r%   r   s     r&   r  zCmfTUUID.modelT  s1    &&&&&&vx
33=>>>r(   c                 *    t          |          j        S r)   )r  r  )rQ   	tuuid_strs     r&   get_cls_by_tuuid_strzCmfTUUID.get_cls_by_tuuid_strZ  s    	""((r(   c                 ^    t          |          }|j                            |j                  S r)   )r  r  rV   r{   )rQ   rr  tuuids      r&   get_obj_by_tuuid_strzCmfTUUID.get_obj_by_tuuid_str^  s%    ##{u{+++r(   c                     | j         r&| j        rt          d| j        d d                    t	                                          |          S )Nu\   Это служебное поле, для присвоения ид используйте )rh  rX   r   rE   r7   r   r;  s     r&   r   zCmfTUUID.validatec  s     	\ 	\$  &[  EI  ET  UX  VX  UX  EY  &[  &[  \  \  \ww&&&r(   c                    t                                          ||           | j                            d          rt	          || j        d d                   rrdt          |          vrc|| j        d d                  j        r|| j        d d                  j        |k    r-|                    |          || j        d d         <   d S d S d S d S d S )N_idrx  z:Class)	r7   r]   r*   rP  hasattrr-   r   rz   make_ellipsis_idobjr  s      r&   r]   zCmfTUUID.seti  s    He$$$ <  '' 	RGHcl3B3>O,P,P 	RU]ehineoeoUoUoCL"-.9 RXclSVTVSVFW=X=[_d=d=d.6.J.J5.Q.Qcrc*+++	R 	R 	R 	RUoUo=d=dr(   )r*   r+   r,   r    rh  ri  r\  rL   rO   rk  rn  r  r  rs  rv  r   r]   r_   r`   s   @r&   r  r  E  s       GKL(+JJL( ( X( . . X. ? ? X?
 ) ) [) , , [,' ' ' ' ' R R R R [R R R R Rr(   r  c                       e Zd ZdZeZdgZdS )CmfTsVectoru   Вектор поискаginN)r*   r+   r,   r    r-   r6   r  r.   r(   r&   r~  r~  v  s        )GM'KKKr(   r~  c                       e Zd ZdZdZdS )CmfM2MTUUID.rd  NrY  r.   r(   r&   r  r  |  ra  r(   r  c                   4    e Zd ZdZeZeZd Ze	d             Z
dS )CmfUUID.c                 *    t          | j                  S r)   r  r}   s    r&   r   zCmfUUID.json  s    4:r(   N)r*   r+   r,   r    r   r6   r   rd   r  rO   r   r.   r(   r&   r  r    sA        GMGF  X  r(   r  c                   b     e Zd ZdZej        Zd Zed             Z	 fdZ
d Zd Z fdZ xZS )CmfIPv4Address.c                 *    t          | j                  S r)   r  r}   s    r&   r   zCmfIPv4Address.db_format  r  r(   c                 <    | j         rd S t          | j                  S r)   r5  r}   s    r&   r   zCmfIPv4Address.json  r6  r(   c                     |sd }t          |t          j                  s|!t                                          |          S t          j        |          S r)   )rN   	ipaddressIPv4Addressr7   r   r;  s     r&   r   zCmfIPv4Address.cast  sP     	EeY233 	'u}77<<&&&$U+++r(   c                     d S r)   r.   r   s     r&   r   zCmfIPv4Address.validate  r   r(   c                 B    |                      | j        | j                  S r)   r   r}   s    r&   r   zCmfIPv4Address._html_diff  r   r(   c                      t                                                      }|r  fd|                                D             }|S )Nc                 B    i | ]\  }}|                     |          S r.   )r   .0rS   rT   r%   s      r&   
<dictcomp>z-CmfIPv4Address.audit_diff.<locals>.<dictcomp>  s-    NNNAAt11!44NNNr(   )r7   r   r  )r%   rH  r?   s   ` r&   r   zCmfIPv4Address.audit_diff  sH    ww!!## 	ONNNNNNNDr(   )r*   r+   r,   r    r  r  r6   r   rO   r   r   r   r   r   r_   r`   s   @r&   r  r    s        G)M     X
, , , , ,  : : :        r(   r  c                   R     e Zd ZdZej        Zd Zed             Z	 fdZ
d Z xZS )CmfIPv4Network.c                 *    t          | j                  S r)   r  r}   s    r&   r   zCmfIPv4Network.db_format  r  r(   c                 <    | j         rd S t          | j                  S r)   r5  r}   s    r&   r   zCmfIPv4Network.json  r6  r(   c                     t          |t          j                  s|!t                                          |          S t          j        |          S r)   )rN   r  IPv4Networkr7   r   r;  s     r&   r   zCmfIPv4Network.cast  sC    eY233 	'u}77<<&&&$U+++r(   c                     d S r)   r.   r   s     r&   r   zCmfIPv4Network.validate  r   r(   )r*   r+   r,   r    r  r  r6   r   rO   r   r   r   r_   r`   s   @r&   r  r    s~        G)M     X
, , , , ,
      r(   r  c                       e Zd ZdZdS )	CmfDomain.Nr-  r.   r(   r&   r  r    r.  r(   r  c                   6     e Zd ZdZd ZdZd Zd Z fdZ xZ	S )CmfPassword.zAES256:c                     ddl m} |s|S |                     |           |                    | j                  r|S | j         |                    |           S )Nr   cmfutil)cmf.utilr  r   rH   crypt_prefixcrypt)r%   r{   r  s      r&   r   zCmfPassword.cast  sq    $$$$$$ 	LeD-.. 	L#;W]]5%9%9;;;r(   c                    ddl m} ddlm}m} | j        s| j        S t          j        t          j        k    r+|j	        
                                s |d           | j        S | j                            | j                  r8|                    | j                            | j                  d                   S | j        S )Nr   r  r   u!   Недостаточно правrm  )r  r  r   r   r   r{   r   current_personsystem_personCmfAccessListcheck_admin_moderH   r  decryptr  )r%   r  r   r   s       r&   r  zCmfPassword.decrypt  s    $$$$$$11111111z 	:q..v7K7\7\7^7^.I9:::::  !233 	K??4:#3#3D4E#F#Fq#IJJJzr(   c                     t          j        d|          rt          d          t                                          |          S )Nu   [А-Яа-яЁё]uD   Пароль не должен содержать кириллицу)rQ  searchr   r7   r   r;  s     r&   r   zCmfPassword.validate  s@    9(%00 	m$%klllww&&&r(   )
r*   r+   r,   r    r  r  r   r  r   r_   r`   s   @r&   r  r    se        GFL< < <  ' ' ' ' ' ' ' ' 'r(   r  c                        e Zd ZdZeZdZdZd Ze	j
        dz   Z
ed             Zd Z fdZed             Zd Zd	 Zd
 Zd Zd Z fdZ fdZ fdZ fdZ xZS )CmfDate.Fauto_nowauto_now_addc                 F    | j         rd S | j                                        S r)   r   r{   	isoformatr}   s    r&   r   zCmfDate.json  %    < 	4z##%%%r(   c                     | j         si S | j        r| j                                        nd | j        r| j                                        nd dS Nr   r   rx   r  r{   r}   s    r&   r   zCmfDate.audit_diff  Z     	I+/8=48%%'''-1ZA4:'')))T
 
 	
r(   c                     t          |t                    r1t          j                            |                                          S t                                          |          S r)   )rN   r-   r8  r9  r:  r   r7   r   r;  s     r&   r   zCmfDate.cast  r<  r(   c                 t     | t          j        t          j                                                            S r)   )r   nowr   utcr   r   s    r&   r  zCmfDate.now  s*    s8<--2244555r(   c                 8    |                                  | _        d S r)   r  r{   r}   s    r&   set_nowzCmfDate.set_now      XXZZ


r(   c                     t          |t                    r| xj        |z  c_        n+| xj         t          |           |          j        z  c_        | S r)   rN   r   r{   r   r  s     r&   ry  zCmfDate.__iadd__  N    eY'' 	2JJ%JJJJJ*$t**U++11JJr(   c                     t          |t                    r| xj        |z  c_        n+| xj         t          |           |          j        z  c_        | S r)   r  r  s     r&   r|  zCmfDate.__isub__  r  r(   c                     t          |t                    r
| j        |z   S | j         t          |           |          j        z   S r)   r  r  s     r&   r8  zCmfDate.__add__  A    eY'' 	8:%%:
T

5 1 1 777r(   c                     t          |t                    r
| j        |z
  S | j         t          |           |          j        z
  S r)   r  r  s     r&   r;  zCmfDate.__sub__"  r  r(   c                     t           j        r! t          |           |           | j        rdS t	                                          |          S r   r  r%   r   r?   s     r&   r  zCmfDate.__lt__)  I    # 	DJJu| uww~~e$$$r(   c                     t           j        r! t          |           |           | j        rdS t	                                          |          S r   r   r  s     r&   r  zCmfDate.__le__1  r  r(   c                     t           j        r! t          |           |           | j        rdS t	                                          |          S r   r#  r  s     r&   r  zCmfDate.__gt__9  r  r(   c                     t           j        r! t          |           |           | j        rdS t	                                          |          S r   r&  r  s     r&   r  zCmfDate.__ge__A  r  r(   )r*   r+   r,   r    r   r6   r  r  r  rb   rL   rO   r   r   r   r  r  r  ry  r|  r8  r;  r  r  r  r  r_   r`   s   @r&   r  r    sS       GM HLF'*FFL& & X&

 
 
# # # # #
 6 6 [6         8 8 88 8 8% % % % %% % % % %% % % % %% % % % % % % % %r(   r  c                        e Zd ZdZdZdZdZdZej	        dz   Z	dZ
e fd            Zd Zd Zed	             Zd
 Z xZS )CmfDateRange.NCmfDateTimeRange)start_field_nameend_field_nameTc                 b    t                                                      | j        | j        gz   S r)   )r7   r   r  r  rQ   r?   s    r&   r   z CmfDateRange.get_required_fieldsT  s)    ww**,,0DcFX/YYYr(   c                     t          | j        | j                  }t          | j        | j                  }|r|sd S |                    |j                  }|                    |j                  }||gS )N)year)rM   rX   r  r  replacer  )r%   range_start	range_ends      r&   r   zCmfDateRange.virtual_getterX  sz    dmT-BCCDM4+>??	 	) 	4!)){/?)@@%%9>%::	Y''r(   c                    |rt           j                            |d                                                   }t           j                            |d                                                   }t	          | j        | j        |           t	          | j        | j        |           d S t	          | j        | j        d            t	          | j        | j        d            d S )Nr   rm  )r8  r9  r:  r   r   rX   r  r  )r%   r{   start_value	end_values       r&   r   zCmfDateRange.virtual_setterb  s     	>"///a99>>@@K --eAh77<<>>IDM4#8+FFFDM4#6	BBBBBDM4#8$???DM4#6=====r(   c                    t          | j        | j                  rt          | j        | j                  sd S t          | j        | j                                                  t          | j        | j                                                  gS r)   )rM   rX   r  r  r  r}   s    r&   r   zCmfDateRange.jsonl  s}    t}d&;<< 	GDM[_[nDoDo 	4t'<==GGIIt':;;EEGGI 	Ir(   c                 B    | j         si S d|                                 dS )NTODOr   )r   r   r}   s    r&   r   zCmfDateRange.audit_difft  s.     	I99;;
 
 	
r(   )r*   r+   r,   r    r6   r  r  r  rb   rL   rF   r  r   r   r   rO   r   r   r_   r`   s   @r&   r  r  K  s        GMNF'*PPLGZ Z Z Z [Z( ( (> > > I I XI
 
 
 
 
 
 
r(   r  c                       e Zd ZdZeZdZdZd Ze	j
        dz   Z
edefd            Zed             Zed             Zd Zed	             Z fd
Zd Zed             Zd Zd Zd Zd Zd Z fdZ fdZ fdZ fdZ xZS )CmfDateTime.Fr  dtc                 p    | 3t          j        t          j                  | z
                                  S d S r)   )r   r  r   r  total_seconds)r  s    r&   cls_agezCmfDateTime.cls_age  s1    >L..3BBDDD >r(   c                 H    | j         sdS |                     | j                   S Nr   )r{   r  r}   s    r&   agezCmfDateTime.age  s%    z 	1||DJ'''r(   c                 F    | j         rd S | j                                        S r)   r  r}   s    r&   r   zCmfDateTime.json  r  r(   c                     | j         si S | j        r| j                                        nd | j        r| j                                        nd dS r  r  r}   s    r&   r   zCmfDateTime.audit_diff  r  r(   c                     ddddddddd	d
ddd}|                                 D ]\  }}|                     ||          } | S )Njanfebmaraprmayjunjulaugsepoctnovdec)u   янвu   февu   марu   апрu   майu   июнu   июлu   авгu   сенu   октu   нояu   дек)r  r  )r{   mappingmonth_rumonth_ens       r&   _translate_monthzCmfDateTime._translate_month  sl     
 
 #*--// 	6 	6HhMM(H55EEr(   c                 V   d}||S t          |t                    r|d         dk    rd}|d         dk    s|d         dk    rQ|d                                         sd}t          j                            |                     |          |          }nCt          j                            ||          }n!t                                          |          }|	                                >|
                    t          j                                                    j        	          }|S )
NFr   r   T/rm     )dayfirst)tzinfo)rN   r-   isdigitr8  r9  r:  r  r7   r   	utcoffsetr  r   r  
astimezoner   )r%   r{   r  r   r?   s       r&   r   zCmfDateTime.cast  s   =LeS!! 	&Qx3 Qx3%(c//Qx'')) $#Ho++D,A,A%,H,HS[+\\o++EH+EE'',,u%%C ==??"++X\^^%>%>%@%@%G+HHC
r(   c                 H    |sdS |                                 }d| d| d}|S )Nrc   z<time datetime="z">z</time>)r  r   s     r&   r   z!CmfDateTime._format_for_html_diff  s;     	2!!:5::E:::r(   c                 P     | t          j        t          j                            S r)   )r   r  r   r  r   s    r&   r  zCmfDateTime.now  s    s8<--...r(   c                 8    |                                  | _        d S r)   r  r}   s    r&   r  zCmfDateTime.set_now  r  r(   c                    t          |t                    r| xj        |z  c_        n`t          |          t          u r| xj        t          |          z  c_        n+| xj         t          |           |          j        z  c_        | S N)daysrN   r   r{   r   r(  r  s     r&   ry  zCmfDateTime.__iadd__  |    eY'' 	2JJ%JJJ%[[CJJ)////JJJJJ*$t**U++11JJr(   c                    t          |t                    r| xj        |z  c_        n`t          |          t          u r| xj        t          |          z  c_        n+| xj         t          |           |          j        z  c_        | S r  r
  r  s     r&   r|  zCmfDateTime.__isub__  r  r(   c                     t          |t                    r
| j        |z   S t          |          t          u r| j        t          |          z   S | j         t          |           |          j        z   S r  r
  r  s     r&   r8  zCmfDateTime.__add__  j    eY'' 	8:%%%[[C:	u 5 5 555:
T

5 1 1 777r(   c                     t          |t                    r
| j        |z
  S t          |          t          u r| j        t          |          z
  S | j         t          |           |          j        z
  S r  r
  r  s     r&   r;  zCmfDateTime.__sub__  r  r(   c                     t           j        r! t          |           |           | j        rdS t	                                          |          S r   r  r  s     r&   r  zCmfDateTime.__lt__  r  r(   c                     t           j        r! t          |           |           | j        rdS t	                                          |          S r   r   r  s     r&   r  zCmfDateTime.__le__  r  r(   c                     t           j        r! t          |           |           | j        rdS t	                                          |          S r   r#  r  s     r&   r  zCmfDateTime.__gt__  r  r(   c                     t           j        r! t          |           |           | j        rdS t	                                          |          S r   r&  r  s     r&   r  zCmfDateTime.__ge__  r  r(   ) r*   r+   r,   r    r   r6   r  r  r  rb   rL   staticmethodr  rO   r  r   r   r  r   r   r  r  r  ry  r|  r8  r;  r  r  r  r  r_   r`   s   @r&   r  r  |  s       GMHLF'*FFLEH E E E \E ( ( X(
 & & X&

 
 
   \&    2   / / [/         8 8 88 8 8% % % % %% % % % %% % % % %% % % % % % % % %r(   r  c                   "     e Zd ZdZ fdZ xZS )CmfCreateDateTime.c                     t                                          |          }t          j        t          j                  }||k    r|}|S r)   )r7   r   r   r  r   r  )r%   r{   r   r  r?   s       r&   r   zCmfCreateDateTime.cast"  s<    ggll5!!l8<((99C
r(   )r*   r+   r,   r    r   r_   r`   s   @r&   r  r    s=        G        r(   r  c                        e Zd ZdZdZdZej        dz   Zd Z fdZ	e
 fd            Ze
d             Zed	             Ze
d
             Ze
 fd            Ze
d             Zdd fd
Zd fd	Zd Z fdZddZd Zed             Z xZS )CmfRelationBase.rB   )r  r   r   rX   r   rx   ry   r   )setattr_fieldsc                     t           r)   r  r   s     r&   r   zCmfRelationBase.validate:      !!r(   c                    t                                                      }| j        r| j        j        j        pd |d<   | j        r| j        j        j        pd |d<   | j        r| j        j        j        pd |d<   | j        r| j        j        j        pd |d<   | j        r| j        j        j        pd |d<   | j        r| j        j        j        pd |d<   |S )Nfrom_value_nameto_value_namefrom_value_codeto_value_coderr   rs   )r7   r~   rx   r;   r{   ry   r|   rz   )r%   r   r?   s     r&   r~   zCmfRelationBase.history=  s    ggoo!%!Adhm.A!IT#x?DHM,?G4O!%!Adhm.A!IT#x?DHM,?G4O H:):BdL(8tx{'8@DJ
r(   c                 p    t                                                      |                                 gz   S r)   )r7   r   id_fieldnamer  s    r&   r   z#CmfRelationBase.get_required_fieldsG  s-    ww**,,0@0@0B0B/CCCr(   c                     | j         dz   S )Nrz  rE   r   s    r&   r#  zCmfRelationBase.id_fieldnameK  s    ~%%r(   c                 P    t          | j        |                                           S r)   )rM   rX   r#  r}   s    r&   rz   zCmfRelationBase.idO  s     t}d&7&7&9&9:::r(   c                 ,   t          |t                    r|j        }t          ||                                           }|j        du r0|j        |_        ddlm}  |j	        d| d| j
         d|            ||_        |j        |j        k    |_        dS )u}   
        Обновим служебное поле
        :param instance:
        :param new_id:
        :return:
        .r   r   u?   DEV: INFO: пессиместичный is_changed у поля r   r   N)rN   rb   r{   rM   r#  r   r   r   r   r   rE   r   )rQ   rX   new_idfk_fieldr   s        r&   
_update_fkzCmfRelationBase._update_fkS  s     fg&& 	"\F8S%5%5%7%788 =C$OHMAGzV^zzadaozzrxzz{{{ &o>r(   c                    t                                          ||           || j                 }|j        du rd S |j        rd }n|j        j        }|j        du rd S |                     ||           |                     |           d S r   )	r7   r]   r*   r   r   r{   rz   r*  _update_backref)rQ   rX   r{   inserted_valuer(  r?   s        r&   r]   zCmfRelationBase.seth  s    He$$$!#,/ C''F! 	FF#),F}##x(((H%%%%%r(   c                 8   t          | dd           r|| j                 }|j        s|| j                 }|j        du rd S |j        d |j        D             v rd S |j                            |           |j        dur|j        |j	        | j                 j        durht          |j	        | j                 j                  D ]E}|j        |j        k    r-|j	        | j                 j                            |            d S @d S d S d S d S |j        dur|j        ~|j	        | j                 j        durg|j	        | j                 }|j        du rd S t          |j                  D ]7}|j        |j        k    r|j                            |            d S 0d S d S d S d S d S )Nbackref.c                     g | ]	}|j         
S r.   rz   r  rv   s     r&   
<listcomp>z3CmfRelationBase._update_backref.<locals>.<listcomp>  s    "I"I"Ic36"I"I"Ir(   )rM   r*   r   r/  r   rz   r{   r  r   rx   r   r  )rQ   rX   r   backref_fieldrv   s        r&   r,  zCmfRelationBase._update_backrefw  s   3	4(( 	"S\*E= " %ck 2 '3..F;"I"I]5H"I"I"IIIF#**8444:S((UZ-C	RUR]H^HempHpHp#EIck$:$@AA " "6X[00!Ick28??DDD!EE 1 )(-C-CHpHp" "
 :S((UZ-C	RUR]H^HcknHnHn$)Ick$:M$+s22#M$788 " "6X[00)/66s;;;!EE 1+	" 	"  )(-C-CHnHn" "r(   r   depthc                v   ddl m}  t                      j        |i | | j        du rd S | j        rd }nU| j        j        s| j        j        }n<| j        j	        r| j        j        }n# | j        j        |d|dz   i| | j        j        }| j        rddl m
} | j        du r |d|             | j        dur1| j        *|j                            | | j        j        j                   | j        s!|j                            | | j                   t!          |                               | j        |           d S )	Nr   r   .r6  rm  r  z(DEV: FATAL Potential RelationCache leak target)r   r   r7   r   r   r   r{   r   rz   is_recursion_saver   r   r  remove_field_referencerx   add_field_referencer   r*  rX   )r%   r6  rR   r$   r   r(  r   r?   s          r&   r   zCmfRelationBase.save  sv   ))))))d%f%%%;#F< 	#FF& 	#Z]FFZ) 	#Z]FFDJOT==f===Z]F ? 	R******yC	KTKKLLLy##	(=$;;D$(+BSTTT< R$88dj8QQQ 	T

dmV44444r(   c                     |dk    rd S | j         dur%| j        s| j                            |dz              t	                                                       d S )Nrm  .r5  )r   r   r{   r   r7   )r%   r6  r?   s     r&   r   zCmfRelationBase.flush  sW    199F;c!!$,!J519---r(   c                 ,    t          | j        |          S r)   )rM   r{   )r%   r;   s     r&   __getattr__zCmfRelationBase.__getattr__  s    tz4(((r(   c                     || j         v s|t          |           v r$t                                          ||           d S t	          | j        ||           d S r)   )r  rK   r7   __setattr__r   r{   )r%   r;   r{   r?   s      r&   rB  zCmfRelationBase.__setattr__  s[    4&&&$#d))*;*;GGe,,,,,DJe,,,,,r(   NFc                 $    ddl m}  j        durI|sG j        r j        r9 j        j        s-|r) fd|D             } j                            |            S d|vrd|d<   d|vrd|d<    j                                                  }|j        du rI fd	|pg D                                               j        gz   } j                            |           n3t          t                     d
          rXt          | j                  } |j         j        fd|i| _         j        du s j        r j        j        r j         _        n j        r j                            d          d         }t          ||d          }|st!          d|            |j         j        fd|i| _         j        du s j        r j        j        r j         _        n/d _         j        du s j        r j        j        r j         _         S )u1   Ленивая загрузка Relation поляr   r  .c                 (    g | ]}j          d | S r   r%  r  
load_fieldr%   s     r&   r3  z(CmfRelationBase.load.<locals>.<listcomp>  s)    "^"^"^do#D#D
#D#D"^"^"^r(   r   r  Tr  c                 (    g | ]}j          d | S rE  r%  rF  s     r&   r3  z(CmfRelationBase.load.<locals>.<listcomp>  s)    \\\do<<
<<\\\r(   r  r   r  Nu$   Нет класса с именем )r   r   r   is_ellipsis_idobjrX   r   r#  rE   r{  r   rM   r  rV   rz   r   r  r  )	r%   r   r   r$   r   fields_listid_fieldr  cls_names	   `        r&   r   zCmfRelationBase.load  st   &&&&&&9C9  493N  B"^"^"^"^W]"^"^"^KM--[-AAA F**(,F$%&((&*F?#=!2!2!4!45=C\\\\v|Y[\\\!..00$/BCKM%%[%9999 T$ZZ)) 	(FDJ//E!	$'CC&CFCCDI{c!!dk!dk6S!"iW 	(w}}S))!,HFHd33E T !R!R!RSSS!	$'CC&CFCCDI{c!!dk!dk6S!"iDI{c!!dk!dk6S!"ir(   c                 J    |dur|rt          |d          r|j        j        S d S )N.r;   )r{  r;   r{   r   s     r&   r   z%CmfRelationBase._format_for_html_diff  s1    '%*@*@:##tr(   c                 ,    | j         rd S | j        j        S r)   )r   r{   r   r}   s    r&   r   zCmfRelationBase.json  s    < 	4zr(   r   r   )r*   r+   r,   r    rn   r  r  rL   r   r~   r  r   r#  rO   rz   r*  r]   r,  r   r   r@  rB  r   r   r   r_   r`   s   @r&   r  r  +  s       GI	N *-@@L" " "     D D D D [D & & [& ; ; X; ? ? [?( & & & & [& " " ["4 !" 5 5 5 5 5 5 5>     ) ) )- - - - -. . . .`  &   X    r(   r  c                   N    e Zd ZdZd ZdZdZej        dz   Zd Z	e
d             ZdS )CmfRelation.N)ri  c                     t          |          j        | j        k    r4t          d| j         dt          |          j         d| j                   d S )Nu   Тип u    не совпадает: z != )r   r*   r  r   rE   r   s     r&   r   zCmfRelation.validate  sx    ;;4:--$  &At  &A  &AZ^_dZeZeZn  &A  &Atxt~  &A  &A  B  B  B .-r(   c                 D    ddl m} t          |          | j                 gS rp  r   r   varsr  rQ   r   s     r&   r  zCmfRelation.related_models  s*    &&&&&&VSY'((r(   )r*   r+   r,   r    r  ri  r  r  rL   r   r  r  r.   r(   r&   rQ  rQ    sc        GFLE"/2CCLB B B ) ) [) ) )r(   rQ  c                   6    e Zd ZdZd ZdZd Zed             ZdS )CmfGenericRelation.Nc                     | j         rLt          |          j        | j         vr3t          dt          |          t          |          j        |          d S d S )NuJ   Тип не совпадает, неизвестное имя модели)r   r   r*   r   r   s     r&   r   zCmfGenericRelation.validate"  s    ; 	aE{{#4;66()uw{  }B  xC  xC  EI  JO  EP  EP  EY  [`  a  a  a	a 	a66r(   c                     ddl m} g }| j        sg S | j        D ];}|t          |          v r(|                    t          |          |                    <|S rp  )r   r   rU  r  )rQ   r   r   r  s       r&   r  z!CmfGenericRelation.related_models'  sm    &&&&&&z 	IZ 	0 	0EV$$

4<<.///
r(   )	r*   r+   r,   r    r  r   r   r  r  r.   r(   r&   rX  rX    sP        G!FFa a a
   [  r(   rX  c                   <    e Zd ZdZdZdgZg Zed             Zd Z	dS )CmfSubclassedGenericRelation.	CmfEntityc                     dd l }t          |j        | j                  }t	          |                                          S r  )
cmf.modelsrM   r   
base_modelr   iter_subclasses)rQ   cmfr`  s      r&   r  z+CmfSubclassedGenericRelation.related_models9  s;    SZ88
J..00111r(   c                     dd l }t          t          |          t          |j        | j                            s;t          d| j         d| j         d| dt          |           d| j         d          d S )Nr      Тип не совпадает r   = ( | r  )	r_  
issubclassr   rM   r   r`  r   rX   rE   )r%   r{   rb  s      r&   r   z%CmfSubclassedGenericRelation.validateA  s    $u++wsz4?'K'KLL 	K  J  J  JPTP_  J  Jbg  J  Jkopukvkv  J  J{  |G  J  J  J  K  K  K	K 	Kr(   N)
r*   r+   r,   r    r`  r   field_options_list_limitr  r  r   r.   r(   r&   r\  r\  3  sX        GJ]F!2 2 [2K K K K Kr(   r\  c                   B     e Zd ZdZdZdZd ZddZ fdZ fdZ	 xZ
S )	CmfBackrefBase.Nc                     t           r)   r  r}   s    r&   r~   zCmfBackrefBase.historyN  r  r(   Fc           	      2   | j         dur|s| S t                      | _         |                                 D ]?}| j                              |j        dd|i| j        dz   | j        j        i|           @| j        du rt          | j                   | _        | S )N.r   rz  r.   )	r   r   r  r  r/  rX   rz   r   r   )r%   r   r   r$   r  s        r&   r   zCmfBackrefBase.loadQ  s    9CKFF	((** 	a 	aEI
__&_T\E-A4=CS,T_X^__a a a a;#ty//DKr(   c                 `    t                      | _         t                      j        |i | d S r)   )r   rd   r7   r'   r  s      r&   r'   zCmfBackrefBase.__init__]  s0    vv$)&)))))r(   c                 :     t                      j        |i | d S r)   )r7   r   r  s      r&   r   zCmfBackrefBase.flusha  s&     	t&v&&&&&r(   r   )r*   r+   r,   r    r  r/  r~   r   r'   r   r_   r`   s   @r&   rk  rk  I  s        GEG" " "
 
 
 
* * * * *' ' ' ' ' ' ' ' 'r(   rk  c                   0    e Zd Zd ZdZdZed             ZdS )
CmfBackref.Nc                 V    ddl m} | j        rt          |          | j                 gng S rp  )r   r   r  rU  rV  s     r&   r  zCmfBackref.related_modelso  s6    &&&&&&,/I=VSY'((2=r(   )r*   r+   r,   r  r    r  r  r  r.   r(   r&   rq  rq  j  s<        FGE> > [> > >r(   rq  c                   0    e Zd Zd ZdZdZed             ZdS )CmfGenericBackref.Nc                 6    ddl m fd| j        D             S )Nr   r  c                 :    g | ]}t                    |         S r.   rU  r  r  r   s     r&   r3  z4CmfGenericBackref.related_models.<locals>.<listcomp>~  $    <<<VU#<<<r(   r   r   rV  s    @r&   r  z CmfGenericBackref.related_modelsz  1    &&&&&&<<<<<<<<r(   )r*   r+   r,   r  r    r   r  r  r.   r(   r&   rt  rt  u  s<         FGF= = [= = =r(   rt  c                       e Zd ZdZdZdZdZej        dz   Zd Z	d Z
d Zd Zed             Z fd	Zdd
Zed             Zed             ZddZddZddZ fdZed             Zd ZddZd dZd Zdddd fd
Zd! fd	Z xZS )"
CmfM2MBase.N)changes_appendedchanges_removedc                     t           r)   r  r   s     r&   r   zCmfM2MBase.validate  r  r(   c                     t           r)   r  r}   s    r&   r~   zCmfM2MBase.history  r  r(   c                    d}| j         s|S i }| j         D ]6}|d         }|d         }||vrg ||<   ||                             |           7d|v r-| dd                    d |d         D                        }|d= d|v r-| d	d                    d
 |d         D                        }|d= |r| d| }| j         d| S )Nrc   r   rm  r  u    добавлено: ,c                 ,    g | ]}t          |          S r.   r   r  cs     r&   r3  z)CmfM2MBase._html_diff.<locals>.<listcomp>  s    BeBeBea3q66BeBeBer(   r  u    удалено: c                 ,    g | ]}t          |          S r.   r   r  s     r&   r3  z)CmfM2MBase._html_diff.<locals>.<listcomp>  s    >a>a>a!s1vv>a>a>ar(   u    остальное: r  )_changesr  r   r    )r%   html_strchangeschangeactrv   s         r&   r   zCmfM2MBase._html_diff  s.   } 	Om 	% 	%F)C)C'!!!CL$$$$w"hhBeBeSZ[cSdBeBeBe9f9fhhH!w"ddSXX>a>awW_O`>a>a>a5b5bddH! 	C"BBBBH,,,(,,,r(   c                     | j         si S | j        si S i }| j        D ]@}|d         }|d         j        j        }||vrg ||<   ||                             |           A|S )r   r   rm  )r   r  rz   r{   r  )r%   r  r  r  obj_ids        r&   r   zCmfM2MBase.audit_diff  s      	I} 	Im 	( 	(F)CAY\'F'!!!CL''''r(   c                 \    ddl m} t          |          |                                          S rp  )r   r   rU  m2m_model_cls_namerV  s     r&   m2m_model_clszCmfM2MBase.m2m_model_cls  s1    &&&&&&F||C224455r(   c                 |     t                      j        |i | g | _        g | _        t	                      | _        d S r)   )r7   r'   r  _changes_bufferr   rd   r  s      r&   r'   zCmfM2MBase.__init__  s?    $)&)))
 !vvr(   c                 D    | j         D ]^}}}||k    r|r||k    r|c S dS )uU  
        Проверяем, есть ли объект (obj) в списки изменений поля.
        :param obj: объект который ищем в изменениях.
        :param action: append|remove|None
        :type action: str
        :return action изменения: append|remove
        :rtype str
        Nr  )r%   rv   actionchange_action
change_objrD   s         r&   
in_changeszCmfM2MBase.in_changes  sP     .2] 	) 	))M:j   )=!8!8((((	) 	)r(   c                 $    d | j         D             S )Nc                 $    g | ]^}}}|d k    |S )r  r.   r  r  r  rD   s       r&   r3  z/CmfM2MBase.changes_appended.<locals>.<listcomp>  +    kkk<}j1Q^bjQjQj
QjQjQjr(   r  r}   s    r&   r~  zCmfM2MBase.changes_appended  s     lkkkkkr(   c                 $    d | j         D             S )Nc                 $    g | ]^}}}|d k    |S )r  r.   r  s       r&   r3  z.CmfM2MBase.changes_removed.<locals>.<listcomp>  r  r(   r  r}   s    r&   r  zCmfM2MBase.changes_removed  s    kkkkkkr(   rm  c                     t          |t                    r|j        }t          |t                    rt                              |          }|                     |           d| _        d}t          | j	                  D ]N}|d         j
        |j
        k    r6|d         dk    rd}|d         dk    r| j	                            |            nOt          | j                  D ]N}|d         j
        |j
        k    r6|d         dk    rd}|d         dk    r| j                            |            nO|rdS | j	                            d||f           | j                            d||f           d| _        | j        rd| j        _        | j        r?| j        r8|dk    r2t#          || j                                      | j        |dz              | j        d	ur%|| j        vr| j                            |           dS dS dS )
t   Должен работать в т.ч. с незагруженными полями, для оптимизации.NFrm  r   r  Tr  r5  .)rN   rb   r{   r-   r  rv  r   r  r   r  rz   r  r  r  r   rX   r/  rM   r   )r%   rv   descriptionr6  rR   r$   already_appendedrows           r&   r  zCmfM2MBase.append  s(   c7## 	)Cc3 	5//44Cc!% && 	 	C1vyCF""q6X%%'+$q6X%%M((---E,-- 	 	C1vyCF""q6X%%'+$q6X%%(//444E 	Fh[9:::##XsK$@AAA= 	,'+DM$< 	LDM 	LeqjjC&&--dm57-KKK;c!!c&<&<Ks##### "!&<&<r(   c                 r    t          |          D ]&\  }}|                     ||r||         pd            'd S )N)r  )	enumerater  )r%   objsdescriptionsirv   s        r&   r  zCmfM2MBase.extend	  sP    oo 	S 	SFAsKK)I,q/)QTKRRRR	S 	Sr(   c                    d| _         t          |t                    rt                              |          }d}t          | j                  D ]N}|d         j        |j        k    r6|d         dk    r| j                            |            n|d         dk    rd}Ot          | j	                  D ]N}|d         j        |j        k    r6|d         dk    r| j	                            |            n|d         dk    rd}O|rdS | j        
                    d|f           | j	        
                    d|f           d| _        | j        r?| j        r8|dk    r2t          || j                                      | j        |dz              | j        rd| j        _        | j        d	ur%|| j        v r| j                            |           dS dS dS )
r  NFrm  r   r  r  Tr5  .)r  rN   r-   r  rv  r   r  rz   r  r  r  r   r/  rX   rM   r   )r%   rv   r6  rR   r$   already_removedr  s          r&   r  zCmfM2MBase.remove  s   !%c3 	5//44C&& 	+ 	+C1vyCF""q6X%%M((---Eq6X%%&*O,-- 	+ 	+C1vyCF""q6X%%(//444Eq6X%%&*O 	Fh_---##XsO444< 	LDM 	LeqjjC&&--dm57-KKK= 	,'+DM$;c!!cT[&8&8Ks##### "!&8&8r(   c                 F   g }|g }|D ]r}t          |t                    r|j        }t          |t          t          f          r!t                                          |          }|r|                    |           s| j        du r(| j	        j
        rg | _        n|                                  t          | j                  D ]*}|j        d |D             vr|                     |           +d | j        D             }|D ] }|j        |vr|                     |           !|S )N.c                     g | ]	}|j         
S r.   r1  r2  s     r&   r3  z#CmfM2MBase.cast.<locals>.<listcomp>H  s    777cf777r(   c                     h | ]	}|j         
S r.   r1  r2  s     r&   	<setcomp>z"CmfM2MBase.cast.<locals>.<setcomp>K  s    222SV222r(   )rN   rb   r{   r   r-   r7   r   r  r   rX   r   r   r   rz   r  )r%   r{   r  val	value_idsr?   s        r&   r   zCmfM2MBase.cast1  sC   =E 
	# 
	#C #w''  i#c{++ (ggll3'' #c""";#}#  		$$ 	! 	!Cv7777777C   22tz222	 	! 	!CvY&&C   r(   c                     t           r)   r  r   s    r&   r  zCmfM2MBase.m2m_model_cls_nameQ  r  r(   c                 j    |                                  D ]}|                    |          }|r|c S d S r)   )r  rV   )r%   rz   r  related_objs       r&   get_related_objzCmfM2MBase.get_related_objU  sJ    ((** 	# 	#E))B--K #""""#tr(   Fc                 ~      j         dur|s S  j         g}|r fd|D             }  j        j        |fd|i|  S )N.c                 (    g | ]}j          d | S rE  r%  )r  fr%   s     r&   r3  z#CmfM2MBase.load.<locals>.<listcomp>c  s)    ???1..1..???r(   r   )r   rE   rX   r   r   r  r/  r  r  r   rz   r  select_relatedleftapply_changesr   )r%   r   r   r$   paramsr  s   `     r&   r   zCmfM2MBase.load]  sp    9CK_&' 	@???????F!!&@@@@@@r(   c                    	
 ddl m} ddlm	 | j        p| j        g}dd| j        j        gdd| j        gdd|gg}|j        	                    |d	g
          }d |D             }|r|S 	
fd|D             }|S )u   
        Запрос all_nested наоборот. Не вложенные сущности, а все родительские
        r   r  r  child_idre  child_fieldparent_modelr  	parent_id)r  r   c                 *    h | ]}|j         	|j         S r.   )r  )r  relations     r&   r  z)CmfM2MBase.all_parents.<locals>.<setcomp>  s#    YYYhFXY($YYYr(   c                 F    h | ]}                     |           xS )r   )get_obj_by_id)r  group_idr  r   rv   s     r&   r  z)CmfM2MBase.all_parents.<locals>.<setcomp>  s7    hhh(8M8Mh_e8M8f8f1fh#hhhr(   )
r   r   r  r  r  rX   rz   rE   r  slist)r%   id_onlyr   r   r   group_model_namesrelation_filterrelation_listr  r  rv   s     `      @@r&   all_parentszCmfM2MBase.all_parents{  s     	'&&&&&$$$$$$ K7DJ<dm./C1T#45

 ,22/S^R_2``YY]YYY 	Mhhhhhhfhhhr(   c                 
   | j         D ]z^}}}|dk    r,	 | j                            |           '# t          $ r Y 3w xY w|dk    r,	 | j                            |           Y# t          $ r Y ew xY wt          d|           d S )Nr  r  u*   Неизвестное изменение )r  r   r  r  r  )r%   change_typerX   rR   s       r&   r  zCmfM2MBase.apply_changes  s    ,0,@ 	] 	](KDh&&K&&x0000!    D	
 ((K&&x0000!    D	 !![k![![\\\%	] 	]s   /
<<A!!
A.-A.r   )r6  	only_datainvalidate_donec          	          t                      j        |||d| ddlm} ddlm} ddlm} ddlm}	 |sWt          j
        d           | j        j        r|                    | j        d           n|                    | j        d	           | j        D ]6^}
}}d }| j        r|}| j        }| }nE| j        r&|}| j        }| j        rt%          || j                  }nt'          d
| j         d          |                    |j        g           |	j        rd}|                                  d|j         d|j         }t          j
        d| d           |j        j        j                                                            |d|i          }t=          |          }t          j
        d| d           |                                                      |j        |j        d d          }|
dk    r|r(ddlm!}  |d| j         d| j         d| d            |                                 ||          }|r|d         |_"        |#                                5   |j        |d|dz   i| |j$        %                    | |           d d d            n# 1 swxY w Y   n|
d k    r|s(ddlm!}  |d!| j         d| j         d| d           A|#                                5  |&                                 |j$        '                    | |j        j(                   d d d            n# 1 swxY w Y   |                    | j        |
|| j        "           t%          |d#d           s\|
d k    rDtS          |d$          r4|j*        +                                 |j*        s |j        |d|dz   i| $ |j        |d|dz   i| 8g | _        d | _,        d S )%N)r6  r  r   )	CMF_CACHEr  r  r   u`   WARNING CmfM2MBase.save имеем прямой save делаем доп.инвалидацию!creater  u   У поля u-    не указано right оно или left)force_check_fieldszJSELECT pg_advisory_xact_lock(('x' || md5(:lock_tuuids))::bit(64)::bigint);-zRun pg_advisory_xact_lock(r  lock_tuuidszDone pg_advisory_xact_lock(T)left_idright_idroot_idTECHCOM_nocacher  r8  u]   DEV: попытка добавления уже существующей м2м связи у r   r  Fabort)r  rightr6  rm  r9  r  uV   DEV: попытка удаления несуществующей м2м связи у )m2m_field_namer;  cmf_deleted)-r7   r   cmf.appr  r   r   r  r  r   r   r   rX   r   
invalidater  r  r  r/  rM   r#   rE   _acl_check_writeM2M_DUB_PROTECT_LOCKr  rz   
CmfProjectdpdata_driverSessionexecuter   r  rV   r   r  disable_aclr  r=  deleter<  r{   r{  r  r   r  )r%   r6  r  r  rR   r$   r  r   r  r   r  rv   cargs
left_fieldr  r  lock_sqlr  lock_resr  r   r?   s                        r&   r   zCmfM2MBase.save  s   d%9GGGGG%%%%%%&&&&&&$$$$$$&&&&&&  	>Gwxxx}# >$$T]H====$$T]H===#'#7 I	? I	?FC%Jy 
o}!

 o< =!(t|!<!<J mt m m mnnn !!j6K5L!MMM* F h!%!8!8!:!:QQTWQQuxQQC[CCCDDD!,/;CCEEMMh);Y    >>DkDDDEEE ))++//%(\`rv/wwH!! 555555I  g  C  L  g  g  OS  O^  g  g  be  g  g  ot  u  u  u  u/4--//TGGG 4+08H(((** O O!HM4CuqyCFCCC(<<T#<NNNO O O O O O O O O O O O O O O 8## 555555I  `w{  xE  `  `  HL  HW  `  `  [^  `  `  hm  n  n  n  n((** T TOO%%%(??cflSSST T T T T T T T T T T T T T T
   DO \\\ 3 3T:: ?X%%'#}*E*E% O((***? C $BeaiB6BBBCHd>%!)>v>>>!!%s$    /JJ	"J	+:L11L5	8L5	c                     |dk    rd S | j         dur7| j        s0| j        D ](}t          |dd           r|                                 )g | _        t                                                       d S )Nrm  .r;  )r   r   r{   rM   r   r  r7   )r%   r6  rT   r?   s      r&   r   zCmfM2MBase.flush	  s{    199F;c!!$,!Z  11488 				 	r(   r)   )Nrm  )rm  r   )FNrO  ) r*   r+   r,   r    r  r  r/  r  rL   r   r~   r   r   r  r  r'   r  rO   r~  r  r  r  r  r   r  r  r   r  r  r   r   r_   r`   s   @r&   r}  r}    s       GDEG*-TTL" " "" " "- - -.  & 6 6 [6    ) ) ) ) l l Xl l l Xl%$ %$ %$ %$NS S S S"$ "$ "$ "$H    @ " " ["     <   ,] ] ], !"UE _& _& _& _& _& _& _&B         r(   r}  c                   f    e Zd Zd ZdZdZdZed             Ze	d             Z
e	d             Zd ZdS )CmfM2M.Nc                 0    d                     | |g          S r   )r   )	left_name
right_names     r&   _m2m_model_cls_namezCmfM2M._m2m_model_cls_name	  s    ww	:.///r(   c                     | j         r%|                     | j        j        | j                  S | j        r%|                     | j        | j        j                  S t          d          )Nu2   Не определено left это или right)r  r  ro   rE   r  r  r#   r   s    r&   r  zCmfM2M.m2m_model_cls_name#	  sc    8 	R**3+=+H#)TTTY 	R**39c6H6STTTPQQQr(   c                 D    ddl m} t          |          | j                 gS rp  rT  rV  s     r&   r  zCmfM2M.related_models,	  s*    &&&&&&VSY'((r(   c                     t          |          t          urXt          |          j        | j        k    r=t	          d| j         d| j         d| dt          |           d| j         d          d S d S Nrd  r   re  rf  rg  r  )r   r   r*   r  r   rX   rE   r   s     r&   r   zCmfM2M.validate2	  s    ;;d""tE{{';tz'I'I  I  I  IPTP_  I  Ibg  I  Ikopukvkv  I  I{  |F  I  I  I  J  J  J #"'I'Ir(   )r*   r+   r,   r  r    r  r/  r  r  r  r  r  r   r.   r(   r&   r  r  	  s        FGEG0 0 \0 R R [R ) ) [)
J J J J Jr(   r  c                   T    e Zd Zd ZdZdZdZdZed             Z	ed             Z
d ZdS )CmfGenericM2M.Nc                     | j         r"| j         | j                                         S | j        j         | j                                         S r)   )r  r  r/  
capitalizero   rE   r   s    r&   r  z CmfGenericM2M.m2m_model_cls_name?	  sR    9 	<i;!7!7!9!9;;;$/N1J1J1L1LNNNr(   c                     ddl m | j        rfd| j        D             S | j        rfd| j        D             S t                    | j                 gS )Nr   r  c                 :    g | ]}t                    |         S r.   rw  r  r;   r   s     r&   r3  z0CmfGenericM2M.related_models.<locals>.<listcomp>J	  s$    >>>4DLL&>>>r(   c                 :    g | ]}t                    |         S r.   rw  r   s     r&   r3  z0CmfGenericM2M.related_models.<locals>.<listcomp>M	  s$    BBBtVT*BBBr(   )r   r   r  rU  r  rV  s    @r&   r  zCmfGenericM2M.related_modelsE	  sx    &&&&&&8 	->>>>3:>>>>z CBBBBszBBBBLL+,,r(   c                     | j         rlt          |          t          urXt          |          j        | j         vr?t	          d| j         d| j         d| dt          |           d| j          d          d S d S d S r  )r   r   r   r*   r   rX   rE   r   s     r&   r   zCmfGenericM2M.validateP	  s    ; 	OE{{$&&4;;+?t{+R+R!  #NDM  #N  #NTXTc  #N  #Nfk  #N  #Nostyozoz  #N  #N  @D  @K  #N  #N  #N  O  O  O	O 	O&&+R+Rr(   )r*   r+   r,   r  r    r   r  r/  r  r  r  r   r.   r(   r&   r  r  8	  sx        FGFEGO O [O
 - - [-O O O O Or(   r  c                       e Zd ZdZd ZdS )	CmfStatus.N)r*   r+   r,   r    r  r.   r(   r&   r  r  V	  s        GEEEr(   r  c                   0     e Zd ZdZdZd Zd Z fdZ xZS )	CmfChoice.Nc                 B    |                      | j        | j                  S r)   r   r}   s    r&   r   zCmfChoice._html_diff`	  r   r(   c                    ddl m} d }| j        r4t          | j        |          r| j                            | j                  }| j        pi }|rG|d                             | j                  r'|d         | j                                     d|          }|r0||                    ||          }||                    ||          }t                      
                    ||          S Nr   )r]  	ui_fieldschoices)r_  r]  rX   rh  ro   _build_ui_formr  rV   rE   r7   r   r%   r   r   r]  ui_form_customr  r?   s         r&   r   zCmfChoice._simple_html_diffc	  s    ((((((= 	OZ(;YGG 	O!0??NNN,$" 	[n[9==doNN 	[$[1$/BFFyRYZZG 	>$#KK	9==	$#KK	9==	ww((I>>>r(   )	r*   r+   r,   r    r  r  r   r   r_   r`   s   @r&   r  r  [	  sV        GGF: : :? ? ? ? ? ? ? ? ?r(   r  c                   *     e Zd ZdZdZd Z fdZ xZS )CmfChoiceInt.Nc                 
   ddl m} d }| j        r4t          | j        |          r| j                            | j                  }| j        pi }|rG|d                             | j                  r'|d         | j                                     d|          }|rJ|#|                    t          |          |          }|#|                    t          |          |          }t                                          ||          S r	  )r_  r]  rX   rh  ro   r  r  rV   rE   r(  r7   r   r  s         r&   r   zCmfChoiceInt._simple_html_diff	  s   ((((((= 	OZ(;YGG 	O!0??NNN,$" 	[n[9==doNN 	[$[1$/BFFyRYZZG 	C$#KKI	BB	$#KKI	BB	ww((I>>>r(   )r*   r+   r,   r    r  r  r   r_   r`   s   @r&   r  r  {	  sG        GGF? ? ? ? ? ? ? ? ?r(   r  c                   "     e Zd Z fdZdZ xZS )CmfEmailc                     |r't          j        d|          st          d|           t                                          |          S )Nz[^@]+@[^@]+\.[^@]+u8   Неправильный формат ввода email: )rQ  matchr   r7   r   r;  s     r&   r   zCmfEmail.validate	  sQ     	i"7?? 	i$%g`e%g%ghhhww&&&r(   .r*   r+   r,   r   r    r_   r`   s   @r&   r  r  	  s3        ' ' ' ' '
 GGGGGr(   r  c                   "     e Zd Z fdZdZ xZS )
CmfOrgNamec                     t          j        d          }|                    |          st          d          t	                                          |          S )Nz^([a-z0-9-]+)+$u=   Неправильный формат имени домена)rQ  compiler  r   r7   r   )r%   r{   patternr?   s      r&   r   zCmfOrgName.validate	  sO    *.//}}U## 	f$%deeeww&&&r(   .r  r`   s   @r&   r  r  	  s3        ' ' ' ' ' GGGGGr(   r  c                       e Zd ZdZdS )CmfLogin.Nr-  r.   r(   r&   r  r  	  r.  r(   r  c                       e Zd ZdZdZd ZdZ ej        d          Z	e
j        dz   Zd Z fdZd Zed	             Zej        d
             Zed             Zed             Zed             Zed             Zej        d             Z xZS )CmfPhoneu  
    Храним в одном поле номер и коментарий:
    Через обязательный разделитель ";":
        person.phone.value == '79998005008;доб 123'
        person.phone2.value == '79998005008;'
        person.phone3.value == ';потерялся'

        person.phone4.value == '79998005008;номер жены'
        person.phone4.number == '79998005008'
        person.phone4.info == 'номер жены'
    .u+   Формат: +7 999 999-99-99, доб. 210z^\d*;.*$)VALUE_REc                     ddl m} d g|j        pg D ]A}t          j        ||          }|                                r|                                c S Bt          d||j                  )Nr   r   ?   Введите корректный номер телефона)r   r   PHONE_REGIONSphonenumbersPhoneNumberMatcherhas_nextnextr   )r%   r{   r   regionmatchers        r&   _matchzCmfPhone._match	  s    &&&&&&;v39r; 	& 	&F"5eVDDG!! &||~~%%%& !bdikqk  A  A  	Ar(   c                 r   |sdS | j                             |          r#t                                          |           dS |                     |          }|j        }t          j        |          rt          j        |          st          d          t                                          |           dS )zV
        Valid values: [0-9]*;.*
        Castable: Any text with valid number
        Nr"  )
r   r  r7   r   r*  numberr$  is_valid_numberis_possible_numberr   )r%   r{   r  phoner?   s       r&   r   zCmfPhone.validate	  s    
  	F=u%% 	GGU###FE"",U33 	h8WX]8^8^ 	h$%fgggr(   c                    |s|S |dk    rdS |                      |          }|j        }t          j        |          rt          j        |          st          d          |d |j                 ||j        d          z                                   }|                                                    d          }t          j	        |t          j
        j                  dd          }|dz  }|j        r|d|j         z  }|r|dz  }||z  }|S )N;rc   r"  z ,;rm  u   доб. z, )r*  r,  r$  r-  r.  r   startendstripformat_numberPhoneNumberFormatE164	extension)r%   r{   r  r/  infos        r&   r   zCmfPhone.cast	  s     	LC<<2 E"",U33 	h8WX]8^8^ 	h$%fggglu{l#eEIJJ&77>>@@zz||!!%((*5,2P2UVVWXWYWYZ? 	1111E r(   c                     | j         r6| j                             d          d         }|                                r|S d S )Nr1  r   )r{   	partitionr  )r%   r  s     r&   r,  zCmfPhone.number	  s@    : 	*&&s++A.C{{}} 
r(   c                 H   |r|                      |          }|j        }t          j        |          rt          j        |          st          d          t          j        |t          j        j                  dd          }| d}nd}| j	        r
|| j	        z  }|| _
        d S )Nr"  rm  r1  )r*  r,  r$  r-  r.  r   r5  r6  r7  r9  r{   )r%   r{   r  r/  r   s        r&   r,  zCmfPhone.number	  s     		KK&&ELE 077 lL<[\a<b<b l()jkkk .ul6T6YZZ[\[][]^E III9 	#"I


r(   c                     | j         rZt          j        d| j                             d          d          d           }t          j        |t          j        j                  S d S N+r1  r   )r{   r$  r:  r;  r5  r6  r7  r%   r/  s     r&   number_e164zCmfPhone.number_e164
  sb    : 	Z &'I4:+?+?+D+DQ+G'I'I4PPE-e\5S5XYYY	Z 	Zr(   c                     | j         rZt          j        d| j                             d          d          d           }t          j        |t          j        j                  S d S r>  )r{   r$  r:  r;  r5  r6  NATIONALr@  s     r&   number_nationalzCmfPhone.number_national
  sb    : 	^ &'I4:+?+?+D+DQ+G'I'I4PPE-e\5S5\]]]	^ 	^r(   c                     | j         rZt          j        d| j                             d          d          d           }t          j        |t          j        j                  S d S r>  )r{   r$  r:  r;  r5  r6  INTERNATIONALr@  s     r&   number_internationalzCmfPhone.number_international
  sb    : 	c &'I4:+?+?+D+DQ+G'I'I4PPE-e\5S5abbb	c 	cr(   c                 ^    | j         s| j         S | j                             d          d         S )Nr1  r   )r{   r;  r}   s    r&   r9  zCmfPhone.info
  s/    z 	:z##C((++r(   c                 J    | j         r| j          d}nd}|r||z  }|| _        d S )Nr1  )r,  r{   )r%   r{   r   s      r&   r9  zCmfPhone.info#
  s@    ; 	;)))III 	I


r(   )r*   r+   r,   r  r    r  r  rQ  r  r   r\  rL   r*  r   r   rO   r,  r  rA  rD  rG  r9  r_   r`   s   @r&   r  r  	  s\       
 
 GF?Krz+&&H(=8LA A A         "  >   X ]  ] Z Z XZ
 ^ ^ X^
 c c Xc
 , , X,
 
[  [    r(   r  c                       e Zd ZdZd ZdS )CmfMarkdown.NrU  r.   r(   r&   rK  rK  5
  s        GFFFr(   rK  c                       e Zd ZdZd ZdS )	CmfMarkup.NrU  r.   r(   r&   rM  rM  :
  s        GFFFr(   rM  c                       e Zd Zd ZdZd ZdS )CmfUrl.c                      ||S d|vrd|z   S |S )Nz://zhttp://r.   r   s     r&   r   zCmfUrl.castC
  s'    =Lu$$Lr(   N)r*   r+   r,   r  r    r   r.   r(   r&   rO  rO  ?
  s-        FG    r(   rO  c                       e Zd ZdZdZdS )CmfUrlShort.rd  NrY  r.   r(   r&   rR  rR  L
  ra  r(   rR  c                   2    e Zd ZdZdZdZd Zd Zd Zd Z	dS )CmfJson.NCmfJSONc                 J    | j         | j         S t          | j         d          S NF)ensure_ascii)r{   r   r}   s    r&   r   zCmfJson.db_formatV
  s'    ::TZe4444r(   c                      t          |t                    r  fd|                                D             S t          |t                    r fd|D             S t          |t                    r|j        S |S )Nc                 B    i | ]\  }}|                     |          S r.   r   r  s      r&   r  z CmfJson.cast.<locals>.<dictcomp>]
  s)    >>>1Atyy||>>>r(   c                 :    g | ]}                     |          S r.   r[  )r  rT   r%   s     r&   r3  z CmfJson.cast.<locals>.<listcomp>_
  s#    000QDIIaLL000r(   )rN   r   r  r   rb   r   r   s   ` r&   r   zCmfJson.cast[
  s    eT"" 	>>>>>>>>t$$ 	0000%0000w'' 	:Lr(   c                 P   ddl m} | j        s|                                  | j        g | _        t          | j        t                    s |d| d|  d| j         d           || j        vr6| j                            |           d| _        | j	        rd| j	        _        d S d S d S )Nr   r8  u,   Не возможно сделать append #   , т.к. значение поля     не список: Tr  )
r   r   r   r   r{   rN   r   r  r   rX   r%   r{   rR   r$   r   s        r&   r  zCmfJson.appendf
  s   )))))) 	IIKKK:DJ$*d++ 	]I Pu  P  Pim  P  P  DH  DN  P  P  X\] ] ] ] 
""Je$$$"DO} 0+/(((	 #"0 0r(   c                 F   ddl m} | j        s|                                  | j        d S t          | j        t                    s |d| d|  d| j         d           || j        v r6| j                            |           d| _        | j	        rd| j	        _        d S d S d S )Nr   r8  u,   Не возможно сделать remove r^  r_  Tr  )
r   r   r   r   r{   rN   r   r  r   rX   r`  s        r&   r  zCmfJson.removew
  s   )))))) 	IIKKK:F$*d++ 	]I Pu  P  Pim  P  P  DH  DN  P  P  X\] ] ] ] DJJe$$$"DO} 0+/(((	 0 0r(   )
r*   r+   r,   r    r6   r  r   r   r  r  r.   r(   r&   rT  rT  Q
  s_        GMF5 5 5
  0 0 0"0 0 0 0 0r(   rT  c                        e Zd ZdZdZdZdZdZdZdZ	dZ
dZed	             Zd
 Zd Zd Z fdZ fdZ fdZ fdZ xZS )
CmfNumeric.N	CmfNumber   r   r   rm  z0.00c                     t                      5 }t          |_        t          t	          || j                            cd d d            S # 1 swxY w Y   d S )N)r  )r   r   roundingr-   roundscale)rQ   r{   ctxs      r&   _as_strzCmfNumeric._as_str
  s    ^^ 	8s(CLuUCI66677	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8s   /AAAc                     | j         si S | j        d n|                     | j                  | j        d n|                     | j                  dS r  )r   rx   rk  ry   r}   s    r&   r   zCmfNumeric.audit_diff
  sX     	I8+44dh1G1G8+44dh1G1G
 
 	
r(   c                 4    |dS |                      |          S )Nr   )rk  r   s     r&   r   z CmfNumeric._format_for_html_diff
  s    =((||E"""r(   c                 >    |	| j         sdS |s|S t          |          S r  )r   r   r   s     r&   r   zCmfNumeric.cast
  s+    ==1 	"L5>>!r(   c                     t           j        r) t          |           |          }| j        r
|dk    rdS dS t	                                          |          S r  r  r  s      r&   r  zCmfNumeric.__lt__
  r  r(   c                     t           j        r) t          |           |          }| j        r
|dk    rdS dS t	                                          |          S r  r   r  s      r&   r  zCmfNumeric.__le__
  r!  r(   c                     t           j        r) t          |           |          }| j        r
|dk     rdS dS t	                                          |          S r  r#  r  s      r&   r  zCmfNumeric.__gt__
  r$  r(   c                     t           j        r) t          |           |          }| j        r
|dk    rdS dS t	                                          |          S r  r&  r  s      r&   r  zCmfNumeric.__ge__
  r'  r(   )r*   r+   r,   r    r6   r  	precisionri  r)  r*  stepr  r  rk  r   r   r   r  r  r  r  r_   r`   s   @r&   rc  rc  
  s        GMFIE
C
CDK8 8 [8

 
 
# # #
" " "% % % % %% % % % %% % % % %% % % % % % % % %r(   rc  c                   H    e Zd ZdZeZd ZdZ e            Ze	d             Z
dS )CmfObjectList.Nc                 6    ddl m fd| j        D             S )Nr   r  c                 :    g | ]}t                    |         S r.   rw  rx  s     r&   r3  z0CmfObjectList.related_models.<locals>.<listcomp>
  ry  r(   rz  rV  s    @r&   r  zCmfObjectList.related_models
  r{  r(   )r*   r+   r,   r    r   r6   r  r   rd   r  r  r.   r(   r&   rv  rv  
  sL        GMFFdffG= = [= = =r(   rv  c                   8    e Zd ZdZdZd ZdZdZed             Z	dS )	CmfObject.Nc                 6    ddl m fd| j        D             S )Nr   r  c                 :    g | ]}t                    |         S r.   rw  rx  s     r&   r3  z,CmfObject.related_models.<locals>.<listcomp>
  ry  r(   rz  rV  s    @r&   r  zCmfObject.related_models
  r{  r(   )
r*   r+   r,   r    r6   r  r   rd   r  r  r.   r(   r&   rz  rz  
  sF        GMFFG= = [= = =r(   rz  c                       e Zd ZdZdS )CmfLikes.Nr-  r.   r(   r&   r~  r~  
  r.  r(   r~  c                       e Zd ZdZdS )CmfViews.Nr-  r.   r(   r&   r  r  
  r.  r(   r  c                       e Zd ZdZdS )CmfTags.Nr-  r.   r(   r&   r  r  
  r.  r(   r  c                       e Zd ZdZdZd ZdS )CmfObjectJsonu@   Сохраняем и отдаём объект в виде JSON.Nr1  r.   r(   r&   r  r    s        JJGFFFr(   r  c                   d     e Zd ZdZdZ fdZd Zed             Zd Z	e
d             Zd Z xZS )	CmfIPv4NetworkList.CmfJSONArrayc                 ~    |!t                                          |          S t                              |          S r)   )r7   r   r  db_castr;  s     r&   r   zCmfIPv4NetworkList.cast
  s2    =77<<&&&!))%000r(   c                     d S r)   r.   r   s     r&   r   zCmfIPv4NetworkList.validate  r   r(   c                 6    | j         rd S d | j        D             S )Nc                 ,    g | ]}t          |          S r.   r   r  rT   s     r&   r3  z+CmfIPv4NetworkList.json.<locals>.<listcomp>  s    +++1A+++r(   )r   r{   r}   s    r&   r   zCmfIPv4NetworkList.json  s'    < 	4++
++++r(   c                 J    | j         | j         S t          | j        d          S rW  )r{   r   r   r}   s    r&   r   zCmfIPv4NetworkList.db_format  s'    ::TYU3333r(   c                 j    ||S t          |t                    rt          |          }d |D             S )u9   убрать после рефакторинга
        Nc                 6    g | ]}t          j        |          S r.   )r  r  r  s     r&   r3  z.CmfIPv4NetworkList.db_cast.<locals>.<listcomp>&  s#    888Q	%a((888r(   )rN   r-   r   )rQ   r{   s     r&   r  zCmfIPv4NetworkList.db_cast  s?     =LeS!! 	!%LLE88%8888r(   c                 Z    | j         si S d | j        D             d | j        D             dS )Nc                 ,    g | ]}t          |          S r.   r   r  s     r&   r3  z1CmfIPv4NetworkList.audit_diff.<locals>.<listcomp>,      ---qCFF---r(   c                 ,    g | ]}t          |          S r.   r   r  s     r&   r3  z1CmfIPv4NetworkList.audit_diff.<locals>.<listcomp>-  r  r(   r   r   r}   s    r&   r   zCmfIPv4NetworkList.audit_diff(  sF     	I--DH-----DH---
 
 	
r(   )r*   r+   r,   r    r  r   r   rO   r   r   r  r  r   r_   r`   s   @r&   r  r    s        GF1 1 1 1 1   , , X,
4 4 4
 9 9 [9
 
 
 
 
 
 
r(   r  c                   B     e Zd ZdZdZddgZdZdZdZdZ	dZ
 fdZ xZS )	CmfCodeu   КодTrd   gin_trgmu3   Код в реальном мире из жизниr)   r   c                    ddl m} |s|S |                                }| j        dk    rCt	          |          | j        k    r+|d | j        dz
            d|                    |d           }t                                          |          S )Nr   )cmf_hashlibr     r     )	r  r  r4  truncater   rC  short_str_encr7   r   )r%   r{   r  r?   s      r&   r   zCmfCode.cast9  s    (((((( 	L=F""s5zzDO'C'C1do112ZZ[5N5NuVW5X5XZZEww||E"""r(   )r*   r+   r,   r    rm   r  rl   r/   r  r  r   r   r_   r`   s   @r&   r  r  /  se        G
Ej)KFHAGHI# # # # # # # # #r(   r  c                   "    e Zd ZdZdZdZddgZdS )CmfNameu   Имя объектаu   object.name - статичное поле для представления в ui, аналог repr, генерируем методом если не заданоTrd   r  N)r*   r+   r,   r    r  rm   r  r.   r(   r&   r  r  B  s*        #G_G
Ej)KKKr(   r  __main__ababza:bzb:ar   )jr  rQ  r   r   r   r   r   r   typingr	   r
   r   rn  r   r   decimalr   r   r   dateutil.parserr8  r$  ujsonr   r   cmf.base_errorr   r   r   r   r  r   r   r   r   r   r-   r  r2   r   r4   rb   r  r  r  r,  r0  r3  r@  rA  rT  rW  r\  r_  rc  rf  r  r~  r  r  r  r  r  r  r  r  r  r  r  rQ  rX  r\  rk  rq  rt  r}  r  r  r  r  r  r  r  r  r  rK  rM  rO  rR  rT  rc  rv  rz  r~  r  r  r  r  r  r  r*   likestestr{   r  r   r.   r(   r&   <module>r     s       				       > > > > > > > > > > > > > > ' ' ' ' ' ' ' ' ' '         8 8 8 8 8 8 8 8 8 8                 ` ` ` ` ` ` ` ` ` ` ` `             GCz"""	 	 	 	 	 	 	 	A AQ A AD ATRSW A A A A*( *( *( *( *($ *( *( *(be
$ e
$ e
$ e
$ e
$ e
$ e
$ e
$ e
$Pu
 u
 u
 u
 u
 u
 u
 u
nJ J J J Jg J J J$>% >% >% >% >%W >% >% >%D           &   
 
 
 
 
g 
 
 
6    w   .4 .4 .4 .4 .4W .4 .4 .4b    f   
    v   
    v   
       
       
       
-R -R -R -R -Rx -R -R -Rb    '       (   
    g       X   D    X   .       ' ' ' ' '* ' ' 'B]% ]% ]% ]% ]%g ]% ]% ]%B/
 /
 /
 /
 /
7 /
 /
 /
b_% _% _% _% _%' _% _% _%F	 	 	 	 	 	 	 	^ ^ ^ ^ ^j ^ ^ ^B) ) ) ) )/ ) ) )"       ,K K K K K#5 K K K,' ' ' ' 'Z ' ' 'B> > > > > > > >	= 	= 	= 	= 	= 	= 	= 	=U U U U U U U UpJ J J J JZ J J J>O O O O OJ O O O<       
? ? ? ? ? ? ? ?@? ? ? ? ?6 ? ? ?*    y              x   B B B B Bx B B BX    '   
       

 
 
 
 
Z 
 
 
    &   
50 50 50 50 50g 50 50 50pM% M% M% M% M% M% M% M%b= = = = =G = = == = = = = = = =    w       w       g       G   
'
 '
 '
 '
 '
 '
 '
 '
P# # # # #h # # #&* * * * *i * * * z66#;;$$$$$3$$$$$66#;;,,,,,6#;;6#;;$$$$6#;;#6#;;&&++%%%%&&++6#;;#6#;;&&++%%%%&&++6#;;6#;;$$$$6#;;#6#;;&&++%%%%&&++6#;;#6#;;&&++%%%%&&++HJJEHUOOX&D8E??HHUOO4EK;88E??HHUOO<<<<<;5%.((((??D49M L r(   