U
    QdG                    @   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 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-Z/G d*d+ d+e-Z0G d,d- d-e-Z1G d.d/ d/e-Z2G d0d1 d1e-Z3G d2d3 d3e0Z4G d4d5 d5e4Z5G d6d7 d7e&Z6G d8d9 d9e/Z7G d:d; d;e0Z8G d<d= d=e0Z9G d>d? d?e1Z:G d@dA dAe&Z;G dBdC dCe&Z<G dDdE dEe&Z=G dFdG dGe=Z>G dHdI dIe'Z?G dJdK dKe?Z@G dLdM dMe?ZAG dNdO dOeAZBG dPdQ dQe'ZCG dRdS dSeCZDG dTdU dUeCZEG dVdW dWe'ZFG dXdY dYeFZGG dZd[ d[eFZHG d\d] d]e@ZIG d^d_ d_e/ZJG d`da dae)ZKG dbdc dce2ZLG ddde dee0ZMG dfdg dgeLZNG dhdi die0ZOG djdk dke.ZPG dldm dme.ZQG dndo doe3ZRG dpdq dqeRZSG drds dse&ZTG dtdu due&ZUG dvdw dwe&ZVG dxdy dye&ZWG dzd{ d{eTZXG d|d} d}eTZYG d~d deTZZG dd deTZ[e\dkrzde-dd kst]dde-d kst]de-de-d kst]e-ddk st]e-de-dk st]de-dk st]e-ddkst]e-de-dkst]de-dks&t]e-ddks8t]e-de-dksNt]de-dks`t]e-ddksrt]e-de-dkst]de-dkst]e-ddkst]e-de-dkst]de-dkst]e-ddkst]e-de-dkst]de-dkst]eX Z^e4de4gZ_e4de4dge^_`e^j`e4de4dgksNt]e^j`ddgksbt]e=a Zeejbkszt]dS )    N)copy)datedatetime	timedeltatimezonetime)TypeTypeVarUnion)UUIDuuid1)DecimalROUND_CEILINGlocalcontext)dumps)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   ./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__r3   
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rB   instanceownerr   r   r   __get__F   s    zCmfTypeMeta.__get__c                 C   s   |  ||S r   )setrG   r   r   r   __set__J   s    zCmfTypeMeta.__set__)N)N)r!   r"   r#   r+   r    rJ   rL   __classcell__r   r   r1   r   r(   !   s   
r(   c                   @   sD  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eed< dZeed	< 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,j-dd Z,d d! Z.e+j-d"d Z+d#d$ Z/e*d%d& Z0e*d'd( Z1e*d)d* Z2e*d+d, Z3e*d-d. Z4e5dd/d0Z6e5d1d2 Z7d3d4 Z8d5d6 Z9d7d8 Z:d9d: Z;d;d< Z<e5d=d> Z=dd?d@Z>dAdB Z?dCdD Z@dEdF ZAdGdH ZBdIdJ ZCdKdL ZDdMdN ZEdOdP ZFdQdR ZGdSdT ZHdUdV ZIdWdX ZJdYdZ ZKd[d\ ZLd]d^ ZMd_d` ZNdadb ZOdcdd ZPdedf ZQdgdh ZRdidj ZSdkdl ZTdmdn ZUdodp ZVdqdr ZWdsdt ZXdudv ZYdwdx ZZddydzZ[d{d| Z\d}d~ Z]dd Z^dd Z_dd Z`dd Zadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd ZhdddZidd Zjdd Zkdd Zldd Zmdd Zndd Zodd Zpdd Zqdd Zrdd Zsdd Ztdd ZudddZvdd Zwdd Zxdd Zydd Zzdd Z{dd Z|dd Z}dd Z~dd ZddĄ 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)r;   r=   r)   db_namedb_aliasrP   primary_keyuniqueindex	lazy_loadr3   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)r7   _value_oldrH   load_fieldsr6   )r   rb   rc   r   r   r   r   load   s    zCmfType.loadc                 O   s   d S r   r   r   rC   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_changedrd   re   r?   listdictr   rh   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 )Nr5   r   r   u5   DEV: ошибка рассчета virtual-поля: 
)
r>   rH   r6   rd   	Exceptionflaskr   	tracebackdebug
format_exc)r   reser   rr   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 )Nr5   r   r   u   Не получилось выполнить присвоение, т.к. нет сеттера у виртуального поля)	r>   typerH   r6   fsetrq   r   rs   setattr)r   rd   r   r   r   r   virtual_setter   s    zCmfType.virtual_setterc                 C   s   |   S r   )
_get_valuer`   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)re   rH   is_newr   r6   r`   r   r   r   old   s
    zCmfType.oldc                 C   s   t dd S )Nu=   Нельзя устанавливать .old значения)rp   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}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}   *rb   u>   ПРОИЗОШЛА ЛЕНИВАЯ ПОДГРУЗКА ПОЛЯ )	cmf_alertmodels)codezField: ro   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.*) rd   rH   r~   r7   rw   rq   r   r   cmf.includer   r>   rs   r6   rg   ZRAISE_LAZYLOADZinteractive_shellrr   r   r   ZCMF_ADMIN_CODE	CmfPersonrF   joinformat_stackstrZCmfTaskZ	auto_taskZdelayidr\   r   rf   )	r   r   r   r   rr   r   r   ZadminZ	task_infor   r   r   r|      sR      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)r7   r{   r   rH   r6   r   r?   rN   r\   r^   nullabler]   re   rk   rd   r[   r   r   r   r     s*    
"


"

zCmfType._set_valuec                 C   s   | j S r   r_   r`   r   r   r   newG  s    zCmfType.newc                 C   s   t | jtr| jjS | jS r   )r?   r\   rN   r`   r   r   r   jsonK  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?   rd   rl   rm   lenr`   r   r   r   is_nullR  s
    
zCmfType.is_nullc                 C   s   | j  S r   )r   r`   r   r   r   is_not_null[  s    zCmfType.is_not_nullc                 C   s
   | j dk	S N.)rd   r`   r   r   r   
is_defined_  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!   r8   r,   rx   r#   rG   r   r   r   rF   g  s    zCmfType.getc                 C   s   |j | j }||_d S r   )r8   r!   r\   )rB   rH   r\   fieldr   r   r   rK   t  s    zCmfType.setc                 C   s   t |S r   r   r[   r   r   r   _format_for_html_diffy  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   r`   r   r   r   
_html_diff  s    zCmfType._html_diffc                 C   s   | j s
dS |  S NrO   )rk   r   r`   r   r   r   	html_diff  s    zCmfType.html_diffc                 C   s   | j s
i S | j| jdS )A   
        Данные для таблицы аудита
        r   r   )rk   r   r   r`   r   r   r   
audit_diff  s
    zCmfType.audit_diffc                 C   s
   | j pg S r   )rZ   rB   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   )	rk   rH   re   rd   r\   	log_levelvisibler7   r6   r[   r   r   r   r      s    $zCmfType.__init__c                 C   s    t |tr|j}t| j||S r   )r?   rN   r\   r>   )r   fnotherr   r   r   _compare  s    
zCmfType._comparec                 C   s   t | j dt| j dS )N())rx   r#   reprrd   r`   r   r   r   __repr__  s    zCmfType.__repr__c                 C   s
   t | jS r   r   r\   r`   r   r   r   __str__  s    zCmfType.__str__c                 C   s
   | j  S r   )r\   	__bytes__r`   r   r   r   r     s    zCmfType.__bytes__c                 C   s   | j t| |j k S r   r\   rx   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 rj   )r?   rN   r   r   r\   rx   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\   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)rH   r~   rd   boolr\   r`   r   r   r   __bool__  s    zCmfType.__bool__c                 C   s
   t | jS r   )r   r\   r`   r   r   r   __len__  s    zCmfType.__len__c                 C   s
   | j  S r   )r\   __length_hint__r`   r   r   r   r   
  s    zCmfType.__length_hint__c                 C   s
   | j | S r   r_   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   r_   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__r`   r   r   r   r     s    zCmfType.__iter__c                 C   s
   t | jS r   )reversedr\   r`   r   r   r   __reversed__  s    zCmfType.__reversed__c                 C   s    t d|  d| d || jkS )Nz!!! z.__contains__(r   )printr\   )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__+  s    zCmfType.__mul__c                 C   s   | j t| |j  S r   r   r   r   r   r   
__matmul__.  s    zCmfType.__matmul__c                 C   s   | j t| |j  S r   r   r   r   r   r   __truediv__1  s    zCmfType.__truediv__c                 C   s   | j t| |j  S r   r   r   r   r   r   __floordiv__4  s    zCmfType.__floordiv__c                 C   s   | j t| |j  S r   r   r   r   r   r   __mod__7  s    zCmfType.__mod__c                 C   s   t | jt| |jS r   )divmodr\   rx   r   r   r   r   
__divmod__:  s    zCmfType.__divmod__c                 C   s   t | jt| |j|S r   )powr\   rx   r   r   Zmodulor   r   r   __pow__=  s    zCmfType.__pow__c                 C   s   | j t| |j > S r   r   r   r   r   r   
__lshift__@  s    zCmfType.__lshift__c                 C   s   | j t| |j ? S r   r   r   r   r   r   
__rshift__C  s    zCmfType.__rshift__c                 C   s   | j t| |j @ S r   r   r   r   r   r   __and__F  s    zCmfType.__and__c                 C   s   | j t| |j A S r   r   r   r   r   r   __xor__I  s    zCmfType.__xor__c                 C   s   | j t| |j B S r   r   r   r   r   r   __or__L  s    zCmfType.__or__c                 C   s   t | |j| j S r   rx   r\   r   r   r   r   __radd__O  s    zCmfType.__radd__c                 C   s   t | |j| j S r   r   r   r   r   r   __rsub__U  s    zCmfType.__rsub__c                 C   s   t | |j| j S r   r   r   r   r   r   __rmul__X  s    zCmfType.__rmul__c                 C   s   t | |j| j S r   r   r   r   r   r   __rmatmul__[  s    zCmfType.__rmatmul__c                 C   s   t | |j| j S r   r   r   r   r   r   __rtruediv__^  s    zCmfType.__rtruediv__c                 C   s   t | |j| j S r   r   r   r   r   r   __rfloordiv__a  s    zCmfType.__rfloordiv__c                 C   s   t | |j| j S r   r   r   r   r   r   __rmod__d  s    zCmfType.__rmod__c                 C   s   t t| |j| jS r   )r   rx   r\   r   r   r   r   __rdivmod__g  s    zCmfType.__rdivmod__c                 C   s   t t| |j| j|S r   )r   rx   r\   r   r   r   r   __rpow__j  s    zCmfType.__rpow__c                 C   s   t | |j| j> S r   r   r   r   r   r   __rlshift__m  s    zCmfType.__rlshift__c                 C   s   t | |j| j? S r   r   r   r   r   r   __rrshift__p  s    zCmfType.__rrshift__c                 C   s   t | |j| j@ S r   r   r   r   r   r   __rand__s  s    zCmfType.__rand__c                 C   s   t | |j| jA S r   r   r   r   r   r   __rxor__v  s    zCmfType.__rxor__c                 C   s   t | |j| jB S r   r   r   r   r   r   __ror__y  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__rx   r   r   r   r   r     s    zCmfType.__ipow__c                 C   s   | j t| |j S r   )r\   __ilshift__rx   r   r   r   r   r     s    zCmfType.__ilshift__c                 C   s   | j t| |j S r   )r\   __irshift__rx   r   r   r   r   r     s    zCmfType.__irshift__c                 C   s   | j t| |j S r   )r\   __iand__rx   r   r   r   r   r     s    zCmfType.__iand__c                 C   s   | j t| |j S r   )r\   __ixor__rx   r   r   r   r   r     s    zCmfType.__ixor__c                 C   s   | j t| |j S r   )r\   __ior__rx   r   r   r   r   r     s    zCmfType.__ior__c                 C   s
   | j  S r   )r\   __neg__r`   r   r   r   r    s    zCmfType.__neg__c                 C   s
   | j  S r   )r\   __pos__r`   r   r   r   r    s    zCmfType.__pos__c                 C   s
   | j  S r   )r\   __abs__r`   r   r   r   r    s    zCmfType.__abs__c                 C   s
   | j  S r   )r\   
__invert__r`   r   r   r   r    s    zCmfType.__invert__c                 C   s
   | j  S r   )r\   __complex__r`   r   r   r   r    s    zCmfType.__complex__c                 C   s
   | j  S r   )r\   __int__r`   r   r   r   r    s    zCmfType.__int__c                 C   s
   | j  S r   )r\   	__float__r`   r   r   r   r    s    zCmfType.__float__c                 C   s
   | j  S r   )r\   	__index__r`   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__r`   r   r   r   r    s    zCmfType.__trunc__c                 C   s
   | j  S r   )r\   	__floor__r`   r   r   r   r    s    zCmfType.__floor__c                 C   s
   | j  S r   )r\   __ceil__r`   r   r   r   r    s    zCmfType.__ceil__c                 C   s
   | j  S r   )r\   	__enter__r`   r   r   r   r    s    zCmfType.__enter__c                 C   s   | j |||S r   )r\   __exit__r   exc_type	exc_valuerr   r   r   r   r    s    zCmfType.__exit__c                 C   s
   | j  S r   )r\   	__await__r`   r   r   r   r    s    zCmfType.__await__c                 C   s
   | j  S r   )r\   	__aiter__r`   r   r   r   r    s    zCmfType.__aiter__c                 C   s
   | j  S r   )r\   	__anext__r`   r   r   r   r    s    zCmfType.__anext__c                 C   s
   | j  S r   )r\   
__aenter__r`   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   )r8   r   r`   r   r   r   __getstate__  s    zCmfType.__getstate__c                 C   s   | j | d S r   )r8   update)r   stater   r   r   __setstate__  s    zCmfType.__setstate__)NF)N).)N)N)N)N)r!   r"   r#   __doc__r   r)   placeholderZcommentrS   rT   r   rP   rU   rV   rW   r   r   r&   r3   widgetrY   r7   Zvirtual_cache_timelifeautor:   rZ   Zoptions_list_paramsrQ   r   __annotations__rR   r;   Zui_form_visibler=   r]   r^   ra   rg   ri   rn   rw   r{   r@   r\   r   setterr|   r   r   r   r   r   r   classmethodrF   rK   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   rN   R   s.  




2
(





	

	.



rN   )	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.NFc                 C   s$   d| _ | jrd| j_ | j| d S NT)rk   rH   r\   appendr   objr   r   r   r&    s    zCmfRelBase.appendc                 C   s$   d| _ | jrd| j_ | j| d S r%  )rk   rH   r\   remover'  r   r   r   r)    s    zCmfRelBase.removec                    s   t  j|| d | _d S r   )r*   r    _all_nested_cacherh   r1   r   r   r      s    zCmfRelBase.__init__c                    s   t  || d || j _d S r   )r*   rK   r!   r*  )rB   rH   r\   r1   r   r   rK     s    zCmfRelBase.setc                 C   s   t d S r   NotImplementedErrorr   r   r   r   related_models  s    zCmfRelBase.related_modelsc                    sH  ddl m} t|tr^d|kr\tt| dd dkr<t|dnt|d j}|j|d ddS nt|t	r$|
d}d }tt| dd dkrt|d}nt|d	krt||d d }|r|| }r|S |  D ]"}|jd
d|gd}|r|  S q|  D ]"}|jdd|gd}|r|  S qnt|tr<|j|S t |S )Nr   r   r   modelZCmfRFileT)Zinclude_deleted:r   r   z==)filterr-   )r   r   r?   rm   r>   rx   CmfTUUIDr/  rF   r   splitr   r-  r*   r^   )r   r\   r   r/  Zid_partsr(  ru   r1   r   r   r^     s8    


zCmfRelBase.castr   )r6   rb   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 qj|| j|< |S )Nr   r.  )Zchild_modelsr   INr1  rb   )r   r*  r   r   RelationCacheZget_children_dictrH   r   r\   r6   itemsr>   extendrl   )r   r6   rb   _args_kwargsZall_nested_cache_keyr   Zchildren_dictresultZ
model_nameZids_listr/  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)rk   r?   r\   rl   r   r   r   r&  )r   r=  r>  r(  r   r   r   r   =  s&    



zCmfRelBase.audit_diff)r!   r"   r#   r   r)   Znested_fieldsZlinkabler&  r)  r    r"  rK   r-  r^   r<  r   rM   r   r   r1   r   r$    s   
 r$  c                   @   s    e Zd ZdZeZd Zdd ZdS )CmfBool.c                 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   Y  s    zCmfBool._format_for_html_diffN)r!   r"   r#   r   r   r)   r  r   r   r   r   r   r?  T  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 r   )r*   r^   r[   r1   r   r   r^   k  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_moderx   r   r*   r   r   r   or1   r   r   r   r  s    zCmfInt.__lt__c                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rB  r   rD  rx   r   r*   r   rE  r1   r   r   r   |  s    zCmfInt.__le__c                    s4   t jr(t| |}| jr(|dk r$dS dS t |S rB  r   rD  rx   r   r*   r   rE  r1   r   r   r     s    zCmfInt.__gt__c                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rB  r   rD  rx   r   r*   r   rE  r1   r   r   r     s    zCmfInt.__ge__)r!   r"   r#   r   intr)   minmaxr  r^   r   r   r   r   rM   r   r   r1   r   rA  d  s   

	rA  c                   @   s   e Zd ZdZdS )	CmfBigInt.Nr!   r"   r#   r   r   r   r   r   rM    s   rM  c                   @   s   e Zd ZdZd ZdS )CmfInterval.Nr!   r"   r#   r   r  r   r   r   r   rO    s   rO  c                   @   s,   e Zd ZdZeZdZdZd Ze	dd Z
dS )CmfTime.Nc                 C   s   | j r
d S t| jS r   r   r   r\   r`   r   r   r   r     s    zCmfTime.json)r!   r"   r#   r   r   r)   rK  rL  r  r@   r   r   r   r   r   rQ    s   rQ  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 )CmfStr.Nregexu^   Значение {} не удовлетворяет регулярному выражению.)rT  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 )NrO   : )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,   Слишком длинная строка: )
max_lengthr   r   rT  	fullmatchrU  formatr[   r   r   r   r]     s    zCmfStr.validatec                 O   s   | j j||S r   r\   r3  rh   r   r   r   r3    s    zCmfStr.split)r%   c                 O   s   | j r
dS | jj||S rj   )r   r\   r9   rh   r   r   r   r9     s    zCmfStr.startswithc                 O   s   | j r
dS | jj||S rj   )r   r\   endswithrh   r   r   r   r[    s    zCmfStr.endswith)r!   r"   r#   r   r   r)   rW  rT  rePatternr   rU  r  rN   r=   r   r]   r3  r   r9   r[  r   r   r   r   rS    s   

rS  c                   @   s   e Zd ZdZd ZdS )CmfText.NrP  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   rW  r   r   r   r   r_    s   r_  c                   @   s   e Zd ZdZdZdS )CmfStr64.@   Nra  r   r   r   r   rb    s   rb  c                   @   s   e Zd ZdZdZdS )	CmfStr256.   Nra  r   r   r   r   rd    s   rd  c                   @   s   e Zd ZdZdZdS )	CmfStr128.   Nra  r   r   r   r   rf    s   rf  c                   @   s   e Zd ZdZdZdS )
CmfStr4096.i   Nra  r   r   r   r   rh    s   rh  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 )r2  .N)foreign_keyforeign_keysc                 C   s   | j dd S )Nr0  r   rZ  r`   r   r   r   	type_name  s    zCmfTUUID.type_namec                 C   s   t | jdd S )Nr0     )r   r\   r3  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>   r2  r\   rk  )r   r   r   r   r   r/  
  s    zCmfTUUID.modelc                 C   s
   t |jS r   )r2  r/  )rB   	tuuid_strr   r   r   get_cls_by_tuuid_str  s    zCmfTUUID.get_cls_by_tuuid_strc                 C   s   t |}|j|jS r   )r2  r/  rF   r\   )rB   ro  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\   Это служебное поле, для присвоения ид используйте )ri  rH   r   r6   r*   r]   r[   r1   r   r   r]     s    zCmfTUUID.validate)r!   r"   r#   r   ri  rj  rb  r=   r@   rk  rm  r/  r"  rp  rq  r]   rM   r   r   r1   r   r2    s   





r2  c                   @   s   e Zd ZdZdZdS )CmfM2MTUUID.rg  Nra  r   r   r   r   rs     s   rs  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   r`   r   r   r   r   +  s    zCmfUUID.jsonN)r!   r"   r#   r   r   r)   r   rP   r  r@   r   r   r   r   r   rt  %  s   rt  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 )
CmfIPv4Address.c                 C   s
   t | jS r   r   r`   r   r   r   ra   4  s    zCmfIPv4Address.db_formatc                 C   s   | j r
d S t| jS r   rR  r`   r   r   r   r   7  s    zCmfIPv4Address.jsonc                    s*   t |tjs|d kr t |S t|S r   )r?   	ipaddressIPv4Addressr*   r^   r[   r1   r   r   r^   =  s    zCmfIPv4Address.castc                 C   s   d S r   r   r[   r   r   r   r]   B  s    zCmfIPv4Address.validate)r!   r"   r#   r   rv  rw  r)   ra   r@   r   r^   r]   rM   r   r   r1   r   ru  0  s   
ru  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   r`   r   r   r   ra   I  s    zCmfIPv4Network.db_formatc                 C   s   | j r
d S t| jS r   rR  r`   r   r   r   r   L  s    zCmfIPv4Network.jsonc                    s*   t |tjs|d kr t |S t|S r   )r?   rv  IPv4Networkr*   r^   r[   r1   r   r   r^   R  s    zCmfIPv4Network.castc                 C   s   d S r   r   r[   r   r   r   r]   W  s    zCmfIPv4Network.validate)r!   r"   r#   r   rv  ry  r)   ra   r@   r   r^   r]   rM   r   r   r1   r   rx  E  s   
rx  c                   @   s   e Zd ZdZdS )	CmfDomain.NrN  r   r   r   r   rz  [  s   rz  c                   @   s   e Zd ZdZd ZdS )CmfPassword.NrP  r   r   r   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\   	isoformatr`   r   r   r   r   n  s    zCmfDate.jsonc                 C   s4   | j s
i S | jr| j nd | jr,| j nd dS Nr   rk   r   r  r\   r`   r   r   r   r   t  s
    zCmfDate.audit_diffc                    s&   t |trtj| S t |S r   )r?   r   dateutilparserparser   r*   r^   r[   r1   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\   r`   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\   rx   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 rj   rC  r   r1   r   r   r     s
    zCmfDate.__lt__c                    s(   t jrt| | | jrdS t |S rj   rG  r   r1   r   r   r     s
    zCmfDate.__le__c                    s(   t jrt| | | jrdS t |S rj   rH  r   r1   r   r   r     s
    zCmfDate.__gt__c                    s(   t jrt| | | jrdS t |S rj   rI  r   r1   r   r   r     s
    zCmfDate.__ge__)r!   r"   r#   r   r   r)   r~  r  r  rN   r=   r@   r   r   r^   r"  r  r  r   r   r   r   r   r   r   r   rM   r   r   r1   r   r|  d  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   r1   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>   rH   r  r  replacer  )r   Zrange_startZ	range_endr   r   r   rw     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   rl  )r  r  r  r   rz   rH   r  r  )r   r\   Zstart_valueZ	end_valuer   r   r   r{     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>   rH   r  r  r  r`   r   r   r   r     s
    zCmfDateRange.jsonc                 C   s   | j s
i S d|  dS )NZTODOr   )rk   r   r`   r   r   r   r     s
    zCmfDateRange.audit_diff)r!   r"   r#   r   r)   r  r  r  rN   r=   r7   r"  r   rw   r{   r@   r   r   rM   r   r   r1   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_age  s    zCmfDateTime.cls_agec                 C   s   | j s
dS | | j S Nr   )r\   r  r`   r   r   r   age  s    zCmfDateTime.agec                 C   s   | j r
d S | j S r   r  r`   r   r   r   r   
  s    zCmfDateTime.jsonc                 C   s4   | j s
i S | jr| j nd | jr,| j nd dS r  r  r`   r   r   r   r     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   дек)r7  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/rl     )dayfirst)tzinfo)r?   r   isdigitr  r  r  r  r*   r^   Z	utcoffsetr  r   r  Z
astimezoner  )r   r\   r  ru   r1   r   r   r^   ,  s    
zCmfDateTime.castc                 C   s&   |sdS |  }d| d| d}|S )NrO   z<time datetime="z">z</time>)r  r[   r   r   r   r   E  s
    z!CmfDateTime._format_for_html_diffc                 C   s   | t tjS r   )r   r  r   r  r   r   r   r   r  M  s    zCmfDateTime.nowc                 C   s   |   | _d S r   r  r`   r   r   r   r  Q  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\   rx   rJ  r   r   r   r   r   T  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   f  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   n  s
    

zCmfDateTime.__sub__c                    s(   t jrt| | | jrdS t |S rj   rC  r   r1   r   r   r   w  s
    zCmfDateTime.__lt__c                    s(   t jrt| | | jrdS t |S rj   rG  r   r1   r   r   r     s
    zCmfDateTime.__le__c                    s(   t jrt| | | jrdS t |S rj   rH  r   r1   r   r   r     s
    zCmfDateTime.__gt__c                    s(   t jrt| | | jrdS t |S rj   rI  r   r1   r   r   r     s
    zCmfDateTime.__ge__) r!   r"   r#   r   r   r)   r~  r  r  rN   r=   staticmethodr  r@   r  r   r   r  r^   r   r"  r  r  r   r   r   r   r   r   r   r   rM   r   r   r1   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\   ru   r  r1   r   r   r^     s
    zCmfCreateDateTime.cast)r!   r"   r#   r   r^   rM   r   r   r1   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.r4   )r*  rk   rH   rd   r   r   re   )setattr_fieldsc                 C   s   t d S r   r+  r[   r   r   r   r]     s    zCmfRelationBase.validatec                    s   t   |  g S r   )r*   r   id_fieldnamer   r1   r   r   r     s    z#CmfRelationBase.get_required_fieldsc                 C   s
   | j d S )N_idr6   r   r   r   r   r    s    zCmfRelationBase.id_fieldnamec                 C   s   t | j|  S r   )r>   rH   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?   rN   r\   r>   r  re   rd   rq   r   rs   rk   )rB   rH   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*   rK   r!   rd   r   r\   r   r  _update_backref)rB   rH   r\   Zinserted_valuer  r1   r   r   rK     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>  s     z3CmfRelationBase._update_backref.<locals>.<listcomp>)r>   r!   r   r  rd   r   r\   r&  re   r   r   r)  )rB   rH   r   Zbackref_fieldr(  r   r   r   r    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  rl  r.  z(DEV: FATAL Potential RelationCache leak target)r   r   r*   ri   rd   r   r\   rk   r   is_recursion_saver   re   r6  remove_field_referencer   add_field_referencerx   r  rH   )r   r  rC   r   r   r  r   r1   r   r   ri     s*    



zCmfRelationBase.savec                    s<   |dkrd S | j dk	r.| js.| jj|d d t   d S )Nrl  .r  )rd   r   r\   rn   r*   )r   r  r1   r   r   rn      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__rz   r\   )r   r-   r\   r1   r   r   r  +  s    zCmfRelationBase.__setattr__NFc           	         s6  ddl m}  jdk	r|s S  j   }|jdkrj 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
}|std| |j jfd|i| _ jdkr2 j _nd
 _ jdkr2 j _ S )u1   Ленивая загрузка Relation поляr   r.  .c                    s   g | ]} j  d | qS )r}   r  )r  Z
load_fieldr`   r   r   r  ;  s     z(CmfRelationBase.load.<locals>.<listcomp>r   r/  rb   r0  Nu$   Нет класса с именем )r   r   re   rH   r  r6   rf   hasattrrx   r>   r/  rF   r   rd   r3  r@  )	r   rb   rc   r   r   Zid_fieldZfields_listr/  Zcls_namer   r`   r   rg   1  s4    



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   T  s    z%CmfRelationBase._format_for_html_diffc                 C   s   | j r
d S | jjS r   )r   r\   r   r`   r   r   r   r   g  s    zCmfRelationBase.json)r   )NF)r!   r"   r#   r   rX   r  r$  r=   r]   r"  r   r  r@   r   r  rK   r  ri   rn   r  r  rg   r   r   rM   r   r   r1   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)rj  c                 C   s8   t |j| jkr4td| j dt |j d| j d S )Nu   Тип u    не совпадает: z != )rx   r!   r/  r   r6   r[   r   r   r   r]   u  s    zCmfRelation.validatec                 C   s   ddl m} t|| j gS rn  r   r   varsr/  rB   r   r   r   r   r-  y  s    zCmfRelation.related_models)r!   r"   r#   r   r  rj  r/  r  r=   r]   r"  r-  r   r   r   r   r  n  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   rx   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 rn  )r   r   r  r&  )rB   r   ru   r/  r   r   r   r-    s    
z!CmfGenericRelation.related_models)	r!   r"   r#   r   r  r   r]   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.Z	CmfEntityc                 C   s"   dd l }t|j| j}t| S r  )
cmf.modelsr>   r   
base_modelrl   Ziter_subclasses)rB   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      Тип не совпадает r}   = ( | r   )	r  
issubclassrx   r>   r   r  r   rH   r6   )r   r\   r  r   r   r   r]     s    z%CmfSubclassedGenericRelation.validateN)
r!   r"   r#   r   r  r   Zfield_options_list_limitr"  r-  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.rb   r  )	re   rl   r-  r8  r  rH   r   rd   r   r   rb   rc   r   r/  r   r   r   rg     s    "
zCmfBackrefBase.loadc                    s   t  | _t j|| d S r   )rl   rP   r*   r    rh   r1   r   r   r      s    zCmfBackrefBase.__init__c                    s   t  j|| d S r   )r*   rn   rh   r1   r   r   rn     s    zCmfBackrefBase.flush)NF)
r!   r"   r#   r   r/  r  rg   r    rn   rM   r   r   r1   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 rn  )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    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 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 )-
CmfM2MBase.Nc                 C   s   t d S r   r+  r[   r   r   r   r]     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 )NrO   r   rl  r&  u    добавлено: ,c                 S   s   g | ]}t |qS r   r   r  cr   r   r   r    s     z)CmfM2MBase._html_diff.<locals>.<listcomp>r)  u    удалено: c                 S   s   g | ]}t |qS r   r   r  r   r   r   r    s     u    остальное: rV  )_changesr&  r   r   )r   Zhtml_strchangeschangeactr(  r   r   r   r     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   rl  )rk   r  r   r\   r&  )r   r  r  r  Zobj_idr   r   r   r      s    
zCmfM2MBase.audit_diffc                 C   s   ddl m} t||   S rn  )r   r   r  m2m_model_cls_namer  r   r   r   m2m_model_cls  s    zCmfM2MBase.m2m_model_clsc                    s    t  j|| g | _t | _d S r   )r*   r    r  rl   rP   rh   r1   r   r   r      s    zCmfM2MBase.__init__rl  c                 O   s   t |tr|j}t |tr$t|}| | d| _t| j	D ]B}|d j
|j
kr>|d dkrd dS |d dkr>| j	|  qq>| j	d||f d| _| jrd| j_| jr| jr|dkrt|| jj| j|d d | jdk	r|| jkr| j| dS 	ut   Должен работать в т.ч. с незагруженными полями, для оптимизации.Nrl  r   r&  r)  Tr  .)r?   rN   r\   r   r2  rq  r]   r*  r   r  r   r)  r&  rk   rH   r  r>   rd   )r   r(  descriptionr  rC   r   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   r8  9  s    zCmfM2MBase.extendc                 O   s   d| _ t|trt|}t| jD ]B}|d j|jkr$|d dkrT| j|  qh|d dkr$ dS q$| j	d|f d| _
| jr| jr|dkrt|| jj| j|d d | jrd| j_
| jdk	r|| jkr| j| dS r  )r*  r?   r   r2  rq  r   r  r   r)  r&  rk   r  rH   r>   rd   )r   r(  r  rC   r   r  r   r   r   r)  =  s$    

zCmfM2MBase.removec                    s   g }|D ],}t |ttfr&t |}|r|| q| jdkrX| jjrPg | _n| 	  t
| jD ]"}|jdd |D krb| | qbdd | jD }|D ]}|j|kr| | q|S )N.c                 S   s   g | ]
}|j qS r   r  r  r   r   r   r  e  s     z#CmfM2MBase.cast.<locals>.<listcomp>c                 S   s   h | ]
}|j qS r   r  r  r   r   r   	<setcomp>h  s     z"CmfM2MBase.cast.<locals>.<setcomp>)r?   rm   r   r*   r^   r&  rd   rH   r~   rg   r   r   r)  r\   )r   r\   r;  valZ	value_idsr1   r   r   r^   U  s$    

zCmfM2MBase.castc                 C   s   t d S r   r+  r   r   r   r   r  n  s    zCmfM2MBase.m2m_model_cls_namec                 C   s(   |   D ]}||}|r|  S qd S r   )r-  rF   )r   r   r/  Zrelated_objr   r   r   get_related_objr  s
    

zCmfM2MBase.get_related_objFc              	   K   s   | j dk	r|s| S g | _d | _| jr`|  D ]0}| j|jf || jd| jjggd| q,n| 	 j
| j| jd| _|   t| j| _ | S )N.r4  )rb   r1  )r(  left)re   rd   r*  r  r-  r8  rl   rH   r   r  Zselect_relatedr  apply_changesr   r  r   r   r   rg   z  s    0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   r.  )cmfutilZchild_idr  Zchild_fieldZparent_modelr4  	parent_idr5  c                 S   s   h | ]}|j r|j qS r   )r  )r  relationr   r   r   r    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  rb   r(  r   r   r    s      )
r   r   cmf.utilr  r/  rH   r   r6   r6  Zslist)	r   Zid_onlyrb   r:  r   Zgroup_model_namesZrelation_filterZrelation_listr;  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  rd   r&  r@  r)  )r   Zchange_typerH   rC   r   r   r   r    s    zCmfM2MBase.apply_changesr   r  	only_datac                   s  t  j|||d| ddlm} ddlm} | jD ]*^}}}	d }
| jr\|}| j}| }
n6| j	r|}| j}| j
rt|| j
}
ntd| j d|  j|j|jd d}|dkr|rq6|  ||d	}|	r|	d |_|j|d
|d i| |jj| |d n,|dkr.|sq6|  |j| |jj || j|| t|dd s6|j|d
|d i| q6g | _|| jd d | _d S )Nr  r   )	CMF_CACHEr.  u   У поля u-    не указано right оно или left)Zleft_idZright_idZroot_idr&  )r  rightr  rl  r  r)  r  r  )r*   ri   Zcmf.appr  r   r   r  r  rH   r  r  r>   rp   r6   r  rF   r   r  r6  r  deleter  r\   Z
invalidater*  )r   r  r  rC   r   r  r   actionr(  ZcargsZ
left_fieldr  r  r  r1   r   r   ri     sF    


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 )Nrl  .r  )rd   r   r\   r>   rn   r  r*   )r   r  rE   r1   r   r   rn     s    

zCmfM2MBase.flush)Nrl  )N)rl  )NF)FN)r   )r!   r"   r#   r   r  r  r  r]   r   r   r"  r  r    r&  r8  r)  r^   r  r  rg   r  r  ri   rn   rM   r   r   r1   r   r    s,   






0r  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  rY   r6   r/  r  rp   r   r   r   r   r    s
    zCmfM2M.m2m_model_cls_namec                 C   s   ddl m} t|| j gS rn  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 Nr  r}   r  r  r  r   )rx   rl   r!   r/  r   rH   r6   r[   r   r   r   r]     s    zCmfM2M.validate)r!   r"   r#   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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  r/  r  
capitalizerY   r6   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  0  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 r  )r   rx   rl   r!   r   rH   r6   r[   r   r   r   r]   3  s    zCmfGenericM2M.validate)r!   r"   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S )	CmfStatus.N)r!   r"   r#   r   r/  r   r   r   r   r  9  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   r`   r   r   r   r   C  s    zCmfChoice._html_diffc                    sx   t | jdd }| jpi }|r>|d | jr>|d | j d }|rj|d k	rV|||}|d k	rj|||}t ||S )Nui_form_customZ	ui_fieldschoices)r>   rY   r  rF   r6   r*   r   )r   r   r   r  r  r1   r   r   r   F  s    
zCmfChoice._simple_html_diff)	r!   r"   r#   r   r  r  r   r   rM   r   r   r1   r   r  >  s
   r  c                       s(   e Zd ZdZdZdZ fddZ  ZS )CmfChoiceInt.Nr  c                    sr   |d k	r2t || jkr&| jt | }nd| d}|d k	rdt || jkrX| jt | }nd| d}t ||S )Nu,   Несуществующий элемент(r   )rJ  r  r*   r   r   r1   r   r   r   X  s    zCmfChoiceInt._simple_html_diff)r!   r"   r#   r   r  r  r   rM   r   r   r1   r   r  S  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*   r]   r[   r1   r   r   r]   i  s    zCmfEmail.validate.r!   r"   r#   r]   r   rM   r   r   r1   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=   Неправильный формат имени домена)r\  compiler  r   r*   r]   )r   r\   patternr1   r   r   r]   s  s    

zCmfOrgName.validate.r  r   r   r1   r   r  q  s   r  c                   @   s   e Zd ZdZdS )CmfLogin.NrN  r   r   r   r   r  |  s   r  c                       s   e 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 == 'номер жены'
    .z^\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   _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
        Nr  )
r  r  r*   r]   r  numberr  is_valid_numberis_possible_numberr   )r   r\   r  phoner1   r   r   r]     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;rO   r  z ,;rl  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 s| j S | j dd S )Nr  r   )rd   	partitionr`   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  rl  r  )r  r  r  r	  r
  r   r  r  r  r  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  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 r  )r\   r  r  r  r  r  ZNATIONALr  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 r  )r\   r  r  r  r  r  ZINTERNATIONALr  r   r   r   number_international  s    zCmfPhone.number_internationalc                 C   s   | j s| j S | j dd S )Nr  r   )r\   r  r`   r   r   r   r    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   r    s    )r!   r"   r#   r  r   r  r\  r  r  rb  r=   r  r]   r^   r@   r  r!  r  r  r  r  rM   r   r   r1   r   r    s,   







r  c                   @   s   e Zd ZdZd ZdS )CmfMarkdown.NrP  r   r   r   r   r  		  s   r  c                   @   s   e Zd ZdZd ZdS )	CmfMarkup.NrP  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.rg  Nra  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   r`   r   r   r   ra   *	  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  rD   rE   r`   r   r   
<dictcomp>1	  s      z CmfJson.cast.<locals>.<dictcomp>c                    s   g | ]}  |qS r   r!  )r  rE   r`   r   r   r  3	  s     z CmfJson.cast.<locals>.<listcomp>)r?   rm   r7  rl   rN   r   r[   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 #   , т.к. значение поля     не список: Tabort)
r   r   r   rg   r\   r?   rl   r&  rk   rH   r   r\   rC   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 r#  r$  Tr%  )
r   r   r   rg   r\   r?   rl   r)  rk   rH   r'  r   r   r   r)  K	  s    
 
zCmfJson.remove)
r!   r"   r#   r   r)   r  ra   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   rl  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)rB   r\   Zctxr   r   r   _as_strh	  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  )rk   r   r,  r   r`   r   r   r   r   n	  s
    zCmfNumeric.audit_diffc                 C   s   |d krdS |  |S )Nr   )r,  r[   r   r   r   r   v	  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 rB  rC  rE  r1   r   r   r   	  s    zCmfNumeric.__lt__c                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rB  rG  rE  r1   r   r   r   	  s    zCmfNumeric.__le__c                    s4   t jr(t| |}| jr(|dk r$dS dS t |S rB  rH  rE  r1   r   r   r   	  s    zCmfNumeric.__gt__c                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rB  rI  rE  r1   r   r   r   	  s    zCmfNumeric.__ge__)r!   r"   r#   r   r)   r  Z	precisionr+  rK  rL  stepr  r"  r,  r   r   r^   r   r   r   r   rM   r   r   r1   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  	  s     z0CmfObjectList.related_models.<locals>.<listcomp>r  r   r   r.  r   r-  	  s    zCmfObjectList.related_models)r!   r"   r#   r   rl   r)   r  r   rP   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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  	  s     z,CmfObject.related_models.<locals>.<listcomp>r  r   r   r.  r   r-  	  s    zCmfObject.related_models)
r!   r"   r#   r   r)   r  r   rP   r"  r-  r   r   r   r   r/  	  s   r/  c                   @   s   e Zd ZdZdS )CmfLikes.NrN  r   r   r   r   r0  	  s   r0  c                   @   s   e Zd ZdZdS )CmfViews.NrN  r   r   r   r   r1  	  s   r1  c                   @   s   e Zd ZdZdS )CmfTags.NrN  r   r   r   r   r2  	  s   r2  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   r3  	  s   r3  __main__ababza:bzb:a)N)crv  r\  r   r   r   r   r   r   typingr   r	   r
   rm  r   r   Zdecimalr   r   r   Zdateutil.parserr  r  Zujsonr   Zcmf.base_errorr   r   r   r   r  r   rq   r   r   r$   r'   rx   r(   rN   r$  r?  rA  rM  rO  rQ  rS  r^  r_  rb  rd  rf  rh  r2  rs  rt  ru  rx  rz  r{  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r   r(  r.  r/  r0  r1  r2  r3  r!   AssertionErrorZlikesZtestr\   r  r   r   r   r   r   <module>   s   1     j6,%a1 $ J  
 
8Q
