U
    why                    @   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 | _t| D ]F}|drNq>|| j	krZq>t
| |}t|trpq>t|rzq>|| j|< q>d S )N	load_modelazyZcf_T_)r"   
class_namevirtual__dict__r4   
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 r   )getrC   instanceownerr   r   r    __get__F   s    zCmfTypeMeta.__get__c                 C   s   |  ||S r   )setrH   r   r   r    __set__J   s    zCmfTypeMeta.__set__)N)N)r"   r#   r$   r,   r!   rK   rM   __classcell__r   r   r2   r    r)   !   s   
r)   c                   @   s\  e Zd ZU dZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZeed< dZ eed	< dZ!eed
< dZ"dZ#dZ$dZ%d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 Z0e0j1d d Z0d!d" Z2e/j1d#d Z/d$d% Z3e.d&d' Z4e.d(d) Z5e.d*d+ Z6e.d,d- Z7e.d.d/ Z8e9dd0d1Z:e9d2d3 Z;d4d5 Z<d6d7 Z=d8d9 Z>d:d; Z?d<d= Z@e9d>d? ZAdd@dAZBdBdC ZCdDdE ZDdFdG ZEdHdI ZFdJdK ZGdLdM ZHdNdO ZIdPdQ ZJdRdS ZKdTdU ZLdVdW ZMdXdY ZNdZd[ ZOd\d] ZPd^d_ ZQd`da ZRdbdc ZSddde ZTdfdg ZUdhdi ZVdjdk ZWdldm ZXdndo ZYdpdq ZZdrds Z[dtdu Z\dvdw Z]dxdy Z^ddzd{Z_d|d} Z`d~d Zadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd ZldddZmdd Zndd Zodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd ZydddZzdd Z{dd Z|dd Z}dd Z~dd Zdd Zdd 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)r<   r>   r*   db_namedb_aliasrQ   primary_keyuniqueindex	lazy_loadr4   instance_classrequired_fieldsc                 C   s   d S r   r   r   valuer   r   r    validate   s    zCmfType.validatec                 C   s0   |d kr|S | j d k	r,t|| j s,|  |S |S r   )r*   r@   r]   r   r   r    cast   s    

zCmfType.castc                 C   s   | j S r   r^   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)r8   _value_oldrI   load_fieldsr7   )r   rd   re   r   r   r   r    load   s    zCmfType.loadc                 O   s   d S r   r   r   rD   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_changedrf   rg   r@   listdictr   rj   r   r   r    flush   s    zCmfType.flushc              
   C   sv   zt | jd| j | j}W nT tk
rp } z6ddlm} dd l}|d| d|	   |W 5 d }~X Y nX |S )Nr6   r   r   u5   DEV: ошибка рассчета virtual-поля: 
)
r?   rI   r7   rf   	Exceptionflaskr   	tracebackdebug
format_exc)r   reser   rt   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 )Nr6   r   r   u   Не получилось выполнить присвоение, т.к. нет сеттера у виртуального поля)	r?   typerI   r7   fsetrs   r   ru   setattr)r   rf   r   r   r   r    virtual_setter   s    zCmfType.virtual_setterc                 C   s   |   S r   )
_get_valuerb   r   r   r    r^      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)rg   rI   is_newr   r7   rb   r   r   r    old   s
    zCmfType.oldc                 C   s   t dd S )Nu=   Нельзя устанавливать .old значения)rr   r]   r   r   r    r      s    c           	      C   s  | j dk	s| jr| jjr,| jr&|  S | j S ddlm} ddlm} ddl	m
} t|dd r|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 ЛЕНИВАЯ ПОДГРУЗКА ПОЛЯ r   *rd   u>   ПРОИЗОШЛА ЛЕНИВАЯ ПОДГРУЗКА ПОЛЯ 	cmf_alertmodels)codezField: rq   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.*)!rf   rI   r   r8   ry   rs   r   Z
markupsafer   cmf.includer   r?   ru   r7   ri   ZRAISE_LAZYLOADZinteractive_shellrt   r   r   ZCMF_ADMIN_CODE	CmfPersonrG   joinformat_stackstrZCmfTaskZ	auto_taskZdelayidr^   r   rh   )	r   r   r   r   rt   r   r   ZadminZ	task_infor   r   r    r~      sT      zCmfType._get_valuec                 C   s
   |  |S r   )
_set_valuer]   r   r   r    r^   "  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-   Нельзя убирать значение r    Fu7   Не могу присвоить значение None T)r8   r}   r   rI   r7   r   r@   rO   r^   r`   nullabler_   rg   rm   rf   r]   r   r   r    r   &  s*    
"


"

zCmfType._set_valuec                 C   s   | j S r   ra   rb   r   r   r    newN  s    zCmfType.newc                 C   s   t | jtr| jjS | jS r   )r@   r^   rO   rb   r   r   r    jsonR  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)r^   r@   rf   rn   ro   lenrb   r   r   r    is_nullY  s
    
zCmfType.is_nullc                 C   s   | j  S r   )r   rb   r   r   r    is_not_nullb  s    zCmfType.is_not_nullc                 C   s
   | j dk	S N.)rf   rb   r   r   r    
is_definedf  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"   r9   r-   rz   r$   rH   r   r   r    rG   n  s    zCmfType.getc                 C   s   |j | j }||_d S r   )r9   r"   r^   )rC   rI   r^   fieldr   r   r    rL   {  s    zCmfType.setc                 C   s   t |S r   r   r]   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 )N   Не указано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 r   r   r   r   rb   r   r   r    
_html_diff  s    zCmfType._html_diffc                 C   s   | j s
dS |  S NrP   )rm   r   rb   r   r   r    	html_diff  s    zCmfType.html_diffc                 C   s   | j s
i S | j| jdS )A   
        Данные для таблицы аудита
        r   r   rm   r   r   rb   r   r   r    
audit_diff  s
    zCmfType.audit_diffc                 C   s
   | j pg S r   )r\   rC   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   )	rm   rI   rg   rf   r^   	log_levelvisibler8   r7   r]   r   r   r    r!     s    $zCmfType.__init__c                 C   s    t |tr|j}t| j||S r   )r@   rO   r^   r?   )r   fnotherr   r   r    _compare  s    
zCmfType._comparec                 C   s   t | j dt| j dS )N())rz   r$   reprrf   rb   r   r   r    __repr__  s    zCmfType.__repr__c                 C   s
   t | jS r   r   r^   rb   r   r   r    __str__  s    zCmfType.__str__c                 C   s
   | j  S r   )r^   	__bytes__rb   r   r   r    r     s    zCmfType.__bytes__c                 C   s   | j t| |j k S r   r^   rz   r   r   r   r   r    __lt__  s    zCmfType.__lt__c                 C   s   | j t| |j kS r   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 rl   )r@   rO   r   r   r^   rz   r   r   r   r    __eq__  s    zCmfType.__eq__c                 C   s   | j t| |j kS r   r   r   r   r   r    __gt__  s    zCmfType.__gt__c                 C   s   | j t| |j kS r   r   r   r   r   r    __ge__  s    zCmfType.__ge__c                 C   s
   t | jS r   )hashr^   rb   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)rI   r   rf   boolr^   rb   r   r   r    __bool__  s    zCmfType.__bool__c                 C   s
   t | jS r   )r   r^   rb   r   r   r    __len__  s    zCmfType.__len__c                 C   s
   | j  S r   )r^   __length_hint__rb   r   r   r    r     s    zCmfType.__length_hint__c                 C   s
   | j | S r   ra   r   keyr   r   r    __getitem__  s    zCmfType.__getitem__c                 C   s   |  || j|< d S r   )r`   r^   )r   r   r^   r   r   r    __setitem__  s    zCmfType.__setitem__c                 C   s   | j |= d S r   ra   r   r   r   r    __delitem__  s    zCmfType.__delitem__c                 C   s   | j |S r   )r^   __missing__r   r   r   r    r     s    zCmfType.__missing__c                 C   s
   | j  S r   )r^   __iter__rb   r   r   r    r      s    zCmfType.__iter__c                 C   s
   t | jS r   )reversedr^   rb   r   r   r    __reversed__#  s    zCmfType.__reversed__c                 C   s
   || j kS r   ra   )r   itemr   r   r    __contains__&  s    zCmfType.__contains__c                 C   s   | j t| |j  S r   r   r   r   r   r    __add__,  s    zCmfType.__add__c                 C   s   | j t| |j  S r   r   r   r   r   r    __sub__/  s    zCmfType.__sub__c                 C   s   | j t| |j  S r   r   r   r   r   r    __mul__2  s    zCmfType.__mul__c                 C   s   | j t| |j  S r   r   r   r   r   r    
__matmul__5  s    zCmfType.__matmul__c                 C   s   | j t| |j  S r   r   r   r   r   r    __truediv__8  s    zCmfType.__truediv__c                 C   s   | j t| |j  S r   r   r   r   r   r    __floordiv__;  s    zCmfType.__floordiv__c                 C   s   | j t| |j  S r   r   r   r   r   r    __mod__>  s    zCmfType.__mod__c                 C   s   t | jt| |jS r   )divmodr^   rz   r   r   r   r    
__divmod__A  s    zCmfType.__divmod__c                 C   s   t | jt| |j|S r   )powr^   rz   r   r   Zmodulor   r   r    __pow__D  s    zCmfType.__pow__c                 C   s   | j t| |j > S r   r   r   r   r   r    
__lshift__G  s    zCmfType.__lshift__c                 C   s   | j t| |j ? S r   r   r   r   r   r    
__rshift__J  s    zCmfType.__rshift__c                 C   s   | j t| |j @ S r   r   r   r   r   r    __and__M  s    zCmfType.__and__c                 C   s   | j t| |j A S r   r   r   r   r   r    __xor__P  s    zCmfType.__xor__c                 C   s   | j t| |j B S r   r   r   r   r   r    __or__S  s    zCmfType.__or__c                 C   s   t | |j| j S r   rz   r^   r   r   r   r    __radd__V  s    zCmfType.__radd__c                 C   s   t | |j| j S r   r   r   r   r   r    __rsub__\  s    zCmfType.__rsub__c                 C   s   t | |j| j S r   r   r   r   r   r    __rmul___  s    zCmfType.__rmul__c                 C   s   t | |j| j S r   r   r   r   r   r    __rmatmul__b  s    zCmfType.__rmatmul__c                 C   s   t | |j| j S r   r   r   r   r   r    __rtruediv__e  s    zCmfType.__rtruediv__c                 C   s   t | |j| j S r   r   r   r   r   r    __rfloordiv__h  s    zCmfType.__rfloordiv__c                 C   s   t | |j| j S r   r   r   r   r   r    __rmod__k  s    zCmfType.__rmod__c                 C   s   t t| |j| jS r   )r   rz   r^   r   r   r   r    __rdivmod__n  s    zCmfType.__rdivmod__c                 C   s   t t| |j| j|S r   )r   rz   r^   r   r   r   r    __rpow__q  s    zCmfType.__rpow__c                 C   s   t | |j| j> S r   r   r   r   r   r    __rlshift__t  s    zCmfType.__rlshift__c                 C   s   t | |j| j? S r   r   r   r   r   r    __rrshift__w  s    zCmfType.__rrshift__c                 C   s   t | |j| j@ S r   r   r   r   r   r    __rand__z  s    zCmfType.__rand__c                 C   s   t | |j| jA S r   r   r   r   r   r    __rxor__}  s    zCmfType.__rxor__c                 C   s   t | |j| jB S r   r   r   r   r   r    __ror__  s    zCmfType.__ror__c                 C   s   |  j t| |j 7  _ | S r   r   r   r   r   r    __iadd__  s    zCmfType.__iadd__c                 C   s   |  j t| |j 8  _ | S r   r   r   r   r   r    __isub__  s    zCmfType.__isub__c                 C   s   |  j t| |j 9  _ | S r   r   r   r   r   r    __imul__  s    zCmfType.__imul__c                 C   s   |  j t| |j   _ | S r   r   r   r   r   r    __imatmul__  s    zCmfType.__imatmul__c                 C   s   |  j t| |j   _ | S r   r   r   r   r   r    __itruediv__  s    zCmfType.__itruediv__c                 C   s   |  j t| |j   _ | S r   r   r   r   r   r    __ifloordiv__  s    zCmfType.__ifloordiv__c                 C   s   |  j t| |j ;  _ | S r   r   r   r   r   r    __imod__  s    zCmfType.__imod__c                 C   s   | j t| |j |S r   )r^   __ipow__rz   r   r   r   r    r     s    zCmfType.__ipow__c                 C   s   | j t| |j S r   )r^   __ilshift__rz   r   r   r   r    r     s    zCmfType.__ilshift__c                 C   s   | j t| |j S r   )r^   __irshift__rz   r   r   r   r    r     s    zCmfType.__irshift__c                 C   s   | j t| |j S r   )r^   __iand__rz   r   r   r   r    r     s    zCmfType.__iand__c                 C   s   | j t| |j S r   )r^   __ixor__rz   r   r   r   r    r    s    zCmfType.__ixor__c                 C   s   | j t| |j S r   )r^   __ior__rz   r   r   r   r    r    s    zCmfType.__ior__c                 C   s
   | j  S r   )r^   __neg__rb   r   r   r    r    s    zCmfType.__neg__c                 C   s
   | j  S r   )r^   __pos__rb   r   r   r    r    s    zCmfType.__pos__c                 C   s
   | j  S r   )r^   __abs__rb   r   r   r    r    s    zCmfType.__abs__c                 C   s
   | j  S r   )r^   
__invert__rb   r   r   r    r    s    zCmfType.__invert__c                 C   s
   | j  S r   )r^   __complex__rb   r   r   r    r    s    zCmfType.__complex__c                 C   s
   | j  S r   )r^   __int__rb   r   r   r    r    s    zCmfType.__int__c                 C   s
   | j  S r   )r^   	__float__rb   r   r   r    r	    s    zCmfType.__float__c                 C   s
   | j  S r   )r^   	__index__rb   r   r   r    r
    s    zCmfType.__index__c                 C   s   | j |S r   )r^   	__round__)r   ndigitsr   r   r    r    s    zCmfType.__round__c                 C   s
   | j  S r   )r^   	__trunc__rb   r   r   r    r    s    zCmfType.__trunc__c                 C   s
   | j  S r   )r^   	__floor__rb   r   r   r    r    s    zCmfType.__floor__c                 C   s
   | j  S r   )r^   __ceil__rb   r   r   r    r    s    zCmfType.__ceil__c                 C   s
   | j  S r   )r^   	__enter__rb   r   r   r    r    s    zCmfType.__enter__c                 C   s   | j |||S r   )r^   __exit__r   exc_type	exc_valuert   r   r   r    r    s    zCmfType.__exit__c                 C   s
   | j  S r   )r^   	__await__rb   r   r   r    r    s    zCmfType.__await__c                 C   s
   | j  S r   )r^   	__aiter__rb   r   r   r    r    s    zCmfType.__aiter__c                 C   s
   | j  S r   )r^   	__anext__rb   r   r   r    r    s    zCmfType.__anext__c                 C   s
   | j  S r   )r^   
__aenter__rb   r   r   r    r    s    zCmfType.__aenter__c                 C   s   | j |||S r   )r^   	__aexit__r  r   r   r    r    s    zCmfType.__aexit__c                 C   s
   | j  S r   )r9   r   rb   r   r   r    __getstate__  s    zCmfType.__getstate__c                 C   s   | j | d S r   )r9   update)r   stater   r   r    __setstate__  s    zCmfType.__setstate__)NF)N).)N)N)N)N)r"   r#   r$   __doc__r   r*   placeholderZcommentrU   rV   r   rQ   rW   rX   rY   index_usingr   r   r'   r4   widgetr[   r8   Zvirtual_cache_timelifeautor;   Zfullsearch_indexr\   Zoptions_list_paramsrR   r   __annotations__rS   rT   ZTEXKOM_group_by_allowr<   Zui_form_visibler>   r_   r`   rc   ri   rk   rp   ry   r}   rA   r^   r   setterr~   r   r   r   r   r   r   classmethodrG   rL   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    rO   R   s6  




3
(





	

	.



rO   )	metaclassc                       s   e Zd ZdZdZdZdZdZdZdZ	dZ
ej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.NT)options_list_bqloptions_list_bql_exclusivec                 C   s$   d| _ | jrd| j_ | j| d S NT)rm   rI   r^   appendr   objr   r   r    r+    s    zCmfRelBase.appendc                 C   s$   d| _ | jrd| j_ | j| d S r*  )rm   rI   r^   remover,  r   r   r    r.    s    zCmfRelBase.removec                    s   t  j|| d | _d S r   )r+   r!   _all_nested_cacherj   r2   r   r    r!   	  s    zCmfRelBase.__init__c                    s   t  || d || j _d S r   )r+   rL   r"   r/  )rC   rI   r^   r2   r   r    rL     s    zCmfRelBase.setc                 C   s   t d S r   NotImplementedErrorr   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 |  D ]&}|jd
d|gddd}|r|  S q|  D ]&}|jdd|gd}|r|  S q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==)filterr5  r6  r.   )r8  Zemployee_number)r   r   r@   ro   r?   rz   CmfTUUIDr4  rG   r   splitr   r2  r   rd   r+   r`   )r   r^   r   r4  Zid_partsr-  rw   r2   r   r    r`     s@    


zCmfRelBase.castr   )r7   rd   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 }|
 D ].\}	}
t||	}||jdd|
g|dd qj|| j|< |S )Nr   r3  )Zchild_modelsr   INT)r8  rd   Zinclude_system)r   r/  r   r   RelationCacheZget_children_dictrI   r   r^   r7   itemsr?   extendrn   )r   r7   rd   _args_kwargsZall_nested_cache_keyr   Zchildren_dictresultZ
model_nameZids_listr4  r   r   r    
all_nested:  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 }| jD ]}|| jkrN||jj qN| jD ]}|| jkrr||jj qr|s|si S ||dS )Nr   )appendeddeleted)rm   r@   r^   rn   r   r   r   r+  )r   rC  rD  r-  r   r   r    r   P  s&    



zCmfRelBase.audit_diff)r"   r#   r$   r   r*   Znested_fieldsZlinkableZoptions_list_search_columnsZoptions_list_show_columnsr(  r)  rO   r>   r+  r.  r!   r%  rL   r2  r`   rB  r   rN   r   r   r2   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   Нетr   u)   Некорректное значение)
ValueErrorr]   r   r   r    r   n  s    zCmfBool._format_for_html_diffN)
r"   r#   r$   r   r   r*   r!  r   rQ   r   r   r   r   r    rE  g  s   rE  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                    sp   |dkrd S t  |}t| dd }|d k	rl|d k	rl||k rldd l}td| j d| dd|   |S )NrP   TEXKOM_warn_minr   zDEV: TEXKOM_warn_min: : z 
)	r+   r`   r?   rt   r   ru   r   r   r   )r   r^   rH  rt   r2   r   r    r`     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_moderz   r   r+   r   r   r   or2   r   r    r     s    zCmfInt.__lt__c                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rJ  r   rL  rz   r   r+   r   rM  r2   r   r    r     s    zCmfInt.__le__c                    s4   t jr(t| |}| jr(|dk r$dS dS t |S rJ  r   rL  rz   r   r+   r   rM  r2   r   r    r     s    zCmfInt.__gt__c                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rJ  r   rL  rz   r   r+   r   rM  r2   r   r    r     s    zCmfInt.__ge__)r"   r#   r$   r   intr*   minmaxr!  r`   r   r   r   r   rN   r   r   r2   r    rG  y  s   

	rG  c                   @   s   e Zd ZdZdS )	CmfBigInt.Nr"   r#   r$   r   r   r   r   r    rU    s   rU  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    rW    s   rW  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 r   r   r   r^   rb   r   r   r    r     s    zCmfTime.jsonc                    s&   t |trtj| S t |S r   )r@   r   dateutilparserparser   r+   r`   r]   r2   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:%Sr   )rm   r   strftimer^   rb   r   r   r    r     s
    zCmfTime.audit_diff)r"   r#   r$   r   r   r*   rS  rT  r!  rA   r   r`   r   rN   r   r   r2   r    rY    s   
rY  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    r_    s   r_  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 )r`  .Nregexu^   Значение {} не удовлетворяет регулярному выражению.)rc  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 )NrP   rI  )r   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,   Слишком длинная строка: )rb  r   r   rc  	fullmatchrd  formatr]   r   r   r    r_      s    zCmfStr.validatec                 O   s   | j j||S r   r^   r:  rj   r   r   r    r:    s    zCmfStr.split)r&   c                 O   s   | j r
dS | jj||S rl   )r   r^   r:   rj   r   r   r    r:     s    zCmfStr.startswithc                 O   s   | j r
dS | jj||S rl   )r   r^   endswithrj   r   r   r    rh    s    zCmfStr.endswith)r"   r#   r$   r   r   r*   rb  rc  rePatternr#  rd  r!  rO   r>   r   r_   r:  r   r:   rh  r   r   r   r    r`    s   

r`  c                   @   s   e Zd ZdZd ZdS )CmfText.Nr"   r#   r$   r   r!  r   r   r   r    rk    s   rk  c                   @   s   e Zd ZdZdZdS )CmfStr32.    Nr"   r#   r$   r   rb  r   r   r   r    rm    s   rm  c                   @   s   e Zd ZdZdZdS )CmfStr64.@   Nro  r   r   r   r    rp  "  s   rp  c                   @   s   e Zd ZdZdZdS )	CmfStr256.   Nro  r   r   r   r    rr  '  s   rr  c                   @   s   e Zd ZdZdZdS )	CmfStr128.   Nro  r   r   r   r    rt  ,  s   rt  c                   @   s   e Zd ZdZdZdS )
CmfStr4096.i   Nro  r   r   r   r    rv  1  s   rv  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 )r9  .N)foreign_keyforeign_keysc                 C   s   | j dd S )Nr7  r   rg  rb   r   r   r    	type_name=  s    zCmfTUUID.type_namec                 C   s   t | jdd S )Nr7     )r   r^   r:  rb   r   r   r    uuidA  s    zCmfTUUID.uuidc                 C   s   ddl m} t|t| jjS Nr   r3  )r   r   r?   r9  r^   ry  )r   r   r   r   r    r4  E  s    zCmfTUUID.modelc                 C   s
   t |jS r   )r9  r4  )rC   	tuuid_strr   r   r    get_cls_by_tuuid_strK  s    zCmfTUUID.get_cls_by_tuuid_strc                 C   s   t |}|j|jS r   )r9  r4  rG   r^   )rC   r}  Ztuuidr   r   r    get_obj_by_tuuid_strO  s    zCmfTUUID.get_obj_by_tuuid_strc                    s0   | j r$| jr$td| jd d  t |S )Nu\   Это служебное поле, для присвоения ид используйте )rw  rI   r   r7   r+   r_   r]   r2   r   r    r_   T  s    zCmfTUUID.validate)r"   r#   r$   r   rw  rx  rp  r>   rA   ry  r{  r4  r%  r~  r  r_   rN   r   r   r2   r    r9  6  s   





r9  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    r  [  s   r  c                   @   s   e Zd ZdZdZdS )CmfM2MTUUID.ru  Nro  r   r   r   r    r  a  s   r  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 r   r   rb   r   r   r    r   l  s    zCmfUUID.jsonN)r"   r#   r$   r   r   r*   r   rQ   r!  rA   r   r   r   r   r    r  f  s   r  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 r   r   rb   r   r   r    rc   u  s    zCmfIPv4Address.db_formatc                 C   s   | j r
d S t| jS r   rZ  rb   r   r   r    r   x  s    zCmfIPv4Address.jsonc                    s2   |sd }t |tjs|d kr(t |S t|S r   )r@   	ipaddressIPv4Addressr+   r`   r]   r2   r   r    r`   ~  s
    zCmfIPv4Address.castc                 C   s   d S r   r   r]   r   r   r    r_     s    zCmfIPv4Address.validatec                 C   s   |  | j| jS r   r   rb   r   r   r    r     s    zCmfIPv4Address._html_diff)r"   r#   r$   r   r  r  r*   rc   rA   r   r`   r_   r   rN   r   r   r2   r    r  q  s   
r  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 r   r   rb   r   r   r    rc     s    zCmfIPv4Network.db_formatc                 C   s   | j r
d S t| jS r   rZ  rb   r   r   r    r     s    zCmfIPv4Network.jsonc                    s*   t |tjs|d kr t |S t|S r   )r@   r  IPv4Networkr+   r`   r]   r2   r   r    r`     s    zCmfIPv4Network.castc                 C   s   d S r   r   r]   r   r   r    r_     s    zCmfIPv4Network.validate)r"   r#   r$   r   r  r  r*   rc   rA   r   r`   r_   rN   r   r   r2   r    r    s   
r  c                   @   s   e Zd ZdZdS )	CmfDomain.NrV  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 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.utilr  r_   r:   crypt_prefixZcrypt)r   r^   r  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   r  r   u!   Недостаточно правrz  )r  r  r   r   r   r^   r   Zcurrent_personZsystem_personZCmfAccessListZcheck_admin_moder:   r  decryptr:  )r   r  r   r   r   r   r    r    s    zCmfPassword.decryptc                    s    t d|rtdt |S )Nu   [А-Яа-яЁё]uD   Пароль не должен содержать кириллицу)ri  searchr   r+   r_   r]   r2   r   r    r_     s    zCmfPassword.validate)
r"   r#   r$   r   r!  r  r`   r  r_   rN   r   r   r2   r    r    s   	r  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 r   r   r^   	isoformatrb   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 Nr   rm   r   r  r^   rb   r   r   r    r     s
    zCmfDate.audit_diffc                    s&   t |trtj| S t |S r   )r@   r   r[  r\  r]  r   r+   r`   r]   r2   r   r    r`     s    
zCmfDate.castc                 C   s   | t tj S r   )r   nowr   utcr   r   r   r   r    r    s    zCmfDate.nowc                 C   s   |   | _d S r   r  r^   rb   r   r   r    set_now  s    zCmfDate.set_nowc                 C   s6   t |tr|  j|7  _n|  jt| |j7  _| S r   r@   r   r^   rz   r   r   r   r    r     s    
zCmfDate.__iadd__c                 C   s6   t |tr|  j|8  _n|  jt| |j8  _| S r   r  r   r   r   r    r     s    
zCmfDate.__isub__c                 C   s,   t |tr| j| S | jt| |j S d S r   r  r   r   r   r    r     s    

zCmfDate.__add__c                 C   s,   t |tr| j| S | jt| |j S d S r   r  r   r   r   r    r     s    

zCmfDate.__sub__c                    s(   t jrt| | | jrdS t |S rl   rK  r   r2   r   r    r     s
    zCmfDate.__lt__c                    s(   t jrt| | | jrdS t |S rl   rO  r   r2   r   r    r     s
    zCmfDate.__le__c                    s(   t jrt| | | jrdS t |S rl   rP  r   r2   r   r    r     s
    zCmfDate.__gt__c                    s(   t jrt| | | jrdS t |S rl   rQ  r   r2   r   r    r      s
    zCmfDate.__ge__)r"   r#   r$   r   r   r*   r  r  r!  rO   r>   rA   r   r   r`   r%  r  r  r   r   r   r   r   r   r   r   rN   r   r   r2   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 r   )r+   r   r  r  r   r2   r   r    r   3  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?   rI   r  r  replacer  )r   Zrange_startZ	range_endr   r   r    ry   7  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   rz  )r[  r\  r]  r   r|   rI   r  r  )r   r^   Zstart_valueZ	end_valuer   r   r    r}   A  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 r   )r?   rI   r  r  r  rb   r   r   r    r   K  s
    zCmfDateRange.jsonc                 C   s   | j s
i S d|  dS )NZTODOr   )rm   r   rb   r   r   r    r   S  s
    zCmfDateRange.audit_diff)r"   r#   r$   r   r*   r  r  r!  rO   r>   r8   r%  r   ry   r}   rA   r   r   rN   r   r   r2   r    r  *  s   



r  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.Fr  Zdtc                 C   s    | d k	rt tj|   S d S r   )r   r  r   r  Ztotal_secondsr  r   r   r    cls_aged  s    zCmfDateTime.cls_agec                 C   s   | j s
dS | | j S Nr   )r^   r  rb   r   r   r    agei  s    zCmfDateTime.agec                 C   s   | j r
d S | j S r   r  rb   r   r   r    r   o  s    zCmfDateTime.jsonc                 C   s4   | j s
i S | jr| j nd | jr,| j nd dS r  r  rb   r   r   r    r   u  s
    zCmfDateTime.audit_diffc                 C   s@   ddddddddd	d
ddd}|  D ]\}}| ||} q&| 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=  r  )r^   mappingZmonth_ruZmonth_enr   r   r    _translate_month}  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   r   T/rz     )dayfirst)tzinfo)r@   r   isdigitr[  r\  r]  r  r+   r`   Z	utcoffsetr  r   r  Z
astimezoner  )r   r^   r  rw   r2   r   r    r`     s    
zCmfDateTime.castc                 C   s&   |sdS |  }d| d| d}|S )NrP   z<time datetime="z">z</time>)r  r]   r   r   r    r     s
    z!CmfDateTime._format_for_html_diffc                 C   s   | t tjS r   )r   r  r   r  r   r   r   r    r    s    zCmfDateTime.nowc                 C   s   |   | _d S r   r  rb   r   r   r    r    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)Zdaysr@   r   r^   rz   rR  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 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 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 r  r  r   r   r   r    r     s
    

zCmfDateTime.__sub__c                    s(   t jrt| | | jrdS t |S rl   rK  r   r2   r   r    r     s
    zCmfDateTime.__lt__c                    s(   t jrt| | | jrdS t |S rl   rO  r   r2   r   r    r     s
    zCmfDateTime.__le__c                    s(   t jrt| | | jrdS t |S rl   rP  r   r2   r   r    r     s
    zCmfDateTime.__gt__c                    s(   t jrt| | | jrdS t |S rl   rQ  r   r2   r   r    r     s
    zCmfDateTime.__ge__) r"   r#   r$   r   r   r*   r  r  r!  rO   r>   staticmethodr  rA   r  r   r   r  r`   r   r%  r  r  r   r   r   r   r   r   r   r   rN   r   r   r2   r    r  [  s8   




			r  c                       s    e Zd ZdZ fddZ  ZS )CmfCreateDateTime.c                    s(   t  |}ttj}||kr$|}|S r   )r+   r`   r   r  r   r  )r   r^   rw   r  r2   r   r    r`     s
    zCmfCreateDateTime.cast)r"   r#   r$   r   r`   rN   r   r   r2   r    r    s   r  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.r5   )r/  rm   rI   rf   r   r   rg   )setattr_fieldsc                 C   s   t d S r   r0  r]   r   r   r    r_     s    zCmfRelationBase.validatec                    s   t   |  g S r   )r+   r   id_fieldnamer   r2   r   r    r     s    z#CmfRelationBase.get_required_fieldsc                 C   s
   | j d S )N_idr7   r   r   r   r    r    s    zCmfRelationBase.id_fieldnamec                 C   s   t | j|  S r   )r?   rI   r  rb   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@   rO   r^   r?   r  rg   rf   rs   r   ru   rm   )rC   rI   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 r   )	r+   rL   r"   rf   r   r^   r   r  _update_backref)rC   rI   r^   Zinserted_valuer  r2   r   r    rL   <  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	rt
|j	| j jD ](}|j|jkr|j	| j j|  qqnz|jdk	r:|jd k	r:|j	| j jdk	r:|j	| j }|jdkrd S t
|jD ]&}|j|jkr|j|  q:qd S )Nbackref.c                 S   s   g | ]
}|j qS r   r   .0r-  r   r   r    
<listcomp>T  s     z3CmfRelationBase._update_backref.<locals>.<listcomp>)r?   r"   r   r  rf   r   r^   r+  rg   r   r   r.  )rC   rI   r   Zbackref_fieldr-  r   r   r    r  K  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  rz  r3  z(DEV: FATAL Potential RelationCache leak target)r   r   r+   rk   rf   r   r^   rm   r   is_recursion_saver   rg   r<  remove_field_referencer   add_field_referencerz   r  rI   )r   r  rD   r   r   r  r   r2   r   r    rk   f  s*    



zCmfRelationBase.savec                    s<   |dkrd S | j dk	r.| js.| jj|d d t   d S )Nrz  .r  )rf   r   r^   rp   r+   )r   r  r2   r   r    rp     s
    zCmfRelationBase.flushc                 C   s   t | j|S r   )r?   r^   )r   r.   r   r   r    __getattr__  s    zCmfRelationBase.__getattr__c                    s8   || j ks|t| kr&t || nt| j|| d S r   )r  r=   r+   __setattr__r|   r^   )r   r.   r^   r2   r   r    r    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   r3  .r5  Tr6  c                    s   g | ]} j  d | qS )r   r  )r  Z
load_fieldrb   r   r    r    s     z(CmfRelationBase.load.<locals>.<listcomp>r   r4  rd   r7  Nu$   Нет класса с именем )r   r   rg   rI   r  r7   rh   hasattrrz   r?   r4  rG   r   rf   r:  rF  )	r   rd   re   r   r   Zid_fieldZfields_listr4  Zcls_namer   rb   r    ri     s<    



zCmfRelationBase.loadc                 C   s"   |dk	r|rt |dr|jjS d S )N.r.   )r  r.   r^   r]   r   r   r    r     s    z%CmfRelationBase._format_for_html_diffc                 C   s   | j r
d S | jjS r   )r   r^   r   rb   r   r   r    r     s    zCmfRelationBase.json)r   )NF)r"   r#   r$   r   rZ   r  r'  r>   r_   r%  r   r  rA   r   r  rL   r  rk   rp   r  r  ri   r   r   rN   r   r   r2   r    r  
  s2   	





+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)rx  c                 C   s8   t |j| jkr4td| j dt |j d| j d S )Nu   Тип u    не совпадает: z != )rz   r"   r4  r   r7   r]   r   r   r    r_     s    zCmfRelation.validatec                 C   s   ddl m} t|| j gS r|  r   r   varsr4  rC   r   r   r   r    r2    s    zCmfRelation.related_models)r"   r#   r$   r   r!  rx  r4  r  r>   r_   r%  r2  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   rz   r"   r   r]   r   r   r    r_     s    zCmfGenericRelation.validatec                 C   sH   ddl m} g }| jsg S | jD ]"}|t|kr |t||  q |S r|  )r   r   r  r+  )rC   r   rw   r4  r   r   r    r2    s    
z!CmfGenericRelation.related_models)	r"   r#   r$   r   r!  r   r_   r%  r2  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 r  )
cmf.modelsr?   r   
base_modelrn   Ziter_subclasses)rC   cmfr  r   r   r    r2    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      Тип не совпадает r   = ( | r   )	r  
issubclassrz   r?   r   r  r   rI   r7   )r   r^   r  r   r   r    r_     s    z%CmfSubclassedGenericRelation.validateN)
r"   r#   r$   r   r  r   Zfield_options_list_limitr%  r2  r_   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   sn   | j dk	r|s| S t | _ |  D ]0}| j |jf d|i| jd | jji| q"| jdkrjt| j | _| S )N.rd   r  )	rg   rn   r2  r>  r  rI   r   rf   r   r   rd   re   r   r4  r   r   r    ri     s    "
zCmfBackrefBase.loadc                    s   t  | _t j|| d S r   )rn   rQ   r+   r!   rj   r2   r   r    r!   )  s    zCmfBackrefBase.__init__c                    s   t  j|| d S r   )r+   rp   rj   r2   r   r    rp   -  s    zCmfBackrefBase.flush)NF)
r"   r#   r$   r   r4  r  ri   r!   rp   rN   r   r   r2   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 r|  )r   r   r4  r  r  r   r   r    r2  ;  s    zCmfBackref.related_models)r"   r#   r$   r!  r   r4  r%  r2  r   r   r   r    r  6  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   r3  c                    s   g | ]}t  | qS r   r  r  r4  r3  r   r    r  J  s     z4CmfGenericBackref.related_models.<locals>.<listcomp>r   r   r   r   r3  r    r2  F  s    z CmfGenericBackref.related_models)r"   r#   r$   r!  r   r   r%  r2  r   r   r   r    r  A  s
   r  c                       s   e Zd ZdZdZdZdZejd Zdd Z	dd Z
dd	 Zed
d Z fddZd.ddZedd Zedd Zd/ddZd0ddZd1ddZ fddZedd Zdd  Zd2d"d#Zd3d$d%Zd&d' Zd(d!d) fd*d+
Zd4 fd,d-	Z  ZS )5
CmfM2MBase.N)changes_appendedchanges_removedc                 C   s   t d S r   r0  r]   r   r   r    r_   U  s    zCmfM2MBase.validatec                 C   s   d}| j s|S i }| j D ]2}|d }|d }||kr<g ||< || | q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 )NrP   r   rz  r+  u    добавлено: ,c                 S   s   g | ]}t |qS r   r   r  cr   r   r    r  f  s     z)CmfM2MBase._html_diff.<locals>.<listcomp>r.  u    удалено: c                 S   s   g | ]}t |qS r   r   r  r   r   r    r  i  s     u    остальное: rI  )_changesr+  r   r   )r   Zhtml_strchangeschangeactr-  r   r   r    r   X  s&    
""zCmfM2MBase._html_diffc                 C   sZ   | j s
i S | jsi S i }| jD ]6}|d }|d jj}||krFg ||< || | q|S )r   r   rz  )rm   r  r   r^   r+  )r   r  r  r  Zobj_idr   r   r    r   o  s    
zCmfM2MBase.audit_diffc                 C   s   ddl m} t||   S r|  )r   r   r  m2m_model_cls_namer  r   r   r    m2m_model_cls  s    zCmfM2MBase.m2m_model_clsc                    s&   t  j|| g | _g | _t | _d S r   )r+   r!   r  _changes_bufferrn   rQ   rj   r2   r   r    r!     s    zCmfM2MBase.__init__c                 C   s2   | j D ]&^}}}||kr|r$||kr|  S qdS )uU  
        Проверяем, есть ли объект (obj) в списки изменений поля.
        :param obj: объект который ищем в изменениях.
        :param action: append|remove|None
        :type action: str
        :return action изменения: append|remove
        :rtype str
        Nr  )r   r-  actionchange_action
change_objr6   r   r   r    
in_changes  s    	zCmfM2MBase.in_changesc                 C   s   dd | j D S )Nc                 S   s   g | ]^}}}|d kr|qS )r+  r   r  r  r  r6   r   r   r    r    s      z/CmfM2MBase.changes_appended.<locals>.<listcomp>r  rb   r   r   r    r    s    zCmfM2MBase.changes_appendedc                 C   s   dd | j D S )Nc                 S   s   g | ]^}}}|d kr|qS )r.  r   r  r   r   r    r    s      z.CmfM2MBase.changes_removed.<locals>.<listcomp>r  rb   r   r   r    r    s    zCmfM2MBase.changes_removedrz  c                 O   sp  t |tr|j}t |tr$t|}| | d| _d}t| j	D ]@}|d j
|j
krB|d dkrfd}|d dkrB| j	|  qqBt| jD ]@}|d j
|j
kr|d dkrd}|d dkr| j|  qq|rdS | j	d||f | jd||f d| _| jrd| j_| jrH| jrH|dkrHt|| jj| j|d d | jd	k	rl|| jkrl| j| dS )
t   Должен работать в т.ч. с незагруженными полями, для оптимизации.NFrz  r   r+  Tr.  r  .)r@   rO   r^   r   r9  r  r_   r/  r   r  r   r.  r  r+  rm   rI   r  r?   rf   )r   r-  descriptionr  rD   r   Zalready_appendedrowr   r   r    r+    s@    



zCmfM2MBase.appendc                 C   s0   t |D ]"\}}| j||r"|| p$d d qd S )N)r  )	enumerater+  )r   ZobjsZdescriptionsir-  r   r   r    r>    s    zCmfM2MBase.extendc                 O   sR  d| _ t|trt|}d}t| jD ]@}|d j|jkr(|d dkrX| j|  qj|d dkr(d}q(t| j	D ]@}|d j|jkrt|d dkr| j	|  q|d dkrtd}qt|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	rN|| jkrN| j| dS )
r  NFrz  r   r+  r.  Tr  .)r/  r@   r   r9  r  r   r  r   r.  r  r+  rm   r  rI   r?   rf   )r   r-  r  rD   r   Zalready_removedr  r   r   r    r.    s:    

zCmfM2MBase.removec                    s   g }|d krg }|D ]<}t |tr(|j}t |ttfrBt |}|r|| q| jdkrt| j	j
rlg | _n|   t| jD ]"}|jdd |D kr~| | q~dd | jD }|D ]}|j|kr| | q|S )N.c                 S   s   g | ]
}|j qS 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    	<setcomp>  s     z"CmfM2MBase.cast.<locals>.<setcomp>)r@   rO   r^   ro   r   r+   r`   r+  rf   rI   r   ri   r   r   r.  )r   r^   rA  valZ	value_idsr2   r   r    r`     s,    


zCmfM2MBase.castc                 C   s   t d S r   r0  r   r   r   r    r    s    zCmfM2MBase.m2m_model_cls_namec                 C   s(   |   D ]}||}|r|  S qd S r   )r2  rG   )r   r   r4  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rb|  D ]2}| j|jf || jd| jjggdd| q,n| 	 j
| j| jd| _|   t| j| _ | S )N.r;  T)rd   r8  Zinclude_archived)r-  left)rg   rf   r/  r  r2  r>  rn   rI   r   r  Zselect_relatedr  apply_changesr   r  r   r   r    ri   &  s    2zCmfM2MBase.loadc           	         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  fdd|D }|S )u   
        Запрос all_nested наоборот. Не вложенные сущности, а все родительские
        r   r3  r  Zchild_idr  Zchild_fieldZparent_modelr;  	parent_id)r8  rd   c                 S   s   h | ]}|j r|j qS r   )r   )r  relationr   r   r    r  J  s      z)CmfM2MBase.all_parents.<locals>.<setcomp>c                    s"   h | ]} j |d  rqS )r   )Zget_obj_by_id)r  Zgroup_idr  rd   r-  r   r    r  O  s      )
r   r   r  r  r4  rI   r   r7   r<  Zslist)	r   Zid_onlyrd   r@  r   Zgroup_model_namesZrelation_filterZrelation_listrA  r   r  r    all_parents<  s    
zCmfM2MBase.all_parentsc              	   C   s   | j D ]x^}}}|dkr@z| j| W q~ tk
r<   Y q~X q|dkrpz| j| W q~ tk
rl   Y q~X qtd| qd S )Nr+  r.  u*   Неизвестное изменение )r  rf   r+  rF  r.  )r   Zchange_typerI   rD   r   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} ddlm} |	| j
d | jD ]^}	}
}d }| jr|
}| j
}| }n6| jr|
}| j
}| jrt|| j}ntd| j d	|j|jgd
 |jr6d}|   d|j d|j }td| d |jjj |d|i}t|}td| d |  j|j|jd d}|	dkr|r`q\|  ||d}|r|d |_ |! . |j|d|d i| |j"j#| |
d W 5 Q R X n@|	dkr|sq\|!   |$  |j"%| |
jj& W 5 Q R X |j	| j
|	|
| jd t|
dd s\|	dkrbt'|
drb|
j()  |
j(sz|
j|d|d i| q\|
j|d|d i| q\g | _d | _*d S )Nr  r   )	CMF_CACHEr3  r  r   r  u   У поля u-    не указано right оно или left)Z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()Zleft_idZright_idZroot_idr+  )r  rightr  rz  r  r.  )Zm2m_field_namer  cmf_deleted)+r+   rk   Zcmf.appr  r   r   r  r  r   Z
invalidaterI   r  r  r	  r  r?   rr   r7   Z_acl_check_writeZM2M_DUB_PROTECT_LOCKr  r   r   ru   r   ZdpZ_ddZSessionZexecutern   r  rG   r  Zdisable_aclr<  r  deleter  r^   r  r
  ri   r/  )r   r  r  rD   r   r  r   r  r   r  r-  ZcargsZ
left_fieldr	  r  Zlock_sqlr  Zlock_resr  r2   r   r    rk   h  sl    	 





zCmfM2MBase.savec                    sR   |dkrd S | j dk	r>| js>| jD ]}t|dd r4q"|  q"g | _t   d S )Nrz  .r  )rf   r   r^   r?   rp   r  r+   )r   r  rF   r2   r   r    rp     s    

zCmfM2MBase.flush)N)Nrz  )N)rz  )NF)FN)r   )r"   r#   r$   r   r  r	  r  r'  r>   r_   r   r   r%  r  r!   r  rA   r  r  r+  r>  r.  r`   r  r  ri   r  r  rk   rp   rN   r   r   r2   r    r  M  s8   






'

$ 


Wr  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 r   )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  r[   r7   r4  r	  rr   r   r   r   r    r    s
    zCmfM2M.m2m_model_cls_namec                 C   s   ddl m} t|| j gS r|  r  r  r   r   r    r2    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 Nr  r   r  r  r  r   )rz   rn   r"   r4  r   rI   r7   r]   r   r   r    r_     s    zCmfM2M.validate)r"   r#   r$   r!  r   r4  r  r  r  r%  r  r2  r_   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 r   )r	  r4  r  
capitalizer[   r7   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   r3  c                    s   g | ]}t  | qS r   r  r  r.   r3  r   r    r  	  s     z0CmfGenericM2M.related_models.<locals>.<listcomp>c                    s   g | ]}t  | qS r   r  r  r3  r   r    r  	  s     )r   r   r  r  r4  r   r   r3  r    r2    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 r  )r   rz   rn   r"   r   rI   r7   r]   r   r   r    r_   	  s    zCmfGenericM2M.validate)r"   r#   r$   r!  r   r   r4  r  r%  r  r2  r_   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   r4  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 r   r   rb   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  Z	ui_fieldschoices)r  r  rI   r  r[   _build_ui_formr  rG   r7   r+   r   r   r   r   r  Zui_form_customr  r2   r   r    r   	  s    
zCmfChoice._simple_html_diff)	r"   r#   r$   r   r  r!  r   r   rN   r   r   r2   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 r  )r  r  rI   r  r[   r  r  rG   r7   rR  r+   r   r  r2   r   r    r   7	  s    
zCmfChoiceInt._simple_html_diff)r"   r#   r$   r   r  r!  r   rN   r   r   r2   r    r  2	  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: )ri  matchr   r+   r_   r]   r2   r   r    r_   I	  s    zCmfEmail.validate.r"   r#   r$   r_   r   rN   r   r   r2   r    r  G	  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=   Неправильный формат имени домена)ri  compiler  r   r+   r_   )r   r^   patternr2   r   r    r_   S	  s    

zCmfOrgName.validate.r  r   r   r2   r    r  Q	  s   r  c                   @   s   e Zd ZdZdS )CmfLogin.NrV  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} d|jpg D ]$}t||}| r|   S qtd||jd S )Nr   r   ?   Введите корректный номер телефона)N)r   r   ZPHONE_REGIONSphonenumbersZPhoneNumberMatcherZhas_nextnextr   )r   r^   r   ZregionZmatcherr   r   r    _matchr	  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
        Nr"  )
r!  r  r+   r_   r%  numberr#  is_valid_numberis_possible_numberr   )r   r^   r  phoner2   r   r    r_   z	  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;rP   r"  z ,;rz  u   доб. z, )r%  r&  r#  r'  r(  r   startendstripformat_numberPhoneNumberFormatE164	extension)r   r^   r  r)  infor   r   r    r`   	  s$    

 zCmfPhone.castc                 C   s&   | j r"| j dd }| r"|S d S )Nr*  r   )r^   	partitionr  )r   r  r   r   r    r&  	  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 )Nr"  rz  r*  )r%  r&  r#  r'  r(  r   r.  r/  r0  r2  r^   )r   r^   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   )r^   r#  r]  r3  r.  r/  r0  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 r4  )r^   r#  r]  r3  r.  r/  ZNATIONALr6  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 r4  )r^   r#  r]  r3  r.  r/  ZINTERNATIONALr6  r   r   r    number_international	  s    zCmfPhone.number_internationalc                 C   s   | j s| j S | j dd S )Nr*  r   )r^   r3  rb   r   r   r    r2  	  s    zCmfPhone.infoc                 C   s.   | j r| j  d}nd}|r$||7 }|| _d S )Nr*  )r&  r^   )r   r^   r   r   r   r    r2  	  s    )r"   r#   r$   r  r   r!  r  ri  r  r!  rp  r>   r%  r_   r`   rA   r&  r$  r7  r8  r9  r2  rN   r   r   r2   r    r   `	  s.   







r   c                   @   s   e Zd ZdZd ZdS )CmfMarkdown.Nrl  r   r   r   r    r:  	  s   r:  c                   @   s   e Zd ZdZd ZdS )	CmfMarkup.Nrl  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]   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.ru  Nro  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)Zensure_ascii)r^   r   rb   r   r   r    rc   
  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  rE   rF   rb   r   r    
<dictcomp>
  s      z CmfJson.cast.<locals>.<dictcomp>c                    s   g | ]}  |qS r   r@  r  rF   rb   r   r    r  
  s     z CmfJson.cast.<locals>.<listcomp>)r@   ro   r=  rn   rO   r   r]   r   rb   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 #   , т.к. значение поля     не список: Tabort)
r   r   r   ri   r^   r@   rn   r+  rm   rI   r   r^   rD   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 rC  rD  TrE  )
r   r   r   ri   r^   r@   rn   r.  rm   rI   rG  r   r   r    r.  .
  s    
 
zCmfJson.remove)
r"   r#   r$   r   r*   r!  rc   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   rz  z0.00c              
   C   s6   t  &}t|_tt|| jdW  5 Q R  S Q R X d S )N)r  )r   r   Zroundingr   roundscale)rC   r^   Zctxr   r   r    _as_strK
  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 r  )rm   r   rL  r   rb   r   r   r    r   Q
  s
    zCmfNumeric.audit_diffc                 C   s   |d krdS |  |S )Nr   )rL  r]   r   r   r    r   Y
  s    z CmfNumeric._format_for_html_diffc                 C   s&   |d kr| j sdS |s|S t|S d S r  )r   r   r]   r   r   r    r`   ^
  s
    zCmfNumeric.castc                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rJ  rK  rM  r2   r   r    r   i
  s    zCmfNumeric.__lt__c                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rJ  rO  rM  r2   r   r    r   s
  s    zCmfNumeric.__le__c                    s4   t jr(t| |}| jr(|dk r$dS dS t |S rJ  rP  rM  r2   r   r    r   }
  s    zCmfNumeric.__gt__c                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rJ  rQ  rM  r2   r   r    r   
  s    zCmfNumeric.__ge__)r"   r#   r$   r   r*   r!  Z	precisionrK  rS  rT  stepr  r%  rL  r   r   r`   r   r   r   r   rN   r   r   r2   r    rH  @
  s$   


	rH  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   r3  c                    s   g | ]}t  | qS r   r  r  r3  r   r    r  
  s     z0CmfObjectList.related_models.<locals>.<listcomp>r  r   r   r3  r    r2  
  s    zCmfObjectList.related_models)r"   r#   r$   r   rn   r*   r!  r   rQ   r%  r2  r   r   r   r    rN  
  s   rN  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   r3  c                    s   g | ]}t  | qS r   r  r  r3  r   r    r  
  s     z,CmfObject.related_models.<locals>.<listcomp>r  r   r   r3  r    r2  
  s    zCmfObject.related_models)
r"   r#   r$   r   r*   r!  r   rQ   r%  r2  r   r   r   r    rO  
  s   rO  c                   @   s   e Zd ZdZdS )CmfLikes.NrV  r   r   r   r    rP  
  s   rP  c                   @   s   e Zd ZdZdS )CmfViews.NrV  r   r   r   r    rQ  
  s   rQ  c                   @   s   e Zd ZdZdS )CmfTags.NrV  r   r   r   r    rR  
  s   rR  c                   @   s   e Zd ZdZdZd ZdS )CmfObjectJsonu@   Сохраняем и отдаём объект в виде JSON.NrX  r   r   r   r    rS  
  s   rS  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 r   )r+   r`   rT  db_castr]   r2   r   r    r`   
  s    zCmfIPv4NetworkList.castc                 C   s   d S r   r   r]   r   r   r    r_   
  s    zCmfIPv4NetworkList.validatec                 C   s   | j r
d S dd | jD S )Nc                 S   s   g | ]}t |qS r   r   rB  r   r   r    r  
  s     z+CmfIPv4NetworkList.json.<locals>.<listcomp>)r   r^   rb   r   r   r    r   
  s    zCmfIPv4NetworkList.jsonc                 C   s   | j d kr| j S t| jddS r?  )r^   r   r   rb   r   r   r    rc   
  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   )r  r  rB  r   r   r    r  
  s     z.CmfIPv4NetworkList.db_cast.<locals>.<listcomp>)r@   r   r   )rC   r^   r   r   r    rU  
  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   rB  r   r   r    r  
  s     z1CmfIPv4NetworkList.audit_diff.<locals>.<listcomp>c                 S   s   g | ]}t |qS r   r   rB  r   r   r    r  
  s     r   r   rb   r   r   r    r   
  s
    zCmfIPv4NetworkList.audit_diff)r"   r#   r$   r   r!  r`   r_   rA   r   rc   r%  rU  r   rN   r   r   r2   r    rT  
  s   

	rT  __main__ababza:bzb:a)N)gr  ri  r   r   r   r   r   r   typingr   r	   r
   r{  r   r   decimalr   r   r   Zdateutil.parserr[  r#  Zujsonr   r   Zcmf.base_errorr   r   r   r   r  r   rs   r   r   r%   r(   rz   r)   rO   r'  rE  rG  rU  rW  rY  r_  r`  rk  rm  rp  rr  rt  rv  r9  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>  rH  rN  rO  rP  rQ  rR  rS  rT  r"   AssertionErrorZlikesZtestr^   r  r   r   r   r   r    <module>   s   1     $vB1%!a1 $ R    
 8Q+
