B
    fl                @   s  d dl Z d dlZd dlmZ d dlmZmZmZmZmZ d dlm	Z	m
Z
mZ d dlmZmZ d dlmZmZmZ d dlZd dlZd dlmZmZ d dlmZmZmZmZ d d	lmZ d d
l m!Z! G dd dZ"e
dddZ#de	e# e	e# dddZ$G dd de%Z&G dd de&dZ'G dd de'Z(G dd de'Z)G dd de'Z*G dd de*Z+G d d! d!e*Z,G d"d# d#e'Z-G d$d% d%e'Z.G d&d' d'e'Z/G d(d) d)e/Z0G d*d+ d+e/Z1G d,d- d-e/Z2G d.d/ d/e/Z3G d0d1 d1e/Z4G d2d3 d3e/Z5G d4d5 d5e2Z6G d6d7 d7e'Z7G d8d9 d9e6Z8G d:d; d;e'Z9G d<d= d=e1Z:G d>d? d?e2Z;G d@dA dAe2Z<G dBdC dCe5Z=G dDdE dEe'Z>G dFdG dGe'Z?G dHdI dIe'Z@G dJdK dKe@ZAG dLdM dMe(ZBG dNdO dOeBZCG dPdQ dQeBZDG dRdS dSeDZEG dTdU dUe(ZFG dVdW dWeFZGG dXdY dYeFZHG dZd[ d[e(ZIG d\d] d]eIZJG d^d_ d_eIZKG d`da daeCZLG dbdc dce1ZMG ddde dee*ZNG dfdg dge4ZOG dhdi die2ZPG djdk dkeOZQG dldm dme2ZRG dndo doe0ZSG dpdq dqe0ZTG drds dse5ZUG dtdu dueUZVG dvdw dwe'ZWG dxdy dye'ZXG dzd{ d{e'ZYG d|d} d}e'ZZG d~d deWZ[G dd deWZ\G dd deWZ]G dd deWZ^G dd deWZ_e`dkrde/dd kstadde/d kstade/de/d kstae/ddk stae/de/dk stade/dk s tae/ddks2tae/de/dksHtade/dksZtae/ddksltae/de/dkstade/dkstae/ddkstae/de/dkstade/dkstae/ddkstae/de/dkstade/dkstae/ddkstae/de/dks0tade/dksBtae[ Zbe6de6gZce6de6dgeb_debjde6de6dgkstaebjdddgkstae@e ZeejfkstadS )    N)copy)datedatetime	timedeltatimezonetime)TypeTypeVarUnion)UUIDuuid1)DecimalROUND_CEILINGlocalcontext)dumpsloads)CmfCastErrorCmfOrmErrorCmfOrmImplicitLazyLoadCmfValidationError)htmldiff)gc               @   s   e Zd Zdd ZdS )	FieldDatac             K   s   || _ || _|| _d S )N)basecaptionkwargs)selfr   r   r    r   ./cmf/fields/base_fields.py__init__   s    zFieldData.__init__N)__name__
__module____qualname__r   r   r   r   r   r      s   r   TZCmfModel)Zbound)r   returnc             K   s   t | |fd|i|S )Nreadonly)r   )r   r   r%   r   r   r   r   Field   s    r&   c                   s8   e Zd Z fddZdd Zd
ddZddd	Z  ZS )CmfTypeMetac                sJ   t  | |||}d|kr,|jdkr,tdd|krF|jdkrFtd|S )Nr   .u   Укажите captioninternal_typeu   Укажите internal_type)super__new__r   AttributeErrorr(   )Zmcsnamebases	namespacer)	__class__r   r   r*   "   s    

zCmfTypeMeta.__new__c             O   s   | j | _| jrd| jkrd| _| jdr0d| _i | _xRt| D ]F}|drPq@|| j	kr\q@t
| |}t|trrq@t|r|q@|| j|< q@W d S )N	load_modelazyZcf_T_)r    
class_namevirtual__dict__r1   
startswithcustomui_metadirui_meta_skipgetattr
isinstancepropertycallable)clsargsr   kvr   r   r   r   /   s"    



zCmfTypeMeta.__init__Nc             C   s   |  ||S )N)get)r@   instanceownerr   r   r   __get__F   s    zCmfTypeMeta.__get__c             C   s   |  ||S )N)set)r@   rE   rF   r   r   r   __set__J   s    zCmfTypeMeta.__set__)N)N)r    r!   r"   r*   r   rG   rI   __classcell__r   r   )r0   r   r'   !   s   
r'   c               @   sX  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eed< dZeed	< dZ eed
< dZ!dZ"dZ#dZ$dd Z%dd Z&dd Z'dddZ(dd Z)dd Z*dd Z+dd Z,e-dd Z.e-dd Z/e/j0d d Z/d!d" Z1e.j0d#d Z.d$d% Z2e-d&d' Z3e-d(d) Z4e-d*d+ Z5e-d,d- Z6e-d.d/ Z7e8dd0d1Z9e8d2d3 Z:d4d5 Z;d6d7 Z<d8d9 Z=d:d; Z>d<d= Z?e8d>d? Z@dd@dAZAdBdC ZBdDdE ZCdFdG ZDdHdI ZEdJdK ZFdLdM ZGdNdO ZHdPdQ ZIdRdS ZJdTdU ZKdVdW ZLdXdY ZMdZd[ ZNd\d] ZOd^d_ ZPd`da ZQdbdc ZRddde ZSdfdg ZTdhdi ZUdjdk ZVdldm ZWdndo ZXdpdq ZYdrds ZZdtdu Z[dvdw Z\dxdy Z]ddzd{Z^d|d} Z_d~d Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd ZkdddZldd Zmdd Zndd Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd ZxdddZydd Zzdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd ZddÄ Zddń ZddǄ ZddɄ Zdd˄ Zddd̈́Zddτ Zddф Zddӄ ZddՄ Zddׄ Zddل Zddۄ Zdd݄ Zdd߄ Zdd Zdd Zdd ZdS )CmfTypeu  
    load_mode
        load_mode=default, грузим по
            [] - id code name
            [*] - Первый уровень
            [**] - +FK +GFK
            [***] - +M2M + GM2M
        load_mode=always, грузим поле всегда, даже если его не указали в списке полей.
            Например: status_color, status_type, person_login. Как замена backref_load_mode = "load"
        load_mode=lazy, никогда не грузим по *, кроме явного указания в списке полей. Например: Photo, Blob

    subclassed_relation, всегда ленивая, если явно указали, то грузится отдельным запросом, а не через join
    . NTFdefaultoptions_list_query_allno_acl	api_allow)r9   r;   r(   db_namedb_aliasrM   primary_keyuniqueindex	lazy_loadr1   instance_classrequired_fieldsc             C   s   d S )Nr   )r   valuer   r   r   validate   s    zCmfType.validatec             C   s0   |d kr|S | j d k	r,t|| j s,|  |S |S )N)r(   r=   )r   rY   r   r   r   cast   s    

zCmfType.castc             C   s   | j S )N)rY   )r   r   r   r   	db_format   s    zCmfType.db_formatc             K   s0   |r| j rd| _d| _n| jj| jg|d | S )u+   fields относительно филда.N)fieldsforce)r5   _value_oldrE   load_fieldsr4   )r   r]   r^   r   r   r   r   load   s    zCmfType.loadc             O   s   d S )Nr   )r   rA   r   r   r   r   save   s    zCmfType.savec             O   s.   d| _ | j| _t| jttfr*t| j| _d S )NF)
is_changedr_   r`   r=   listdictr   )r   rA   r   r   r   r   flush   s    zCmfType.flushc          
   C   sv   yt | jd| j | j}W nT tk
rp } z6ddlm} dd l}|d| d|	   |W d d }~X Y nX |S )Nr3   r   )r   u5   DEV: ошибка рассчета virtual-поля: 
)
r<   rE   r4   r_   	Exceptionflaskr   	tracebackdebug
format_exc)r   reser   rk   r   r   r   virtual_getter   s    zCmfType.virtual_getterc             C   sT   t t| jd| j js>ddlm} |d| j| j| d S t| jd| j |S )Nr3   r   )r   u   Не получилось выполнить присвоение, т.к. нет сеттера у виртуального поля)	r<   typerE   r4   fsetrj   r   rl   setattr)r   r_   r   r   r   r   virtual_setter   s    zCmfType.virtual_setterc             C   s   |   S )N)
_get_value)r   r   r   r   rY      s    zCmfType.valuec             C   s>   | j dk	s| jr| jjr| j S td| jj d| j dd S )N.u$   old не загружен из БД .ud    загрузите явно поле в save_preload_fields или в field_loads или field.load)r`   rE   is_newr   r4   )r   r   r   r   old   s    zCmfType.oldc             C   s   t dd S )Nu=   Нельзя устанавливать .old значения)ri   )r   rY   r   r   r   rx      s    c       	      C   s  | j dk	s| jr| jjr,| jr&|  S | j S ddlm}m} ddlm	} t
|dd r|d| jj d| j  | jdgd	 | jr|  S | j S |d
| jj d| j  |jr|jsdd l}ddlm}m} d }|jr|jj|jd}|rd| jj d| j d}|d| d d 7 }|dt
|dd  7 }|dt
|dd  7 }dt|| d}|jjjd| jj d| j d|d|jj|jjd | jrt| jj d| j dt| jj d| j | jjd| j dgd	 | jr |  S | j S )N.r   )r   escape)configZdisable_raise_lazyloaduH   TODO2 if is_new: load_fields ЛЕНИВАЯ ПОДГРУЗКА ПОЛЯ rv   *)r]   u>   ПРОИЗОШЛА ЛЕНИВАЯ ПОДГРУЗКА ПОЛЯ )	cmf_alertmodels)codezField: rh   z
jsurl: Zjsurlz
api_method: Z
api_methodz<pre>z</pre>zRaise CmfOrmImplicitLazyLoad u    #Очередь0 #bug   )r,   textpriorityZresponsible_idZcmf_owner_iduf    загрузите явно само виртуальное поле и его зависимостиz**z.*) r_   rE   rw   r5   rp   rj   r   ry   cmf.includerz   r<   rl   r4   rb   ZRAISE_LAZYLOADZinteractive_shellrk   r|   r}   ZCMF_ADMIN_CODE	CmfPersonrD   joinformat_stackstrZCmfTaskZ	auto_taskZdelayidrY   r   ra   )	r   r   ry   rz   rk   r|   r}   ZadminZ	task_infor   r   r   ru      sJ    zCmfType._get_valuec             C   s
   |  |S )N)
_set_value)r   rY   r   r   r   rY      s    c             C   s   | j r| |S |dkr@td| jo(| jj d| j d| j t|trP|j}| 	|}|d kr| j
dkrtd| jo|| jj d| j d| j n
| | | jdk	r| j|k| _nd| _| jr| jrd| j_|| _d S )N.u-   Нельзя убирать значение rv    Fu7   Не могу присвоить значение None T)r5   rt   r   rE   r4   r   r=   rK   rY   r[   nullablerZ   r`   rd   r_   )r   rY   r   r   r   r   $  s&    
&


(

zCmfType._set_valuec             C   s   | j S )N)rY   )r   r   r   r   newL  s    zCmfType.newc             C   s   t | jtr| jjS | jS )N)r=   rY   rK   )r   r   r   r   jsonP  s    zCmfType.jsonc             C   s4   | j d krdS t| jttfr0t| jdkr0dS dS )NTr   F)rY   r=   r_   re   rf   len)r   r   r   r   is_nullW  s
    
zCmfType.is_nullc             C   s   | j  S )N)r   )r   r   r   r   is_not_null`  s    zCmfType.is_not_nullc             C   s
   | j dk	S )N.)r_   )r   r   r   r   
is_definedd  s    zCmfType.is_definedc             C   sB   |d kr| S | j |jkr6tdt|j d| j d|j| j  S )N'z' object has no attribute ')r    r6   r+   rq   r"   )r@   rE   rF   r   r   r   rD   l  s    zCmfType.getc             C   s   |j | j }||_d S )N)r6   r    rY   )r@   rE   rY   fieldr   r   r   rH   y  s    zCmfType.setc             C   s   t |S )N)r   )r   rY   r   r   r   _format_for_html_diff~  s    zCmfType._format_for_html_diffc             C   s<   |  |}|  |}|sd}|s$d}| j d| d| dS )Nu   Не указаноz: <del>u   </del> ➔ <ins>z</ins>)r   r   )r   	old_value	new_valuer   r   r   _simple_html_diff  s    

zCmfType._simple_html_diffc             C   s   |  | j| jS )N)r   rx   r   )r   r   r   r   
_html_diff  s    zCmfType._html_diffc             C   s   | j s
dS |  S )NrL   )rd   r   )r   r   r   r   	html_diff  s    zCmfType.html_diffc             C   s   | j s
i S | j| jdS )uA   
        Данные для таблицы аудита
        )rx   r   )rd   rx   r   )r   r   r   r   
audit_diff  s    zCmfType.audit_diffc             C   s
   | j pg S )N)rX   )r@   r   r   r   get_required_fields  s    zCmfType.get_required_fieldsc             C   s`   d| _ d | _d| _d| _|dk	r&|| _| jsP| jrP| jsP| jdd dksPd| _| js\d| _d S )NF.r      Zcache_r   r   )	rd   rE   r`   r_   rY   	log_levelvisibler5   r4   )r   rY   r   r   r   r     s    $zCmfType.__init__c             C   s    t |tr|j}t| j||S )N)r=   rK   rY   r<   )r   fnotherr   r   r   _compare  s    
zCmfType._comparec             C   s   t | j dt| j dS )N())rq   r"   reprr_   )r   r   r   r   __repr__  s    zCmfType.__repr__c             C   s
   t | jS )N)r   rY   )r   r   r   r   __str__  s    zCmfType.__str__c             C   s
   | j  S )N)rY   	__bytes__)r   r   r   r   r     s    zCmfType.__bytes__c             C   s   | j t| |j k S )N)rY   rq   )r   r   r   r   r   __lt__  s    zCmfType.__lt__c             C   s   | j t| |j kS )N)rY   rq   )r   r   r   r   r   __le__  s    zCmfType.__le__c             C   s6   |d kst |tr"|jr"| js"dS | jt| |jkS )NF)r=   rK   r   r   rY   rq   )r   r   r   r   r   __eq__  s    zCmfType.__eq__c             C   s   | j t| |j kS )N)rY   rq   )r   r   r   r   r   __gt__  s    zCmfType.__gt__c             C   s   | j t| |j kS )N)rY   rq   )r   r   r   r   r   __ge__  s    zCmfType.__ge__c             C   s
   t | jS )N)hashrY   )r   r   r   r   __hash__  s    zCmfType.__hash__c             C   s&   | j r| j jr| jdkrdS t| jS )N.F)rE   rw   r_   boolrY   )r   r   r   r   __bool__  s    zCmfType.__bool__c             C   s
   t | jS )N)r   rY   )r   r   r   r   __len__  s    zCmfType.__len__c             C   s
   | j  S )N)rY   __length_hint__)r   r   r   r   r     s    zCmfType.__length_hint__c             C   s
   | j | S )N)rY   )r   keyr   r   r   __getitem__  s    zCmfType.__getitem__c             C   s   |  || j|< d S )N)r[   rY   )r   r   rY   r   r   r   __setitem__  s    zCmfType.__setitem__c             C   s   | j |= d S )N)rY   )r   r   r   r   r   __delitem__  s    zCmfType.__delitem__c             C   s   | j |S )N)rY   __missing__)r   r   r   r   r   r     s    zCmfType.__missing__c             C   s
   | j  S )N)rY   __iter__)r   r   r   r   r     s    zCmfType.__iter__c             C   s
   t | jS )N)reversedrY   )r   r   r   r   __reversed__!  s    zCmfType.__reversed__c             C   s
   || j kS )N)rY   )r   itemr   r   r   __contains__$  s    zCmfType.__contains__c             C   s   | j t| |j  S )N)rY   rq   )r   r   r   r   r   __add__*  s    zCmfType.__add__c             C   s   | j t| |j  S )N)rY   rq   )r   r   r   r   r   __sub__-  s    zCmfType.__sub__c             C   s   | j t| |j  S )N)rY   rq   )r   r   r   r   r   __mul__0  s    zCmfType.__mul__c             C   s   | j t| |j  S )N)rY   rq   )r   r   r   r   r   
__matmul__3  s    zCmfType.__matmul__c             C   s   | j t| |j  S )N)rY   rq   )r   r   r   r   r   __truediv__6  s    zCmfType.__truediv__c             C   s   | j t| |j  S )N)rY   rq   )r   r   r   r   r   __floordiv__9  s    zCmfType.__floordiv__c             C   s   | j t| |j  S )N)rY   rq   )r   r   r   r   r   __mod__<  s    zCmfType.__mod__c             C   s   t | jt| |jS )N)divmodrY   rq   )r   r   r   r   r   
__divmod__?  s    zCmfType.__divmod__c             C   s   t | jt| |j|S )N)powrY   rq   )r   r   modulor   r   r   __pow__B  s    zCmfType.__pow__c             C   s   | j t| |j > S )N)rY   rq   )r   r   r   r   r   
__lshift__E  s    zCmfType.__lshift__c             C   s   | j t| |j ? S )N)rY   rq   )r   r   r   r   r   
__rshift__H  s    zCmfType.__rshift__c             C   s   | j t| |j @ S )N)rY   rq   )r   r   r   r   r   __and__K  s    zCmfType.__and__c             C   s   | j t| |j A S )N)rY   rq   )r   r   r   r   r   __xor__N  s    zCmfType.__xor__c             C   s   | j t| |j B S )N)rY   rq   )r   r   r   r   r   __or__Q  s    zCmfType.__or__c             C   s   t | |j| j S )N)rq   rY   )r   r   r   r   r   __radd__T  s    zCmfType.__radd__c             C   s   t | |j| j S )N)rq   rY   )r   r   r   r   r   __rsub__Z  s    zCmfType.__rsub__c             C   s   t | |j| j S )N)rq   rY   )r   r   r   r   r   __rmul__]  s    zCmfType.__rmul__c             C   s   t | |j| j S )N)rq   rY   )r   r   r   r   r   __rmatmul__`  s    zCmfType.__rmatmul__c             C   s   t | |j| j S )N)rq   rY   )r   r   r   r   r   __rtruediv__c  s    zCmfType.__rtruediv__c             C   s   t | |j| j S )N)rq   rY   )r   r   r   r   r   __rfloordiv__f  s    zCmfType.__rfloordiv__c             C   s   t | |j| j S )N)rq   rY   )r   r   r   r   r   __rmod__i  s    zCmfType.__rmod__c             C   s   t t| |j| jS )N)r   rq   rY   )r   r   r   r   r   __rdivmod__l  s    zCmfType.__rdivmod__c             C   s   t t| |j| j|S )N)r   rq   rY   )r   r   r   r   r   r   __rpow__o  s    zCmfType.__rpow__c             C   s   t | |j| j> S )N)rq   rY   )r   r   r   r   r   __rlshift__r  s    zCmfType.__rlshift__c             C   s   t | |j| j? S )N)rq   rY   )r   r   r   r   r   __rrshift__u  s    zCmfType.__rrshift__c             C   s   t | |j| j@ S )N)rq   rY   )r   r   r   r   r   __rand__x  s    zCmfType.__rand__c             C   s   t | |j| jA S )N)rq   rY   )r   r   r   r   r   __rxor__{  s    zCmfType.__rxor__c             C   s   t | |j| jB S )N)rq   rY   )r   r   r   r   r   __ror__~  s    zCmfType.__ror__c             C   s   |  j t| |j 7  _ | S )N)rY   rq   )r   r   r   r   r   __iadd__  s    zCmfType.__iadd__c             C   s   |  j t| |j 8  _ | S )N)rY   rq   )r   r   r   r   r   __isub__  s    zCmfType.__isub__c             C   s   |  j t| |j 9  _ | S )N)rY   rq   )r   r   r   r   r   __imul__  s    zCmfType.__imul__c             C   s   |  j t| |j   _ | S )N)rY   rq   )r   r   r   r   r   __imatmul__  s    zCmfType.__imatmul__c             C   s   |  j t| |j   _ | S )N)rY   rq   )r   r   r   r   r   __itruediv__  s    zCmfType.__itruediv__c             C   s   |  j t| |j   _ | S )N)rY   rq   )r   r   r   r   r   __ifloordiv__  s    zCmfType.__ifloordiv__c             C   s   |  j t| |j ;  _ | S )N)rY   rq   )r   r   r   r   r   __imod__  s    zCmfType.__imod__c             C   s   | j t| |j |S )N)rY   __ipow__rq   )r   r   r   r   r   r   r     s    zCmfType.__ipow__c             C   s   | j t| |j S )N)rY   __ilshift__rq   )r   r   r   r   r   r     s    zCmfType.__ilshift__c             C   s   | j t| |j S )N)rY   __irshift__rq   )r   r   r   r   r   r     s    zCmfType.__irshift__c             C   s   | j t| |j S )N)rY   __iand__rq   )r   r   r   r   r   r     s    zCmfType.__iand__c             C   s   | j t| |j S )N)rY   __ixor__rq   )r   r   r   r   r   r     s    zCmfType.__ixor__c             C   s   | j t| |j S )N)rY   __ior__rq   )r   r   r   r   r   r     s    zCmfType.__ior__c             C   s
   | j  S )N)rY   __neg__)r   r   r   r   r     s    zCmfType.__neg__c             C   s
   | j  S )N)rY   __pos__)r   r   r   r   r     s    zCmfType.__pos__c             C   s
   | j  S )N)rY   __abs__)r   r   r   r   r     s    zCmfType.__abs__c             C   s
   | j  S )N)rY   
__invert__)r   r   r   r   r     s    zCmfType.__invert__c             C   s
   | j  S )N)rY   __complex__)r   r   r   r   r     s    zCmfType.__complex__c             C   s
   | j  S )N)rY   __int__)r   r   r   r   r     s    zCmfType.__int__c             C   s
   | j  S )N)rY   	__float__)r   r   r   r   r     s    zCmfType.__float__c             C   s
   | j  S )N)rY   	__index__)r   r   r   r   r     s    zCmfType.__index__c             C   s   | j |S )N)rY   	__round__)r   ndigitsr   r   r   r     s    zCmfType.__round__c             C   s
   | j  S )N)rY   	__trunc__)r   r   r   r   r     s    zCmfType.__trunc__c             C   s
   | j  S )N)rY   	__floor__)r   r   r   r   r     s    zCmfType.__floor__c             C   s
   | j  S )N)rY   __ceil__)r   r   r   r   r     s    zCmfType.__ceil__c             C   s
   | j  S )N)rY   	__enter__)r   r   r   r   r     s    zCmfType.__enter__c             C   s   | j |||S )N)rY   __exit__)r   exc_type	exc_valuerk   r   r   r   r     s    zCmfType.__exit__c             C   s
   | j  S )N)rY   	__await__)r   r   r   r   r     s    zCmfType.__await__c             C   s
   | j  S )N)rY   	__aiter__)r   r   r   r   r     s    zCmfType.__aiter__c             C   s
   | j  S )N)rY   	__anext__)r   r   r   r   r     s    zCmfType.__anext__c             C   s
   | j  S )N)rY   
__aenter__)r   r   r   r   r     s    zCmfType.__aenter__c             C   s   | j |||S )N)rY   	__aexit__)r   r   r   rk   r   r   r   r     s    zCmfType.__aexit__c             C   s
   | j  S )N)r6   r   )r   r   r   r   __getstate__  s    zCmfType.__getstate__c             C   s   | j | d S )N)r6   update)r   stater   r   r   __setstate__  s    zCmfType.__setstate__)NF)N).)N)N)N)N)r    r!   r"   __doc__r   r(   placeholdercommentrQ   rR   r   rM   rS   rT   rU   index_usingr   r   r%   r1   widgetrW   r5   Zvirtual_cache_timelifeautor8   rX   Zoptions_list_paramsrN   r   __annotations__rO   rP   ZTEXKOM_group_by_allowr9   Zui_form_visibler;   rZ   r[   r\   rb   rc   rg   rp   rt   r>   rY   rx   setterru   r   r   r   r   r   r   classmethodrD   rH   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r   r   r   r   rK   R   s  

2(		
	.



rK   )	metaclassc                   s|   e Zd ZdZdZdZdZdd Zdd Z fdd	Z	e
 fd
dZe
dd Z fddZdddddZdd Z  ZS )
CmfRelBase.NTc             C   s$   d| _ | jrd| j_ | j| d S )NT)rd   rE   rY   append)r   objr   r   r   r    s    zCmfRelBase.appendc             C   s$   d| _ | jrd| j_ | j| d S )NT)rd   rE   rY   remove)r   r  r   r   r   r    s    zCmfRelBase.removec                s   t  j|| d | _d S )N)r)   r   _all_nested_cache)r   rA   r   )r0   r   r   r      s    zCmfRelBase.__init__c                s   t  || d || j _d S )N)r)   rH   r    r  )r@   rE   rY   )r0   r   r   rH     s    zCmfRelBase.setc             C   s   t d S )N)NotImplementedError)r@   r   r   r   related_models	  s    zCmfRelBase.related_modelsc                s  ddl m} t|trbd|kr^tt| dd dkr<t|dnt|d j}|j|d dddS n(t|t	rr|
d}d }tt| dd dkrt|d}nt|d	krt||d d }|r|j|ddd}|r|S x.|  D ]"}|jd
d|gddd}|r|S qW x.|  D ]"}|jdd|gd}|r|S qW d|jjkr|j|  kr|jjdd|gd}|r|S nt|tr|j|S t |S )Nr   )r}   r   modelZCmfRFileT)include_deletedinclude_dummy:r   r~   z==)filterr  r  r,   )r  Zemployee_number)r   r}   r=   rf   r<   rq   CmfTUUIDr  rD   r   splitr   r  r   r]   r)   r[   )r   rY   r}   r  Zid_partsr  rn   )r0   r   r   r[     s@    


zCmfRelBase.castr   )r4   r]   c            O   s   t |t | }| jr,|| jkr2| j| S ni | _ddlm} |jj| jjj| j	|oX|gd}g }x:|
 D ].\}	}
t||	}||jdd|
g|dd qlW || j|< |S )Nr   )r}   )Zchild_modelsr   INT)r  r]   Zinclude_system)r   r  r   r}   RelationCacheZget_children_dictrE   r   rY   r4   itemsr<   extendre   )r   r4   r]   Z_args_kwargsZall_nested_cache_keyr}   Zchildren_dictresultZ
model_nameZids_listr  r   r   r   
all_nested2  s    

 
zCmfRelBase.all_nestedc             C   s   | j s
i S t| jts@| jr&| jjjnd | jr8| jjjnd dS g }g }x&| jD ]}|| jkrP||jj qPW x&| jD ]}|| jkrx||jj qxW |s|si S ||dS )N)rx   r   )appendeddeleted)rd   r=   rY   re   rx   r   r   r  )r   r"  r#  r  r   r   r   r   H  s"    

zCmfRelBase.audit_diff)r    r!   r"   r   r(   Znested_fieldsZlinkabler  r  r   r  rH   r  r[   r!  r   rJ   r   r   )r0   r   r    s   %r  c               @   s(   e Zd ZdZeZd ZdZdZdd Z	dS )CmfBool.Fc             C   s0   |dkrdS |dkrdS |d kr$dS t dd S )NTu   ДаFu   Нетu   Не указаноu)   Некорректное значение)
ValueError)r   rY   r   r   r   r   f  s    zCmfBool._format_for_html_diffN)
r    r!   r"   r   r   r(   r  r   rM   r   r   r   r   r   r$  _  s   r$  c                   s`   e Zd ZdZeZdZdZd Z fddZ	 fddZ
 fddZ fd	d
Z fddZ  ZS )CmfInt.Nc                s   |dkrd S t  |S )NrL   )r)   r[   )r   rY   )r0   r   r   r[   x  s    zCmfInt.castc                s4   t jr(t| |}| jr(|dkr$dS dS t |S )Nr   TF)r   relaxed_bz_python_moderq   r   r)   r   )r   r   o)r0   r   r   r     s    zCmfInt.__lt__c                s4   t jr(t| |}| jr(|dkr$dS dS t |S )Nr   TF)r   r'  rq   r   r)   r   )r   r   r(  )r0   r   r   r     s    zCmfInt.__le__c                s4   t jr(t| |}| jr(|dk r$dS dS t |S )Nr   TF)r   r'  rq   r   r)   r   )r   r   r(  )r0   r   r   r     s    zCmfInt.__gt__c                s4   t jr(t| |}| jr(|dkr$dS dS t |S )Nr   TF)r   r'  rq   r   r)   r   )r   r   r(  )r0   r   r   r     s    zCmfInt.__ge__)r    r!   r"   r   intr(   minmaxr  r[   r   r   r   r   rJ   r   r   )r0   r   r&  q  s   

	r&  c               @   s   e Zd ZdZdS )	CmfBigInt.N)r    r!   r"   r   r   r   r   r   r,    s   r,  c               @   s   e Zd ZdZdZd ZdS )CmfIntervalu3   Интервал времени в секундах.N)r    r!   r"   r  r   r  r   r   r   r   r-    s   r-  c                   sD   e Zd ZdZeZdZdZd Ze	dd Z
 fddZdd Z  ZS )	CmfTime.Nc             C   s   | j r
d S t| jS )N)r   r   rY   )r   r   r   r   r     s    zCmfTime.jsonc                s&   t |trtj| S t |S )N)r=   r   dateutilparserparser   r)   r[   )r   rY   )r0   r   r   r[     s    
zCmfTime.castc             C   s8   | j s
i S | jr| jdnd | jr0| jdnd dS )Nz%H:%M:%S)rx   r   )rd   rx   ZstrftimerY   )r   r   r   r   r     s    zCmfTime.audit_diff)r    r!   r"   r   r   r(   r*  r+  r  r>   r   r[   r   rJ   r   r   )r0   r   r.    s   r.  c               @   s   e Zd ZdZeZdZdZdS )CmfBytes.NCmfStr)r    r!   r"   r   bytesr(   
max_lengthr  r   r   r   r   r2    s   r2  c               @   sn   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dd Zdd	 Zd
d ZedddZedddZdS )r3  .Nregexu^   Значение {} не удовлетворяет регулярному выражению.)r6  regex_error_msgc             C   sB   | j r| j dkrdS t| j pd| jp&d}|s2dS | j d| S )NrL   z: )rx   r   r   r   )r   Zdiffr   r   r   r     s    zCmfStr._html_diffc             C   sH   | j r"t|| j kr"td| | jrD| j|sDt| j|d S )Nu,   Слишком длинная строка: )r5  r   r   r6  	fullmatchr7  format)r   rY   r   r   r   rZ     s    zCmfStr.validatec             O   s   | j j||S )N)rY   r  )r   rA   r   r   r   r   r    s    zCmfStr.split)r$   c             O   s   | j r
dS | jj||S )NF)r   rY   r7   )r   rA   r   r   r   r   r7     s    zCmfStr.startswithc             O   s   | j r
dS | jj||S )NF)r   rY   endswith)r   rA   r   r   r   r   r:    s    zCmfStr.endswith)r    r!   r"   r   r   r(   r5  r6  rePatternr	  r7  r  rK   r;   r   rZ   r  r   r7   r:  r   r   r   r   r3    s   
r3  c               @   s   e Zd ZdZd ZdS )CmfText.N)r    r!   r"   r   r  r   r   r   r   r=    s   r=  c               @   s   e Zd ZdZdZdS )CmfStr32.    N)r    r!   r"   r   r5  r   r   r   r   r>  	  s   r>  c               @   s   e Zd ZdZdZdS )CmfStr64.@   N)r    r!   r"   r   r5  r   r   r   r   r@    s   r@  c               @   s   e Zd ZdZdZdS )	CmfStr256.   N)r    r!   r"   r   r5  r   r   r   r   rB    s   rB  c               @   s   e Zd ZdZdZdS )	CmfStr128.   N)r    r!   r"   r   r5  r   r   r   r   rD    s   rD  c               @   s   e Zd ZdZdZdS )
CmfStr4096.i   N)r    r!   r"   r   r5  r   r   r   r   rF    s   rF  c                   sn   e Zd ZdZdZdZejd Zedd Z	edd Z
edd	 Zed
d Zedd Z fddZ  ZS )r  .N)foreign_keyforeign_keysc             C   s   | j dd S )Nr  r   )rY   r  )r   r   r   r   	type_name)  s    zCmfTUUID.type_namec             C   s   t | jdd S )Nr     )r   rY   r  )r   r   r   r   uuid-  s    zCmfTUUID.uuidc             C   s   ddl m} t|t| jjS )Nr   )r}   )r   r}   r<   r  rY   rI  )r   r}   r   r   r   r  1  s    zCmfTUUID.modelc             C   s
   t |jS )N)r  r  )r@   	tuuid_strr   r   r   get_cls_by_tuuid_str7  s    zCmfTUUID.get_cls_by_tuuid_strc             C   s   t |}|j|jS )N)r  r  rD   rY   )r@   rL  Ztuuidr   r   r   get_obj_by_tuuid_str;  s    zCmfTUUID.get_obj_by_tuuid_strc                s0   | j r$| jr$td| jd d  t |S )Nu\   Это служебное поле, для присвоения ид используйте )rG  rE   r   r4   r)   rZ   )r   rY   )r0   r   r   rZ   @  s    zCmfTUUID.validate)r    r!   r"   r   rG  rH  r@  r;   r>   rI  rK  r  r  rM  rN  rZ   rJ   r   r   )r0   r   r  "  s   
r  c               @   s   e Zd ZdZeZdgZdS )CmfTsVectoru   Вектор поискаZginN)r    r!   r"   r   r   r(   r  r   r   r   r   rP  G  s   rP  c               @   s   e Zd ZdZdZdS )CmfM2MTUUID.rE  N)r    r!   r"   r   r5  r   r   r   r   rQ  M  s   rQ  c               @   s(   e Zd ZdZeZeZd Ze	dd Z
dS )CmfUUID.c             C   s
   t | jS )N)r   rY   )r   r   r   r   r   X  s    zCmfUUID.jsonN)r    r!   r"   r   r   r(   r   rM   r  r>   r   r   r   r   r   rR  R  s
   rR  c                   sJ   e Zd ZdZejZdd Zedd Z	 fddZ
dd	 Zd
d Z  ZS )CmfIPv4Address.c             C   s
   t | jS )N)r   rY   )r   r   r   r   r\   a  s    zCmfIPv4Address.db_formatc             C   s   | j r
d S t| jS )N)r   r   rY   )r   r   r   r   r   d  s    zCmfIPv4Address.jsonc                s*   t |tjs|d kr t |S t|S )N)r=   	ipaddressIPv4Addressr)   r[   )r   rY   )r0   r   r   r[   j  s    zCmfIPv4Address.castc             C   s   d S )Nr   )r   rY   r   r   r   rZ   o  s    zCmfIPv4Address.validatec             C   s   |  | j| jS )N)r   rx   r   )r   r   r   r   r   r  s    zCmfIPv4Address._html_diff)r    r!   r"   r   rT  rU  r(   r\   r>   r   r[   rZ   r   rJ   r   r   )r0   r   rS  ]  s   rS  c                   sB   e Zd ZdZejZdd Zedd Z	 fddZ
dd	 Z  ZS )
CmfIPv4Network.c             C   s
   t | jS )N)r   rY   )r   r   r   r   r\   z  s    zCmfIPv4Network.db_formatc             C   s   | j r
d S t| jS )N)r   r   rY   )r   r   r   r   r   }  s    zCmfIPv4Network.jsonc                s*   t |tjs|d kr t |S t|S )N)r=   rT  IPv4Networkr)   r[   )r   rY   )r0   r   r   r[     s    zCmfIPv4Network.castc             C   s   d S )Nr   )r   rY   r   r   r   rZ     s    zCmfIPv4Network.validate)r    r!   r"   r   rT  rW  r(   r\   r>   r   r[   rZ   rJ   r   r   )r0   r   rV  v  s   rV  c               @   s   e Zd ZdZdS )	CmfDomain.N)r    r!   r"   r   r   r   r   r   rX    s   rX  c                   s8   e Zd ZdZd ZdZdd Zdd Z fddZ  Z	S )	CmfPassword.zAES256:c             C   sB   ddl m} |s|S | | || jr.|S | j || S )Nr   )cmfutil)cmf.utilrZ  rZ   r7   crypt_prefixZcrypt)r   rY   rZ  r   r   r   r[     s    
zCmfPassword.castc             C   sx   ddl m} ddlm}m} | js(| jS tjtjkrL|j	
 sL|d | jS | j| jrr|| j| jd S | jS )Nr   )rZ  )r|   r}   u!   Недостаточно правrJ  )r[  rZ  r   r|   r}   rY   r   Zcurrent_personZsystem_personZCmfAccessListZcheck_admin_moder7   r\  decryptr  )r   rZ  r|   r}   r   r   r   r]    s    zCmfPassword.decryptc                s    t d|rtdt |S )Nu   [А-Яа-яЁё]uD   Пароль не должен содержать кириллицу)r;  searchr   r)   rZ   )r   rY   )r0   r   r   rZ     s    zCmfPassword.validate)
r    r!   r"   r   r  r\  r[   r]  rZ   rJ   r   r   )r0   r   rY    s   	rY  c                   s   e Zd ZdZeZdZdZd Ze	j
d Z
edd Zdd Z fdd	Zed
d Zdd Zdd Zdd Zdd Zdd Z fddZ fddZ fddZ fddZ  ZS )CmfDate.F)auto_nowauto_now_addc             C   s   | j r
d S | j S )N)r   rY   	isoformat)r   r   r   r   r     s    zCmfDate.jsonc             C   s4   | j s
i S | jr| j nd | jr,| j nd dS )N)rx   r   )rd   rx   rb  rY   )r   r   r   r   r     s    zCmfDate.audit_diffc                s&   t |trtj| S t |S )N)r=   r   r/  r0  r1  r   r)   r[   )r   rY   )r0   r   r   r[     s    
zCmfDate.castc             C   s   | t tj S )N)r   nowr   utcr   )r@   r   r   r   rc    s    zCmfDate.nowc             C   s   |   | _d S )N)rc  rY   )r   r   r   r   set_now  s    zCmfDate.set_nowc             C   s6   t |tr|  j|7  _n|  jt| |j7  _| S )N)r=   r   rY   rq   )r   r   r   r   r   r     s    
zCmfDate.__iadd__c             C   s6   t |tr|  j|8  _n|  jt| |j8  _| S )N)r=   r   rY   rq   )r   r   r   r   r   r     s    
zCmfDate.__isub__c             C   s,   t |tr| j| S | jt| |j S d S )N)r=   r   rY   rq   )r   r   r   r   r   r     s    

zCmfDate.__add__c             C   s,   t |tr| j| S | jt| |j S d S )N)r=   r   rY   rq   )r   r   r   r   r   r     s    

zCmfDate.__sub__c                s(   t jrt| | | jrdS t |S )NF)r   r'  rq   r   r)   r   )r   r   )r0   r   r   r     s
    zCmfDate.__lt__c                s(   t jrt| | | jrdS t |S )NF)r   r'  rq   r   r)   r   )r   r   )r0   r   r   r     s
    zCmfDate.__le__c                s(   t jrt| | | jrdS t |S )NF)r   r'  rq   r   r)   r   )r   r   )r0   r   r   r     s
    zCmfDate.__gt__c                s(   t jrt| | | jrdS t |S )NF)r   r'  rq   r   r)   r   )r   r   )r0   r   r   r   	  s
    zCmfDate.__ge__)r    r!   r"   r   r   r(   r`  ra  r  rK   r;   r>   r   r   r[   r  rc  re  r   r   r   r   r   r   r   r   rJ   r   r   )r0   r   r_    s&   
r_  c                   sf   e Zd ZdZdZdZdZdZej	d Z	dZ
e fddZdd	 Zd
d Zedd Zdd Z  ZS )CmfDateRange.NZCmfDateTimeRange)start_field_nameend_field_nameTc                s   t   | j| jg S )N)r)   r   rg  rh  )r@   )r0   r   r   r     s    z CmfDateRange.get_required_fieldsc             C   sL   t | j| j}t | j| j}|r$|s(d S |j|jd}|j|jd}||gS )N)year)r<   rE   rg  rh  replaceri  )r   Zrange_startZ	range_endr   r   r   rp      s    zCmfDateRange.virtual_getterc             C   sr   |rNt j|d  }t j|d  }t| j| j| t| j| j| n t| j| jd  t| j| jd  d S )Nr   rJ  )r/  r0  r1  r   rs   rE   rg  rh  )r   rY   Zstart_valueZ	end_valuer   r   r   rt   *  s    zCmfDateRange.virtual_setterc             C   sD   t | j| jrt | j| js d S t | j| j t | j| j gS )N)r<   rE   rg  rh  rb  )r   r   r   r   r   4  s    zCmfDateRange.jsonc             C   s   | j s
i S d|  dS )NZTODO)rx   r   )rd   r   )r   r   r   r   r   <  s    zCmfDateRange.audit_diff)r    r!   r"   r   r(   rg  rh  r  rK   r;   r5   r  r   rp   rt   r>   r   r   rJ   r   r   )r0   r   rf    s   


rf  c                   s   e Zd ZdZeZdZdZd Ze	j
d Z
eedddZedd Zed	d
 Zdd Zedd Z fddZdd Zedd Zdd Zdd Zdd Zdd Zdd Z fdd Z fd!d"Z fd#d$Z fd%d&Z  ZS )'CmfDateTime.F)r`  ra  )dtc             C   s    | d k	rt tj|   S d S )N)r   rc  r   rd  Ztotal_seconds)rl  r   r   r   cls_ageM  s    zCmfDateTime.cls_agec             C   s   | j s
dS | | j S )Nr   )rY   rm  )r   r   r   r   ageR  s    zCmfDateTime.agec             C   s   | j r
d S | j S )N)r   rY   rb  )r   r   r   r   r   X  s    zCmfDateTime.jsonc             C   s4   | j s
i S | jr| j nd | jr,| j nd dS )N)rx   r   )rd   rx   rb  rY   )r   r   r   r   r   ^  s    zCmfDateTime.audit_diffc             C   sD   ddddddddd	d
ddd}x |  D ]\}}| ||} q(W | S )NZjanZfebZmarZaprZmayZjunZjulZaugsepoctZnovZdec)u   янвu   февu   марu   апрu   майu   июнu   июлu   авгu   сенu   октu   нояu   дек)r  rj  )rY   mappingZmonth_ruZmonth_enr   r   r   _translate_monthf  s    zCmfDateTime._translate_monthc                s   d}|d kr|S t |tr||d dkr*d}|d dksB|d dkrj|d  sRd}tjj| ||d}qtjj||d}nt |}|	 d kr|j
t  jd	}|S )
NFr   rv   T/rJ     )dayfirst)tzinfo)r=   r   isdigitr/  r0  r1  rr  r)   r[   Z	utcoffsetrj  r   rc  Z
astimezonerv  )r   rY   ru  rn   )r0   r   r   r[   z  s    
zCmfDateTime.castc             C   s&   |sdS |  }d| d| d}|S )NrL   z<time datetime="z">z</time>)rb  )r   rY   r   r   r   r     s
    z!CmfDateTime._format_for_html_diffc             C   s   | t tjS )N)r   rc  r   rd  )r@   r   r   r   rc    s    zCmfDateTime.nowc             C   s   |   | _d S )N)rc  rY   )r   r   r   r   re    s    zCmfDateTime.set_nowc             C   sX   t |tr|  j|7  _n:t|tkr<|  jt|d7  _n|  jt| |j7  _| S )N)days)r=   r   rY   rq   r)  )r   r   r   r   r   r     s    
zCmfDateTime.__iadd__c             C   sX   t |tr|  j|8  _n:t|tkr<|  jt|d8  _n|  jt| |j8  _| S )N)rx  )r=   r   rY   rq   r)  )r   r   r   r   r   r     s    
zCmfDateTime.__isub__c             C   sH   t |tr| j| S t|tkr0| jt|d S | jt| |j S d S )N)rx  )r=   r   rY   rq   r)  )r   r   r   r   r   r     s
    

zCmfDateTime.__add__c             C   sH   t |tr| j| S t|tkr0| jt|d S | jt| |j S d S )N)rx  )r=   r   rY   rq   r)  )r   r   r   r   r   r     s
    

zCmfDateTime.__sub__c                s(   t jrt| | | jrdS t |S )NF)r   r'  rq   r   r)   r   )r   r   )r0   r   r   r     s
    zCmfDateTime.__lt__c                s(   t jrt| | | jrdS t |S )NF)r   r'  rq   r   r)   r   )r   r   )r0   r   r   r     s
    zCmfDateTime.__le__c                s(   t jrt| | | jrdS t |S )NF)r   r'  rq   r   r)   r   )r   r   )r0   r   r   r     s
    zCmfDateTime.__gt__c                s(   t jrt| | | jrdS t |S )NF)r   r'  rq   r   r)   r   )r   r   )r0   r   r   r     s
    zCmfDateTime.__ge__) r    r!   r"   r   r   r(   r`  ra  r  rK   r;   staticmethodrm  r>   rn  r   r   rr  r[   r   r  rc  re  r   r   r   r   r   r   r   r   rJ   r   r   )r0   r   rk  D  s0   
			rk  c                   s    e Zd ZdZ fddZ  ZS )CmfCreateDateTime.c                s(   t  |}ttj}||kr$|}|S )N)r)   r[   r   rc  r   rd  )r   rY   rn   rc  )r0   r   r   r[     s
    zCmfCreateDateTime.cast)r    r!   r"   r   r[   rJ   r   r   )r0   r   rz    s   rz  c                   s   e Zd ZdZdZdZejd Zdd Ze	 fddZ
e	d	d
 Zedd Ze	dd Ze	 fddZe	dd Zdd fdd
Zd% fdd	Zdd Z fddZd&dd Zd!d" Zed#d$ Z  ZS )'CmfRelationBase.r2   )r  rd   rE   r_   rx   r   r`   )setattr_fieldsc             C   s   t d S )N)r  )r   rY   r   r   r   rZ     s    zCmfRelationBase.validatec                s   t   |  g S )N)r)   r   id_fieldname)r@   )r0   r   r   r     s    z#CmfRelationBase.get_required_fieldsc             C   s
   | j d S )N_id)r4   )r@   r   r   r   r}    s    zCmfRelationBase.id_fieldnamec             C   s   t | j|  S )N)r<   rE   r}  )r   r   r   r   r     s    zCmfRelationBase.idc             C   sj   t |tr|j}t||  }|jdkrR|j|_ddlm} |	d| d|  ||_|j|jk|_
dS )u}   
        Обновим служебное поле
        :param instance:
        :param new_id:
        :return:
        .r   )r   u?   DEV: INFO: пессиместичный is_changed у поля r   N)r=   rK   rY   r<   r}  r`   r_   rj   r   rl   rd   )r@   rE   new_idZfk_fieldr   r   r   r   
_update_fk  s    

zCmfRelationBase._update_fkc                sb   t  || || j }|jdkr&d S |jr2d }n|jj}|jdkrHd S | || | | d S )N.)	r)   rH   r    r_   r   rY   r   r  _update_backref)r@   rE   rY   Zinserted_valuer  )r0   r   r   rH   %  s    


zCmfRelationBase.setc             C   s@  t | dd r<|| j }|js|| j }|jdkr6d S |jdd |jD krPd S |j| |jdk	r|jd k	r|j	| j jdk	rxt
|j	| j jD ]&}|j|jkr|j	| j j| P qW nz|jdk	r<|jd k	r<|j	| j jdk	r<|j	| j }|jdkr
d S x0t
|jD ]"}|j|jkr|j| P qW d S )Nbackref.c             S   s   g | ]
}|j qS r   )r   ).0r  r   r   r   
<listcomp>=  s    z3CmfRelationBase._update_backref.<locals>.<listcomp>)r<   r    r   r  r_   r   rY   r  r`   rx   r   r  )r@   rE   r   Zbackref_fieldr  r   r   r   r  4  s,    


&,zCmfRelationBase._update_backrefr   )depthc               s   ddl m} t j|| | jdkr(d S | jr4d }nF| jjsF| jj}n4| jj	rX| jj}n"| jj|d|d i| | jj}| jrddl m
} | jdkr|d|   | jdk	r| jd k	r|j| | jjj | js|jj| | jd t| | j| d S )	Nr   )r|   .r  rJ  )r}   z(DEV: FATAL Potential RelationCache leak )target)r   r|   r)   rc   r_   r   rY   rd   r   is_recursion_saver}   r`   r  remove_field_referencerx   add_field_referencerq   r  rE   )r   r  rA   r   r|   r  r}   )r0   r   r   rc   O  s*    



zCmfRelationBase.savec                s<   |dkrd S | j dk	r.| js.| jj|d d t   d S )NrJ  .)r  )r_   r   rY   rg   r)   )r   r  )r0   r   r   rg   n  s
    zCmfRelationBase.flushc             C   s   t | j|S )N)r<   rY   )r   r,   r   r   r   __getattr__u  s    zCmfRelationBase.__getattr__c                s8   || j ks|t| kr&t || nt| j|| d S )N)r|  r:   r)   __setattr__rs   rY   )r   r,   rY   )r0   r   r   r  y  s    zCmfRelationBase.__setattr__NFc       	         sX  ddl m}  jdk	r|s S d|kr.d|d< d|kr>d|d<  j   }|jdkr fdd|pfg D    jg } jj|d	 ntt d
rt	| j
}|j jfd|i| _ jdkrЈ j _n jr: jdd }t	||d}|s
td| |j jfd|i| _ jdkrT j _nd _ jdkrT j _ S )u1   Ленивая загрузка Relation поляr   )r}   .r  Tr  c                s   g | ]} j  d | qS )rv   )r4   )r  Z
load_field)r   r   r   r    s    z(CmfRelationBase.load.<locals>.<listcomp>)r]   r  r]   r  Nu$   Нет класса с именем )r   r}   r`   rE   r}  r4   ra   hasattrrq   r<   r  rD   r   r_   r  r%  )	r   r]   r^   r   r}   Zid_fieldZfields_listr  Zcls_namer   )r   r   rb     s:    



zCmfRelationBase.loadc             C   s"   |dk	r|rt |dr|jjS d S )N.r,   )r  r,   rY   )r   rY   r   r   r   r     s    z%CmfRelationBase._format_for_html_diffc             C   s   | j r
d S | jjS )N)r   rY   r   )r   r   r   r   r     s    zCmfRelationBase.json)r   )NF)r    r!   r"   r   rV   r|  r  r;   rZ   r  r   r}  r>   r   r  rH   r  rc   rg   r  r  rb   r   r   rJ   r   r   )r0   r   r{    s$   

+r{  c               @   s:   e Zd ZdZd ZdZdZejd Zdd Z	e
dd ZdS )CmfRelation.N)rH  c             C   s8   t |j| jkr4td| j dt |j d| j d S )Nu   Тип u    не совпадает: z != )rq   r    r  r   r4   )r   rY   r   r   r   rZ     s    zCmfRelation.validatec             C   s   ddl m} t|| j gS )Nr   )r}   )r   r}   varsr  )r@   r}   r   r   r   r    s    zCmfRelation.related_models)r    r!   r"   r   r  rH  r  r{  r;   rZ   r  r  r   r   r   r   r    s   
r  c               @   s,   e Zd ZdZd ZdZdd Zedd ZdS )CmfGenericRelation.Nc             C   s2   | j r.t|j| j kr.tdt|t|j|d S )NuJ   Тип не совпадает, неизвестное имя модели)r}   rq   r    r   )r   rY   r   r   r   rZ     s    zCmfGenericRelation.validatec             C   sL   ddl m} g }| jsg S x,| jD ]"}|t|kr"|t||  q"W |S )Nr   )r}   )r   r}   r  r  )r@   r}   rn   r  r   r   r   r    s    z!CmfGenericRelation.related_models)	r    r!   r"   r   r  r}   rZ   r  r  r   r   r   r   r    s
   r  c               @   s2   e Zd ZdZdZdgZg Zedd Zdd Z	dS )CmfSubclassedGenericRelation.	CmfEntityc             C   s"   dd l }t|j| j}t| S )Nr   )
cmf.modelsr<   r}   
base_modelre   Ziter_subclasses)r@   cmfr  r   r   r   r    s    z+CmfSubclassedGenericRelation.related_modelsc             C   sV   dd l }tt|t|j| jsRtd| j d| j d| dt| d| j dd S )Nr   u   Тип не совпадает rv   =z (z | r   )	r  
issubclassrq   r<   r}   r  r   rE   r4   )r   rY   r  r   r   r   rZ     s    z%CmfSubclassedGenericRelation.validateN)
r    r!   r"   r   r  r}   Zfield_options_list_limitr  r  rZ   r   r   r   r   r    s   r  c                   s>   e Zd ZdZdZdZd
ddZ fddZ fdd	Z  Z	S )CmfBackrefBase.NFc             K   sr   | j dk	r|s| S t | _ x<|  D ]0}| j |jf d|i| jd | jji| q$W | jdkrnt| j | _| S )N.r]   r~  )	r`   re   r  r  r  rE   r   r_   r   )r   r]   r^   r   r  r   r   r   rb     s    *
zCmfBackrefBase.loadc                s   t  | _t j|| d S )N)re   rM   r)   r   )r   rA   r   )r0   r   r   r     s    zCmfBackrefBase.__init__c                s   t  j|| d S )N)r)   rg   )r   rA   r   )r0   r   r   rg     s    zCmfBackrefBase.flush)NF)
r    r!   r"   r   r  r  rb   r   rg   rJ   r   r   )r0   r   r    s   
r  c               @   s$   e Zd Zd ZdZdZedd ZdS )
CmfBackref.Nc             C   s&   ddl m} | jr"t|| j gS g S )Nr   )r}   )r   r}   r  r  )r@   r}   r   r   r   r  $  s    zCmfBackref.related_models)r    r!   r"   r  r   r  r  r  r   r   r   r   r    s   r  c               @   s$   e Zd Zd ZdZdZedd ZdS )CmfGenericBackref.Nc                s    ddl m   fdd| jD S )Nr   )r}   c                s   g | ]}t  | qS r   )r  )r  r  )r}   r   r   r  3  s    z4CmfGenericBackref.related_models.<locals>.<listcomp>)r   r}   )r@   r   )r}   r   r  /  s    z CmfGenericBackref.related_models)r    r!   r"   r  r   r}   r  r  r   r   r   r   r  *  s   r  c                   s   e Zd ZdZdZdZdZdd Zdd Zdd Z	e
d	d
 Z fddZd)ddZd*ddZd+ddZd,ddZ fddZe
dd Zdd Zd-ddZd.dd Zd!d" Zd#dd$ fd%d&
Zd/ fd'd(	Z  ZS )0
CmfM2MBase.Nc             C   s   t d S )N)r  )r   rY   r   r   r   rZ   <  s    zCmfM2MBase.validatec             C   s   d}| j s|S i }x<| j D ]2}|d }|d }||kr>g ||< || | qW d|kr| dddd |d D  }|d= d	|kr| d
ddd |d	 D  }|d	= |r| d| }| j d| S )NrL   r   rJ  r  u    добавлено: ,c             S   s   g | ]}t |qS r   )r   )r  cr   r   r   r  M  s    z)CmfM2MBase._html_diff.<locals>.<listcomp>r  u    удалено: c             S   s   g | ]}t |qS r   )r   )r  r  r   r   r   r  P  s    u    остальное: z: )_changesr  r   r   )r   Zhtml_strchangeschangeactr  r   r   r   r   ?  s&    ""zCmfM2MBase._html_diffc             C   s^   | j s
i S | jsi S i }x@| jD ]6}|d }|d jj}||krHg ||< || | q W |S )uA   
        Данные для таблицы аудита
        r   rJ  )rd   r  r   rY   r  )r   r  r  r  Zobj_idr   r   r   r   V  s    zCmfM2MBase.audit_diffc             C   s   ddl m} t||   S )Nr   )r}   )r   r}   r  m2m_model_cls_name)r@   r}   r   r   r   m2m_model_clsi  s    zCmfM2MBase.m2m_model_clsc                s&   t  j|| g | _g | _t | _d S )N)r)   r   r  _changes_bufferre   rM   )r   rA   r   )r0   r   r   r   n  s    zCmfM2MBase.__init__c             C   s2   x,| j D ]"^}}}||kr|r&||kr|S qW dS )uU  
        Проверяем, есть ли объект (obj) в списки изменений поля.
        :param obj: объект который ищем в изменениях.
        :param action: append|remove|None
        :type action: str
        :return action изменения: append|remove
        :rtype str
        N)r  )r   r  actionZchange_actionZ
change_objr3   r   r   r   
in_changesx  s    	zCmfM2MBase.in_changesrJ  c             O   st  t |tr|j}t |tr$t|}| | d| _d}xLt| j	D ]>}|d j
|j
krD|d dkrhd}|d dkrD| j	| P qDW xLt| jD ]>}|d j
|j
kr|d dkrd}|d dkr| j| P qW |rdS | j	d||f | jd||f d| _| jrd| j_| jrL| jrL|dkrLt|| jj| j|d d | jd	k	rp|| jkrp| j| dS )
ut   Должен работать в т.ч. с незагруженными полями, для оптимизации.NFrJ  r   r  Tr  )r  .)r=   rK   rY   r   r  rN  rZ   r  r   r  r   r  r  r  rd   rE   r  r<   r_   )r   r  descriptionr  rA   r   Zalready_appendedrowr   r   r   r    s@    



zCmfM2MBase.appendc             C   s4   x.t |D ]"\}}| j||r$|| p&d d q
W d S )N)r  )	enumerater  )r   ZobjsZdescriptionsir  r   r   r   r    s    zCmfM2MBase.extendc             O   sV  d| _ t|trt|}d}xLt| jD ]>}|d j|jkr*|d dkrX| j| P |d dkr*d}q*W xLt| j	D ]>}|d j|jkrx|d dkr| j	| P |d dkrxd}qxW |rdS | j
d|f | j	
d|f d| _| jr| jr|dkrt|| jj| j|d d | jr.d| j_| jd	k	rR|| jkrR| j| dS )
ut   Должен работать в т.ч. с незагруженными полями, для оптимизации.NFrJ  r   r  r  T)r  .)r  r=   r   r  rN  r   r  r   r  r  r  rd   r  rE   r<   r_   )r   r  r  rA   r   Zalready_removedr  r   r   r   r    s:    

zCmfM2MBase.removec                s   g }|d krg }x4|D ],}t |ttfr4t |}|r|| qW | jdkrh| jjr`g | _n| 	  x0t
| jD ]"}|jdd |D krt| | qtW dd | jD }x |D ]}|j|kr| | qW |S )N.c             S   s   g | ]
}|j qS r   )r   )r  r  r   r   r   r    s    z#CmfM2MBase.cast.<locals>.<listcomp>c             S   s   h | ]
}|j qS r   )r   )r  r  r   r   r   	<setcomp>  s    z"CmfM2MBase.cast.<locals>.<setcomp>)r=   rf   r   r)   r[   r  r_   rE   rw   rb   r   r   r  rY   )r   rY   r   valZ	value_ids)r0   r   r   r[     s(    



zCmfM2MBase.castc             C   s   t d S )N)r  )r@   r   r   r   r    s    zCmfM2MBase.m2m_model_cls_namec             C   s(   x"|   D ]}||}|r
|S q
W d S )N)r  rD   )r   r   r  Zrelated_objr   r   r   get_related_obj  s
    
zCmfM2MBase.get_related_objFc          	   K   s   | j dk	r|s| S g | _d | _| jrdxV|  D ]0}| j|jf || jd| jjggd| q.W n| 	 j
| j| jd| _|   t| j| _ | S )N.r  )r]   r  )r  left)r`   r_   r  r  r  r  re   rE   r   r  Zselect_relatedr  apply_changesr   )r   r]   r^   r   r  r   r   r   rb     s    2zCmfM2MBase.loadc             K   s   ddl m} ddlm} | jp$| jg}dd| jjgdd| jgdd|gg}|jj	|d	gd
}dd |D }	|rp|	S t
 }
x(|	D ] }|j||d}|r||
| q|W |
}	|	S )u   
        Запрос all_nested наоборот. Не вложенные сущности, а все родительские
        r   )r}   )rZ  Zchild_idr  Zchild_fieldZparent_modelr  	parent_id)r  r]   c             S   s   h | ]}|j r|j qS r   )r  )r  relationr   r   r   r     s    z)CmfM2MBase.all_parents.<locals>.<setcomp>)r]   )r   r}   r[  rZ  r  rE   r   r4   r  ZslistrH   Zget_obj_by_idadd)r   Zid_onlyr]   r  r}   rZ  Zgroup_model_namesZrelation_filterZrelation_listr   Z
obj_resultZgroup_idr  r   r   r   all_parents  s"    

zCmfM2MBase.all_parentsc          	   C   s   x| j D ]x^}}}|dkrBy| j| W q tk
r>   Y qX q|dkrry| j| W q tk
rn   Y qX qtd| qW d S )Nr  r  u*   Неизвестное изменение )r  r_   r  r%  r  )r   Zchange_typerE   rA   r   r   r   r  .  s    zCmfM2MBase.apply_changesr   )r  	only_datac         
      s  t  j|||d| ddlm} ddlm} ddlm} || j	d x| j
D ]^}}	}
d }| jrz|	}| j	}| }n6| jr|	}| j	}| jrt|| j}ntd| j d|j|jgd	 |  j|j|jd d
}|dkrF|rqT|  ||d}|
r|
d |_| . |j|d|d i| |jj| |	d W d Q R X n@|dkr|sXqT|   |  |j| |	jj W d Q R X |j| j	||	| jd t|	dd sT|dkrt|	dr|	j  |	js|	j|d|d i| qT|	j|d|d i| qTW g | _
d | _d S )N)r  r  r   )	CMF_CACHE)r}   )rZ  r   u   У поля u-    не указано right оно или left)Zforce_check_fields)Zleft_idZright_idZroot_idr  )r  rightr  rJ  )r  r  )Zm2m_field_namer  cmf_deleted) r)   rc   Zcmf.appr  r   r}   r[  rZ  Z
invalidaterE   r  r  r  r  r<   ri   r4   Z_acl_check_writer  rD   r   r  Zdisable_aclr  r  deleter  rY   r  r  rb   r  )r   r  r  rA   r   r  r}   rZ  r  r  ZcargsZ
left_fieldr  r  r  )r0   r   r   rc   D  sV    	





zCmfM2MBase.savec                sV   |dkrd S | j dk	rB| jsBx$| jD ]}t|dd r6q$|  q$W g | _t   d S )NrJ  .r  )r_   r   rY   r<   rg   r  r)   )r   r  rC   )r0   r   r   rg     s    zCmfM2MBase.flush)N)NrJ  )N)rJ  )NF)FN)r   )r    r!   r"   r   r  r  r  rZ   r   r   r  r  r   r  r  r  r  r[   r  r  rb   r  r  rc   rg   rJ   r   r   )r0   r   r  6  s*   


'

$

Dr  c               @   sH   e Zd Zd ZdZdZdZedd Ze	dd Z
e	dd Zd	d
 ZdS )CmfM2M.Nc             C   s   d | |gS )NrL   )r   )Z	left_nameZ
right_namer   r   r   _m2m_model_cls_name  s    zCmfM2M._m2m_model_cls_namec             C   s<   | j r| | jj| jS | jr0| | j| jjS tdd S )Nu2   Не определено left это или right)r  r  rW   r4   r  r  ri   )r@   r   r   r   r    s
    zCmfM2M.m2m_model_cls_namec             C   s   ddl m} t|| j gS )Nr   )r}   )r   r}   r  r  )r@   r}   r   r   r   r    s    zCmfM2M.related_modelsc             C   sR   t |tk	rNt |j| jkrNtd| j d| j d| dt | d| j dd S )Nu   Тип не совпадает rv   r  z (z | r   )rq   re   r    r  r   rE   r4   )r   rY   r   r   r   rZ     s    zCmfM2M.validate)r    r!   r"   r  r   r  r  ry  r  r  r  r  rZ   r   r   r   r   r    s   	r  c               @   s@   e Zd Zd ZdZdZdZdZedd Z	edd Z
dd ZdS )	CmfGenericM2M.Nc             C   s0   | j r| j | j  S | jj | j  S )N)r  r  r  
capitalizerW   r4   )r@   r   r   r   r    s    z CmfGenericM2M.m2m_model_cls_namec                sT   ddl m  | jr& fdd| jD S | jr@ fdd| jD S t | j gS d S )Nr   )r}   c                s   g | ]}t  | qS r   )r  )r  r,   )r}   r   r   r    s    z0CmfGenericM2M.related_models.<locals>.<listcomp>c                s   g | ]}t  | qS r   )r  )r  r,   )r}   r   r   r    s    )r   r}   r  r  r  )r@   r   )r}   r   r    s    zCmfGenericM2M.related_modelsc             C   sX   | j rTt|tk	rTt|j| j krTtd| j d| j d| dt| d| j  dd S )Nu   Тип не совпадает rv   r  z (z | r   )r}   rq   re   r    r   rE   r4   )r   rY   r   r   r   rZ     s    zCmfGenericM2M.validate)r    r!   r"   r  r   r}   r  r  r  r  r  rZ   r   r   r   r   r    s   r  c               @   s   e Zd ZdZd ZdS )	CmfStatus.N)r    r!   r"   r   r  r   r   r   r   r    s   r  c                   s0   e Zd ZdZdZd Zdd Z fddZ  ZS )	CmfChoice.Nc             C   s   |  | j| jS )N)r   rx   r   )r   r   r   r   r     s    zCmfChoice._html_diffc                s   ddl m} d }| jr0t| j|r0| j| j}| jp8i }|rd|d | jrd|d | j d|}|r|d k	r||||}|d k	r|||}t	 
||S )Nr   )r  	ui_fieldschoices)r  r  rE   r  rW   _build_ui_formr  rD   r4   r)   r   )r   r   r   r  ui_form_customr  )r0   r   r   r     s    
zCmfChoice._simple_html_diff)	r    r!   r"   r   r  r  r   r   rJ   r   r   )r0   r   r    s
   r  c                   s(   e Zd ZdZdZd Z fddZ  ZS )CmfChoiceInt.Nc                s   ddl m} d }| jr0t| j|r0| j| j}| jp8i }|rd|d | jrd|d | j d|}|r|d k	r|t	||}|d k	r|t	||}t
 ||S )Nr   )r  r  r  )r  r  rE   r  rW   r  r  rD   r4   r)  r)   r   )r   r   r   r  r  r  )r0   r   r   r    	  s    
zCmfChoiceInt._simple_html_diff)r    r!   r"   r   r  r  r   rJ   r   r   )r0   r   r    s   r  c                   s    e Zd Z fddZdZ  ZS )CmfEmailc                s*   |rt d|std| t |S )Nz[^@]+@[^@]+\.[^@]+u8   Неправильный формат ввода email: )r;  matchr   r)   rZ   )r   rY   )r0   r   r   rZ   	  s    zCmfEmail.validate.)r    r!   r"   rZ   r   rJ   r   r   )r0   r   r  	  s   r  c                   s    e Zd Z fddZdZ  ZS )
CmfOrgNamec                s(   t d}||stdt |S )Nz^([a-z0-9-]+)+$u=   Неправильный формат имени домена)r;  compiler  r   r)   rZ   )r   rY   pattern)r0   r   r   rZ   	  s    

zCmfOrgName.validate.)r    r!   r"   rZ   r   rJ   r   r   )r0   r   r  	  s   r  c               @   s   e Zd ZdZdS )CmfLogin.N)r    r!   r"   r   r   r   r   r   r  %	  s   r  c                   s   e Zd ZdZdZd ZdZedZ	e
jd Zdd Z fdd	Zd
d Zedd Zejdd Zedd Zedd Zedd Zedd Zejdd Z  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             C   sR   ddl m} x2d|jpg D ] }t||}| r| S qW td||jd S )Nr   )rz   u?   Введите корректный номер телефона)N)r   rz   ZPHONE_REGIONSphonenumbersZPhoneNumberMatcherZhas_nextnextr   )r   rY   rz   ZregionZmatcherr   r   r   _match;	  s    zCmfPhone._matchc                s`   |sdS | j |r$t | dS | |}|j}t|rHt|sPt	dt | dS )zV
        Valid values: [0-9]*;.*
        Castable: Any text with valid number
        Nu?   Введите корректный номер телефона)
r  r  r)   rZ   r  numberr  is_valid_numberis_possible_numberr   )r   rY   r  phone)r0   r   r   rZ   C	  s    
zCmfPhone.validatec             C   s   |s|S |dkrdS |  |}|j}t|r8t|s@td|d |j ||jd    }| d}t	|tj
jdd  }|d7 }|jr|d|j 7 }|r|d7 }||7 }|S )N;rL   u?   Введите корректный номер телефонаz ,;rJ  u   доб. z, )r  r  r  r  r  r   startendstripformat_numberPhoneNumberFormatE164	extension)r   rY   r  r  infor   r   r   r[   T	  s$    

 zCmfPhone.castc             C   s&   | j r"| j dd }| r"|S d S )Nr  r   )rY   	partitionrw  )r   r  r   r   r   r  s	  s
    zCmfPhone.numberc             C   sr   |rT|  |}|j}t|r(t|s0tdt|tjjdd  }| d}nd}| j	rh|| j	7 }|| _
d S )Nu?   Введите корректный номер телефонаrJ  r  )r  r  r  r  r  r   r  r  r  r  rY   )r   rY   r  r  r   r   r   r   r  {	  s    

c             C   s8   | j r4td| j dd  d }t|tjjS d S )N+r  r   )rY   r  r1  r  r  r  r  )r   r  r   r   r   number_e164	  s    zCmfPhone.number_e164c             C   s8   | j r4td| j dd  d }t|tjjS d S )Nr  r  r   )rY   r  r1  r  r  r  ZNATIONAL)r   r  r   r   r   number_national	  s    zCmfPhone.number_nationalc             C   s8   | j r4td| j dd  d }t|tjjS d S )Nr  r  r   )rY   r  r1  r  r  r  ZINTERNATIONAL)r   r  r   r   r   number_international	  s    zCmfPhone.number_internationalc             C   s   | j s| j S | j dd S )Nr  r   )rY   r  )r   r   r   r   r  	  s    zCmfPhone.infoc             C   s.   | j r| j  d}nd}|r$||7 }|| _d S )Nr  )r  rY   )r   rY   r   r   r   r   r  	  s    )r    r!   r"   r  r   r  r  r;  r  r  r@  r;   r  rZ   r[   r>   r  r
  r  r  r  r  rJ   r   r   )r0   r   r  )	  s    

r  c               @   s   e Zd ZdZd ZdS )CmfMarkdown.N)r    r!   r"   r   r  r   r   r   r   r  	  s   r  c               @   s   e Zd ZdZd ZdS )	CmfMarkup.N)r    r!   r"   r   r  r   r   r   r   r  	  s   r  c               @   s   e Zd Zd ZdZdd ZdS )CmfUrl.c             C   s$   |d kr|S d|krd| S |S d S )Nz://zhttp://r   )r   rY   r   r   r   r[   	  s
    zCmfUrl.castN)r    r!   r"   r  r   r[   r   r   r   r   r  	  s   r  c               @   s   e Zd ZdZdZdS )CmfUrlShort.rE  N)r    r!   r"   r   r5  r   r   r   r   r  	  s   r  c               @   s8   e Zd ZdZdZdZdd Zdd Zdd	 Zd
d Z	dS )CmfJson.NZCmfJSONc             C   s   | j d kr| j S t| j ddS )NF)ensure_ascii)rY   r   )r   r   r   r   r\   	  s    
zCmfJson.db_formatc                sT   t |tr  fdd| D S t |tr< fdd|D S t |trL|jS |S d S )Nc                s   i | ]\}}  ||qS r   )r[   )r  rB   rC   )r   r   r   
<dictcomp>	  s    z CmfJson.cast.<locals>.<dictcomp>c                s   g | ]}  |qS r   )r[   )r  rC   )r   r   r   r  	  s    z CmfJson.cast.<locals>.<listcomp>)r=   rf   r  re   rK   r   )r   rY   r   )r   r   r[   	  s    


zCmfJson.castc             O   s   ddl m} | js|   | jd kr*g | _t| jtsV|d| d|  d| j dd || jkr| j| d| _| j	rd| j	_d S )Nr   )r|   u,   Не возможно сделать append u#   , т.к. значение поля u    не список: T)abort)
r   r|   r   rb   rY   r=   re   r  rd   rE   )r   rY   rA   r   r|   r   r   r   r  	  s    

zCmfJson.appendc             O   s   ddl m} | js|   | jd kr(d S t| jtsT|d| d|  d| j dd || jkr~| j| d| _| j	r~d| j	_d S )Nr   )r|   u,   Не возможно сделать remove u#   , т.к. значение поля u    не список: T)r  )
r   r|   r   rb   rY   r=   re   r  rd   rE   )r   rY   rA   r   r|   r   r   r   r  	  s    

zCmfJson.remove)
r    r!   r"   r   r(   r  r\   r[   r  r  r   r   r   r   r  	  s   r  c                   s   e Zd ZdZdZdZdZdZdZdZ	dZ
dZed	d
 Zdd Zdd Zdd Z fddZ fddZ fddZ fddZ  ZS )
CmfNumeric.NZ	CmfNumber   r   r   rJ  z0.00c          	   C   s*   t  }t|_tt|| jdS Q R X d S )N)r   )r   r   Zroundingr   roundscale)r@   rY   Zctxr   r   r   _as_str
  s    zCmfNumeric._as_strc             C   s@   | j s
i S | jd krd n
| | j| jd kr0d n
| | jdS )N)rx   r   )rd   rx   r  r   )r   r   r   r   r   
  s    zCmfNumeric.audit_diffc             C   s   |d krdS |  |S )Nu   Не указано)r  )r   rY   r   r   r   r   "
  s    z CmfNumeric._format_for_html_diffc             C   s&   |d kr| j sdS |s|S t|S d S )Nr   )r   r   )r   rY   r   r   r   r[   '
  s
    zCmfNumeric.castc                s4   t jr(t| |}| jr(|dkr$dS dS t |S )Nr   TF)r   r'  rq   r   r)   r   )r   r   r(  )r0   r   r   r   2
  s    zCmfNumeric.__lt__c                s4   t jr(t| |}| jr(|dkr$dS dS t |S )Nr   TF)r   r'  rq   r   r)   r   )r   r   r(  )r0   r   r   r   <
  s    zCmfNumeric.__le__c                s4   t jr(t| |}| jr(|dk r$dS dS t |S )Nr   TF)r   r'  rq   r   r)   r   )r   r   r(  )r0   r   r   r   F
  s    zCmfNumeric.__gt__c                s4   t jr(t| |}| jr(|dkr$dS dS t |S )Nr   TF)r   r'  rq   r   r)   r   )r   r   r(  )r0   r   r   r   O
  s    zCmfNumeric.__ge__)r    r!   r"   r   r(   r  Z	precisionr  r*  r+  stepr  r  r  r   r   r[   r   r   r   r   rJ   r   r   )r0   r   r  	
  s"   

	r  c               @   s.   e Zd ZdZeZd ZdZe Ze	dd Z
dS )CmfObjectList.Nc                s    ddl m   fdd| jD S )Nr   )r}   c                s   g | ]}t  | qS r   )r  )r  r  )r}   r   r   r  e
  s    z0CmfObjectList.related_models.<locals>.<listcomp>)r   r}   )r@   r   )r}   r   r  a
  s    zCmfObjectList.related_models)r    r!   r"   r   re   r(   r  r}   rM   r  r  r   r   r   r   r  Z
  s   r  c               @   s,   e Zd ZdZdZd ZdZdZedd Z	dS )	CmfObject.Nc                s    ddl m   fdd| jD S )Nr   )r}   c                s   g | ]}t  | qS r   )r  )r  r  )r}   r   r   r  s
  s    z,CmfObject.related_models.<locals>.<listcomp>)r   r}   )r@   r   )r}   r   r  o
  s    zCmfObject.related_models)
r    r!   r"   r   r(   r  r}   rM   r  r  r   r   r   r   r  h
  s   r  c               @   s   e Zd ZdZdS )CmfLikes.N)r    r!   r"   r   r   r   r   r   r  v
  s   r  c               @   s   e Zd ZdZdS )CmfViews.N)r    r!   r"   r   r   r   r   r   r  z
  s   r  c               @   s   e Zd ZdZdS )CmfTags.N)r    r!   r"   r   r   r   r   r   r  ~
  s   r  c               @   s   e Zd ZdZdZd ZdS )CmfObjectJsonu@   Сохраняем и отдаём объект в виде JSON.N)r    r!   r"   r  r   r  r   r   r   r   r  
  s   r  c                   sT   e Zd ZdZdZ fddZdd Zedd Zd	d
 Z	e
dd Zdd Z  ZS )CmfIPv4NetworkList.ZCmfJSONArrayc                s   |d krt  |S t|S )N)r)   r[   r  db_cast)r   rY   )r0   r   r   r[   
  s    zCmfIPv4NetworkList.castc             C   s   d S )Nr   )r   rY   r   r   r   rZ   
  s    zCmfIPv4NetworkList.validatec             C   s   | j r
d S dd | jD S )Nc             S   s   g | ]}t |qS r   )r   )r  rC   r   r   r   r  
  s    z+CmfIPv4NetworkList.json.<locals>.<listcomp>)r   rY   )r   r   r   r   r   
  s    zCmfIPv4NetworkList.jsonc             C   s   | j d kr| j S t| jddS )NF)r  )rY   r   r   )r   r   r   r   r\   
  s    
zCmfIPv4NetworkList.db_formatc             C   s,   |dkr|S t |trt|}dd |D S )u9   убрать после рефакторинга
        Nc             S   s   g | ]}t |qS r   )rT  rW  )r  rC   r   r   r   r  
  s    z.CmfIPv4NetworkList.db_cast.<locals>.<listcomp>)r=   r   r   )r@   rY   r   r   r   r  
  s
    
zCmfIPv4NetworkList.db_castc             C   s,   | j s
i S dd | jD dd | jD dS )Nc             S   s   g | ]}t |qS r   )r   )r  rC   r   r   r   r  
  s    z1CmfIPv4NetworkList.audit_diff.<locals>.<listcomp>c             S   s   g | ]}t |qS r   )r   )r  rC   r   r   r   r  
  s    )rx   r   )rd   rx   r   )r   r   r   r   r   
  s    zCmfIPv4NetworkList.audit_diff)r    r!   r"   r   r  r[   rZ   r>   r   r\   r  r  r   rJ   r   r   )r0   r   r  
  s   
r  __main__Zababza:bzb:a)N)grT  r;  r   r   r   r   r   r   typingr   r	   r
   rK  r   r   Zdecimalr   r   r   Zdateutil.parserr/  r  Zujsonr   r   Zcmf.base_errorr   r   r   r   r[  r   rj   r   r   r#   r&   rq   r'   rK   r  r$  r&  r,  r-  r.  r2  r3  r=  r>  r@  rB  rD  rF  r  rP  rQ  rR  rS  rV  rX  rY  r_  rf  rk  rz  r{  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r    AssertionErrorZlikesZtestrY   rc  r   r   r   r   r   <module>   s   1     "p61%!a1 $ R  e 
 8Q+
