
    oi4                    	   d dl Z d dlZd dlmZ d dlmZmZmZmZmZ d dlm	Z	m
Z
mZ d dlmZmZ d dlmZmZmZ d dlZd dlZd dlmZmZ d dlmZmZmZmZ d d	lmZ d d
l m!Z!  e
dd      Z" G d d      Z#dde	e"   de$de	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(      Z0 G d) d*e0      Z1 G d+ d,e0      Z2 G d- d.e0      Z3 G d/ d0e0      Z4 G d1 d2e0      Z5 G d3 d4e0      Z6 G d5 d6e3      Z7 G d7 d8e(      Z8 G d9 d:e7      Z9 G d; d<e(      Z: G d= d>e2      Z; G d? d@e3      Z< G dA dBe3      Z= G dC dDe6      Z> G dE dFe(      Z? G dG dHe(      Z@ G dI dJe(      ZA G dK dLeA      ZB G dM dNe)      ZC G dO dPeC      ZD G dQ dReC      ZE G dS dTeE      ZF G dU dVe)      ZG G dW dXeG      ZH G dY dZeG      ZI G d[ d\e)      ZJ G d] d^eJ      ZK G d_ d`eJ      ZL G da dbeD      ZM G dc dde2      ZN G de dfe+      ZO G dg dhe5      ZP G di dje3      ZQ G dk dleP      ZR G dm dne3      ZS G do dpe1      ZT G dq dre1      ZU G ds dte6      ZV G du dveV      ZW G dw dxe(      ZX G dy dze(      ZY G d{ d|e(      ZZ G d} d~e(      Z[ G d deX      Z\ G d deX      Z] G d deX      Z^ G d deX      Z_ G d deX      Z` G d de3      Za G d de4      Zbecdk(  rd e0d      dz   k(  sJ dd e0d      z   k(  sJ d e0d       e0d      z   k(  sJ  e0d      dk  sJ  e0d       e0d      k  sJ d e0d      k  sJ  e0d      dk  sJ  e0d       e0d      k  sJ d e0d      k  sJ  e0d      dk  sJ  e0d       e0d      k  sJ d e0d      k  sJ  e0d      dkD  sJ  e0d       e0d      kD  sJ d e0d      kD  sJ  e0d      dk\  sJ  e0d       e0d      k\  sJ d e0d      k\  sJ  e0d      dk\  sJ  e0d       e0d      k\  sJ d e0d      k\  sJ  e\       Zd e7d      e7gZe e7d       e7d      ged_f        edj                   e7d       e7d      gk(  sJ edj                  ddgk(  sJ eAj                         Zeej                  k(  sJ yy)    N)copy)datedatetime	timedeltatimezonetime)TypeTypeVarUnion)UUIDuuid1)DecimalROUND_CEILINGlocalcontext)dumpsloads)CmfCastErrorCmfOrmErrorCmfOrmImplicitLazyLoadCmfValidationError)htmldiffgTCmfModel)boundc                   $    e Zd Zddee   defdZy)	FieldDataNbasecaptionc                     || _         |8| j                   j                  r| j                   j                  }nt        d      || _        || _        y )N   Укажите caption)r   r    	Exceptionkwargs)selfr   r    r$   s       ./cmf/fields/base_fields.py__init__zFieldData.__init__   sD    	?yy  ))++ 899    N)__name__
__module____qualname__r	   r   strr'    r(   r&   r   r      s    T!W s r(   r   r   r    returnc                     t        | |fi |S r)   )r   )r   r    r$   s      r&   Fieldr1   "   s    T7-f--r(   c                   4     e Zd Z fdZd ZddZddZ xZS )CmfTypeMetac                     t         |   | |||      }d|vr|j                  du rt        d      d|vr|j                  du rt        d      |S )Nr    .r"   internal_typeu   Укажите internal_type)super__new__r    AttributeErrorr5   )mcsnamebases	namespacer	__class__s        r&   r7   zCmfTypeMeta.__new__'   s^    GOCui8 I%yyC$%=>>)+#%$%CDDr(   c                    | j                   | _        | j                  rd| j                  vrd| _        | j                  j                  d      rd| _        i | _        t        |       D ][  }|j                  d      r|| j                  v r$t        | |      }t        |t              rAt        |      rM|| j                  |<   ] y )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__4   s     ;;;cll:"CM>>$$U+CJS 
	A||C C$$$QA!X&{CKKN
	r(   c                 &    | j                  ||      S r)   )getrP   instanceowners      r&   __get__zCmfTypeMeta.__get__K       wwx''r(   c                 &    | j                  ||      S r)   )setrV   s      r&   __set__zCmfTypeMeta.__set__O   rZ   r(   r)   )r*   r+   r,   r7   r'   rY   r]   __classcell__r>   s   @r&   r3   r3   &   s    .((r(   r3   c                      e Zd ZU dZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZeed<   dZ eed	<   dZ!eed
<   dZ"dZ#dZ$dZ%eed<   dZ&d Z'd Z(d Z)d Z*d|dZ+d Z,d Z-d Z.d Z/e0d        Z1e0d        Z2e2jf                  d        Z2d Z4e1jf                  d        Z1d Z5e0d        Z6e0d        Z7e0d        Z8e0d        Z9e0d         Z:e;d}d!       Z<e;d"        Z=d# Z>d$ Z?d% Z@d& ZAd' ZBe;d(        ZCd~d)ZDd* ZEd+ ZFd, ZGd- ZHd. ZId/ ZJd0 ZKd1 ZLd2 ZMd3 ZNd4 ZOd5 ZPd6 ZQd7 ZRd8 ZSd9 ZTd: ZUd; ZVd< ZWd= ZXd> ZYd? ZZd@ Z[dA Z\dB Z]dC Z^dD Z_dE Z`d}dFZadG ZbdH ZcdI ZddJ ZedK ZfdL ZgdM ZhdN ZidO ZjdP ZkdQ ZldR ZmdS Znd}dTZodU ZpdV ZqdW ZrdX ZsdY ZtdZ Zud[ Zvd\ Zwd] Zxd^ Zyd_ Zzd` Z{d}daZ|db Z}dc Z~dd Zde Zdf Zdg Zdh Zdi Zdj Zdk Zdl Zdm Zdn Zd}doZdp Zdq Zdr Zds Zdt Zdu Zdv Zdw Zdx Zdy Zdz Zd{ Zy)CmfTypeu  
    load_mode
        load_mode=default, грузим по
            [] - id code name
            [*] - Первый уровень
            [**] - +FK +GFK
            [***] - +M2M + GM2M
        load_mode=always, грузим поле всегда, даже если его не указали в списке полей.
            Например: status_color, status_type, person_login. Как замена backref_load_mode = "load"
        load_mode=lazy, никогда не грузим по *, кроме явного указания в списке полей. Например: Photo, Blob

    subclassed_relation, всегда ленивая, если явно указали, то грузится отдельным запросом, а не через join
    . NTFdefaultoptions_list_query_allno_acl	api_allowcolumn_history)rI   rK   r5   db_namedb_aliasrc   primary_keyuniqueindex	lazy_loadr@   instance_classrequired_fieldsc                     | j                   | j                  | j                  | j                  j                  | j                  j                  j
                  | j                  j                  j
                  dS )N)
from_valueto_value
field_namecmf_model_nameobjobj_code)oldnewrD   rW   idvaluecoder%   s    r&   historyzCmfType.history   sT    "hhDHH"oo"&--":":}}''--4==;M;M;S;SU 	Ur(   c                      y r)   r.   r%   rz   s     r&   validatezCmfType.validate       r(   c                 t    ||S | j                   't        || j                         s| j                  |      S |S r)   )r5   rM   r   s     r&   castzCmfType.cast   s>    =L)eT%7%78))%00r(   c                     | j                   S r)   rz   r|   s    r&   	db_formatzCmfType.db_format   s    zzr(   c                     |r	 | j                   rd| _        d| _        | S | j                  j	                  | j
                  g|       | S )u+   fields относительно филда.N)fieldsforce)rE   _value_oldrW   load_fieldsrD   )r%   r   r   r$   s       r&   loadzCmfType.load   sK     <<DKDI  MM%%doo->e%Lr(   c                      y r)   r.   r%   rQ   r$   s      r&   savezCmfType.save   s    r(   c                     d| _         | j                  | _        t        | j                  t        t
        f      rt        | j                        | _        y y NF)
is_changedr   r   rM   listdictr   r   s      r&   flushzCmfType.flush   s;    ;;	dkkD$<0DKK(DI 1r(   c                     	 t        | j                  d| j                   | j                        }|S # t        $ r7}ddlm} dd l} |j                  d| d|j                                 |d }~ww xY w)NrC   r   r   u5   DEV: ошибка рассчета virtual-поля: 
)
rL   rW   rD   r   r#   flaskr   	tracebackdebug
format_exc)r%   reser   r   s        r&   virtual_getterzCmfType.virtual_getter   st    	$--1T__,=)>LC 
  	AGGKA3bQZQeQeQgPhijG		s   .2 	A22A--A2c                    t        t        | j                        d| j                         j                  s0ddlm}  |j                  d| j                  | j                  |       y t        | j                  d| j                   |      S )NrC   r   r   u   Не получилось выполнить присвоение, т.к. нет сеттера у виртуального поля)	rL   typerW   rD   fsetr   r   r   setattr)r%   r   r   s      r&   virtual_setterzCmfType.virtual_setter   ss    tDMM*a/@,ABGGAGG W	 t}}$//):&;VDDr(   c                 "    | j                         S r)   )
_get_valuer|   s    r&   rz   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   rW   is_newr   rD   r|   s    r&   rw   zCmfType.old   s_    99Ct}}8L8L99$24==3K3K2LAdooM^rtu 	ur(   c                     t        d      )Nu=   Нельзя устанавливать .old значения)r#   r   s     r&   rw   zCmfType.old   s    WXXr(   c                 j   | j                   dus"| j                  r| j                  j                  r(| j                  r| j	                         S | j                   S ddlm} ddlm} ddl	m
} t        |dd       rq |j                  d| j                  j                   d| j                          | j                  d	g
       | j                  r| j	                         S | j                   S  |j                  d| j                  j                   d| j                          |j                  r|j                   sdd l}ddl	m}m} d }|j(                  r&|j*                  j-                  |j(                        }|rd| j                  j                   d| j                   d}|dj/                  |j1                         d d       z  }|dt        |dd        z  }|dt        |dd        z  }dt3         ||             d}|j4                  j6                  j9                  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                  jA                  d| j                   dg
       | j                  r| j	                         S | j                   S )N.r   r   )escapeconfigdisable_raise_lazyloaduH   TODO2 if is_new: load_fields ЛЕНИВАЯ ПОДГРУЗКА ПОЛЯ r   *r   u>   ПРОИЗОШЛА ЛЕНИВАЯ ПОДГРУЗКА ПОЛЯ 	cmf_alertmodels)r{   zField: r   z
jsurl: jsurlz
api_method: 
api_methodz<pre>z</pre>zRaise CmfOrmImplicitLazyLoad u    #Очередь0 #bug   )r:   textpriorityresponsible_idcmf_owner_iduf    загрузите явно само виртуальное поле и его зависимостиz**z.*)!r   rW   r   rE   r   r   r   
markupsafer   cmf.includer   rL   r   rD   r   RAISE_LAZYLOADinteractive_shellr   r   r   CMF_ADMIN_CODE	CmfPersonrU   joinformat_stackr-   CmfTask	auto_taskdelayry   rz   r   r   )	r%   r   r   r   r   r   r   admin	task_infos	            r&   r   zCmfType._get_value   s   ;;c!$--:N:N||**,,;;%& 1.5AGG 0014??2CE FIIcUI#||**,,;;PQUQ^Q^QiQiPjjklpl{l{k|}~   )<)<5 E$$((,,&2G2G,H%dmm&>&>%?q@QQST	TYYy'='='?'DEE	yGT)B(CDD	~gat.L-MNN	#Cy(9$:#;6B	((..89Q9Q8RRSTXTcTcSddz{"Q#(88>> / P ||,}}//0$//1B|~  )DMM,D,D+EQtFW)XYY!!$4??2C20F)G!H<<&&(({{r(   c                 $    | j                  |      S r)   )
_set_valuer   s     r&   rz   zCmfType.value/  s    u%%r(   c                    | j                   r| j                  |      S |du rJt        d| j                  xr | j                  j                   d| j                   d| j
                         t        |t              r|j                  }| j                  |      }|X| j                  du r[t        d| j                  xr | j                  j                   d| j                   d| j
                         | j                  |       | j                  dur| j                  |k7  | _        nd| _        | j                  r| j                  rd| j                  _        || _        y )N.u-   Нельзя убирать значение r    Fu7   Не могу присвоить значение None T)rE   r   r   rW   rD   r    rM   ra   rz   r   nullabler   r   r   r   r   s     r&   r   zCmfType._set_value3  sD   <<&&u--C<$MM>dmm&>&>?q@QQRSWS_S_R`bc c eW%KKE		% =}}%(B$--*B*BC1T__DUUVW[WcWcVdfg g
 MM% 
 99C"ii50DO"DO??t}}'+DMM$ r(   c                     | j                   S r)   r   r|   s    r&   rx   zCmfType.new[  s    zzr(   c                 z    t        | j                  t              r| j                  j                  S | j                  S r)   )rM   rz   ra   r|   s    r&   jsonzCmfType.json_  s,     djj'*::###zzr(   c                     | j                   yt        | j                  t        t        f      rt        | j                        dk(  ryy)NTr   F)rz   rM   r   r   r   lenr|   s    r&   is_nullzCmfType.is_nullf  s9     ::dkkD$<0S5E5Jr(   c                     | j                    S r)   )r   r|   s    r&   is_not_nullzCmfType.is_not_nullo  s    <<r(   c                     | j                   duS N.)r   r|   s    r&   
is_definedzCmfType.is_defineds  s    {{#%%r(   c                     || S | j                   |j                  vr/t        dt        |      j                   d| j                   d      |j                  | j                      S )N'z' object has no attribute ')r*   rF   r8   r   r,   rV   s      r&   rU   zCmfType.get{  sm    J<<x000 X334 5)),)9)9(:!=    ..r(   c                 D    |j                   | j                     }||_        y r)   )rF   r*   rz   )rP   rW   rz   fields       r&   r\   zCmfType.set  s    !!#,,/r(   c                     t        |      S r)   )r-   r   s     r&   _format_for_html_diffzCmfType._format_for_html_diff  s    5zr(   c                     | j                  |      }| j                  |      }|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  sP    ..y9	..y9	-I-I,,wyk1A)FSSr(   c                 N    | j                  | j                  | j                        S r)   r   rw   rx   r|   s    r&   
_html_diffzCmfType._html_diff      %%dhh99r(   c                 <    | j                   sy| j                         S Nrb   )r   r   r|   s    r&   	html_diffzCmfType.html_diff  s      r(   c                 P    | j                   si S | j                  | j                  dS )A   
        Данные для таблицы аудита
        rw   rx   )r   rw   rx   r|   s    r&   
audit_diffzCmfType.audit_diff  s(     I8888
 	
r(   c                 "    | j                   xs g S r)   )ro   rP   s    r&   get_required_fieldszCmfType.get_required_fields  s    ""(b(r(   c                    d| _         d| _        d | _        d| _        d| _        |dur|| _        | j                  s1| j                  r%| j                  s| j                  dd dk(  sd| _        | j                  sd| _        y y )NF.r      cache_r   r   )
r   	orm_dirtyrW   r   r   rz   	log_levelvisiblerE   rD   r   s     r&   r'   zCmfType.__init__  sv    	DJ~~$,,t||DOO\]^_L`dlLlDN~~DN r(   c                 r    t        |t              r|j                  } t        | j                  |      |      S r)   )rM   ra   rz   rL   )r%   fnothers      r&   _comparezCmfType._compare  s-    eW%KKE&wtzz2&u--r(   c                 ^    t        |       j                   dt        | j                         dS )N())r   r,   reprr   r|   s    r&   __repr__zCmfType.__repr__  s*    t*))*!D,=+>a@@r(   c                 ,    t        | j                        S r)   r-   rz   r|   s    r&   __str__zCmfType.__str__      4::r(   c                 6    | j                   j                         S r)   )rz   	__bytes__r|   s    r&   r  zCmfType.__bytes__      zz##%%r(   c                 R    | j                    t        |       |      j                   k  S r)   rz   r   r%   r   s     r&   __lt__zCmfType.__lt__  "    zzJDJu-3333r(   c                 R    | j                    t        |       |      j                   k  S r)   r
  r  s     r&   __le__zCmfType.__le__  "    zzZT$Z.4444r(   c                     |t        |t              r|j                  r| j                  sy| j                   t        |       |      j                  k(  S r   )rM   ra   r   r   rz   r   r  s     r&   __eq__zCmfType.__eq__  sB    MZw7EMMSWS`S`zzZT$Z.4444r(   c                 R    | j                    t        |       |      j                   kD  S r)   r
  r  s     r&   __gt__zCmfType.__gt__  r  r(   c                 R    | j                    t        |       |      j                   k\  S r)   r
  r  s     r&   __ge__zCmfType.__ge__  r  r(   c                 ,    t        | j                        S r)   )hashrz   r|   s    r&   __hash__zCmfType.__hash__  s    DJJr(   c                     | j                   r%| j                   j                  r| j                  du ryt        | j                        S )N.F)rW   r   r   boolrz   r|   s    r&   __bool__zCmfType.__bool__  s2    ==T]]11dkkS6HDJJr(   c                 ,    t        | j                        S r)   )r   rz   r|   s    r&   __len__zCmfType.__len__  r  r(   c                 6    | j                   j                         S r)   )rz   __length_hint__r|   s    r&   r   zCmfType.__length_hint__  s    zz))++r(   c                      | j                   |   S r)   r   r%   keys     r&   __getitem__zCmfType.__getitem__"  s    zz#r(   c                 @    | j                  |      | j                  |<   y r)   )r   rz   )r%   r#  rz   s      r&   __setitem__zCmfType.__setitem__%  s    ))E*

3r(   c                     | j                   |= y r)   r   r"  s     r&   __delitem__zCmfType.__delitem__(  s    JJsOr(   c                 8    | j                   j                  |      S r)   )rz   __missing__r"  s     r&   r*  zCmfType.__missing__+  s    zz%%c**r(   c                 6    | j                   j                         S r)   )rz   __iter__r|   s    r&   r,  zCmfType.__iter__.      zz""$$r(   c                 ,    t        | j                        S r)   )reversedrz   r|   s    r&   __reversed__zCmfType.__reversed__1  s    

##r(   c                     || j                   v S r)   r   )r%   items     r&   __contains__zCmfType.__contains__4  s     tzz!!r(   c                 R    | j                    t        |       |      j                   z   S r)   r
  r  s     r&   __add__zCmfType.__add__:  r  r(   c                 R    | j                    t        |       |      j                   z
  S r)   r
  r  s     r&   __sub__zCmfType.__sub__=  r  r(   c                 R    | j                    t        |       |      j                   z  S r)   r
  r  s     r&   __mul__zCmfType.__mul__@  r  r(   c                 R    | j                    t        |       |      j                   z  S r)   r
  r  s     r&   
__matmul__zCmfType.__matmul__C  r  r(   c                 R    | j                    t        |       |      j                   z  S r)   r
  r  s     r&   __truediv__zCmfType.__truediv__F  r  r(   c                 R    | j                    t        |       |      j                   z  S r)   r
  r  s     r&   __floordiv__zCmfType.__floordiv__I  r  r(   c                 R    | j                    t        |       |      j                   z  S r)   r
  r  s     r&   __mod__zCmfType.__mod__L  r  r(   c                 `    t        | j                   t        |       |      j                        S r)   )divmodrz   r   r  s     r&   
__divmod__zCmfType.__divmod__O  s$    djj*$t*U"3"9"9::r(   c                 b    t        | j                   t        |       |      j                  |      S r)   )powrz   r   r%   r   modulos      r&   __pow__zCmfType.__pow__R  s&    4::ztDz%066??r(   c                 R    | j                    t        |       |      j                   z  S r)   r
  r  s     r&   
__lshift__zCmfType.__lshift__U  r  r(   c                 R    | j                    t        |       |      j                   z	  S r)   r
  r  s     r&   
__rshift__zCmfType.__rshift__X  r  r(   c                 R    | j                    t        |       |      j                   z  S r)   r
  r  s     r&   __and__zCmfType.__and__[  r  r(   c                 R    | j                    t        |       |      j                   z  S r)   r
  r  s     r&   __xor__zCmfType.__xor__^  r  r(   c                 R    | j                    t        |       |      j                   z  S r)   r
  r  s     r&   __or__zCmfType.__or__a  r  r(   c                 R     t        |       |      j                  | j                  z   S r)   r   rz   r  s     r&   __radd__zCmfType.__radd__d  s$     tDz% &&33r(   c                 R     t        |       |      j                  | j                  z
  S r)   rU  r  s     r&   __rsub__zCmfType.__rsub__j  "    tDz% &&33r(   c                 R     t        |       |      j                  | j                  z  S r)   rU  r  s     r&   __rmul__zCmfType.__rmul__m  rY  r(   c                 R     t        |       |      j                  | j                  z  S r)   rU  r  s     r&   __rmatmul__zCmfType.__rmatmul__p  rY  r(   c                 R     t        |       |      j                  | j                  z  S r)   rU  r  s     r&   __rtruediv__zCmfType.__rtruediv__s  rY  r(   c                 R     t        |       |      j                  | j                  z  S r)   rU  r  s     r&   __rfloordiv__zCmfType.__rfloordiv__v  "    tDz% &&$**44r(   c                 R     t        |       |      j                  | j                  z  S r)   rU  r  s     r&   __rmod__zCmfType.__rmod__y  rY  r(   c                 `    t         t        |       |      j                  | j                        S r)   )rC  r   rz   r  s     r&   __rdivmod__zCmfType.__rdivmod__|  s$    jd4j'--tzz::r(   c                 b    t         t        |       |      j                  | j                  |      S r)   )rF  r   rz   rG  s      r&   __rpow__zCmfType.__rpow__  s&    :4:e$**DJJ??r(   c                 R     t        |       |      j                  | j                  z  S r)   rU  r  s     r&   __rlshift__zCmfType.__rlshift__  rb  r(   c                 R     t        |       |      j                  | j                  z	  S r)   rU  r  s     r&   __rrshift__zCmfType.__rrshift__  rb  r(   c                 R     t        |       |      j                  | j                  z  S r)   rU  r  s     r&   __rand__zCmfType.__rand__  rY  r(   c                 R     t        |       |      j                  | j                  z  S r)   rU  r  s     r&   __rxor__zCmfType.__rxor__  rY  r(   c                 R     t        |       |      j                  | j                  z  S r)   rU  r  s     r&   __ror__zCmfType.__ror__  rY  r(   c                 b    | xj                    t        |       |      j                   z  c_         | S r)   r
  r  s     r&   __iadd__zCmfType.__iadd__  &    

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

ztDz%(...
r(   c                 b    | xj                    t        |       |      j                   z  c_         | S r)   r
  r  s     r&   __imod__zCmfType.__imod__  ru  r(   c                 l    | j                   j                   t        |       |      j                   |      S r)   )rz   __ipow__r   rG  s      r&   r  zCmfType.__ipow__  s*    zz"":4:e#4#:#:FCCr(   c                 j    | j                   j                   t        |       |      j                         S r)   )rz   __ilshift__r   r  s     r&   r  zCmfType.__ilshift__  (    zz%%jd4j&7&=&=>>r(   c                 j    | j                   j                   t        |       |      j                         S r)   )rz   __irshift__r   r  s     r&   r  zCmfType.__irshift__  r  r(   c                 j    | j                   j                   t        |       |      j                         S r)   )rz   __iand__r   r  s     r&   r  zCmfType.__iand__  (    zz"":4:e#4#:#:;;r(   c                 j    | j                   j                   t        |       |      j                         S r)   )rz   __ixor__r   r  s     r&   r  zCmfType.__ixor__  r  r(   c                 j    | j                   j                   t        |       |      j                         S r)   )rz   __ior__r   r  s     r&   r  zCmfType.__ior__  s(    zz!!*$t*U"3"9"9::r(   c                 6    | j                   j                         S r)   )rz   __neg__r|   s    r&   r  zCmfType.__neg__      zz!!##r(   c                 6    | j                   j                         S r)   )rz   __pos__r|   s    r&   r  zCmfType.__pos__  r  r(   c                 6    | j                   j                         S r)   )rz   __abs__r|   s    r&   r  zCmfType.__abs__  r  r(   c                 6    | j                   j                         S r)   )rz   
__invert__r|   s    r&   r  zCmfType.__invert__      zz$$&&r(   c                 6    | j                   j                         S r)   )rz   __complex__r|   s    r&   r  zCmfType.__complex__  s    zz%%''r(   c                 6    | j                   j                         S r)   )rz   __int__r|   s    r&   r  zCmfType.__int__  r  r(   c                 6    | j                   j                         S r)   )rz   	__float__r|   s    r&   r  zCmfType.__float__  r  r(   c                 6    | j                   j                         S r)   )rz   	__index__r|   s    r&   r  zCmfType.__index__  r  r(   c                 8    | j                   j                  |      S r)   )rz   	__round__)r%   ndigitss     r&   r  zCmfType.__round__  s    zz##G,,r(   c                 6    | j                   j                         S r)   )rz   	__trunc__r|   s    r&   r  zCmfType.__trunc__  r  r(   c                 6    | j                   j                         S r)   )rz   	__floor__r|   s    r&   r  zCmfType.__floor__  r  r(   c                 6    | j                   j                         S r)   )rz   __ceil__r|   s    r&   r  zCmfType.__ceil__  r-  r(   c                 6    | j                   j                         S r)   )rz   	__enter__r|   s    r&   r  zCmfType.__enter__  r  r(   c                 <    | j                   j                  |||      S r)   )rz   __exit__r%   exc_type	exc_valuer   s       r&   r  zCmfType.__exit__  s    zz""8Y	BBr(   c                 6    | j                   j                         S r)   )rz   	__await__r|   s    r&   r  zCmfType.__await__  r  r(   c                 6    | j                   j                         S r)   )rz   	__aiter__r|   s    r&   r  zCmfType.__aiter__  r  r(   c                 6    | j                   j                         S r)   )rz   	__anext__r|   s    r&   r  zCmfType.__anext__  r  r(   c                 6    | j                   j                         S r)   )rz   
__aenter__r|   s    r&   r  zCmfType.__aenter__  r  r(   c                 <    | j                   j                  |||      S r)   )rz   	__aexit__r  s       r&   r  zCmfType.__aexit__  s    zz##HiCCr(   c                 6    | j                   j                         S r)   )rF   r   r|   s    r&   __getstate__zCmfType.__getstate__  s    }}!!##r(   c                 :    | j                   j                  |       y r)   )rF   update)r%   states     r&   __setstate__zCmfType.__setstate__  s    U#r(   r   r)   ).)r*   r+   r,   __doc__r    r5   placeholdercommentrh   ri   r   rc   rj   rk   rl   index_usingr   r   readonlyr@   widgetrn   rE   virtual_cache_timelifeautorH   fullsearch_indexro   options_list_paramsrd   r  __annotations__re   rf   TEXKOM_group_by_allowrI   ui_form_visiblerg   rK   r}   r   r   r   r   r   r   r   r   rN   rz   rw   setterr   r   rx   r   r   r   r   classmethodrU   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,  r0  r3  r5  r7  r9  r;  r=  r?  rA  rD  rI  rK  rM  rO  rQ  rS  rV  rX  r[  r]  r_  ra  rd  rf  rh  rj  rl  rn  rp  rr  rt  rw  ry  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r.   r(   r&   ra   ra   W   s    GM KGGHHGKFEKGIHIFNG!DFO $)D(FDIt! GON4L U)*
E ! ! u u 	ZZY Y1f \\& &&P           & & 
/ 
/  T:!	
 ) ) .A&45545  \,++%$"4444454;@554444444454;@55444D??<<;$$$'($&&-&&%&C&&&'D$$r(   ra   )	metaclassc                        e Zd ZdZdZdZdZdZdZdZ	dZ
dZej                  dz   Zd Zd Z fdZe fd	       Zed
        Z fdZddddZd Z xZS )
CmfRelBase.NFT)options_list_bqloptions_list_bql_exclusivec                     d| _         | j                  rd| j                  _         | j                  j                  |       y NT)r   rW   rz   appendr%   ru   s     r&   r  zCmfRelBase.append  .    =='+DMM$

#r(   c                     d| _         | j                  rd| j                  _         | j                  j                  |       y r  )r   rW   rz   remover  s     r&   r  zCmfRelBase.remove  r  r(   c                 2    t        |   |i | d | _        y r)   )r6   r'   _all_nested_cacher%   rQ   r$   r>   s      r&   r'   zCmfRelBase.__init__  s    $)&)!%r(   c                 N    t         |   ||       d || j                     _        y r)   )r6   r\   r*   r  rP   rW   rz   r>   s      r&   r\   zCmfRelBase.set  s"    He$370r(   c                     t         r)   NotImplementedErrorr   s    r&   related_modelszCmfRelBase.related_models!      !!r(   c                    ddl m} t        |t              rYd|v rt	        t        |       dd       dk(  rt	        |d      nt        |d         j                  }|j                  |d   dd      S t        |t              r*|j                  d      }d }t	        t        |       dd       dk(  rt	        |d      }nt        |      d	k(  rt	        ||d   d       }|r|j                  |dd      x}r|S | j                         D ]  }|j                  d
d|gdd      }|s|c S  | j                         D ]  }|j                  dd|g      }|s|c S  d|j                  j                  v rj|j                  | j                         v rN|j                  j                  dd|g      }|r-|S t        |t              r|j                  j                  |      S t        | A  |      S )Nr   r   ry   modelCmfRFileT)include_deletedinclude_dummy:r   r{   z==)filterr  r  r:   )r  employee_number)r   r   rM   r   rL   r   CmfTUUIDr  rU   r-   splitr   r  r   r   r6   r   )r%   rz   r   r  id_partsru   r   r>   s          r&   r   zCmfRelBase.cast%  s   &eT"u}7>tDz7TX7Y]g7g
3!%+.44 yytdRVyWWs#{{3'HEtDz7D1Z?
3X!#T:))E4t)TT3TJ,,. iie'<dbfigJ ,,. iie'<i=J !F$4$4$;$;;@P@PTXTgTgTi@i&&**3DdE2R*SJx(;;??5))w|E""r(   r   )rD   r   c                   t        |      t        |      z   }| j                  r|| j                  v r| j                  |   S i | _        ddlm} |j                  j                  | j                  j                  j                  | j                  |xr |g      }g }|j                         D ]7  \  }	}
t        ||	      }|j                  |j                  dd|
g|d             9 || j                  |<   |S )Nr   r  )child_modelsry   INT)r  r   include_system)r-   r  r   r   RelationCacheget_children_dictrW   ry   rz   rD   itemsrL   extendr   )r%   rD   r   _args_kwargsall_nested_cache_keyr   children_dictresult
model_nameids_listr  s               r&   
all_nestedzCmfRelBase.all_nestedI  s    ":s6{:!!#t'='==--.BCC%'D"&,,>>MM""DOO*B]R\Q] ? _$1$7$7$9 	i JFJ/EMM%**T4,B6bf*gh	i 8>34r(   c                 B   | j                   si S t        | j                  t              s_| j                  r | j                  j
                  j                  nd | j                  r"| j                  j
                  j                  dS d dS g }g }| j                  D ]6  }|| j                  vs|j                  |j
                  j                         8 | j                  D ]6  }|| j                  vs|j                  |j
                  j                         8 |s|si S ||dS )Nr   )appendeddeleted)r   rM   rz   r   rw   ry   rx   r  )r%   r  r  ru   s       r&   r   zCmfRelBase.audit_diff_  s    I$**d+,0HHtxx{{(($.2jjtzz}}** >B  88 	-C$(("svv||,	- 88 	.C$(("-	. I 
 	
r(   )r*   r+   r,   r    r5   nested_fieldsnested_fields_is_edge_parentlinkableoptions_list_search_columnsoptions_list_show_columnsr  r  ra   rK   r  r  r'   r  r\   r  r   r  r   r^   r_   s   @r&   r  r    s    GMM#( H"& $!%''*\\L& 8 8 " "!#H -8 ,
r(   r  c                   &    e Zd ZdZeZd ZdZdZd Z	y)CmfBool.Fc                 2    |du ry|du ry|yt        d      )NTu   ДаFu   Нетr   u)   Некорректное значение)
ValueErrorr   s     r&   r   zCmfBool._format_for_html_diff}  s*    D=e^](HIIr(   N)
r*   r+   r,   r    r  r5   r  r   rc   r   r.   r(   r&   r  r  v  s!    GMFHG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y t         |   |      }t        | dd       }|P|N||k  rIdd l}t	        j
                  d| j                   d| ddj                  |j                                       |S )Nrb   TEXKOM_warn_minr   zDEV: TEXKOM_warn_min: : z 
)	r6   r   rL   r   r   r   r    r   r   )r%   rz   r  r   r>   s       r&   r   zCmfInt.cast  s}    B;U#!$(94@'!'GG,T\\N"UG3rwwyOeOeOgGhFijkr(   c                     t         j                  r$ t        |       |      }| j                  r|dkD  ryyt        |   |      S Nr   TFr   relaxed_bz_python_moder   r   r6   r  r%   r   or>   s      r&   r  zCmfInt.__lt__  ?    ##T
5!A||q5w~e$$r(   c                     t         j                  r$ t        |       |      }| j                  r|dk\  ryyt        |   |      S r  r   r  r   r   r6   r  r  s      r&   r  zCmfInt.__le__  ?    ##T
5!A||6w~e$$r(   c                     t         j                  r$ t        |       |      }| j                  r|dk  ryyt        |   |      S r  r   r  r   r   r6   r  r  s      r&   r  zCmfInt.__gt__  ?    ##T
5!A||q5w~e$$r(   c                     t         j                  r$ t        |       |      }| j                  r|dk  ryyt        |   |      S r  r   r  r   r   r6   r  r  s      r&   r  zCmfInt.__ge__  ?    ##T
5!A||6w~e$$r(   )r*   r+   r,   r    intr5   minmaxr  r   r  r  r  r  r^   r_   s   @r&   r  r    s:    GM
C
CF&%%%% %r(   r  c                       e Zd ZdZy)	CmfBigInt.Nr*   r+   r,   r    r.   r(   r&   r(  r(        Gr(   r(  c                       e Zd ZdZdZd Zy)CmfIntervalu3   Интервал времени в секундах.Nr*   r+   r,   r  r    r  r.   r(   r&   r,  r,    s    =GFr(   r,  c                   H     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                 F    | j                   ry t        | j                        S r)   r   r-   rz   r|   s    r&   r   zCmfTime.json      <<4::r(   c                     t        |t              r-t        j                  j	                  |      j                         S t        |   |      S r)   )rM   r-   dateutilparserparser   r6   r   r%   rz   r>   s     r&   r   zCmfTime.cast  :    eS!??((/4466w|E""r(   c                     | j                   si S | j                  r| j                  j                  d      nd | j                  r| j                  j                  d      dS d dS )Nz%H:%M:%Sr   )r   rw   strftimerz   r|   s    r&   r   zCmfTime.audit_diff  sW    I48HH488$$Z0$6:jj4::&&z2
 	
FJ
 	
r(   )r*   r+   r,   r    r   r5   r%  r&  r  rN   r   r   r   r^   r_   s   @r&   r/  r/    s8    GM
C
CF 
#

r(   r/  c                       e Zd ZdZeZdZdZy)CmfBytes.NCmfStr)r*   r+   r,   r    bytesr5   
max_lengthr  r.   r(   r&   r<  r<    s    GMJFr(   r<  c                       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y)r=  .Nregexu^   Значение {} не удовлетворяет регулярному выражению.)rA  regex_error_msgc                     | j                   r| j                   dk(  ryt        | j                   xs d| j                  xs d      }|sy| j                   d| S )Nrb   r  )rw   r   rx   r    )r%   diffs     r&   r   zCmfStr._html_diff  sO    xx488r> BB7,,r$((r(   c                     | j                   r&t        |      | j                   kD  rt        d|       | j                  r@| j                  j	                  |      s$t        | j
                  j                  |            y y )Nu,   Слишком длинная строка: )r?  r   r   rA  	fullmatchrB  formatr   s     r&   r   zCmfStr.validate  sm    ??5zDOO+(+WX]W^)_``::::''.()=)=)D)DU)KLL / r(   c                 :     | j                   j                  |i |S r)   rz   r  r   s      r&   r  zCmfStr.split  s    tzz000r(   r/   c                 T    | j                   ry | j                  j                  |i |S r   )r   rz   rG   r   s      r&   rG   zCmfStr.startswith  s(    <<$tzz$$d5f55r(   c                 T    | j                   ry | j                  j                  |i |S r   )r   rz   endswithr   s      r&   rL  zCmfStr.endswith   s(    <<"tzz""D3F33r(   )r*   r+   r,   r    r-   r5   r?  rA  rePatternr  rB  r  ra   rK   r   r   r  r  rG   rL  r.   r(   r&   r=  r=    sf    GMJE2::vOF'' + L
)M16T 644 4r(   r=  c                       e Zd ZdZd Zy)CmfText.Nr*   r+   r,   r    r  r.   r(   r&   rP  rP  '  s    GFr(   rP  c                       e Zd ZdZdZy)CmfStr32.    Nr*   r+   r,   r    r?  r.   r(   r&   rS  rS  ,      GJr(   rS  c                       e Zd ZdZdZy)CmfStr64.@   NrU  r.   r(   r&   rX  rX  1  rV  r(   rX  c                       e Zd ZdZdZy)	CmfStr256.   NrU  r.   r(   r&   r[  r[  6      GJr(   r[  c                       e Zd ZdZdZy)	CmfStr128.   NrU  r.   r(   r&   r_  r_  ;  r]  r(   r_  c                       e Zd ZdZdZy)
CmfStr4096.i   NrU  r.   r(   r&   rb  rb  @  s    GJr(   rb  c                        e Zd ZdZdZdZej                  dz   Zed        Z	ed        Z
ed        Zed        Zed        Z fd	Ze fd
       Z xZS )r  .N)foreign_keyforeign_keysc                 >    | j                   j                  d      d   S )Nr  r   rI  r|   s    r&   	type_namezCmfTUUID.type_nameL  s    zz$Q''r(   c                 P    t        | j                  j                  d      d         S )Nr     )r   rz   r  r|   s    r&   uuidzCmfTUUID.uuidP  s!    DJJ$$S)!,--r(   c                 `    ddl m} t        |t        | j                        j
                        S Nr   r  )r   r   rL   r  rz   rg  )r%   r   s     r&   r  zCmfTUUID.modelT  s!    &vx

3==>>r(   c                 ,    t        |      j                  S r)   )r  r  )rP   	tuuid_strs     r&   get_cls_by_tuuid_strzCmfTUUID.get_cls_by_tuuid_strZ  s    	"(((r(   c                 b    t        |      }|j                  j                  |j                        S r)   )r  r  rU   rz   )rP   rn  tuuids      r&   get_obj_by_tuuid_strzCmfTUUID.get_obj_by_tuuid_str^  s#    #{{u{{++r(   c                     | j                   r'| j                  rt        d| j                  d d        t        |   |      S )Nu\   Это служебное поле, для присвоения ид используйте )rd  rW   r   rD   r6   r   r7  s     r&   r   zCmfTUUID.validatec  sn    $  (D  EI  ET  ET  UX  VX  EY  DZ  &[  \  \w&&r(   c                 h   t         |   ||       | j                  j                  d      rt	        || j                  d d       rldt        |      vr^|| j                  d d    j                  r|| j                  d d    j                  |k7  r"|j                  |      || j                  d d <   y y y y y )N_idrt  z:Class)	r6   r\   r*   rL  hasattrr-   r   ry   make_ellipsis_idobjr  s      r&   r\   zCmfTUUID.seti  s    He$ <<  'GHcll3B>O,PU]ehineoUoCLL"-.99XcllSVTVFW=X=[=[_d=d.6.J.J5.Qcr*+ >e Vp,P'r(   )r*   r+   r,   r    rd  re  rX  rK   rN   rg  rj  r  r  ro  rr  r   r\   r^   r_   s   @r&   r  r  E  s    GKL((+JJL( ( . . ? ?
 ) ) , ,' R Rr(   r  c                       e Zd ZdZeZdgZy)CmfTsVectoru   Вектор поискаginN)r*   r+   r,   r    r-   r5   r  r.   r(   r&   rz  rz  v  s    )GM'Kr(   rz  c                       e Zd ZdZdZy)CmfM2MTUUID.r`  NrU  r.   r(   r&   r}  r}  |  r]  r(   r}  c                   ,    e Zd ZdZeZeZd Ze	d        Z
y)CmfUUID.c                 ,    t        | j                        S r)   r  r|   s    r&   r   zCmfUUID.json  s    4::r(   N)r*   r+   r,   r    r   r5   r   rc   r  rN   r   r.   r(   r&   r  r    s(    GMGF r(   r  c                   f     e Zd ZdZej
                  Zd Zed        Z	 fdZ
d Zd Z fdZ xZS )CmfIPv4Address.c                 ,    t        | j                        S r)   r  r|   s    r&   r   zCmfIPv4Address.db_format  r  r(   c                 F    | j                   ry t        | j                        S r)   r1  r|   s    r&   r   zCmfIPv4Address.json  r2  r(   c                     |sd }t        |t        j                        s|t        |   |      S t        j                  |      S r)   )rM   	ipaddressIPv4Addressr6   r   r7  s     r&   r   zCmfIPv4Address.cast  s?    EeY223u}7<&&$$U++r(   c                      y r)   r.   r   s     r&   r   zCmfIPv4Address.validate  r   r(   c                 N    | j                  | j                  | j                        S r)   r   r|   s    r&   r   zCmfIPv4Address._html_diff  r   r(   c                     t         |          }|r2|j                         D ci c]  \  }}|| j                  |       }}}|S c c}}w r)   )r6   r   r  r   )r%   rD  rR   rS   r>   s       r&   r   zCmfIPv4Address.audit_diff  sK    w!#AENAAt11!44NDN Os   A)r*   r+   r,   r    r  r  r5   r   rN   r   r   r   r   r   r^   r_   s   @r&   r  r    sE    G))M  
,: r(   r  c                   V     e Zd ZdZej
                  Zd Zed        Z	 fdZ
d Z xZS )CmfIPv4Network.c                 ,    t        | j                        S r)   r  r|   s    r&   r   zCmfIPv4Network.db_format  r  r(   c                 F    | j                   ry t        | j                        S r)   r1  r|   s    r&   r   zCmfIPv4Network.json  r2  r(   c                     t        |t        j                        s|t        |   |      S t        j                  |      S r)   )rM   r  IPv4Networkr6   r   r7  s     r&   r   zCmfIPv4Network.cast  s7    eY223u}7<&&$$U++r(   c                      y r)   r.   r   s     r&   r   zCmfIPv4Network.validate  r   r(   )r*   r+   r,   r    r  r  r5   r   rN   r   r   r   r^   r_   s   @r&   r  r    s6    G))M  
,
r(   r  c                       e Zd ZdZy)	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                  |       |j                  | j                        r|S | j                   |j                  |       S )Nr   cmfutil)cmf.utilr  r   rG   crypt_prefixcrypt)r%   rz   r  s      r&   r   zCmfPassword.cast  sR    $LeD--.L##$W]]5%9$:;;r(   c                    ddl m} ddlm}m} | j
                  s| j
                  S t        j                  t        j                  k7  r.|j                  j                         s |d       | j
                  S | j
                  j                  | j                        r7|j                  | j
                  j                  | j                        d         S | j
                  S )Nr   r  r   u!   Недостаточно правri  )r  r  r   r   r   rz   r   current_personsystem_personCmfAccessListcheck_admin_moderG   r  decryptr  )r%   r  r   r   s       r&   r  zCmfPassword.decrypt  s    $1zz::q.v7K7K7\7\7^9:::::  !2!23??4::#3#3D4E4E#Fq#IJJzzr(   c                 d    t        j                  d|      rt        d      t        |   |      S )Nu   [А-Яа-яЁё]uD   Пароль не должен содержать кириллицу)rM  searchr   r6   r   r7  s     r&   r   zCmfPassword.validate  s.    99(%0$%kllw&&r(   )
r*   r+   r,   r    r  r  r   r  r   r^   r_   s   @r&   r  r    s&    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                 P    | j                   ry | j                  j                         S r)   r   rz   	isoformatr|   s    r&   r   zCmfDate.json      <<zz##%%r(   c                     | j                   si S | j                  r| j                  j                         nd | j                  r| j                  j                         dS d dS Nr   r   rw   r  rz   r|   s    r&   r   zCmfDate.audit_diff  S    I+/88488%%'-1ZZ4::'')
 	
=A
 	
r(   c                     t        |t              r-t        j                  j	                  |      j                         S t        |   |      S r)   )rM   r-   r4  r5  r6  r   r6   r   r7  s     r&   r   zCmfDate.cast  r8  r(   c                 p     | t        j                  t        j                        j	                               S r)   )r   nowr   utcr   r   s    r&   r  zCmfDate.now  s#    8<<-22455r(   c                 .    | j                         | _        y r)   r  rz   r|   s    r&   set_nowzCmfDate.set_now      XXZ
r(   c                     t        |t              r| xj                  |z  c_        | S | xj                   t        |       |      j                  z  c_        | S r)   rM   r   rz   r   r  s     r&   rt  zCmfDate.__iadd__  G    eY'JJ%J  JJ*$t*U+111Jr(   c                     t        |t              r| xj                  |z  c_        | S | xj                   t        |       |      j                  z  c_        | S r)   r  r  s     r&   rw  zCmfDate.__isub__  r  r(   c                     t        |t              r| j                  |z   S | j                   t        |       |      j                  z   S r)   r  r  s     r&   r5  zCmfDate.__add__  ;    eY'::%%::
T
5 1 7 777r(   c                     t        |t              r| j                  |z
  S | j                   t        |       |      j                  z
  S r)   r  r  s     r&   r7  zCmfDate.__sub__"  r  r(   c                 ~    t         j                  r t        |       |       | j                  ryt        |   |      S r   r  r%   r   r>   s     r&   r  zCmfDate.__lt__)  3    ##DJu||w~e$$r(   c                 ~    t         j                  r t        |       |       | j                  ryt        |   |      S r   r  r  s     r&   r  zCmfDate.__le__1  r  r(   c                 ~    t         j                  r t        |       |       | j                  ryt        |   |      S r   r  r  s     r&   r  zCmfDate.__gt__9  r  r(   c                 ~    t         j                  r t        |       |       | j                  ryt        |   |      S r   r"  r  s     r&   r  zCmfDate.__ge__A  r  r(   )r*   r+   r,   r    r   r5   r  r  r  ra   rK   rN   r   r   r   r  r  r  rt  rw  r5  r7  r  r  r  r  r^   r_   s   @r&   r  r    s    GM HLF''*FFL& &

#
 6 6 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                 R    t         |          | j                  | j                  gz   S r)   )r6   r   r  r  rP   r>   s    r&   r   z CmfDateRange.get_required_fieldsT  s'    w*,0D0DcFXFX/YYYr(   c                    t        | j                  | j                        }t        | j                  | j                        }|r|sy |j	                  |j
                        }|j	                  |j
                        }||gS )N)year)rL   rW   r  r  replacer  )r%   range_start	range_ends      r&   r   zCmfDateRange.virtual_getterX  sq    dmmT-B-BCDMM4+>+>?	)!)){/?/?)@%%9>>%:	Y''r(   c                    |rt         j                  j                  |d         j                         }t         j                  j                  |d         j                         }t	        | j
                  | j                  |       t	        | j
                  | j                  |       y t	        | j
                  | j                  d        t	        | j
                  | j                  d        y )Nr   ri  )r4  r5  r6  r   r   rW   r  r  )r%   rz   start_value	end_values       r&   r   zCmfDateRange.virtual_setterb  s    "////a9>>@K --eAh7<<>IDMM4#8#8+FDMM4#6#6	BDMM4#8#8$?DMM4#6#6=r(   c                 <   t        | j                  | j                        r t        | j                  | j                        sy t        | j                  | j                        j	                         t        | j                  | j                        j	                         gS r)   )rL   rW   r  r  r  r|   s    r&   r   zCmfDateRange.jsonl  ss    t}}d&;&;<GDMM[_[n[nDot'<'<=GGIt':':;EEGI 	Ir(   c                 D    | j                   si S d| j                         dS )NTODOr   )r   r   r|   s    r&   r   zCmfDateRange.audit_difft  s$    I99;
 	
r(   )r*   r+   r,   r    r5   r  r  r  ra   rK   rE   r  r   r   r   rN   r   r   r^   r_   s   @r&   r  r  K  sl    GMNF''*PPLGZ Z(> I 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    | 4t        j                  t        j                        | z
  j	                         S y r)   )r   r  r   r  total_seconds)r  s    r&   cls_agezCmfDateTime.cls_age  s-    >LL.3BBDD r(   c                 R    | j                   sy| j                  | j                         S Nr   )rz   r  r|   s    r&   agezCmfDateTime.age  s    zz||DJJ''r(   c                 P    | j                   ry | j                  j                         S r)   r  r|   s    r&   r   zCmfDateTime.json  r  r(   c                     | j                   si S | j                  r| j                  j                         nd | j                  r| j                  j                         dS d dS r  r  r|   s    r&   r   zCmfDateTime.audit_diff  r  r(   c                 x    ddddddddd	d
ddd}|j                         D ]  \  }}| j                  ||      }  | 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  )rz   mappingmonth_rumonth_ens       r&   _translate_monthzCmfDateTime._translate_month  s`     
 #*--/ 	6HhMM(H5E	6r(   c                    d}||S t        |t              r|d   dk(  rd}|d   dk(  s|d   dk(  rF|d   j                         sd}t        j                  j                  | j                  |      |      }n1t        j                  j                  ||      }nt        | !  |      }|j                         <|j                  t        j                         j                         j                  	      }|S )
NFr   r   T/ri     )dayfirst)tzinfo)rM   r-   isdigitr4  r5  r6  r  r6   r   	utcoffsetr  r   r  
astimezoner  )r%   rz   r  r   r>   s       r&   r   zCmfDateTime.cast  s    =LeS!Qx3 Qx3%(c/Qx'')#Hoo++D,A,A%,HS[+\oo++EH+E',u%C ==?"++X\\^%>%>%@%G%G+HC
r(   c                 >    |sy|j                         }d| d| d}|S )Nrb   z<time datetime="z">z</time>)r  r   s     r&   r   z!CmfDateTime._format_for_html_diff  s-    !"5'E7':r(   c                 T     | t        j                  t        j                              S r)   )r   r  r   r  r   s    r&   r  zCmfDateTime.now  s    8<<-..r(   c                 .    | j                         | _        y r)   r  r|   s    r&   r  zCmfDateTime.set_now  r  r(   c                    t        |t              r| xj                  |z  c_        | S t        |      t        u r!| xj                  t        |      z  c_        | S | xj                   t        |       |      j                  z  c_        | S N)daysrM   r   rz   r   r$  r  s     r&   rt  zCmfDateTime.__iadd__  o    eY'JJ%J
 	 %[CJJ)//J  JJ*$t*U+111Jr(   c                    t        |t              r| xj                  |z  c_        | S t        |      t        u r!| xj                  t        |      z  c_        | S | xj                   t        |       |      j                  z  c_        | S r   r  r  s     r&   rw  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&   r5  zCmfDateTime.__add__  [    eY'::%%%[C::	u 555::
T
5 1 7 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&   r7  zCmfDateTime.__sub__  r  r(   c                 ~    t         j                  r t        |       |       | j                  ryt        |   |      S r   r  r  s     r&   r  zCmfDateTime.__lt__  r  r(   c                 ~    t         j                  r t        |       |       | j                  ryt        |   |      S r   r  r  s     r&   r  zCmfDateTime.__le__  r  r(   c                 ~    t         j                  r t        |       |       | j                  ryt        |   |      S r   r  r  s     r&   r  zCmfDateTime.__gt__  r  r(   c                 ~    t         j                  r t        |       |       | j                  ryt        |   |      S r   r"  r  s     r&   r  zCmfDateTime.__ge__  r  r(   ) r*   r+   r,   r    r   r5   r  r  r  ra   rK   staticmethodr  rN   r  r   r   r  r   r   r  r  r  rt  rw  r5  r7  r  r  r  r  r^   r_   s   @r&   r  r  |  s    GMHLF''*FFLEH E E ( (
 & &

  &2 / / 88%%%% %r(   r  c                   "     e Zd ZdZ fdZ xZS )CmfCreateDateTime.c                 z    t         |   |      }t        j                  t        j
                        }||kD  r|}|S r)   )r6   r   r   r  r   r  )r%   rz   r   r  r>   s       r&   r   zCmfCreateDateTime.cast"  s4    gl5!ll8<<(9C
r(   )r*   r+   r,   r    r   r^   r_   s   @r&   r  r    s    G r(   r  c                        e Zd ZdZdZdZej                  dz   Zd Z fdZ	e
 fd       Ze
d        Zed	        Ze
d
        Ze
 fd       Ze
d        Zdd fd
Zd fd	Zd Z fdZddZd Zed        Z xZS )CmfRelationBase.rA   )r  r   r   rW   r   rw   rx   r   )setattr_fieldsc                     t         r)   r  r   s     r&   r   zCmfRelationBase.validate:      !!r(   c                    t         |          }| j                  xr  | j                  j                  j                  xs d |d<   | j
                  xr  | j
                  j                  j                  xs d |d<   | j                  xr  | j                  j                  j                  xs d |d<   | j
                  xr  | j
                  j                  j                  xs d |d<   | j                  xr  | j                  j                  j                  xs d |d<   | j
                  xr  | j
                  j                  j                  xs d |d<   |S )Nfrom_value_nameto_value_namefrom_value_codeto_value_coderq   rr   )r6   r}   rw   r:   rz   rx   r{   ry   )r%   r   r>   s     r&   r}   zCmfRelationBase.history=  s    go!%!Adhhmm.A.A!IT#xx?DHHMM,?,?G4O!%!Adhhmm.A.A!IT#xx?DHHMM,?,?G4O HH:):):BdL((8txx{{'8'8@DJ
r(   c                 D    t         |          | j                         gz   S r)   )r6   r   id_fieldnamer  s    r&   r   z#CmfRelationBase.get_required_fieldsG  s"    w*,0@0@0B/CCCr(   c                      | j                   dz   S )Nrv  )rD   r   s    r&   r  zCmfRelationBase.id_fieldnameK  s    ~~%%r(   c                 J    t        | j                  | j                               S r)   )rL   rW   r  r|   s    r&   ry   zCmfRelationBase.idO  s    t}}d&7&7&9::r(   c                 N   t        |t              r|j                  }t        || j	                               }|j
                  du r<|j                  |_        ddlm}  |j                  d| d| j                   d|        ||_        |j                  |j
                  k7  |_        y)u}   
        Обновим служебное поле
        :param instance:
        :param new_id:
        :return:
        .r   r   u?   DEV: INFO: пессиместичный is_changed у поля r   r   N)rM   ra   rz   rL   r  r   r   r   r   r   rD   r   )rP   rW   new_idfk_fieldr   s        r&   
_update_fkzCmfRelationBase._update_fkS  s     fg&\\F8S%5%5%78 ==C$OOHMAGGUV^U__`adaoao`ppqrxqyz{ &oo>r(   c                    t         |   ||       || j                     }|j                  du ry |j                  rd }n%|j
                  j                  }|j                  du ry | j                  ||       | j                  |       y r   )	r6   r\   r*   r   r   rz   ry   r!  _update_backref)rP   rW   rz   inserted_valuer  r>   s        r&   r\   zCmfRelationBase.seth  sz    He$!#,,/  C'!!F#)),,F}}#x(H%r(   c                 .   t        | dd       r|| j                     }|j                  s+|| j                     }|j                  du ry |j
                  |j                  D cg c]  }|j
                   c}v ry |j                  j                  |       |j                  dur|j                  |j                  | j                     j                  durt        |j                  | j                     j                        D ]O  }|j
                  |j
                  k(  s|j                  | j                     j                  j                  |        y  y y y y |j                  dur|j                  |j                  | j                     j                  dury|j                  | j                     }|j                  du ry t        |j                        D ]8  }|j
                  |j
                  k(  s|j                  j                  |        y  y y y y y c c}w )Nbackref.)rL   r*   r   r&  r   ry   rz   r  r   rw   r   r  )rP   rW   r   backref_fieldru   s        r&   r#  zCmfRelationBase._update_backrefw  s   3	4(S\\*E== %ckk 2 ''3.;;]5H5H"Ic366"II##**84::S(UZZ-C		RUR]R]H^HeHempHp#EIIckk$:$@$@A "66X[[0!IIckk288??D!" Iq-C( ::S(UZZ-C		RUR]R]H^HcHcknHn$)IIckk$:M$++s2#M$7$78 "66X[[0)//66s;!"	 Io-C(! ) #Js   "Hr   depthc                <   ddl m} t        |   |i | | j                  du ry | j
                  rd }n| j                  j                  s| j                  j                  }nd| j                  j                  r| j                  j                  }n7 | j                  j                  |d|dz   i| | j                  j                  }| j                  rddl m
} | j                  du r |d|         | j                  durF| j                  :|j                  j                  | | j                  j                  j                         | j
                  s'|j                  j                  | | j                         t!        |       j#                  | j$                  |       y )	Nr   r   .r)  ri  r  z(DEV: FATAL Potential RelationCache leak target)r   r   r6   r   r   r   rz   r   ry   is_recursion_saver   r   r  remove_field_referencerw   add_field_referencer   r!  rW   )r%   r)  rQ   r$   r   r  r   r>   s          r&   r   zCmfRelationBase.save  s2   )d%f%;;#<<F&&ZZ]]FZZ))ZZ]]FDJJOOT==f=ZZ]]F ??*yyCDTFKLyy#		(=$$;;D$((++BSBST<<$$88djj8Q 	T
dmmV4r(   c                     |dkD  ry | j                   dur+| j                  s| j                  j                  |dz          t        |           y )Nri  .r(  )r   r   rz   r   r6   )r%   r)  r>   s     r&   r   zCmfRelationBase.flush  sA    19;;c!$,,JJ519-r(   c                 .    t        | j                  |      S r)   )rL   rz   )r%   r:   s     r&   __getattr__zCmfRelationBase.__getattr__  s    tzz4((r(   c                     || j                   v s|t        |       v rt        |   ||       y t	        | j
                  ||       y r)   )r  rJ   r6   __setattr__r   rz   )r%   r:   rz   r>   s      r&   r5  zCmfRelationBase.__setattr__  s;    4&&&$#d)*;Ge,DJJe,r(   c                 d   ddl m} | j                  durn|sl| j                  r"| j                  rT| j                  j                  s>|r:|D cg c]  }| j                   d|  }}| j
                  j                  |       | S d|vrd|d<   d|vrd|d<   | j
                  | j                            }|j                  du r^|xs g D cg c]  }| j                   d|  c}| j                         | j                  gz   }| j
                  j                  |       | S t        t        |       d	      r}t        || j                        } |j                  | j                  fd
|i|| _        | j                  du s"| j                  r'| j                  j                  r| j                  | _        | S | j                  r| j                  j                  d      d   }	t        ||	d      }|st!        d|	        |j                  | j                  fd
|i|| _        | j                  du s"| j                  r'| j                  j                  r| j                  | _        | S d| _        | j                  du s"| j                  r'| j                  j                  r| j                  | _        | S c c}w c c}w )u1   Ленивая загрузка Relation поляr   r  .r   r   r  Tr  r  r   r  Nu$   Нет класса с именем )r   r   r   is_ellipsis_idobjrD   rW   r   r  rw  r   rL   r  rU   ry   r   r  r  )
r%   r   r   r$   r   
load_fieldfields_listid_fieldr  cls_names
             r&   r   zCmfRelationBase.load  sZ   &99C994993N3NW]"^doo%6a
|#D"^K"^MM--[-A F*(,F$%&(&*F?#==!2!2!45==COU|Y[\doo.a
|<\!..0$//BCKMM%%[%9* # T$Z)FDJJ/E!		$''C&CFCDI{{c!dkkdkk6S6S"ii  WWww}}S)!,HFHd3E #Gz!RSS!		$''C&CFCDI{{c!dkkdkk6S6S"ii
  DI{{c!dkkdkk6S6S"iiM #_ ]s   J(J-c                 T    |dur$|r"t        |d      r|j                  j                  S y )N.r:   )rw  r:   rz   r   s     r&   r   z%CmfRelationBase._format_for_html_diff  s(    '%*@::###r(   c                 H    | j                   ry | j                  j                  S r)   )r   rz   r   r|   s    r&   r   zCmfRelationBase.json  s    <<zzr(   r   r   )r*   r+   r,   r    rm   r  r  rK   r   r}   r  r   r  rN   ry   r!  r\   r#  r   r   r3  r5  r   r   r   r^   r_   s   @r&   r  r  +  s    GI	N **-@@L" D D & & ; ; ? ?( & & " "4 !" 5>)-.`&  r(   r  c                   P    e Zd ZdZd ZdZdZej                  dz   Zd Z	e
d        Zy)CmfRelation.N)re  c                     t        |      j                  | j                  k7  r;t        d| j                   dt        |      j                   d| j                         y )Nu   Тип u    не совпадает: z != )r   r*   r  r   rD   r   s     r&   r   zCmfRelation.validate  sa    ;4::-$wt.??YZ^_dZeZnZnYoostxt~t~s  &A  B  B .r(   c                 @    ddl m} t        |      | j                     gS rl  r   r   varsr  rP   r   s     r&   r  zCmfRelation.related_models  s    &VSYY'((r(   )r*   r+   r,   r    r  re  r  r  rK   r   r  r  r.   r(   r&   r@  r@    sA    GFLE"//2CCLB ) )r(   r@  c                   .    e Zd ZdZd ZdZd Zed        Zy)CmfGenericRelation.Nc                     | j                   rLt        |      j                  | j                   vr*t        dt        |      t        |      j                  |      y y )NuJ   Тип не совпадает, неизвестное имя модели)r   r   r*   r   r   s     r&   r   zCmfGenericRelation.validate"  sv    ;;E{##4;;6()uw{  }B  xC  EI  JO  EP  EY  EY  [`  a  a 7 r(   c                     ddl m} g }| j                  sg S | j                  D ]-  }|t        |      v s|j                  t        |      |          / |S rl  )r   r   rD  r  )rP   r   r   r  s       r&   r  z!CmfGenericRelation.related_models'  sQ    &zzIZZ 	0EV$

4<./	0 
r(   )	r*   r+   r,   r    r  r   r   r  r  r.   r(   r&   rG  rG    s+    G!FFa
  r(   rG  c                   4    e Zd ZdZdZdgZg Zed        Zd Z	y)CmfSubclassedGenericRelation.	CmfEntityc                 |    dd l }t        |j                  | j                        }t	        |j                               S r  )
cmf.modelsrL   r   
base_modelr   iter_subclasses)rP   cmfrO  s      r&   r  z+CmfSubclassedGenericRelation.related_models9  s-    SZZ8
J..011r(   c                     dd l }t        t        |      t        |j                  | j
                              sBt        d| j                   d| j                   d| dt        |       d| j                   d      y )Nr      Тип не совпадает r   = ( | r   )	rN  
issubclassr   rL   r   rO  r   rW   rD   )r%   rz   rQ  s      r&   r   z%CmfSubclassedGenericRelation.validateA  s    $u+wszz4??'KL ?aPTP_P_O``abgahhjkopukvjwwz{  |G  |G  {H  HI  J  K  K Mr(   N)
r*   r+   r,   r    rO  r   field_options_list_limitr  r  r   r.   r(   r&   rK  rK  3  s1    GJ]F!2 2Kr(   rK  c                   b     e Zd ZdZdZdZdZd Zd Zd Z	e
d        ZddZ fd	Z fd
Z xZS )CmfBackrefBase.NTc                     t         r)   r  r|   s    r&   r}   zCmfBackrefBase.historyO  r  r(   c                     t        d| |      Nr  r  r  s     r&   r  zCmfBackrefBase.appendR      !(D#66r(   c                     t        d| |      Nr  r  r  s     r&   r  zCmfBackrefBase.removeU  r^  r(   c                     t        d| ||      )Nr\   r  )rP   rW   rz   s      r&   r\   zCmfBackrefBase.setX  s    !%h>>r(   c           	      f   | j                   dur|s| S t               | _         | j                         D ]T  }| j                   j                   |j                  dd|i| j                  dz   | j
                  j                  i|       V | j                  du rt        | j                         | _        | S )N.r   rv  r.   )	r   r   r  r  r&  rW   ry   r   r   )r%   r   r   r$   r  s        r&   r   zCmfBackrefBase.load\  s    99CKF	((* 	aEII

_&_T\\E-A4==CSCS,T_X^_a	a ;;#tyy/DKr(   c                 B    t               | _        t        |   |i | y r)   )r   rc   r6   r'   r  s      r&   r'   zCmfBackrefBase.__init__h  s    v$)&)r(   c                 $    t        |   |i | y r)   )r6   r   r  s      r&   r   zCmfBackrefBase.flushl  s     	t&v&r(   r   )r*   r+   r,   r    r  r&  r  r}   r  r  r  r\   r   r'   r   r^   r_   s   @r&   rZ  rZ  H  sN    GEGH"77 ? ?
*' 'r(   rZ  c                   (    e Zd Zd ZdZdZed        Zy)
CmfBackref.Nc                 \    ddl m} | j                  rt        |      | j                     gS g S rl  )r   r   r  rD  rE  s     r&   r  zCmfBackref.related_modelsz  s&    &,/IIVSYY'(=2=r(   )r*   r+   r,   r  r    r  r  r  r.   r(   r&   rf  rf  u  s#    FGE> >r(   rf  c                   (    e Zd Zd ZdZdZed        Zy)CmfGenericBackref.Nc                 d    ddl m} | j                  D cg c]  }t        |      |    c}S c c}w rl  r   r   rD  rP   r   r  s      r&   r  z CmfGenericBackref.related_models  &    &14<VU#<<<   -)r*   r+   r,   r  r    r   r  r  r.   r(   r&   ri  ri    s#     FGF= =r(   ri  c                   
    e Zd ZdZdZdZdZej                  dz   Zd Z	d Z
d Zd Zed        Z fd	Zdd
Zed        Zed        ZddZddZddZ fdZed        Zd ZddZddZd Zdddd fd
Zd  fd	Z xZS )!
CmfM2MBase.N)changes_appendedchanges_removedc                     t         r)   r  r   s     r&   r   zCmfM2MBase.validate  r  r(   c                     t         r)   r  r|   s    r&   r}   zCmfM2MBase.history  r  r(   c           
         d}| j                   s|S i }| j                   D ])  }|d   }|d   }||vrg ||<   ||   j                  |       + d|v r3| ddj                  |d   D cg c]  }t        |       c}       }|d= d|v r3| ddj                  |d   D cg c]  }t        |       c}       }|d= |r| d	| }| j                   d
| S c c}w c c}w )Nrb   r   ri  r  u    добавлено: ,r  u    удалено: u    остальное: r  )_changesr  r   r-   r    )r%   html_strchangeschangeactru   cs          r&   r   zCmfM2MBase._html_diff  s   }}Omm 	%F)C)C'!!CL$	% w"#8SZ[cSdBea3q6Be9f8ghH!w"#4SXXwW_O`>a!s1v>a5b4cdH!"#8	BH,,r(,, Cf ?bs   $CCc                     | j                   si S | j                  si S i }| j                  D ]=  }|d   }|d   j                  j                  }||vrg ||<   ||   j	                  |       ? |S )r   r   ri  )r   rw  ry   rz   r  )r%   ry  rz  r{  obj_ids        r&   r   zCmfM2MBase.audit_diff  sz     I}}Imm 	(F)CAY\\''F'!!CL'	( r(   c                 F    ddl m} t        |      | j                            S rl  )r   r   rD  m2m_model_cls_namerE  s     r&   m2m_model_clszCmfM2MBase.m2m_model_cls  s    &F|C22455r(   c                 ^    t        |   |i | g | _        g | _        t	               | _        y r)   )r6   r'   rw  _changes_bufferr   rc   r  s      r&   r'   zCmfM2MBase.__init__  s/    $)&)
 !vr(   c                 N    | j                   D ]  ^}}}||k(  s|r||k(  s|c S  y)uU  
        Проверяем, есть ли объект (obj) в списки изменений поля.
        :param obj: объект который ищем в изменениях.
        :param action: append|remove|None
        :type action: str
        :return action изменения: append|remove
        :rtype str
        Nrw  )r%   ru   actionchange_action
change_objrC   s         r&   
in_changeszCmfM2MBase.in_changes  s6     .2]] 	))M:j =!8((	)r(   c                 ^    | j                   D cg c]  ^}}}|dk(  s| c}}}S c c}}}w r]  r  r%   r  r  rC   s       r&   rq  zCmfM2MBase.changes_appended  s1     AEkk<}j1Q^bjQj
kkk   ((c                 ^    | j                   D cg c]  ^}}}|dk(  s| c}}}S c c}}}w r`  r  r  s       r&   rr  zCmfM2MBase.changes_removed  s-    @Dkk<}j1Q^bjQj
kkkr  c                 ,   t        |t              r|j                  }t        |t              rt        j                  |      }| j                  |       d| _        d}t        | j                        D ]N  }|d   j                  |j                  k(  s |d   dk(  rd}|d   dk(  s3| j                  j                  |        n t        | j                        D ]N  }|d   j                  |j                  k(  s |d   dk(  rd}|d   dk(  s3| j                  j                  |        n |ry| j                  j                  d||f       | j                  j                  d||f       d| _        | j                  rd| j                  _        | j                   rE| j                  r9|dk(  r4t#        || j                         j                  | j                  |dz          | j$                  d	ur+|| j$                  vr| j$                  j                  |       yyy)
t   Должен работать в т.ч. с незагруженными полями, для оптимизации.NFri  r   r  Tr  r(  .)rM   ra   rz   r-   r  rr  r   r  r   rw  ry   r  r  r  r   rW   r&  rL   r   )r%   ru   descriptionr)  rQ   r$   already_appendedrows           r&   r  zCmfM2MBase.append  s   c7#))Cc3//4Cc!% & 	C1vyyCFF"q6X%'+$q6X%MM((-	 ,,- 	C1vyyCFF"q6X%'+$q6X%((//4	 h[9:##XsK$@A=='+DMM$<<DMMeqjC&--dmm57-K;;c!c&<KKs# '=!r(   c                 f    t        |      D ]#  \  }}| j                  ||xr ||   xs d        % y )N)r  )	enumerater  )r%   objsdescriptionsiru   s        r&   r  zCmfM2MBase.extend  s9    o 	SFAsKK)I,q/)QTKR	Sr(   c                    d| _         t        |t              rt        j	                  |      }d}t        | j                        D ]O  }|d   j                  |j                  k(  s |d   dk(  r| j                  j                  |        n|d   dk(  sNd}Q t        | j                        D ]O  }|d   j                  |j                  k(  s |d   dk(  r| j                  j                  |        n|d   dk(  sNd}Q |ry| j                  j                  d|f       | j                  j                  d|f       d| _        | j                  rE| j                  r9|dk(  r4t        || j                        j                  | j                  |dz          | j                  rd| j                  _        | j                  d	ur+|| j                  v r| j                  j                  |       yyy)
r  NFri  r   r  r  Tr(  .)r  rM   r-   r  rr  r   rw  ry   r  r  r  r   r&  rW   rL   r   )r%   ru   r)  rQ   r$   already_removedr  s          r&   r  zCmfM2MBase.remove  s   !%c3//4C& 	+C1vyyCFF"q6X%MM((-q6X%&*O	+ ,,- 	+C1vyyCFF"q6X%((//4q6X%&*O	+ h_-##XsO4<<DMMeqjC&--dmm57-K=='+DMM$;;c!cT[[&8KKs# '9!r(   c                    g }|g }|D ]W  }t        |t              r|j                  }t        |t        t        f      rt
        |   |      }|sG|j                  |       Y | j                  du r.| j                  j                  rg | _        n| j                          t        | j                        D ]:  }|j                  |D cg c]  }|j                   c}vs*| j                  |       < | j                  D ch c]  }|j                   }}|D ]"  }|j                  |vs| j                  |       $ |S c c}w c c}w r   )rM   ra   rz   r   r-   r6   r   r  r   rW   r   r   r   ry   r  )r%   rz   r  valru   	value_idsr>   s         r&   r   zCmfM2MBase.cast<  s    =E 
	#C #w'ii#c{+gl3'c"
	# ;;#}}## 		$ 	!Cvv7cff77C 	! (,zz2SVV2	2 	!CvvY&C 	!  8 3s   D> Ec                     t         r)   r  r   s    r&   r  zCmfM2MBase.m2m_model_cls_name\  r  r(   c                 \    | j                         D ]  }|j                  |      }|s|c S  y r)   )r  rU   )r%   ry   r  related_objs       r&   get_related_objzCmfM2MBase.get_related_obj`  s5    ((* 	#E))B-K""	# r(   Fc                     | j                   dur|s| S | j                   g}|r|D cg c]  }| j                   d|  }} | j                  j                  |fd|i| | S c c}w )N.r   r   )r   rD   rW   r   r   r  r&  r  r  r   ry   r  select_relatedleftapply_changesr   )r%   r   r   r$   paramsfr  s          r&   r   zCmfM2MBase.loadh  ss    99CK__%'8>?1)1#.?F?!!!&@@@ @s   A"c                    ddl m} ddlm} | j                  xs | j                  g}dd| j
                  j                  gdd| j                  gdd|gg}|j                  j                  |d	g
      }|D 	ch c]  }	|	j                  s|	j                   }
}	|r|
S |
D ch c]  }|j                  ||      x}s| }
}|
S c c}	w c c}w )u   
        Запрос all_nested наоборот. Не вложенные сущности, а все родительские
        r   r  r  child_idrT  child_fieldparent_modelr  	parent_id)r  r   r   )r   r   r  r  r  rW   ry   rD   r  slistr  get_obj_by_id)r%   id_onlyr   r  r   r  group_model_namesrelation_filterrelation_listrelationr  group_idru   s                r&   all_parentszCmfM2MBase.all_parents  s     	'$ KK7DJJ<dmm../C1T#45

 ,,22/S^R_2`5BYhFXFX($$YYM&,h(8M8Mh_e8M8f1f1f#hh Z
 is   6CC C;Cc                 
   | j                   D ]V  ^}}}|dk(  r	 | j                  j                  |       (|dk(  r	 | j                  j	                  |       Jt        d|        y # t        $ r Y ew xY w# t        $ r Y tw xY w)Nr  r  u*   Неизвестное изменение )r  r   r  r  r  )r%   change_typerW   rQ   s       r&   r  zCmfM2MBase.apply_changes  s    ,0,@,@ 	](KDh&KK&&x0 (KK&&x0 !#Mk]![\\%	] "  	 "  	s"   A'A6'	A32A36	BBr   )r)  	only_datainvalidate_donec          	      N   t        |   |||d| ddlm} ddlm} ddlm} ddlm}	 |sdt        j                  d       | j                  j                  r|j                  | j                  d       n|j                  | j                  d	       | j                  D ]^  ^}
}}d }| j                  r|}| j                  }| }nV| j                   r1|}| j                  }| j"                  r0t%        || j"                        }nt'        d
| j(                   d      |j+                  |j(                  g       |	j,                  rd}| j/                          d|j0                   d|j0                   }t        j                  d| d       |j2                  j4                  j6                  j9                         j;                  |d|i      }t=        |      }t        j                  d| d       | j?                         jA                  |j0                  |j0                  d d      }|
dk(  r|r/ddlm!}  |d| j                   d| j(                   d| d        | j?                         ||      }|r
|d   |_"        |jG                         5   |j                  |d|dz   i| |jH                  jK                  | |       d d d        n|
d k(  r|s/ddlm!}  |d!| j                   d| j(                   d| d       e|jG                         5  |jM                          |jH                  jO                  | |j0                  jP                         d d d        |j                  | j                  |
|| j(                  "       t%        |d#d       r|
d k(  rMtS        |d$      rA|jT                  jW                          |jT                  r/ |j                  |d|dz   i| H |j                  |d|dz   i| a g | _        d | _,        y # 1 sw Y   xY w# 1 sw Y   xY w)%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_idTECHCOM_nocacher  r+  u]   DEV: попытка добавления уже существующей м2м связи у r   r  Fabort)r  rightr)  ri  r,  r  uV   DEV: попытка удаления несуществующей м2м связи у )m2m_field_namer.  cmf_deleted)-r6   r   cmf.appr  r   r   r  r  r   r   r   rW   r   
invalidater  r  r  r&  rL   r#   rD   _acl_check_writeM2M_DUB_PROTECT_LOCKr  ry   
CmfProjectdpdata_driverSessionexecuter   r  rU   r   r  disable_aclr  r0  deleter/  rz   rw  r  r   r  )r%   r)  r  r  rQ   r$   r  r   r  r   r  ru   cargs
left_fieldr  r  lock_sqlr  lock_resr  r   r>   s                        r&   r   zCmfM2MBase.save  sS   d%9GG%&$& GGvx}}##$$T]]H=$$T]]H=#'#7#7 I	?FC%Jyy}}!
<<!(t||!<J,t.??l mnn !!j6K6K5L!M** h!%!8!8!: ;1TWWIQuxxjQ4[MCD!,,//;;CCEMMh);Y   >5k]!DE ))+//%((\`rv/wH!5 }  C  L  L  ~M  MN  OS  O^  O^  N_  _a  be  af  g  ot  u/4--/TG+08H(((* O!HMM4CuqyCFC((<<T#<NO O 8#5 vw{  xE  xE  wF  FG  HL  HW  HW  GX  XZ  [^  Z_  `  hm  n((* TOO%((??cffllST
   DOO \ 3 3T:X%'#}*E OO((*?? $BeaiB6BCHHd>%!)>v>SI	?T  "!%=O OT Ts   5PAPP	P$	c                     |dkD  ry | j                   dur;| j                  s/| j                  D ]   }t        |dd       r|j	                          " g | _        t        |           y )Nri  .r.  )r   r   rz   rL   r   rw  r6   )r%   r)  rS   r>   s      r&   r   zCmfM2MBase.flush	  s_    19;;c!$,,ZZ 1148	  	r(   r)   )Nri  )ri  r   )FNr>  ) r*   r+   r,   r    r  r  r&  r  rK   r   r}   r   r   r  r  r'   r  rN   rq  rr  r  r  r  r   r  r  r   r  r  r   r   r^   r_   s   @r&   rp  rp    s    GDEG**-TTL""-.& 6 6) l l l l%$NS"$H@ " "<,], !"UE _&B r(   rp  c                   R    e Zd Zd ZdZdZdZed        Ze	d        Z
e	d        Zd Zy)CmfM2M.Nc                 (    dj                  | |g      S r   )r   )	left_name
right_names     r&   _m2m_model_cls_namezCmfM2M._m2m_model_cls_name*	  s    ww	:.//r(   c                    | j                   r0| j                  | j                  j                  | j                        S | j
                  r0| j                  | j                  | j                  j                        S t        d      )Nu2   Не определено left это или right)r  r  rn   rD   r  r  r#   r   s    r&   r  zCmfM2M.m2m_model_cls_name.	  sb    88**3+=+=+H+H#))TTYY**399c6H6H6S6STTPQQr(   c                 @    ddl m} t        |      | j                     gS rl  rC  rE  s     r&   r  zCmfM2M.related_models7	  s    &VSYY'((r(   c                     t        |      t        uret        |      j                  | j                  k7  rBt	        d| j
                   d| j                   d| dt        |       d| j                   d      y y NrS  r   rT  rU  rV  r   )r   r   r*   r  r   rW   rD   r   s     r&   r   zCmfM2M.validate=	  s    ;d"tE{';';tzz'I ?aPTP_P_O``abgahhjkopukvjwwz{  |F  |F  {G  GH  I  J  J (J"r(   )r*   r+   r,   r  r    r  r&  r  r  r  r  r  r   r.   r(   r&   r  r  $	  sX    FGEG0 0 R R ) )
Jr(   r  c                   F    e Zd Zd ZdZdZdZdZed        Z	ed        Z
d Zy)CmfGenericM2M.Nc                     | j                   r(| j                   | j                  j                          S | j                  j
                   | j
                  j                          S r)   )r  r  r&  
capitalizern   rD   r   s    r&   r  z CmfGenericM2M.m2m_model_cls_nameJ	  sT    99ii[!7!7!9 :;;$$//01J1J1L0MNNr(   c                    ddl m} | j                  r&| j                  D cg c]  }t        |      |    c}S | j                  r&| j                  D cg c]  }t        |      |    c}S t        |      | j                     gS c c}w c c}w rl  )r   r   r  rD  r  )rP   r   r:   s      r&   r  zCmfGenericM2M.related_modelsP	  sp    &8836::>4DL&>>zz7:zzBtVT*BBL+,,	 ? Cs   BB	c                    | j                   rvt        |      t        urdt        |      j                  | j                   vrBt	        d| j
                   d| j                   d| dt        |       d| j                    d      y y y r  )r   r   r   r*   r   rW   rD   r   s     r&   r   zCmfGenericM2M.validate[	  s    ;;E{$&4;+?+?t{{+R!$CDMM?RSTXTcTcSddefkellnostyozn{{~  @D  @K  @K  L  LM  #N  O  O ,S& r(   )r*   r+   r,   r  r    r   r  r&  r  r  r  r   r.   r(   r&   r  r  C	  sI    FGFEGO O
 - -Or(   r  c                       e Zd ZdZd Zy)	CmfStatus.N)r*   r+   r,   r    r  r.   r(   r&   r  r  a	  s    GEr(   r  c                   0     e Zd ZdZdZd Zd Z fdZ xZS )	CmfChoice.Nc                 N    | j                  | j                  | j                        S r)   r   r|   s    r&   r   zCmfChoice._html_diffk	  r   r(   c                    ddl m} d }| j                  r;t        | j                  |      r%| j                  j                  | j                        }| j                  xs i }|r@|d   j                  | j                        r"|d   | j                     j                  d|      }|r(||j                  ||      }||j                  ||      }t        | )  ||      S Nr   )rL  	ui_fieldschoices)rN  rL  rW   rW  rn   _build_ui_formr  rU   rD   r6   r   r%   r   r   rL  ui_form_customr  r>   s         r&   r   zCmfChoice._simple_html_diffn	  s    (==Z(;(;YG!00??NN,,$"n[9==dooN$[1$//BFFyRYZG$#KK	9=	$#KK	9=	w(I>>r(   )	r*   r+   r,   r    r  r  r   r   r^   r_   s   @r&   r  r  f	  s!    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                  r;t        | j                  |      r%| j                  j                  | j                        }| j                  xs i }|r@|d   j                  | j                        r"|d   | j                     j                  d|      }|r:||j                  t        |      |      }||j                  t        |      |      }t        | -  ||      S r  )rN  rL  rW   rW  rn   r  r  rU   rD   r$  r6   r   r  s         r&   r   zCmfChoiceInt._simple_html_diff	  s    (==Z(;(;YG!00??NN,,$"n[9==dooN$[1$//BFFyRYZG$#KKI	B	$#KKI	B	w(I>>r(   )r*   r+   r,   r    r  r  r   r^   r_   s   @r&   r  r  	  s    GGF? ?r(   r  c                   "     e Zd Z fdZdZ xZS )CmfEmailc                 n    |r$t        j                  d|      st        d|       t        |   |      S )Nz[^@]+@[^@]+\.[^@]+u8   Неправильный формат ввода email: )rM  matchr   r6   r   r7  s     r&   r   zCmfEmail.validate	  s9    "7?$'_`e_f%ghhw&&r(   .r*   r+   r,   r   r    r^   r_   s   @r&   r  r  	  s    '
 Gr(   r  c                   "     e Zd Z fdZdZ xZS )
CmfOrgNamec                     t        j                  d      }|j                  |      st        d      t        |   |      S )Nz^([a-z0-9-]+)+$u=   Неправильный формат имени домена)rM  compiler  r   r6   r   )r%   rz   patternr>   s      r&   r   zCmfOrgName.validate	  s:    **./}}U#$%deew&&r(   .r  r_   s   @r&   r  r  	  s    ' Gr(   r  c                       e Zd ZdZy)CmfLogin.Nr)  r.   r(   r&   r  r  	  r*  r(   r  c                       e Zd ZdZdZd ZdZ ej                  d      Z	e
j                  dz   Zd Z fdZd Zed	        Zej"                  d
        Zed        Zed        Zed        Zed        Zej"                  d        Z xZS )CmfPhoneu  
    Храним в одном поле номер и коментарий:
    Через обязательный разделитель ";":
        person.phone.value == '79998005008;доб 123'
        person.phone2.value == '79998005008;'
        person.phone3.value == ';потерялся'

        person.phone4.value == '79998005008;номер жены'
        person.phone4.number == '79998005008'
        person.phone4.info == 'номер жены'
    .u+   Формат: +7 999 999-99-99, доб. 210z^\d*;.*$)VALUE_REc                     ddl m} d g|j                  xs g D ]:  }t        j                  ||      }|j                         s*|j                         c S  t        d||j                        )Nr   r   ?   Введите корректный номер телефона)r   r   PHONE_REGIONSphonenumbersPhoneNumberMatcherhas_nextnextr   )r%   rz   r   regionmatchers        r&   _matchzCmfPhone._match	  sq    &;v339r; 	&F"55eVDG!||~%	& !!bdikqkk  A  	Ar(   c                 $   |sy| j                   j                  |      rt        |   |       y| j	                  |      }|j
                  }t        j                  |      rt        j                  |      st        d      t        |   |       y)zV
        Valid values: [0-9]*;.*
        Castable: Any text with valid number
        Nr  )
r  r  r6   r   r  numberr	  is_valid_numberis_possible_numberr   )r%   rz   r  phoner>   s       r&   r   zCmfPhone.validate	  sy    
 ==u%GU#E",,U38W8WX]8^$%fggr(   c                    |s|S |dk(  ry| j                  |      }|j                  }t        j                  |      rt        j                  |      st        d      |d |j                   ||j                  d  z   j                         }|j                         j                  d      }t        j                  |t        j                  j                        dd  }|dz  }|j                  r|d|j                   z  }|r|dz  }||z  }|S )N;rb   r  z ,;ri  u   доб. z, )r  r  r	  r  r  r   startendstripformat_numberPhoneNumberFormatE164	extension)r%   rz   r  r  infos        r&   r   zCmfPhone.cast	  s    LC< E",,U38W8WX]8^$%fgglu{{#eEIIJ&77>>@zz|!!%(**5,2P2P2U2UVWXWYZ??x011Er(   c                 |    | j                   r0| j                   j                  d      d   }|j                         r|S y )Nr  r   )rz   	partitionr  )r%   r  s     r&   r  zCmfPhone.number	  s3    ::**&&s+A.C{{}
r(   c                 b   |r| j                  |      }|j                  }t        j                  |      rt        j                  |      st        d      t        j                  |t        j                  j                        dd  }| d}nd}| j                  r|| j                  z  }|| _
        y )Nr  ri  r  )r  r  r	  r  r  r   r  r  r  r  rz   )r%   rz   r  r  r   s        r&   r  zCmfPhone.number
  s    KK&ELLE 007L<[<[\a<b()jkk ..ul6T6T6Y6YZ[\[]^E 'II99"I
r(   c                     | j                   rct        j                  d| j                   j                  d      d    d       }t        j                  |t        j
                  j                        S y N+r  r   )rz   r	  r6  r   r  r  r  r%   r  s     r&   number_e164zCmfPhone.number_e164
  s[    :: &&4::+?+?+DQ+G*H'I4PE--e\5S5S5X5XYY r(   c                     | j                   rct        j                  d| j                   j                  d      d    d       }t        j                  |t        j
                  j                        S y r#  )rz   r	  r6  r   r  r  NATIONALr%  s     r&   number_nationalzCmfPhone.number_national
  s[    :: &&4::+?+?+DQ+G*H'I4PE--e\5S5S5\5\]] r(   c                     | j                   rct        j                  d| j                   j                  d      d    d       }t        j                  |t        j
                  j                        S y r#  )rz   r	  r6  r   r  r  INTERNATIONALr%  s     r&   number_internationalzCmfPhone.number_international"
  s[    :: &&4::+?+?+DQ+G*H'I4PE--e\5S5S5a5abb r(   c                 n    | j                   s| j                   S | j                   j                  d      d   S )Nr  r   )rz   r   r|   s    r&   r  zCmfPhone.info(
  s-    zz::zz##C(++r(   c                 \    | j                   r| j                    d}nd}|r||z  }|| _        y )Nr  )r  rz   )r%   rz   r   s      r&   r  zCmfPhone.info.
  s2    ;;;;-q)III
r(   )r*   r+   r,   r  r    r  r  rM  r  r  rX  rK   r  r   r   rN   r  r  r&  r)  r,  r  r^   r_   s   @r&   r  r  	  s    
 GF?Krzz+&H((=8LA ">   ]]  Z Z
 ^ ^
 c c
 , ,
 
[[ r(   r  c                       e Zd ZdZd Zy)CmfMarkdown.NrQ  r.   r(   r&   r0  r0  @
  s    GFr(   r0  c                       e Zd ZdZd Zy)	CmfMarkup.NrQ  r.   r(   r&   r2  r2  E
  s    GFr(   r2  c                       e Zd Zd ZdZd Zy)CmfUrl.c                      ||S d|vrd|z   S |S )Nz://zhttp://r.   r   s     r&   r   zCmfUrl.castN
  s$    =Lu$$Lr(   N)r*   r+   r,   r  r    r   r.   r(   r&   r4  r4  J
  s    FGr(   r4  c                       e Zd ZdZdZy)CmfUrlShort.r`  NrU  r.   r(   r&   r7  r7  W
  r]  r(   r7  c                   0    e Zd ZdZdZdZd Zd Zd Zd Z	y)CmfJson.NCmfJSONc                 `    | j                   | j                   S t        | j                   d      S NF)ensure_ascii)rz   r   r|   s    r&   r   zCmfJson.db_formata
  s'    ::::TZZe44r(   c                 8   t        |t              r3|j                         D ci c]  \  }}|| j                  |       c}}S t        |t              r|D cg c]  }| j                  |       c}S t        |t
              r|j                  S |S c c}}w c c}w r)   )rM   r   r  r   r   ra   r   )r%   rz   rR   rS   s       r&   r   zCmfJson.castf
  sw    eT"05>1Atyy|O>>t$*/0QDIIaL00w'::L ?0s   BBc                 z   ddl m} | j                  s| j                          | j                  g | _        t        | j                  t              s |d| d|  d| j                   d       || j                  vrA| j                  j                  |       d| _        | j                  rd| j                  _        y y y )Nr   r+  u,   Не возможно сделать append #   , т.к. значение поля     не список: Tr  )
r   r   r   r   rz   rM   r   r  r   rW   r%   rz   rQ   r$   r   s        r&   r  zCmfJson.appendq
  s    )IIK::DJ$**d+>ugEhimhn  oC  DH  DN  DN  CO  P  X\] 

"JJe$"DO}}+/(  #r(   c                 n   ddl m} | j                  s| j                          | j                  y t        | j                  t              s |d| d|  d| j                   d       || j                  v rA| j                  j                  |       d| _        | j                  rd| j                  _        y y y )Nr   r+  u,   Не возможно сделать remove r@  rA  Tr  )
r   r   r   r   rz   rM   r   r  r   rW   rB  s        r&   r  zCmfJson.remove
  s    )IIK::$**d+>ugEhimhn  oC  DH  DN  DN  CO  P  X\] DJJJJe$"DO}}+/(  r(   )
r*   r+   r,   r    r5   r  r   r   r  r  r.   r(   r&   r9  r9  \
  s%    GMF5
0"0r(   r9  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   ri  z0.00c                     t               5 }t        |_        t        t	        || j
                              cd d d        S # 1 sw Y   y xY w)N)r  )r   r   roundingr-   roundscale)rP   rz   ctxs      r&   _as_strzCmfNumeric._as_str
  s8    ^ 	8s(CLuUCII67	8 	8 	8s   +A  A	c                     | j                   si S | j                  d n| j                  | j                        | j                  d dS | j                  | j                        dS r  )r   rw   rM  rx   r|   s    r&   r   zCmfNumeric.audit_diff
  sY    I88+4dhh1G88+4
 	
15dhh1G
 	
r(   c                 *    |y| j                  |      S )Nr   )rM  r   s     r&   r   z CmfNumeric._format_for_html_diff
  s    =(||E""r(   c                 >    || j                   sy|s|S t        |      S r  )r   r   r   s     r&   r   zCmfNumeric.cast
  s"    =L5>!r(   c                     t         j                  r$ t        |       |      }| j                  r|dkD  ryyt        |   |      S r  r  r  s      r&   r  zCmfNumeric.__lt__
  r  r(   c                     t         j                  r$ t        |       |      }| j                  r|dk\  ryyt        |   |      S r  r  r  s      r&   r  zCmfNumeric.__le__
  r  r(   c                     t         j                  r$ t        |       |      }| j                  r|dk  ryyt        |   |      S r  r  r  s      r&   r  zCmfNumeric.__gt__
  r   r(   c                     t         j                  r$ t        |       |      }| j                  r|dk  ryyt        |   |      S r  r"  r  s      r&   r  zCmfNumeric.__ge__
  r#  r(   )r*   r+   r,   r    r5   r  	precisionrK  r%  r&  stepr  r  rM  r   r   r   r  r  r  r  r^   r_   s   @r&   rE  rE  
  sj    GMFIE
C
CDK8 8

#
"%%%% %r(   rE  c                   :    e Zd ZdZeZd ZdZ e       Ze	d        Z
y)CmfObjectList.Nc                 d    ddl m} | j                  D cg c]  }t        |      |    c}S c c}w rl  rk  rl  s      r&   r  zCmfObjectList.related_models
  rm  rn  )r*   r+   r,   r    r   r5   r  r   rc   r  r  r.   r(   r&   rX  rX  
  s/    GMFFfG= =r(   rX  c                   0    e Zd ZdZdZd ZdZdZed        Z	y)	CmfObject.Nc                 d    ddl m} | j                  D cg c]  }t        |      |    c}S c c}w rl  rk  rl  s      r&   r  zCmfObject.related_models
  rm  rn  )
r*   r+   r,   r    r5   r  r   rc   r  r  r.   r(   r&   r[  r[  
  s-    GMFFG= =r(   r[  c                       e Zd ZdZy)CmfLikes.Nr)  r.   r(   r&   r^  r^    r*  r(   r^  c                       e Zd ZdZy)CmfViews.Nr)  r.   r(   r&   r`  r`    r*  r(   r`  c                       e Zd ZdZy)CmfTags.Nr)  r.   r(   r&   rb  rb  	  r*  r(   rb  c                       e Zd ZdZdZd Zy)CmfObjectJsonu@   Сохраняем и отдаём объект в виде JSON.Nr-  r.   r(   r&   rd  rd    s    JGFr(   rd  c                   X     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                 P    |t         |   |      S t        j                  |      S r)   )r6   r   rf  db_castr7  s     r&   r   zCmfIPv4NetworkList.cast  s(    =7<&&!))%00r(   c                      y r)   r.   r   s     r&   r   zCmfIPv4NetworkList.validate  r   r(   c                 l    | j                   ry | j                  D cg c]  }t        |       c}S c c}w r)   )r   rz   r-   r%   rS   s     r&   r   zCmfIPv4NetworkList.json  s(    << $

+1A+++s   1c                 `    | j                   | j                   S t        | j                  d      S r<  )rz   r   r   r|   s    r&   r   zCmfIPv4NetworkList.db_format$  s'    ::::TYYU33r(   c                     ||S t        |t              rt        |      }|D cg c]  }t        j                  |       c}S c c}w )u9   убрать после рефакторинга
        )rM   r-   r   r  r  )rP   rz   rS   s      r&   ri  zCmfIPv4NetworkList.db_cast)  s@     =LeS!%LE278Q	%%a(888s   Ac                     | j                   si S | j                  D cg c]  }t        |       c}| j                  D cg c]  }t        |       c}dS c c}w c c}w r  )r   rw   r-   rx   rl  s     r&   r   zCmfIPv4NetworkList.audit_diff3  sJ    I$(HH-qCF-$(HH-qCF-
 	
--s
   AA)r*   r+   r,   r    r  r   r   rN   r   r   r  ri  r   r^   r_   s   @r&   rf  rf    sI    GF1 , ,
4
 9 9
r(   rf  c                   B     e Zd ZdZdZddgZdZdZdZdZ	dZ
 fdZ xZS )	CmfCodeu   КодTrc   gin_trgmu3   Код в реальном мире из жизниr)   r   c                     ddl m} |s|S |j                         }| j                  dk(  r?t	        |      | j
                  kD  r'|d | j
                  dz
    d|j                  |d       }t        | !  |      S )Nr   )cmf_hashlibr     r     )	r  rt  r  truncater   r?  short_str_encr6   r   )r%   rz   rt  r>   s      r&   r   zCmfCode.castD  st    (L==F"s5zDOO'C1doo1231[5N5NuVW5X4YZEw|E""r(   )r*   r+   r,   r    rl   r  rk   r  r  rw  r   r   r^   r_   s   @r&   rq  rq  :  s:    G
Ej)KFHAGHI# #r(   rq  c                        e Zd ZdZdZdZddgZy)CmfNameu   Имя объектаu   object.name - статичное поле для представления в ui, аналог repr, генерируем методом если не заданоTrc   rr  N)r*   r+   r,   r    r  rl   r  r.   r(   r&   rz  rz  M  s    #G_G
Ej)Kr(   rz  __main__ababza:bzb:ar)   )ir  rM  r   r   r   r   r   r   typingr	   r
   r   rj  r   r   decimalr   r   r   dateutil.parserr4  r	  ujsonr   r   cmf.base_errorr   r   r   r   r  r   r   r   r   r   r-   r1   r   r3   ra   r  r  r  r(  r,  r/  r<  r=  rP  rS  rX  r[  r_  rb  r  rz  r}  r  r  r  r  r  r  r  r  r  r  r@  rG  rK  rZ  rf  ri  rp  r  r  r  r  r  r  r  r  r  r0  r2  r4  r7  r9  rE  rX  r[  r^  r`  rb  rd  rf  rq  rz  r*   likestestrz   r  r   r.   r(   r&   <module>r     s    	  > > ' '  8 8    ` `   Cz"	 	.Q .# .47 .*($ *(be
$ e
$Pu
 u
nJg J$>%W >%D & 
g 
6w .4W .4bf 
v 
v 
 
 
 
-Rx -Rb' ( 
g X DX . '* 'B]%g ]%B/
7 /
b_%' _%F	 	^j ^B)/ )" ,K#5 K**'Z *'Z> >	= 	=U UpJZ J>OJ O< 
? ?@?6 ?*y  x Bx BX' 
 

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