
    *`mh~                       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!  G d d          Z" e
dd          Z#dde	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'          Z. G d& d'e'          Z/ G d( d)e/          Z0 G d* d+e/          Z1 G d, d-e/          Z2 G d. d/e/          Z3 G d0 d1e/          Z4 G d2 d3e/          Z5 G d4 d5e2          Z6 G d6 d7e'          Z7 G d8 d9e6          Z8 G d: d;e'          Z9 G d< d=e1          Z: G d> d?e2          Z; G d@ dAe2          Z< G dB dCe5          Z= G dD dEe'          Z> G dF dGe'          Z? G dH dIe'          Z@ G dJ dKe@          ZA G dL dMe(          ZB G dN dOeB          ZC G dP dQeB          ZD G dR dSeD          ZE G dT dUe(          ZF G dV dWeF          ZG G dX dYeF          ZH G dZ d[e(          ZI G d\ d]eI          ZJ G d^ d_eI          ZK G d` daeC          ZL G db dce1          ZM G dd dee*          ZN G df dge4          ZO G dh die2          ZP G dj dkeO          ZQ G dl dme2          ZR G dn doe0          ZS G dp dqe0          ZT G dr dse5          ZU G dt dueU          ZV G dv dwe'          ZW G dx dye'          ZX G dz d{e'          ZY G d| d}e'          ZZ G d~ deW          Z[ G d deW          Z\ G d deW          Z] G d deW          Z^ G d deW          Z_e`dk    r0d e/d          dz   k    sJ dd e/d          z   k    sJ d e/d           e/d          z   k    sJ  e/d          dk     sJ  e/d           e/d          k     sJ d e/d          k     sJ  e/d          dk    sJ  e/d           e/d          k    sJ d e/d          k    sJ  e/d          dk    sJ  e/d           e/d          k    sJ d e/d          k    sJ  e/d          dk    sJ  e/d           e/d          k    sJ d e/d          k    sJ  e/d          dk    sJ  e/d           e/d          k    sJ d e/d          k    sJ  e/d          dk    sJ  e/d           e/d          k    sJ d e/d          k    sJ  e[            Za e6d          e6gZb e6d           e6d          gea_c        eajc         e6d           e6d          gk    sJ eajc        ddgk    sJ e@d                                Zeeje        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gc                       e Zd Zd ZdS )	FieldDatac                 0    || _         || _        || _        d S N)basecaptionkwargs)selfr   r   r    s       ./cmf/fields/base_fields.py__init__zFieldData.__init__   s    	    N)__name__
__module____qualname__r#    r$   r"   r   r      s#            r$   r   TCmfModel)boundr   returnc                 "    t          | |fd|i|S )Nreadonly)r   )r   r   r.   r    s       r"   Fieldr/      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   .u   Укажите captioninternal_typeu   Укажите internal_type)super__new__r   AttributeErrorr3   )mcsnamebases	namespacer	__class__s        r"   r5   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__r>   
startswithcustomui_metadirui_meta_skipgetattr
isinstancepropertycallable)clsargsr    kvs        r"   r#   zCmfTypeMeta.__init__/   s     ; 	#;cl::"CM>$$U++ 	CJS 
	 
	A||C   C$$$QA!X&& {{ CKNN
	 
	r$   Nc                 .    |                      ||          S r   )getrN   instanceowners      r"   __get__zCmfTypeMeta.__get__F       wwx'''r$   c                 .    |                      ||          S r   )setrT   s      r"   __set__zCmfTypeMeta.__set__J   rX   r$   r   )r%   r&   r'   r5   r#   rW   r[   __classcell__r<   s   @r"   r1   r1   !   so              .( ( ( (( ( ( ( ( ( ( (r$   r1   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%d Z&d Z'd Z(dzdZ)d Z*d Z+d Z,d Z-e.d             Z/e.d             Z0e0j1        d             Z0d Z2e/j1        d             Z/d Z3e.d             Z4e.d             Z5e.d             Z6e.d             Z7e.d             Z8e9d{d            Z:e9d              Z;d! Z<d" Z=d# Z>d$ Z?d% Z@e9d&             ZAd|d'ZBd( ZCd) 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^d{dDZ_dE Z`dF ZadG ZbdH ZcdI ZddJ ZedK ZfdL ZgdM ZhdN ZidO ZjdP ZkdQ Zld{dRZmdS ZndT ZodU ZpdV ZqdW ZrdX ZsdY ZtdZ Zud[ Zvd\ Zwd] Zxd^ Zyd{d_Zzd` Z{da Z|db Z}dc Z~dd Zde Zdf Zdg Zdh Zdi Zdj Zdk Zdl Zd{dmZdn Zdo Zdp Zdq Zdr Zds Zdt Zdu Zdv Zdw Zdx Zdy 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)rG   rI   r3   db_namedb_aliasra   primary_keyuniqueindex	lazy_loadr>   instance_classrequired_fieldsc                     d S r   r(   r!   values     r"   validatezCmfType.validate       r$   c                 p    ||S | j         *t          || j                   s|                      |          S |S r   )r3   rK   rn   s     r"   castzCmfType.cast   sC    =L)eT%788 1))%000r$   c                     | j         S r   ro   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)rC   _value_oldrU   load_fieldsrB   )r!   ry   rz   r    s       r"   loadzCmfType.load   sO     	 < 	MDKDIIM%%do->e%LLLr$   c                     d S r   r(   r!   rO   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|   rK   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 )NrA   r   r   u5   DEV: ошибка рассчета virtual-поля: 
)
rJ   rU   rB   r{   	Exception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 )NrA   r   r   u   Не получилось выполнить присвоение, т.к. нет сеттера у виртуального поля)	rJ   typerU   rB   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_valuerv   s    r"   ro   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|   rU   is_newr   rB   rv   s    r"   oldz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   rn   s     r"   r   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   *ry   u>   ПРОИЗОШЛА ЛЕНИВАЯ ПОДГРУЗКА ПОЛЯ 	cmf_alertmodels)codezField: r   z
jsurl: jsurlz
api_method: 
api_methodz<pre>z</pre>zRaise CmfOrmImplicitLazyLoad u    #Очередь0 #bug   )r8   textpriorityresponsible_idcmf_owner_iduf    загрузите явно само виртуальное поле и его зависимостиz**z.*)!r{   rU   r   rC   r   r   r   
markupsafer   cmf.includer   rJ   r   rB   r~   RAISE_LAZYLOADinteractive_shellr   r   r   CMF_ADMIN_CODE	CmfPersonrS   joinformat_stackstrCmfTask	auto_taskdelayidro   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_valuern   s     r"   ro   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)rC   r   r   rU   rB   r   rK   r_   ro   rs   nullablerp   r|   r   r{   rn   s     r"   r   zCmfType._set_value&  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   ru   rv   s    r"   newzCmfType.newN  s
    zr$   c                 \    t          | j        t                    r| j        j        S | j        S r   )rK   ro   r_   rv   s    r"   jsonzCmfType.jsonR  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)ro   rK   r{   r   r   lenrv   s    r"   is_nullzCmfType.is_nullY  sG     :4dkD$<00 	S5E5E5J5J4ur$   c                     | j          S r   )r   rv   s    r"   is_not_nullzCmfType.is_not_nullb  s    <r$   c                     | j         duS N.)r{   rv   s    r"   
is_definedzCmfType.is_definedf  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%   rD   r6   r   r'   rT   s      r"   rS   zCmfType.getn  sp    J<x000 =X3 = =),)9= = =    ..r$   c                 8    |j         | j                 }||_        d S r   )rD   r%   ro   )rN   rU   ro   fields       r"   rZ   zCmfType.set{  s    !#,/r$   c                      t          |          S r   r   rn   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   r   r   rv   s    r"   
_html_diffzCmfType._html_diff      %%dh999r$   c                 <    | j         sdS |                                 S Nr`   )r   r   rv   s    r"   	html_diffzCmfType.html_diff  s!     	2   r$   c                 2    | j         si S | j        | j        dS )A   
        Данные для таблицы аудита
        r   r   r   r   r   rv   s    r"   
audit_diffzCmfType.audit_diff  s,      	I88
 
 	
r$   c                     | j         pg S r   )rl   rN   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_dirtyrU   r|   r{   ro   	log_levelvisiblerC   rB   rn   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   )rK   r_   ro   rJ   )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{   rv   s    r"   __repr__zCmfType.__repr__  s,    t**)@@D,=,=@@@@r$   c                 *    t          | j                  S r   r   ro   rv   s    r"   __str__zCmfType.__str__      4:r$   c                 4    | j                                         S r   )ro   	__bytes__rv   s    r"   r   zCmfType.__bytes__      z##%%%r$   c                 N    | j          t          |           |          j         k     S r   ro   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   )rK   r_   r   r   ro   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   )hashro   rv   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)rU   r   r{   boolro   rv   s    r"   __bool__zCmfType.__bool__  s9    = 	T]1 	dkS6H6H5DJr$   c                 *    t          | j                  S r   )r   ro   rv   s    r"   __len__zCmfType.__len__  r   r$   c                 4    | j                                         S r   )ro   __length_hint__rv   s    r"   r  zCmfType.__length_hint__  s    z))+++r$   c                     | j         |         S r   ru   r!   keys     r"   __getitem__zCmfType.__getitem__  s    z#r$   c                 @    |                      |          | j        |<   d S r   )rs   ro   )r!   r  ro   s      r"   __setitem__zCmfType.__setitem__  s    ))E**
3r$   c                     | j         |= d S r   ru   r  s     r"   __delitem__zCmfType.__delitem__  s    JsOOOr$   c                 6    | j                             |          S r   )ro   __missing__r  s     r"   r#  zCmfType.__missing__  s    z%%c***r$   c                 4    | j                                         S r   )ro   __iter__rv   s    r"   r%  zCmfType.__iter__!      z""$$$r$   c                 *    t          | j                  S r   )reversedro   rv   s    r"   __reversed__zCmfType.__reversed__$  s    
###r$   c                     || j         v S r   ru   )r!   items     r"   __contains__zCmfType.__contains__'  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__0  r/  r$   c                 L    | j          t          |           |          j         z  S r   r  r  s     r"   __mul__zCmfType.__mul__3  r/  r$   c                 L    | j          t          |           |          j         z  S r   r  r  s     r"   
__matmul__zCmfType.__matmul__6  r/  r$   c                 L    | j          t          |           |          j         z  S r   r  r  s     r"   __truediv__zCmfType.__truediv__9  r/  r$   c                 L    | j          t          |           |          j         z  S r   r  r  s     r"   __floordiv__zCmfType.__floordiv__<  "    zZT$ZZ..444r$   c                 L    | j          t          |           |          j         z  S r   r  r  s     r"   __mod__zCmfType.__mod__?  r/  r$   c                 b    t          | j         t          |           |          j                  S r   )divmodro   r   r  s     r"   
__divmod__zCmfType.__divmod__B  s'    dj*$t**U"3"3"9:::r$   c                 d    t          | j         t          |           |          j        |          S r   )powro   r   r!   r   modulos      r"   __pow__zCmfType.__pow__E  s)    4:ztDzz%006???r$   c                 L    | j          t          |           |          j         z  S r   r  r  s     r"   
__lshift__zCmfType.__lshift__H  r:  r$   c                 L    | j          t          |           |          j         z	  S r   r  r  s     r"   
__rshift__zCmfType.__rshift__K  r:  r$   c                 L    | j          t          |           |          j         z  S r   r  r  s     r"   __and__zCmfType.__and__N  r/  r$   c                 L    | j          t          |           |          j         z  S r   r  r  s     r"   __xor__zCmfType.__xor__Q  r/  r$   c                 L    | j          t          |           |          j         z  S r   r  r  s     r"   __or__zCmfType.__or__T  r/  r$   c                 L     t          |           |          j        | j        z   S r   r   ro   r  s     r"   __radd__zCmfType.__radd__W  s$     tDzz%  &33r$   c                 L     t          |           |          j        | j        z
  S r   rP  r  s     r"   __rsub__zCmfType.__rsub__]  "    tDzz%  &33r$   c                 L     t          |           |          j        | j        z  S r   rP  r  s     r"   __rmul__zCmfType.__rmul__`  rT  r$   c                 L     t          |           |          j        | j        z  S r   rP  r  s     r"   __rmatmul__zCmfType.__rmatmul__c  rT  r$   c                 L     t          |           |          j        | j        z  S r   rP  r  s     r"   __rtruediv__zCmfType.__rtruediv__f  rT  r$   c                 L     t          |           |          j        | j        z  S r   rP  r  s     r"   __rfloordiv__zCmfType.__rfloordiv__i  "    tDzz%  &$*44r$   c                 L     t          |           |          j        | j        z  S r   rP  r  s     r"   __rmod__zCmfType.__rmod__l  rT  r$   c                 b    t           t          |           |          j        | j                  S r   )r>  r   ro   r  s     r"   __rdivmod__zCmfType.__rdivmod__o  s'    jd4jj''-tz:::r$   c                 d    t           t          |           |          j        | j        |          S r   )rA  r   ro   rB  s      r"   __rpow__zCmfType.__rpow__r  s)    :4::e$$*DJ???r$   c                 L     t          |           |          j        | j        z  S r   rP  r  s     r"   __rlshift__zCmfType.__rlshift__u  r]  r$   c                 L     t          |           |          j        | j        z	  S r   rP  r  s     r"   __rrshift__zCmfType.__rrshift__x  r]  r$   c                 L     t          |           |          j        | j        z  S r   rP  r  s     r"   __rand__zCmfType.__rand__{  rT  r$   c                 L     t          |           |          j        | j        z  S r   rP  r  s     r"   __rxor__zCmfType.__rxor__~  rT  r$   c                 L     t          |           |          j        | j        z  S r   rP  r  s     r"   __ror__zCmfType.__ror__  rT  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__  rp  r$   c                 \    | xj          t          |           |          j         z  c_         | S r   r  r  s     r"   __imul__zCmfType.__imul__  rp  r$   c                 \    | xj          t          |           |          j         z  c_         | S r   r  r  s     r"   __imatmul__zCmfType.__imatmul__  rp  r$   c                 \    | xj          t          |           |          j         z  c_         | S r   r  r  s     r"   __itruediv__zCmfType.__itruediv__  rp  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__  rp  r$   c                 n    | j                              t          |           |          j         |          S r   )ro   __ipow__r   rB  s      r"   r~  zCmfType.__ipow__  s-    z"":4::e#4#4#:FCCCr$   c                 l    | j                              t          |           |          j                   S r   )ro   __ilshift__r   r  s     r"   r  zCmfType.__ilshift__  +    z%%jd4jj&7&7&=>>>r$   c                 l    | j                              t          |           |          j                   S r   )ro   __irshift__r   r  s     r"   r  zCmfType.__irshift__  r  r$   c                 l    | j                              t          |           |          j                   S r   )ro   __iand__r   r  s     r"   r  zCmfType.__iand__  +    z"":4::e#4#4#:;;;r$   c                 l    | j                              t          |           |          j                   S r   )ro   __ixor__r   r  s     r"   r  zCmfType.__ixor__  r  r$   c                 l    | j                              t          |           |          j                   S r   )ro   __ior__r   r  s     r"   r  zCmfType.__ior__  s+    z!!*$t**U"3"3"9:::r$   c                 4    | j                                         S r   )ro   __neg__rv   s    r"   r  zCmfType.__neg__      z!!###r$   c                 4    | j                                         S r   )ro   __pos__rv   s    r"   r  zCmfType.__pos__  r  r$   c                 4    | j                                         S r   )ro   __abs__rv   s    r"   r  zCmfType.__abs__  r  r$   c                 4    | j                                         S r   )ro   
__invert__rv   s    r"   r  zCmfType.__invert__      z$$&&&r$   c                 4    | j                                         S r   )ro   __complex__rv   s    r"   r  zCmfType.__complex__  s    z%%'''r$   c                 4    | j                                         S r   )ro   __int__rv   s    r"   r  zCmfType.__int__  r  r$   c                 4    | j                                         S r   )ro   	__float__rv   s    r"   r  zCmfType.__float__  r  r$   c                 4    | j                                         S r   )ro   	__index__rv   s    r"   r  zCmfType.__index__  r  r$   c                 6    | j                             |          S r   )ro   	__round__)r!   ndigitss     r"   r  zCmfType.__round__  s    z##G,,,r$   c                 4    | j                                         S r   )ro   	__trunc__rv   s    r"   r  zCmfType.__trunc__  r  r$   c                 4    | j                                         S r   )ro   	__floor__rv   s    r"   r  zCmfType.__floor__  r  r$   c                 4    | j                                         S r   )ro   __ceil__rv   s    r"   r  zCmfType.__ceil__  r&  r$   c                 4    | j                                         S r   )ro   	__enter__rv   s    r"   r  zCmfType.__enter__  r  r$   c                 :    | j                             |||          S r   )ro   __exit__r!   exc_type	exc_valuer   s       r"   r  zCmfType.__exit__  s    z""8Y	BBBr$   c                 4    | j                                         S r   )ro   	__await__rv   s    r"   r  zCmfType.__await__  r  r$   c                 4    | j                                         S r   )ro   	__aiter__rv   s    r"   r  zCmfType.__aiter__  r  r$   c                 4    | j                                         S r   )ro   	__anext__rv   s    r"   r  zCmfType.__anext__  r  r$   c                 4    | j                                         S r   )ro   
__aenter__rv   s    r"   r  zCmfType.__aenter__  r  r$   c                 :    | j                             |||          S r   )ro   	__aexit__r  s       r"   r  zCmfType.__aexit__  s    z##HiCCCr$   c                 4    | j                                         S r   )rD   r   rv   s    r"   __getstate__zCmfType.__getstate__  s    }!!###r$   c                 :    | j                             |           d S r   )rD   update)r!   states     r"   __setstate__zCmfType.__setstate__  s    U#####r$   r   r   ).)r%   r&   r'   __doc__r   r3   placeholdercommentre   rf   r   ra   rg   rh   ri   index_usingr   r   r.   r>   widgetrk   rC   virtual_cache_timelifeautorF   fullsearch_indexrl   options_list_paramsrb   r  __annotations__rc   rd   TEXKOM_group_by_allowrG   ui_form_visiblerI   rp   rs   rw   r~   r   r   r   r   rL   ro   r   setterr   r   r   r   r   r   r   classmethodrS   rZ   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.  r1  r3  r5  r7  r9  r<  r?  rD  rF  rH  rJ  rL  rN  rQ  rS  rV  rX  rZ  r\  r_  ra  rc  re  rg  ri  rk  rm  ro  rr  rt  rv  rx  rz  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   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L            ) ) )  *
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$   r_   )	metaclassc                        e 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.NT)options_list_bqloptions_list_bql_exclusivec                 n    d| _         | j        rd| j        _         | j                            |           d S NT)r   rU   ro   appendr!   objs     r"   r  zCmfRelBase.append  9    = 	,'+DM$
#r$   c                 n    d| _         | j        rd| j        _         | j                            |           d S r  )r   rU   ro   remover  s     r"   r  zCmfRelBase.remove  r  r$   c                 H     t                      j        |i | d | _        d S r   )r4   r#   _all_nested_cacher!   rO   r    r<   s      r"   r#   zCmfRelBase.__init__
  s-    $)&)))!%r$   c                 p    t                                          ||           d || j                 _        d S r   )r4   rZ   r%   r  )rN   rU   ro   r<   s      r"   rZ   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   r   modelCmfRFileT)include_deletedinclude_dummy:r   r   z==)filterr  r  r8   )r  employee_number)r   r   rK   r   rJ   r   CmfTUUIDr  rS   r   splitr   r  r   ry   r4   rs   )r!   ro   r   r  id_partsr  r   r<   s          r"   rs   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   )rB   ry   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_modelsr   INT)r  ry   include_system)r   r  r   r   RelationCacheget_children_dictrU   r   ro   rB   itemsrJ   extendr   )r!   rB   ry   _args_kwargsall_nested_cache_keyr   children_dictresult
model_nameids_listr  s               r"   
all_nestedzCmfRelBase.all_nested;  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   rK   ro   r   r   r   r   r  )r!   r  r  r  s       r"   r   zCmfRelBase.audit_diffQ  s     	I$*d++ 	,0H>tx{(($.2jBtz}**d   8 	- 	-C$(""sv|,,,8 	. 	.C$(""--- 	 	I 
 
 	
r$   )r%   r&   r'   r   r3   nested_fieldslinkableoptions_list_search_columnsoptions_list_show_columnsr  r  r_   rI   r  r  r#   r  rZ   r  rs   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)   Некорректное значение)
ValueErrorrn   s     r"   r   zCmfBool._format_for_html_diffo  s8    D==6e^^8]((HIIIr$   N)
r%   r&   r'   r   r  r3   r  r   ra   r   r(   r$   r"   r  r  h  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 )Nr`   TEXKOM_warn_minr   zDEV: TEXKOM_warn_min: : z 
)	r4   rs   rJ   r   r   r   r   r   r   )r!   ro   r  r   r<   s       r"   rs   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   r4   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   r4   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   r4   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   r4   r  r  s      r"   r  zCmfInt.__ge__  V    # 	T

5!!A| 664uww~~e$$$r$   )r%   r&   r'   r   intr3   minmaxr  rs   r  r  r  r  r\   r]   s   @r"   r	  r	  z  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"   r%  r%    s        ==GFFFr$   r%  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   ro   rv   s    r"   r   zCmfTime.json      < 	44:r$   c                     t          |t                    r1t          j                            |                                          S t                                          |          S r   )rK   r   dateutilparserparser   r4   rs   r!   ro   r<   s     r"   rs   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   r   strftimero   rv   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   r3   r  r  r  rL   r   rs   r   r\   r]   s   @r"   r(  r(    sy        GM
C
CF  X
# # # # #

 
 
 
 
 
 
r$   r(  c                       e Zd ZdZeZdZdZdS )CmfBytes.NCmfStr)r%   r&   r'   r   bytesr3   
max_lengthr  r(   r$   r"   r5  r5    s"        GMJFFFr$   r5  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 )r6  .Nregexu^   Значение {} не удовлетворяет регулярному выражению.)r:  regex_error_msgc                     | j         r| j         dk    rdS t          | j         pd| j        pd          }|sdS | j         d| S )Nr`   r  )r   r   r   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,   Слишком длинная строка: )r8  r   r   r:  	fullmatchr;  formatrn   s     r"   rp   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   ro   r  r   s      r"   r  zCmfStr.split	  s    tz0000r$   r,   c                 8    | j         rdS  | j        j        |i |S r   )r   ro   rE   r   s      r"   rE   zCmfStr.startswith  s+    < 	5$tz$d5f555r$   c                 8    | j         rdS  | j        j        |i |S r   )r   ro   endswithr   s      r"   rE  zCmfStr.endswith  s+    < 	5"tz"D3F333r$   )r%   r&   r'   r   r   r3   r8  r:  rePatternr  r;  r  r_   rI   r   rp   r  r  rE   rE  r(   r$   r"   r6  r6    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$   r6  c                       e Zd ZdZd ZdS )CmfText.Nr%   r&   r'   r   r  r(   r$   r"   rI  rI    s        GFFFr$   rI  c                       e Zd ZdZdZdS )CmfStr32.    Nr%   r&   r'   r   r8  r(   r$   r"   rL  rL            GJJJr$   rL  c                       e Zd ZdZdZdS )CmfStr64.@   NrN  r(   r$   r"   rQ  rQ  #  rO  r$   rQ  c                       e Zd ZdZdZdS )	CmfStr256.   NrN  r(   r$   r"   rT  rT  (          GJJJr$   rT  c                       e Zd ZdZdZdS )	CmfStr128.   NrN  r(   r$   r"   rX  rX  -  rV  r$   rX  c                       e Zd ZdZdZdS )
CmfStr4096.i   NrN  r(   r$   r"   r[  r[  2  s        GJJJr$   r[  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 xZS )
r  .N)foreign_keyforeign_keysc                 B    | j                             d          d         S )Nr  r   rB  rv   s    r"   	type_namezCmfTUUID.type_name>  s    z$$Q''r$   c                 \    t          | j                            d          d                   S )Nr     )r   ro   r  rv   s    r"   uuidzCmfTUUID.uuidB  s%    DJ$$S))!,---r$   c                 \    ddl m} t          |t          | j                  j                  S Nr   r  )r   r   rJ   r  ro   r`  )r!   r   s     r"   r  zCmfTUUID.modelF  s1    &&&&&&vx
33=>>>r$   c                 *    t          |          j        S r   )r  r  )rN   	tuuid_strs     r"   get_cls_by_tuuid_strzCmfTUUID.get_cls_by_tuuid_strL  s    	""((r$   c                 ^    t          |          }|j                            |j                  S r   )r  r  rS   ro   )rN   rg  tuuids      r"   get_obj_by_tuuid_strzCmfTUUID.get_obj_by_tuuid_strP  s%    ##{u{+++r$   c                     | j         r&| j        rt          d| j        d d                    t	                                          |          S )Nu\   Это служебное поле, для присвоения ид используйте )r]  rU   r   rB   r4   rp   r0  s     r"   rp   zCmfTUUID.validateU  s     	\ 	\$  &[  EI  ET  UX  VX  UX  EY  &[  &[  \  \  \ww&&&r$   )r%   r&   r'   r   r]  r^  rQ  rI   rL   r`  rc  r  r  rh  rk  rp   r\   r]   s   @r"   r  r  7  s        GKL(+JJL( ( X( . . X. ? ? X?
 ) ) [) , , [,' ' ' ' ' ' ' ' 'r$   r  c                       e Zd ZdZeZdgZdS )CmfTsVectoru   Вектор поискаginN)r%   r&   r'   r   r   r3   r  r(   r$   r"   ro  ro  \  s        )GM'KKKr$   ro  c                       e Zd ZdZdZdS )CmfM2MTUUID.rY  NrN  r(   r$   r"   rr  rr  b  rV  r$   rr  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   rv   s    r"   r   zCmfUUID.jsonm  s    4:r$   N)r%   r&   r'   r   r   r3   r   ra   r  rL   r   r(   r$   r"   rt  rt  g  sA        GMGF  X  r$   rt  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   rv   s    r"   rw   zCmfIPv4Address.db_formatv  r   r$   c                 <    | j         rd S t          | j                  S r   r*  rv   s    r"   r   zCmfIPv4Address.jsony  r+  r$   c                     |sd }t          |t          j                  s|!t                                          |          S t          j        |          S r   )rK   	ipaddressIPv4Addressr4   rs   r0  s     r"   rs   zCmfIPv4Address.cast  sP     	EeY233 	'u}77<<&&&$U+++r$   c                     d S r   r(   rn   s     r"   rp   zCmfIPv4Address.validate  rq   r$   c                 B    |                      | j        | j                  S r   r   rv   s    r"   r   zCmfIPv4Address._html_diff  r   r$   c                      t                                                      }|r  fd|                                D             }|S )Nc                 B    i | ]\  }}|                     |          S r(   )r   .0rP   rQ   r!   s      r"   
<dictcomp>z-CmfIPv4Address.audit_diff.<locals>.<dictcomp>  s-    NNNAAt11!44NNNr$   )r4   r   r  )r!   r=  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|  r3   rw   rL   r   rs   rp   r   r   r\   r]   s   @r"   rw  rw  r  s        G)M     X
, , , , ,  : : :        r$   rw  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   rv   s    r"   rw   zCmfIPv4Network.db_format  r   r$   c                 <    | j         rd S t          | j                  S r   r*  rv   s    r"   r   zCmfIPv4Network.json  r+  r$   c                     t          |t          j                  s|!t                                          |          S t          j        |          S r   )rK   r{  IPv4Networkr4   rs   r0  s     r"   rs   zCmfIPv4Network.cast  sC    eY233 	'u}77<<&&&$U+++r$   c                     d S r   r(   rn   s     r"   rp   zCmfIPv4Network.validate  rq   r$   )r%   r&   r'   r   r{  r  r3   rw   rL   r   rs   rp   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  rp   rE   crypt_prefixcrypt)r!   ro   r  s      r"   rs   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!   Недостаточно правrb  )r  r  r   r   r   ro   r   current_personsystem_personCmfAccessListcheck_admin_moderE   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   Пароль не должен содержать кириллицу)rF  searchr   r4   rp   r0  s     r"   rp   zCmfPassword.validate  s@    9(%00 	m$%klllww&&&r$   )
r%   r&   r'   r   r  r  rs   r  rp   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   ro   	isoformatrv   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   r   r  ro   rv   s    r"   r   zCmfDate.audit_diff  Z     	I+/8=48%%'''-1ZA4:'')))T
 
 	
r$   c                     t          |t                    r1t          j                            |                                          S t                                          |          S r   )rK   r   r-  r.  r/  r   r4   rs   r0  s     r"   rs   zCmfDate.cast  r1  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  ro   rv   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   rK   r   ro   r   r  s     r"   ro  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"   rr  zCmfDate.__isub__  r  r$   c                     t          |t                    r
| j        |z   S | j         t          |           |          j        z   S r   r  r  s     r"   r.  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"   r1  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__  r  r$   c                     t           j        r! t          |           |           | j        rdS t	                                          |          S r   r  r  s     r"   r  zCmfDate.__gt__  r  r$   c                     t           j        r! t          |           |           | j        rdS t	                                          |          S r   r  r  s     r"   r  zCmfDate.__ge__'  r  r$   )r%   r&   r'   r   r   r3   r  r  r  r_   rI   rL   r   r   rs   r  r  r  ro  rr  r.  r1  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   )r4   r   r  r  rN   r<   s    r"   r   z CmfDateRange.get_required_fields:  s)    ww**,,0DcFX/YYYr$   c                     t          | j        | j                  }t          | j        | j                  }|r|sd S |                    |j                  }|                    |j                  }||gS )N)year)rJ   rU   r  r  replacer  )r!   range_start	range_ends      r"   r   zCmfDateRange.virtual_getter>  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   rb  )r-  r.  r/  r   r   rU   r  r  )r!   ro   start_value	end_values       r"   r   zCmfDateRange.virtual_setterH  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   )rJ   rU   r  r  r  rv   s    r"   r   zCmfDateRange.jsonR  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   rv   s    r"   r   zCmfDateRange.audit_diffZ  s.     	I99;;
 
 	
r$   )r%   r&   r'   r   r3   r  r  r  r_   rI   rC   r  r   r   r   rL   r   r   r\   r]   s   @r"   r  r  1  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_agek  s1    >L..3BBDDD >r$   c                 H    | j         sdS |                     | j                   S Nr   )ro   r  rv   s    r"   agezCmfDateTime.agep  s%    z 	1||DJ'''r$   c                 F    | j         rd S | j                                        S r   r  rv   s    r"   r   zCmfDateTime.jsonv  r  r$   c                     | j         si S | j        r| j                                        nd | j        r| j                                        nd dS r  r  rv   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  )ro   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/rb     )dayfirst)tzinfo)rK   r   isdigitr-  r.  r/  r  r4   rs   	utcoffsetr  r   r  
astimezoner  )r!   ro   r  r   r<   s       r"   rs   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 )Nr`   z<time datetime="z">z</time>)r  rn   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  rv   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rK   r   ro   r   r  r  s     r"   ro  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"   rr  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"   r.  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"   r1  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   r3   r  r  r  r_   rI   staticmethodr  rL   r  r   r   r  rs   r   r  r  r  ro  rr  r.  r1  r  r  r  r  r\   r]   s   @r"   r  r  b  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   )r4   rs   r   r  r   r  )r!   ro   r   r  r<   s       r"   rs   zCmfCreateDateTime.cast  s<    ggll5!!l8<((99C
r$   )r%   r&   r'   r   rs   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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.r?   )r  r   r   rU   r{   r   r   r|   )setattr_fieldsc                     t           r   r  rn   s     r"   rp   zCmfRelationBase.validate       !!r$   c                 p    t                                                      |                                 gz   S r   )r4   r   id_fieldnamer  s    r"   r   z#CmfRelationBase.get_required_fields#  s-    ww**,,0@0@0B0B/CCCr$   c                     | j         dz   S )N_idrB   r   s    r"   r  zCmfRelationBase.id_fieldname'  s    ~%%r$   c                 P    t          | j        |                                           S r   )rJ   rU   r  rv   s    r"   r   zCmfRelationBase.id+  s     t}d&7&7&9&9:::r$   c                    t          |t                    r|j        }t          ||                                           }|j        du r(|j        |_        ddlm}  |j	        d| d|            ||_        |j        |j        k    |_
        dS )u}   
        Обновим служебное поле
        :param instance:
        :param new_id:
        :return:
        .r   r   u?   DEV: INFO: пессиместичный is_changed у поля r   N)rK   r_   ro   rJ   r  r|   r{   r   r   r   r   )rN   rU   new_idfk_fieldr   s        r"   
_update_fkzCmfRelationBase._update_fk/  s     fg&& 	"\F8S%5%5%7%788 =C$OHMAGiV^iiagiijjj &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   )	r4   rZ   r%   r{   r   ro   r   r  _update_backref)rN   rU   ro   inserted_valuer  r<   s        r"   rZ   zCmfRelationBase.setD  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(   r   r  r  s     r"   
<listcomp>z3CmfRelationBase._update_backref.<locals>.<listcomp>\  s    "I"I"Ic36"I"I"Ir$   )rJ   r%   r   r  r{   r   ro   r  r|   r   r   r  )rN   rU   r   backref_fieldr  s        r"   r  zCmfRelationBase._update_backrefS  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   .r#  rb  r  z(DEV: FATAL Potential RelationCache leak target)r   r   r4   r   r{   r   ro   r   r   is_recursion_saver   r|   r  remove_field_referencer   add_field_referencer   r  rU   )r!   r#  rO   r    r   r  r   r<   s          r"   r   zCmfRelationBase.saven  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 )Nrb  .r"  )r{   r   ro   r   r4   )r!   r#  r<   s     r"   r   zCmfRelationBase.flush  sW    199F;c!!$,!J519---r$   c                 ,    t          | j        |          S r   )rJ   ro   )r!   r8   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  rH   r4   __setattr__r   ro   )r!   r8   ro   r<   s      r"   r/  zCmfRelationBase.__setattr__  s[    4&&&$#d))*;*;GGe,,,,,DJe,,,,,r$   NFc                 &    ddl m}  j        dur|s S d|vrd|d<   d|vrd|d<    j                                                  }|j        du rH fd|pg D                                               j        gz   } j                            |           nt          t                     d	          rEt          | j
                  } |j         j        fd
|i| _         j        du r j         _        n j        ru j                            d          d         }t          ||d          }|st          d|            |j         j        fd
|i| _         j        du r j         _        nd _         j        du r j         _         S )u1   Ленивая загрузка Relation поляr   r  .r  Tr  c                 (    g | ]}j          d | S )r   r  )r  
load_fieldr!   s     r"   r   z(CmfRelationBase.load.<locals>.<listcomp>  s)    \\\do<<
<<\\\r$   r   r  ry   r  Nu$   Нет класса с именем )r   r   r|   rU   r  rB   r}   hasattrr   rJ   r  rS   r   r{   r  r  )	r!   ry   rz   r    r   id_fieldfields_listr  cls_names	   `        r"   r~   zCmfRelationBase.load  s   &&&&&&9CK 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!!"iW 	(w}}S))!,HFHd33E T !R!R!RSSS!	$'CC&CFCCDI{c!!"iDI{c!!"ir$   c                 J    |dur|rt          |d          r|j        j        S d S )N.r8   )r3  r8   ro   rn   s     r"   r   z%CmfRelationBase._format_for_html_diff  s1    '%*@*@:##tr$   c                 ,    | j         rd S | j        j        S r   )r   ro   r   rv   s    r"   r   zCmfRelationBase.json  s    < 	4zr$   r   r   )r%   r&   r'   r   rj   r  r  rI   rp   r  r   r  rL   r   r  rZ   r  r   r   r-  r/  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>     ) ) )- - - - -) ) ) )V  &   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)r^  c                     t          |          j        | j        k    r4t          d| j         dt          |          j         d| j                   d S )Nu   Тип u    не совпадает: z != )r   r%   r  r   rB   rn   s     r"   rp   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 re  r   r   varsr  rN   r   s     r"   r  zCmfRelation.related_models  s*    &&&&&&VSY'((r$   )r%   r&   r'   r   r  r^  r  r
  rI   rp   r  r  r(   r$   r"   r;  r;    sc        GFLE"/2CCLB B B ) ) [) ) )r$   r;  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   rn   s     r"   rp   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 re  )r   r   r?  r  )rN   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   rp   r  r  r(   r$   r"   rB  rB    sP        G!FFa a a
   [  r$   rB  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.modelsrJ   r   
base_modelr   iter_subclasses)rN   cmfrJ  s      r"   r  z+CmfSubclassedGenericRelation.related_models  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   )	rI  
issubclassr   rJ   r   rJ  r   rU   rB   )r!   ro   rL  s      r"   rp   z%CmfSubclassedGenericRelation.validate  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   rJ  r   field_options_list_limitr  r  rp   r(   r$   r"   rF  rF  
  sX        GJ]F!2 2 [2K K K K Kr$   rF  c                   <     e Zd ZdZdZdZddZ fdZ fdZ xZ	S )CmfBackrefBase.NFc           	      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.ry   r  r(   )	r|   r   r  r  r  rU   r   r{   r   r!   ry   rz   r    r  s        r"   r~   zCmfBackrefBase.load%  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   ra   r4   r#   r  s      r"   r#   zCmfBackrefBase.__init__1  s0    vv$)&)))))r$   c                 :     t                      j        |i | d S r   )r4   r   r  s      r"   r   zCmfBackrefBase.flush5  s&     	t&v&&&&&r$   r   )
r%   r&   r'   r   r  r  r~   r#   r   r\   r]   s   @r"   rU  rU     st        GEG
 
 
 
* * * * *' ' ' ' ' ' ' ' 'r$   rU  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 re  )r   r   r  r?  r@  s     r"   r  zCmfBackref.related_modelsC  s6    &&&&&&,/I=VSY'((2=r$   )r%   r&   r'   r  r   r  r  r  r(   r$   r"   r[  r[  >  s<        FGE> > [> > >r$   r[  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(   r?  r  r  r   s     r"   r   z4CmfGenericBackref.related_models.<locals>.<listcomp>R  $    <<<VU#<<<r$   r   r   r@  s    @r"   r  z CmfGenericBackref.related_modelsN  1    &&&&&&<<<<<<<<r$   )r%   r&   r'   r  r   r   r  r  r(   r$   r"   r^  r^  I  s<         FGF= = [= = =r$   r^  c                       e Zd ZdZdZdZdZej        dz   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  rn   s     r"   rp   zCmfM2MBase.validate]  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 )Nr`   r   rb  r  u    добавлено: ,c                 ,    g | ]}t          |          S r(   r   r  cs     r"   r   z)CmfM2MBase._html_diff.<locals>.<listcomp>n  s    BeBeBea3q66BeBeBer$   r  u    удалено: c                 ,    g | ]}t          |          S r(   r   rn  s     r"   r   z)CmfM2MBase._html_diff.<locals>.<listcomp>q  s    >a>a>a!s1vv>a>a>ar$   u    остальное: r  )_changesr  r   r   )r!   html_strchangeschangeactr  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   rb  )r   rq  r   ro   r  )r!   rs  rt  ru  obj_ids        r"   r   zCmfM2MBase.audit_diffw  s      	I} 	Im 	( 	(F)CAY\'F'!!!CL''''r$   c                 \    ddl m} t          |          |                                          S re  )r   r   r?  m2m_model_cls_namer@  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   )r4   r#   rq  _changes_bufferr   ra   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rq  )r!   r  actionchange_action
change_objrA   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  rA   s       r"   r   z/CmfM2MBase.changes_appended.<locals>.<listcomp>  +    kkk<}j1Q^bjQjQj
QjQjQjr$   r~  rv   s    r"   rh  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"   r   z.CmfM2MBase.changes_removed.<locals>.<listcomp>  r  r$   r~  rv   s    r"   ri  zCmfM2MBase.changes_removed  s    kkkkkkr$   rb  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   Должен работать в т.ч. с незагруженными полями, для оптимизации.NFrb  r   r  Tr  r"  .)rK   r_   ro   r   r  rk  rp   r  r   rq  r   r  r|  r  r   rU   r  rJ   r{   )r!   r  descriptionr#  rO   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ir  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  NFrb  r   r  r  Tr"  .)r  rK   r   r  rk  r   rq  r   r  r|  r  r   r  rU   rJ   r{   )r!   r  r#  rO   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(   r  r  s     r"   r   z#CmfM2MBase.cast.<locals>.<listcomp>  s    777cf777r$   c                     h | ]	}|j         
S r(   r  r  s     r"   	<setcomp>z"CmfM2MBase.cast.<locals>.<setcomp>  s    222SV222r$   )rK   r_   ro   r   r   r4   rs   r  r{   rU   r   r~   r   r   r  )r!   ro   r  val	value_idsr<   s        r"   rs   zCmfM2MBase.cast  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"   ry  zCmfM2MBase.m2m_model_cls_name"  r  r$   c                 j    |                                  D ]}|                    |          }|r|c S d S r   )r  rS   )r!   r   r  related_objs       r"   get_related_objzCmfM2MBase.get_related_obj&  sJ    ((** 	# 	#E))B--K #""""#tr$   Fc                    | j         dur|s| S g | _        d | _        | j        rU|                                 D ]?}| j                             |j        d|| j        d| j        j        ggddd|           @n8| 	                                
                    | j        | j                  | _        |                                  t          | j                  | _         | S )N.r  T)ry   r  TECHCOM_nocacheinclude_archived)r  leftr(   )r|   r{   r  r  r  r  r   rU   r   rz  select_relatedr  apply_changesr   rW  s        r"   r~   zCmfM2MBase.load.  s"   9CK !%< 	a,,.. f f"":5:  $eVT\SWZ^ZgZjYkDl  C  VZ  $e  $e  ^d  $e  $e  f  f  f  ff ,,..==$-VZV_=``DK$$	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_idrO  child_fieldparent_modelr  	parent_id)r  ry   c                 *    h | ]}|j         	|j         S r(   )r  )r  relations     r"   r  z)CmfM2MBase.all_parents.<locals>.<setcomp>R  s#    YYYhFXY($YYYr$   c                 F    h | ]}                     |           xS )r   )get_obj_by_id)r  group_idr  ry   r  s     r"   r  z)CmfM2MBase.all_parents.<locals>.<setcomp>W  s7    hhh(8M8Mh_e8M8f8f1fh#hhhr$   )
r   r   r  r  r  rU   r   rB   r  slist)r!   id_onlyry   r  r   group_model_namesrelation_filterrelation_listr  r  r  s     `      @@r"   all_parentszCmfM2MBase.all_parentsD  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_typerU   rO   s       r"   r  zCmfM2MBase.apply_changesZ  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   )r#  	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)r#  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_idr  r  r%  u]   DEV: попытка добавления уже существующей м2м связи у r   r  Fabort)r  rightr#  rb  r&  r  uV   DEV: попытка удаления несуществующей м2м связи у )m2m_field_namer(  cmf_deleted)-r4   r   cmf.appr  r   r   r  r  r   r   r   rU   r   
invalidater|  r  r  r  rJ   r   rB   _acl_check_writeM2M_DUB_PROTECT_LOCKry  r   r   dp_ddSessionexecuter   rz  rS   r   r  disable_aclr  r*  deleter)  ro   r3  r  r~   r  )r!   r#  r  r  rO   r    r  r   r  r   r  r  cargs
left_fieldr  r  lock_sqlr  lock_resr  r   r<   s                        r"   r   zCmfM2MBase.savep  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!+.2::<<DDX);P    >>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 )Nrb  .r(  )r{   r   ro   rJ   r   rq  r4   )r!   r#  rQ   r<   s      r"   r   zCmfM2MBase.flush  s{    199F;c!!$,!Z  11488 				 	r$   r   )Nrb  )rb  r   )FNr9  )r%   r&   r'   r   r  r  r  r  rI   rp   r   r   r  rz  r#   r  rL   rh  ri  r  r  r  rs   ry  r  r~   r  r  r   r   r\   r]   s   @r"   rg  rg  U  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$   rg  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  rk   rB   r  r  r   r   s    r"   ry  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 re  r>  r@  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 NrN  r   rO  rP  rQ  r   )r   r   r%   r  r   rU   rB   rn   s     r"   rp   zCmfM2M.validate  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  ry  r  rp   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  
capitalizerk   rB   r   s    r"   ry  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(   ra  r  r8   r   s     r"   r   z0CmfGenericM2M.related_models.<locals>.<listcomp>	  s$    >>>4DLL&>>>r$   c                 :    g | ]}t                    |         S r(   ra  r  s     r"   r   z0CmfGenericM2M.related_models.<locals>.<listcomp>	  s$    BBBtVT*BBBr$   )r   r   r  r?  r  r@  s    @r"   r  zCmfGenericM2M.related_models	  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   rU   rB   rn   s     r"   rp   zCmfGenericM2M.validate	  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  ry  r  rp   r(   r$   r"   r  r  	  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  	  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   rv   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   )rG  	ui_fieldschoices)rI  rG  rU   rR  rk   _build_ui_formr  rS   rB   r4   r   r!   r   r   rG  ui_form_customr  r<   s         r"   r   zCmfChoice._simple_html_diff,	  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  )rI  rG  rU   rR  rk   r  r  rS   rB   r  r4   r   r  s         r"   r   zCmfChoiceInt._simple_html_diffI	  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  D	  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: )rF  matchr   r4   rp   r0  s     r"   rp   zCmfEmail.validate[	  sQ     	i"7?? 	i$%g`e%g%ghhhww&&&r$   .r%   r&   r'   rp   r   r\   r]   s   @r"   r  r  Y	  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=   Неправильный формат имени домена)rF  compiler  r   r4   rp   )r!   ro   patternr<   s      r"   rp   zCmfOrgName.validatee	  sO    *.//}}U## 	f$%deeeww&&&r$   .r  r]   s   @r"   r  r  c	  s3        ' ' ' ' ' GGGGGr$   r  c                       e Zd ZdZdS )CmfLogin.Nr"  r(   r$   r"   r  r  n	  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!   ro   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  r4   rp   r  numberr
  is_valid_numberis_possible_numberr   )r!   ro   r  phoner<   s       r"   rp   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;r`   r  z ,;rb  u   доб. z, )r  r  r
  r  r  r   startendstripformat_numberPhoneNumberFormatE164	extension)r!   ro   r  r  infos        r"   rs   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 )Nr  r   )ro   	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  rb  r  )r  r  r
  r  r  r   r  r  r  r  ro   )r!   ro   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+r  r   )ro   r
  r/  r!  r  r  r  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$  )ro   r
  r/  r!  r  r  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$  )ro   r
  r/  r!  r  r  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 )Nr  r   )ro   r!  rv   s    r"   r  zCmfPhone.info	  s/    z 	:z##C((++r$   c                 J    | j         r| j          d}nd}|r||z  }|| _        d S )Nr  )r  ro   )r!   ro   r   s      r"   r  zCmfPhone.info	  s@    ; 	;)))III 	I


r$   )r%   r&   r'   r  r   r  r  rF  r   r  rQ  rI   r  rp   rs   rL   r  r  r'  r*  r-  r  r\   r]   s   @r"   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.NrJ  r(   r$   r"   r1  r1  	  s        GFFFr$   r1  c                       e Zd ZdZd ZdS )	CmfMarkup.NrJ  r(   r$   r"   r3  r3  
  s        GFFFr$   r3  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(   rn   s     r"   rs   zCmfUrl.cast
  s'    =Lu$$Lr$   N)r%   r&   r'   r  r   rs   r(   r$   r"   r5  r5  
  s-        FG    r$   r5  c                       e Zd ZdZdZdS )CmfUrlShort.rY  NrN  r(   r$   r"   r8  r8  
  rV  r$   r8  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)ro   r   rv   s    r"   rw   zCmfJson.db_format
  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(   rs   r  s      r"   r  z CmfJson.cast.<locals>.<dictcomp>&
  s)    >>>1Atyy||>>>r$   c                 :    g | ]}                     |          S r(   rA  )r  rQ   r!   s     r"   r   z CmfJson.cast.<locals>.<listcomp>(
  s#    000QDIIaLL000r$   )rK   r   r  r   r_   r   rn   s   ` r"   rs   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   r%  u,   Не возможно сделать append #   , т.к. значение поля     не список: Tr  )
r   r   r   r~   ro   rK   r   r  r   rU   r!   ro   rO   r    r   s        r"   r  zCmfJson.append/
  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   r%  u,   Не возможно сделать remove rD  rE  Tr  )
r   r   r   r~   ro   rK   r   r  r   rU   rF  s        r"   r  zCmfJson.remove@
  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   r3   r  rw   rs   r  r  r(   r$   r"   r:  r:  
  s_        GMF5 5 5
  0 0 0"0 0 0 0 0r$   r:  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   rb  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)rN   ro   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   r   rQ  r   rv   s    r"   r   zCmfNumeric.audit_diffc
  sX     	I8+44dh1G1G8+44dh1G1G
 
 	
r$   c                 4    |dS |                      |          S )Nr   )rQ  rn   s     r"   r   z CmfNumeric._format_for_html_diffk
  s    =((||E"""r$   c                 >    |	| j         sdS |s|S t          |          S r  )r   r   rn   s     r"   rs   zCmfNumeric.castp
  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   r3   r  	precisionrO  r  r  stepr  r  rQ  r   r   rs   r  r  r  r  r\   r]   s   @r"   rI  rI  R
  s        GMFIE
C
CDK8 8 [8

 
 
# # #
" " "% % % % %% % % % %% % % % %% % % % % % % % %r$   rI  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(   ra  rb  s     r"   r   z0CmfObjectList.related_models.<locals>.<listcomp>
  rc  r$   rd  r@  s    @r"   r  zCmfObjectList.related_models
  re  r$   )r%   r&   r'   r   r   r3   r  r   ra   r  r  r(   r$   r"   r\  r\  
  sL        GMFFdffG= = [= = =r$   r\  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(   ra  rb  s     r"   r   z,CmfObject.related_models.<locals>.<listcomp>
  rc  r$   rd  r@  s    @r"   r  zCmfObject.related_models
  re  r$   )
r%   r&   r'   r   r3   r  r   ra   r  r  r(   r$   r"   r`  r`  
  sF        GMFFG= = [= = =r$   r`  c                       e Zd ZdZdS )CmfLikes.Nr"  r(   r$   r"   rd  rd  
  r#  r$   rd  c                       e Zd ZdZdS )CmfViews.Nr"  r(   r$   r"   rf  rf  
  r#  r$   rf  c                       e Zd ZdZdS )CmfTags.Nr"  r(   r$   r"   rh  rh  
  r#  r$   rh  c                       e Zd ZdZdZd ZdS )CmfObjectJsonu@   Сохраняем и отдаём объект в виде JSON.Nr&  r(   r$   r"   rj  rj  
  s        JJGFFFr$   rj  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   )r4   rs   rl  db_castr0  s     r"   rs   zCmfIPv4NetworkList.cast
  s2    =77<<&&&!))%000r$   c                     d S r   r(   rn   s     r"   rp   zCmfIPv4NetworkList.validate
  rq   r$   c                 6    | j         rd S d | j        D             S )Nc                 ,    g | ]}t          |          S r(   r   r  rQ   s     r"   r   z+CmfIPv4NetworkList.json.<locals>.<listcomp>
  s    +++1A+++r$   )r   ro   rv   s    r"   r   zCmfIPv4NetworkList.json
  s'    < 	4++
++++r$   c                 J    | j         | j         S t          | j        d          S r=  )ro   r   r   rv   s    r"   rw   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  rs  s     r"   r   z.CmfIPv4NetworkList.db_cast.<locals>.<listcomp>
  s#    888Q	%a((888r$   )rK   r   r   )rN   ro   s     r"   ro  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   rs  s     r"   r   z1CmfIPv4NetworkList.audit_diff.<locals>.<listcomp>
      ---qCFF---r$   c                 ,    g | ]}t          |          S r(   r   rs  s     r"   r   z1CmfIPv4NetworkList.audit_diff.<locals>.<listcomp>
  ry  r$   r   r   rv   s    r"   r   zCmfIPv4NetworkList.audit_diff
  sF     	I--DH-----DH---
 
 	
r$   )r%   r&   r'   r   r  rs   rp   rL   r   rw   r  ro  r   r\   r]   s   @r"   rl  rl  
  s        GF1 1 1 1 1   , , X,
4 4 4
 9 9 [9
 
 
 
 
 
 
r$   rl  __main__ababza:bzb:ar   )fr{  rF  r   r   r   r   r   r   typingr	   r
   r   rc  r   r   decimalr   r   r   dateutil.parserr-  r
  ujsonr   r   cmf.base_errorr   r   r   r   r  r   r   r   r   r)   r/   r   r1   r_   r  r  r	  r!  r%  r(  r5  r6  rI  rL  rQ  rT  rX  r[  r  ro  rr  rt  rw  r  r  r  r  r  r  r  r
  r;  rB  rF  rU  r[  r^  rg  r  r  r  r  r  r  r  r  r  r1  r3  r5  r8  r:  rI  r\  r`  rd  rf  rh  rj  rl  r%   likestestro   r  r   r(   r$   r"   <module>r     s       				       > > > > > > > > > > > > > > ' ' ' ' ' ' ' ' ' '         8 8 8 8 8 8 8 8 8 8                 ` ` ` ` ` ` ` ` ` ` ` `                    GCz"""A AQ Ad1g A A A A*( *( *( *( *($ *( *( *(b]
$ ]
$ ]
$ ]
$ ]
$ ]
$ ]
$ ]
$ ]
$@t
 t
 t
 t
 t
 t
 t
 t
l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   
       
       
       
"' "' "' "' "'x "' "' "'J    '       (   
    g       X   D    X   .       ' ' ' ' '* ' ' 'B]% ]% ]% ]% ]%g ]% ]% ]%B/
 /
 /
 /
 /
7 /
 /
 /
b_% _% _% _% _%' _% _% _%F	 	 	 	 	 	 	 	O O O O Oj O O Od) ) ) ) )/ ) ) )"       ,K K K K K#5 K K K,' ' ' ' 'Z ' ' '<> > > > > > > >	= 	= 	= 	= 	= 	= 	= 	=J J J J J J J JZ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   
'
 '
 '
 '
 '
 '
 '
 '
V 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$   