U
    0h                    @   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! e
dddZ"G dd dZ#de	e" e$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)Z0G d'd( d(e)Z1G d)d* d*e1Z2G d+d, d,e1Z3G d-d. d.e1Z4G d/d0 d0e1Z5G d1d2 d2e1Z6G d3d4 d4e1Z7G d5d6 d6e4Z8G d7d8 d8e)Z9G d9d: d:e8Z:G d;d< d<e)Z;G d=d> d>e3Z<G d?d@ d@e4Z=G dAdB dBe4Z>G dCdD dDe7Z?G dEdF dFe)Z@G dGdH dHe)ZAG dIdJ dJe)ZBG dKdL dLeBZCG dMdN dNe*ZDG dOdP dPeDZEG dQdR dReDZFG dSdT dTeFZGG dUdV dVe*ZHG dWdX dXeHZIG dYdZ dZeHZJG d[d\ d\e*ZKG d]d^ d^eKZLG d_d` d`eKZMG dadb dbeEZNG dcdd dde3ZOG dedf dfe,ZPG dgdh dhe6ZQG didj dje4ZRG dkdl dleQZSG dmdn dne4ZTG dodp dpe2ZUG dqdr dre2ZVG dsdt dte7ZWG dudv dveWZXG dwdx dxe)ZYG dydz dze)ZZG d{d| d|e)Z[G d}d~ d~e)Z\G dd deYZ]G dd deYZ^G dd deYZ_G dd deYZ`G dd deYZaG dd de4ZbG dd de5Zceddkrde1dd kstedde1d kstede1de1d ks
tee1ddk stee1de1dk s2tede1dk sDtee1ddksVtee1de1dksltede1dks~tee1ddkstee1de1dkstede1dkstee1ddkstee1de1dkstede1dkstee1ddkstee1de1dkstede1dks,tee1ddks>tee1de1dksTtede1dksftee] Zfe8de8gZge8de8dgef_hefjhe8de8dgksteefjhddgksteeBi Zeejjkste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gTZCmfModel)Zboundc                   @   s"   e Zd Zdee edddZdS )	FieldDataN)basecaptionc                 K   s8   || _ |d kr(| j jr | j j}ntd|| _|| _d S )N   Укажите caption)r   r   	Exceptionkwargs)selfr   r   r    r!   ./cmf/fields/base_fields.py__init__   s    
zFieldData.__init__)N)__name__
__module____qualname__r   r   strr#   r!   r!   r!   r"   r      s   r   F)r   r   readonlyreturnc                 K   s   t | |fd|i|S )Nr(   )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   .r   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__r6   
startswithcustomui_metadirui_meta_skipgetattr
isinstancepropertycallable)clsargsr   kvr!   r!   r"   r#   4   s"    



zCmfTypeMeta.__init__Nc                 C   s   |  ||S N)getrE   instanceownerr!   r!   r"   __get__K   s    zCmfTypeMeta.__get__c                 C   s   |  ||S rI   )setrK   r!   r!   r"   __set__O   s    zCmfTypeMeta.__set__)N)N)r$   r%   r&   r.   r#   rN   rP   __classcell__r!   r!   r4   r"   r+   &   s   
r+   c                   @   sp  e Zd ZU dZdZdZdZdZdZdZ	dZ
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZeed< dZ eed	< dZ!eed
< dZ"dZ#dZ$dZ%eed< dZ&d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/e0dd  Z1e0d!d" Z2e2j3d#d" Z2d$d% Z4e1j3d&d  Z1d'd( Z5e0d)d* Z6e0d+d, Z7e0d-d. Z8e0d/d0 Z9e0d1d2 Z:e;dd3d4Z<e;d5d6 Z=d7d8 Z>d9d: Z?d;d< Z@d=d> ZAd?d@ ZBe;dAdB ZCddCdDZDdEdF ZEdGdH ZFdIdJ ZGdKdL ZHdMdN ZIdOdP ZJdQdR ZKdSdT ZLdUdV ZMdWdX ZNdYdZ ZOd[d\ ZPd]d^ ZQd_d` ZRdadb ZSdcdd ZTdedf ZUdgdh ZVdidj ZWdkdl ZXdmdn ZYdodp ZZdqdr Z[dsdt Z\dudv Z]dwdx Z^dydz Z_d{d| Z`dd}d~Zadd Zbdd Zcdd Zddd Zedd Zfdd Zgdd Zhdd Zidd Zjdd Zkdd Zldd Zmdd ZndddZodd Zpdd Zqdd Zrdd Zsdd Ztdd Zudd Zvdd Zwdd Zxdd Zydd Zzdd Z{dddZ|dd Z}dd Z~dd Zdd Zdd Zdd 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column_history)r>   r@   r,   db_namedb_aliasrT   primary_keyuniqueindex	lazy_loadr6   instance_classrequired_fieldsc                 C   s(   | j | j| j| jj| jjj| jjjdS )N)
from_valueto_valueZ
field_nameZcmf_model_nameobjZobj_code)oldnewr9   rL   idvaluecoder    r!   r!   r"   history   s     zCmfType.historyc                 C   s   d S rI   r!   r    rg   r!   r!   r"   validate   s    zCmfType.validatec                 C   s0   |d kr|S | j d k	r,t|| j s,|  |S |S rI   )r,   rB   rk   r!   r!   r"   cast   s    

zCmfType.castc                 C   s   | j S rI   rg   ri   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)r:   _value_oldrL   load_fieldsr9   )r    rp   rq   r   r!   r!   r"   load   s    zCmfType.loadc                 O   s   d S rI   r!   r    rF   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_changedrr   rs   rB   listdictr   rv   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 )Nr8   r   r   u5   DEV: ошибка рассчета virtual-поля: 
)
rA   rL   r9   rr   r   flaskr   	tracebackdebug
format_exc)r    reser   r   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 )Nr8   r   r   u   Не получилось выполнить присвоение, т.к. нет сеттера у виртуального поля)	rA   typerL   r9   fsetr~   r   r   setattr)r    rr   r   r!   r!   r"   virtual_setter   s    zCmfType.virtual_setterc                 C   s   |   S rI   )
_get_valueri   r!   r!   r"   rg      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)rs   rL   is_newr   r9   ri   r!   r!   r"   rd      s
    zCmfType.oldc                 C   s   t dd S )Nu=   Нельзя устанавливать .old значения)r   rk   r!   r!   r"   rd      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   *rp   u>   ПРОИЗОШЛА ЛЕНИВАЯ ПОДГРУЗКА ПОЛЯ 	cmf_alertmodels)rh   zField: r}   z
jsurl: Zjsurlz
api_method: Z
api_methodz<pre>z</pre>zRaise CmfOrmImplicitLazyLoad u    #Очередь0 #bug   )r0   textpriorityZresponsible_idZcmf_owner_iduf    загрузите явно само виртуальное поле и его зависимостиz**z.*)!rr   rL   r   r:   r   r~   r   Z
markupsafer   cmf.includer   rA   r   r9   ru   ZRAISE_LAZYLOADZinteractive_shellr   r   r   ZCMF_ADMIN_CODE	CmfPersonrJ   joinformat_stackr'   ZCmfTaskZ	auto_taskZdelayrf   rg   r   rt   )	r    r   r   r   r   r   r   ZadminZ	task_infor!   r!   r"   r      sT      zCmfType._get_valuec                 C   s
   |  |S rI   )
_set_valuerk   r!   r!   r"   rg   /  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)r:   r   r   rL   r9   r   rB   rR   rg   rm   nullablerl   rs   ry   rr   rk   r!   r!   r"   r   3  s*    
"


"

zCmfType._set_valuec                 C   s   | j S rI   rn   ri   r!   r!   r"   re   [  s    zCmfType.newc                 C   s   t | jtr| jjS | jS rI   )rB   rg   rR   ri   r!   r!   r"   json_  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)rg   rB   rr   rz   r{   lenri   r!   r!   r"   is_nullf  s
    
zCmfType.is_nullc                 C   s   | j  S rI   )r   ri   r!   r!   r"   is_not_nullo  s    zCmfType.is_not_nullc                 C   s
   | j dk	S N.)rr   ri   r!   r!   r"   
is_defineds  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$   r;   r/   r   r&   rK   r!   r!   r"   rJ   {  s    zCmfType.getc                 C   s   |j | j }||_d S rI   )r;   r$   rg   )rE   rL   rg   fieldr!   r!   r"   rO     s    zCmfType.setc                 C   s   t |S rI   r'   rk   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 rI   r   rd   re   ri   r!   r!   r"   
_html_diff  s    zCmfType._html_diffc                 C   s   | j s
dS |  S NrS   )ry   r   ri   r!   r!   r"   	html_diff  s    zCmfType.html_diffc                 C   s   | j s
i S | j| jdS )A   
        Данные для таблицы аудита
        rd   re   ry   rd   re   ri   r!   r!   r"   
audit_diff  s
    zCmfType.audit_diffc                 C   s
   | j pg S rI   )r`   rE   r!   r!   r"   get_required_fields  s    zCmfType.get_required_fieldsc                 C   sf   d| _ d| _d | _d| _d| _|dk	r,|| _| jsV| jrV| jsV| j	dd dksVd| _| jsbd| _d S )NF.r      Zcache_r   r   )
ry   	orm_dirtyrL   rs   rr   rg   	log_levelvisibler:   r9   rk   r!   r!   r"   r#     s    $zCmfType.__init__c                 C   s    t |tr|j}t| j||S rI   )rB   rR   rg   rA   )r    fnotherr!   r!   r"   _compare  s    
zCmfType._comparec                 C   s   t | j dt| j dS )N())r   r&   reprrr   ri   r!   r!   r"   __repr__  s    zCmfType.__repr__c                 C   s
   t | jS rI   r'   rg   ri   r!   r!   r"   __str__  s    zCmfType.__str__c                 C   s
   | j  S rI   )rg   	__bytes__ri   r!   r!   r"   r     s    zCmfType.__bytes__c                 C   s   | j t| |j k S rI   rg   r   r    r   r!   r!   r"   __lt__  s    zCmfType.__lt__c                 C   s   | j t| |j kS rI   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 rx   )rB   rR   r   r   rg   r   r   r!   r!   r"   __eq__  s    zCmfType.__eq__c                 C   s   | j t| |j kS rI   r   r   r!   r!   r"   __gt__  s    zCmfType.__gt__c                 C   s   | j t| |j kS rI   r   r   r!   r!   r"   __ge__  s    zCmfType.__ge__c                 C   s
   t | jS rI   )hashrg   ri   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)rL   r   rr   boolrg   ri   r!   r!   r"   __bool__  s    zCmfType.__bool__c                 C   s
   t | jS rI   )r   rg   ri   r!   r!   r"   __len__  s    zCmfType.__len__c                 C   s
   | j  S rI   )rg   __length_hint__ri   r!   r!   r"   r     s    zCmfType.__length_hint__c                 C   s
   | j | S rI   rn   r    keyr!   r!   r"   __getitem__"  s    zCmfType.__getitem__c                 C   s   |  || j|< d S rI   )rm   rg   )r    r   rg   r!   r!   r"   __setitem__%  s    zCmfType.__setitem__c                 C   s   | j |= d S rI   rn   r   r!   r!   r"   __delitem__(  s    zCmfType.__delitem__c                 C   s   | j |S rI   )rg   __missing__r   r!   r!   r"   r   +  s    zCmfType.__missing__c                 C   s
   | j  S rI   )rg   __iter__ri   r!   r!   r"   r   .  s    zCmfType.__iter__c                 C   s
   t | jS rI   )reversedrg   ri   r!   r!   r"   __reversed__1  s    zCmfType.__reversed__c                 C   s
   || j kS rI   rn   )r    itemr!   r!   r"   __contains__4  s    zCmfType.__contains__c                 C   s   | j t| |j  S rI   r   r   r!   r!   r"   __add__:  s    zCmfType.__add__c                 C   s   | j t| |j  S rI   r   r   r!   r!   r"   __sub__=  s    zCmfType.__sub__c                 C   s   | j t| |j  S rI   r   r   r!   r!   r"   __mul__@  s    zCmfType.__mul__c                 C   s   | j t| |j  S rI   r   r   r!   r!   r"   
__matmul__C  s    zCmfType.__matmul__c                 C   s   | j t| |j  S rI   r   r   r!   r!   r"   __truediv__F  s    zCmfType.__truediv__c                 C   s   | j t| |j  S rI   r   r   r!   r!   r"   __floordiv__I  s    zCmfType.__floordiv__c                 C   s   | j t| |j  S rI   r   r   r!   r!   r"   __mod__L  s    zCmfType.__mod__c                 C   s   t | jt| |jS rI   )divmodrg   r   r   r!   r!   r"   
__divmod__O  s    zCmfType.__divmod__c                 C   s   t | jt| |j|S rI   )powrg   r   r    r   Zmodulor!   r!   r"   __pow__R  s    zCmfType.__pow__c                 C   s   | j t| |j > S rI   r   r   r!   r!   r"   
__lshift__U  s    zCmfType.__lshift__c                 C   s   | j t| |j ? S rI   r   r   r!   r!   r"   
__rshift__X  s    zCmfType.__rshift__c                 C   s   | j t| |j @ S rI   r   r   r!   r!   r"   __and__[  s    zCmfType.__and__c                 C   s   | j t| |j A S rI   r   r   r!   r!   r"   __xor__^  s    zCmfType.__xor__c                 C   s   | j t| |j B S rI   r   r   r!   r!   r"   __or__a  s    zCmfType.__or__c                 C   s   t | |j| j S rI   r   rg   r   r!   r!   r"   __radd__d  s    zCmfType.__radd__c                 C   s   t | |j| j S rI   r   r   r!   r!   r"   __rsub__j  s    zCmfType.__rsub__c                 C   s   t | |j| j S rI   r   r   r!   r!   r"   __rmul__m  s    zCmfType.__rmul__c                 C   s   t | |j| j S rI   r   r   r!   r!   r"   __rmatmul__p  s    zCmfType.__rmatmul__c                 C   s   t | |j| j S rI   r   r   r!   r!   r"   __rtruediv__s  s    zCmfType.__rtruediv__c                 C   s   t | |j| j S rI   r   r   r!   r!   r"   __rfloordiv__v  s    zCmfType.__rfloordiv__c                 C   s   t | |j| j S rI   r   r   r!   r!   r"   __rmod__y  s    zCmfType.__rmod__c                 C   s   t t| |j| jS rI   )r   r   rg   r   r!   r!   r"   __rdivmod__|  s    zCmfType.__rdivmod__c                 C   s   t t| |j| j|S rI   )r   r   rg   r   r!   r!   r"   __rpow__  s    zCmfType.__rpow__c                 C   s   t | |j| j> S rI   r   r   r!   r!   r"   __rlshift__  s    zCmfType.__rlshift__c                 C   s   t | |j| j? S rI   r   r   r!   r!   r"   __rrshift__  s    zCmfType.__rrshift__c                 C   s   t | |j| j@ S rI   r   r   r!   r!   r"   __rand__  s    zCmfType.__rand__c                 C   s   t | |j| jA S rI   r   r   r!   r!   r"   __rxor__  s    zCmfType.__rxor__c                 C   s   t | |j| jB S rI   r   r   r!   r!   r"   __ror__  s    zCmfType.__ror__c                 C   s   |  j t| |j 7  _ | S rI   r   r   r!   r!   r"   __iadd__  s    zCmfType.__iadd__c                 C   s   |  j t| |j 8  _ | S rI   r   r   r!   r!   r"   __isub__  s    zCmfType.__isub__c                 C   s   |  j t| |j 9  _ | S rI   r   r   r!   r!   r"   __imul__  s    zCmfType.__imul__c                 C   s   |  j t| |j   _ | S rI   r   r   r!   r!   r"   __imatmul__  s    zCmfType.__imatmul__c                 C   s   |  j t| |j   _ | S rI   r   r   r!   r!   r"   __itruediv__  s    zCmfType.__itruediv__c                 C   s   |  j t| |j   _ | S rI   r   r   r!   r!   r"   __ifloordiv__  s    zCmfType.__ifloordiv__c                 C   s   |  j t| |j ;  _ | S rI   r   r   r!   r!   r"   __imod__  s    zCmfType.__imod__c                 C   s   | j t| |j |S rI   )rg   __ipow__r   r   r!   r!   r"   r    s    zCmfType.__ipow__c                 C   s   | j t| |j S rI   )rg   __ilshift__r   r   r!   r!   r"   r    s    zCmfType.__ilshift__c                 C   s   | j t| |j S rI   )rg   __irshift__r   r   r!   r!   r"   r    s    zCmfType.__irshift__c                 C   s   | j t| |j S rI   )rg   __iand__r   r   r!   r!   r"   r    s    zCmfType.__iand__c                 C   s   | j t| |j S rI   )rg   __ixor__r   r   r!   r!   r"   r    s    zCmfType.__ixor__c                 C   s   | j t| |j S rI   )rg   __ior__r   r   r!   r!   r"   r	    s    zCmfType.__ior__c                 C   s
   | j  S rI   )rg   __neg__ri   r!   r!   r"   r
    s    zCmfType.__neg__c                 C   s
   | j  S rI   )rg   __pos__ri   r!   r!   r"   r    s    zCmfType.__pos__c                 C   s
   | j  S rI   )rg   __abs__ri   r!   r!   r"   r    s    zCmfType.__abs__c                 C   s
   | j  S rI   )rg   
__invert__ri   r!   r!   r"   r    s    zCmfType.__invert__c                 C   s
   | j  S rI   )rg   __complex__ri   r!   r!   r"   r    s    zCmfType.__complex__c                 C   s
   | j  S rI   )rg   __int__ri   r!   r!   r"   r    s    zCmfType.__int__c                 C   s
   | j  S rI   )rg   	__float__ri   r!   r!   r"   r    s    zCmfType.__float__c                 C   s
   | j  S rI   )rg   	__index__ri   r!   r!   r"   r    s    zCmfType.__index__c                 C   s   | j |S rI   )rg   	__round__)r    ndigitsr!   r!   r"   r    s    zCmfType.__round__c                 C   s
   | j  S rI   )rg   	__trunc__ri   r!   r!   r"   r    s    zCmfType.__trunc__c                 C   s
   | j  S rI   )rg   	__floor__ri   r!   r!   r"   r    s    zCmfType.__floor__c                 C   s
   | j  S rI   )rg   __ceil__ri   r!   r!   r"   r    s    zCmfType.__ceil__c                 C   s
   | j  S rI   )rg   	__enter__ri   r!   r!   r"   r    s    zCmfType.__enter__c                 C   s   | j |||S rI   )rg   __exit__r    exc_type	exc_valuer   r!   r!   r"   r    s    zCmfType.__exit__c                 C   s
   | j  S rI   )rg   	__await__ri   r!   r!   r"   r    s    zCmfType.__await__c                 C   s
   | j  S rI   )rg   	__aiter__ri   r!   r!   r"   r    s    zCmfType.__aiter__c                 C   s
   | j  S rI   )rg   	__anext__ri   r!   r!   r"   r    s    zCmfType.__anext__c                 C   s
   | j  S rI   )rg   
__aenter__ri   r!   r!   r"   r    s    zCmfType.__aenter__c                 C   s   | j |||S rI   )rg   	__aexit__r  r!   r!   r"   r     s    zCmfType.__aexit__c                 C   s
   | j  S rI   )r;   r   ri   r!   r!   r"   __getstate__  s    zCmfType.__getstate__c                 C   s   | j | d S rI   )r;   update)r    stater!   r!   r"   __setstate__  s    zCmfType.__setstate__)NF)N).)N)N)N)N)r$   r%   r&   __doc__r   r,   placeholdercommentrY   rZ   r   rT   r[   r\   r]   index_usingr   r   r(   r6   widgetr_   r:   Zvirtual_cache_timelifeautor=   Zfullsearch_indexr`   Zoptions_list_paramsrU   r   __annotations__rV   rW   ZTEXKOM_group_by_allowr>   Zui_form_visiblerX   r@   rj   rl   rm   ro   ru   rw   r|   r   r   rC   rg   rd   setterr   r   re   r   r   r   r   classmethodrJ   rO   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"   rR   W   s:  




3
(





	

	.



rR   )	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)ry   rL   rg   appendr    rc   r!   r!   r"   r3    s    zCmfRelBase.appendc                 C   s$   d| _ | jrd| j_ | j| d S r2  )ry   rL   rg   remover4  r!   r!   r"   r5    s    zCmfRelBase.removec                    s   t  j|| d | _d S rI   )r-   r#   _all_nested_cacherv   r4   r!   r"   r#     s    zCmfRelBase.__init__c                    s   t  || d || j _d S rI   )r-   rO   r$   r6  rE   rL   rg   r4   r!   r"   rO     s    zCmfRelBase.setc                 C   s   t d S rI   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   rf   modelZCmfRFileT)include_deletedinclude_dummy:r   rh   z==)filterr=  r>  r0   )r@  Zemployee_number)r   r   rB   r{   rA   r   CmfTUUIDr<  rJ   r'   splitr   r:  r   rp   r-   rm   )r    rg   r   r<  Zid_partsrc   r   r4   r!   r"   rm   $  s@    


zCmfRelBase.castr   )r9   rp   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   r;  )Zchild_modelsrf   INT)r@  rp   Zinclude_system)r'   r6  r   r   RelationCacheZget_children_dictrL   rf   rg   r9   itemsrA   extendrz   )r    r9   rp   _args_kwargsZall_nested_cache_keyr   Zchildren_dictresultZ
model_nameZids_listr<  r!   r!   r"   
all_nestedH  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)ry   rB   rg   rz   rd   rf   re   r3  )r    rK  rL  rc   r!   r!   r"   r   ^  s&    



zCmfRelBase.audit_diff)r$   r%   r&   r   r,   Znested_fieldsZlinkableZoptions_list_search_columnsZoptions_list_show_columnsr0  r1  rR   r@   r3  r5  r#   r-  rO   r:  rm   rJ  r   rQ   r!   r!   r4   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)   Некорректное значение)
ValueErrorrk   r!   r!   r"   r   |  s    zCmfBool._format_for_html_diffN)
r$   r%   r&   r   r   r,   r)  r   rT   r   r!   r!   r!   r"   rM  u  s   rM  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 )NrS   TEXKOM_warn_minr   zDEV: TEXKOM_warn_min: : z 
)	r-   rm   rA   r   r   r   r   r   r   )r    rg   rP  r   r4   r!   r"   rm     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_moder   r   r-   r   r    r   or4   r!   r"   r     s    zCmfInt.__lt__c                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rR  r   rT  r   r   r-   r   rU  r4   r!   r"   r     s    zCmfInt.__le__c                    s4   t jr(t| |}| jr(|dk r$dS dS t |S rR  r   rT  r   r   r-   r   rU  r4   r!   r"   r     s    zCmfInt.__gt__c                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rR  r   rT  r   r   r-   r   rU  r4   r!   r"   r     s    zCmfInt.__ge__)r$   r%   r&   r   intr,   minmaxr)  rm   r   r   r   r   rQ   r!   r!   r4   r"   rO    s   

	rO  c                   @   s   e Zd ZdZdS )	CmfBigInt.Nr$   r%   r&   r   r!   r!   r!   r"   r]    s   r]  c                   @   s   e Zd ZdZdZd ZdS )CmfIntervalu3   Интервал времени в секундах.Nr$   r%   r&   r%  r   r)  r!   r!   r!   r"   r_    s   r_  c                       sD   e Zd ZdZeZdZdZd Ze	dd Z
 fddZdd Z  ZS )	CmfTime.Nc                 C   s   | j r
d S t| jS rI   r   r'   rg   ri   r!   r!   r"   r     s    zCmfTime.jsonc                    s&   t |trtj| S t |S rI   )rB   r'   dateutilparserparser   r-   rm   rk   r4   r!   r"   rm     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   )ry   rd   strftimerg   ri   r!   r!   r"   r     s
    zCmfTime.audit_diff)r$   r%   r&   r   r   r,   r[  r\  r)  rC   r   rm   r   rQ   r!   r!   r4   r"   ra    s   
ra  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"   rg    s   rg  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 )rh  .Nregexu^   Значение {} не удовлетворяет регулярному выражению.)rk  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 )NrS   rQ  )rd   r   re   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,   Слишком длинная строка: )rj  r   r   rk  	fullmatchrl  formatrk   r!   r!   r"   rl     s    zCmfStr.validatec                 O   s   | j j||S rI   rg   rB  rv   r!   r!   r"   rB    s    zCmfStr.split)r)   c                 O   s   | j r
dS | jj||S rx   )r   rg   r<   rv   r!   r!   r"   r<     s    zCmfStr.startswithc                 O   s   | j r
dS | jj||S rx   )r   rg   endswithrv   r!   r!   r"   rq    s    zCmfStr.endswith)r$   r%   r&   r   r'   r,   rj  rk  rePatternr+  rl  r)  rR   r@   r   rl   rB  r   r<   rq  r!   r!   r!   r"   rh    s   

rh  c                   @   s   e Zd ZdZd ZdS )CmfText.Nr$   r%   r&   r   r)  r!   r!   r!   r"   rt  &  s   rt  c                   @   s   e Zd ZdZdZdS )CmfStr32.    Nr$   r%   r&   r   rj  r!   r!   r!   r"   rv  +  s   rv  c                   @   s   e Zd ZdZdZdS )CmfStr64.@   Nrx  r!   r!   r!   r"   ry  0  s   ry  c                   @   s   e Zd ZdZdZdS )	CmfStr256.   Nrx  r!   r!   r!   r"   r{  5  s   r{  c                   @   s   e Zd ZdZdZdS )	CmfStr128.   Nrx  r!   r!   r!   r"   r}  :  s   r}  c                   @   s   e Zd ZdZdZdS )
CmfStr4096.i   Nrx  r!   r!   r!   r"   r  ?  s   r  c                       s~   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e fddZ  ZS )rA  .N)foreign_keyforeign_keysc                 C   s   | j dd S )Nr?  r   rp  ri   r!   r!   r"   	type_nameK  s    zCmfTUUID.type_namec                 C   s   t | jdd S )Nr?     )r   rg   rB  ri   r!   r!   r"   uuidO  s    zCmfTUUID.uuidc                 C   s   ddl m} t|t| jjS Nr   r;  )r   r   rA   rA  rg   r  )r    r   r!   r!   r"   r<  S  s    zCmfTUUID.modelc                 C   s
   t |jS rI   )rA  r<  )rE   	tuuid_strr!   r!   r"   get_cls_by_tuuid_strY  s    zCmfTUUID.get_cls_by_tuuid_strc                 C   s   t |}|j|jS rI   )rA  r<  rJ   rg   )rE   r  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\   Это служебное поле, для присвоения ид используйте )r  rL   r   r9   r-   rl   rk   r4   r!   r"   rl   b  s    zCmfTUUID.validatec                    s   t  || | jdr~t|| jd d r~dt|kr~|| jd d  jrf|| jd d  j|kr~|||| jd d < d S )N_idr  z:Class)	r-   rO   r$   rq  hasattrr'   r   rf   Zmake_ellipsis_idobjr7  r4   r!   r"   rO   h  s    ,,zCmfTUUID.set)r$   r%   r&   r   r  r  ry  r@   rC   r  r  r<  r-  r  r  rl   rO   rQ   r!   r!   r4   r"   rA  D  s"   





rA  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  u  s   r  c                   @   s   e Zd ZdZdZdS )CmfM2MTUUID.r~  Nrx  r!   r!   r!   r"   r  {  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 rI   r   ri   r!   r!   r"   r     s    zCmfUUID.jsonN)r$   r%   r&   r   r   r,   r   rT   r)  rC   r   r!   r!   r!   r"   r    s   r  c                       sV   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 fddZ  ZS )CmfIPv4Address.c                 C   s
   t | jS rI   r   ri   r!   r!   r"   ro     s    zCmfIPv4Address.db_formatc                 C   s   | j r
d S t| jS rI   rb  ri   r!   r!   r"   r     s    zCmfIPv4Address.jsonc                    s2   |sd }t |tjs|d kr(t |S t|S rI   )rB   	ipaddressIPv4Addressr-   rm   rk   r4   r!   r"   rm     s
    zCmfIPv4Address.castc                 C   s   d S rI   r!   rk   r!   r!   r"   rl     s    zCmfIPv4Address.validatec                 C   s   |  | j| jS rI   r   ri   r!   r!   r"   r     s    zCmfIPv4Address._html_diffc                    s(   t   }|r$ fdd| D }|S )Nc                    s   i | ]\}}|  |qS r!   )r   .0rG   rH   ri   r!   r"   
<dictcomp>  s      z-CmfIPv4Address.audit_diff.<locals>.<dictcomp>)r-   r   rE  rm  r4   ri   r"   r     s    
zCmfIPv4Address.audit_diff)r$   r%   r&   r   r  r  r,   ro   rC   r   rm   rl   r   r   rQ   r!   r!   r4   r"   r    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 rI   r   ri   r!   r!   r"   ro     s    zCmfIPv4Network.db_formatc                 C   s   | j r
d S t| jS rI   rb  ri   r!   r!   r"   r     s    zCmfIPv4Network.jsonc                    s*   t |tjs|d kr t |S t|S rI   )rB   r  IPv4Networkr-   rm   rk   r4   r!   r"   rm     s    zCmfIPv4Network.castc                 C   s   d S rI   r!   rk   r!   r!   r"   rl     s    zCmfIPv4Network.validate)r$   r%   r&   r   r  r  r,   ro   rC   r   rm   rl   rQ   r!   r!   r4   r"   r    s   
r  c                   @   s   e Zd ZdZdS )	CmfDomain.Nr^  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  rl   r<   crypt_prefixZcrypt)r    rg   r  r!   r!   r"   rm     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!   Недостаточно правr  )r  r  r   r   r   rg   r   Zcurrent_personZsystem_personZCmfAccessListZcheck_admin_moder<   r  decryptrB  )r    r  r   r   r!   r!   r"   r    s    zCmfPassword.decryptc                    s    t d|rtdt |S )Nu   [А-Яа-яЁё]uD   Пароль не должен содержать кириллицу)rr  searchr   r-   rl   rk   r4   r!   r"   rl     s    zCmfPassword.validate)
r$   r%   r&   r   r)  r  rm   r  rl   rQ   r!   r!   r4   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 rI   r   rg   	isoformatri   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   ry   rd   r  rg   ri   r!   r!   r"   r     s
    zCmfDate.audit_diffc                    s&   t |trtj| S t |S rI   )rB   r'   rc  rd  re  r   r-   rm   rk   r4   r!   r"   rm     s    
zCmfDate.castc                 C   s   | t tj S rI   )r   nowr   utcr   r   r!   r!   r"   r    s    zCmfDate.nowc                 C   s   |   | _d S rI   r  rg   ri   r!   r!   r"   set_now
  s    zCmfDate.set_nowc                 C   s6   t |tr|  j|7  _n|  jt| |j7  _| S rI   rB   r   rg   r   r   r!   r!   r"   r     s    
zCmfDate.__iadd__c                 C   s6   t |tr|  j|8  _n|  jt| |j8  _| S rI   r  r   r!   r!   r"   r     s    
zCmfDate.__isub__c                 C   s,   t |tr| j| S | jt| |j S d S rI   r  r   r!   r!   r"   r     s    

zCmfDate.__add__c                 C   s,   t |tr| j| S | jt| |j S d S rI   r  r   r!   r!   r"   r   !  s    

zCmfDate.__sub__c                    s(   t jrt| | | jrdS t |S rx   rS  r   r4   r!   r"   r   (  s
    zCmfDate.__lt__c                    s(   t jrt| | | jrdS t |S rx   rW  r   r4   r!   r"   r   0  s
    zCmfDate.__le__c                    s(   t jrt| | | jrdS t |S rx   rX  r   r4   r!   r"   r   8  s
    zCmfDate.__gt__c                    s(   t jrt| | | jrdS t |S rx   rY  r   r4   r!   r"   r   @  s
    zCmfDate.__ge__)r$   r%   r&   r   r   r,   r  r  r)  rR   r@   rC   r   r   rm   r-  r  r  r   r   r   r   r   r   r   r   rQ   r!   r!   r4   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 rI   )r-   r   r  r  r   r4   r!   r"   r   S  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)rA   rL   r  r  replacer  )r    Zrange_startZ	range_endr!   r!   r"   r   W  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   r  )rc  rd  re  r   r   rL   r  r  )r    rg   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 rI   )rA   rL   r  r  r  ri   r!   r!   r"   r   k  s
    zCmfDateRange.jsonc                 C   s   | j s
i S d|  dS )NZTODOr   )ry   r   ri   r!   r!   r"   r   s  s
    zCmfDateRange.audit_diff)r$   r%   r&   r   r,   r  r  r)  rR   r@   r:   r-  r   r   r   rC   r   r   rQ   r!   r!   r4   r"   r  J  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 rI   )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   )rg   r  ri   r!   r!   r"   age  s    zCmfDateTime.agec                 C   s   | j r
d S | j S rI   r  ri   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  ri   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   дек)rE  r  )rg   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/r     )dayfirst)tzinfo)rB   r'   isdigitrc  rd  re  r  r-   rm   Z	utcoffsetr  r   r  Z
astimezoner  )r    rg   r  r   r4   r!   r"   rm     s    
zCmfDateTime.castc                 C   s&   |sdS |  }d| d| d}|S )NrS   z<time datetime="z">z</time>)r  rk   r!   r!   r"   r     s
    z!CmfDateTime._format_for_html_diffc                 C   s   | t tjS rI   )r   r  r   r  r   r!   r!   r"   r    s    zCmfDateTime.nowc                 C   s   |   | _d S rI   r  ri   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rB   r   rg   r   rZ  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 rx   rS  r   r4   r!   r"   r     s
    zCmfDateTime.__lt__c                    s(   t jrt| | | jrdS t |S rx   rW  r   r4   r!   r"   r     s
    zCmfDateTime.__le__c                    s(   t jrt| | | jrdS t |S rx   rX  r   r4   r!   r"   r     s
    zCmfDateTime.__gt__c                    s(   t jrt| | | jrdS t |S rx   rY  r   r4   r!   r"   r     s
    zCmfDateTime.__ge__) r$   r%   r&   r   r   r,   r  r  r)  rR   r@   staticmethodr  rC   r  r   r   r  rm   r   r-  r  r  r   r   r   r   r   r   r   r   rQ   r!   r!   r4   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 rI   )r-   rm   r   r  r   r  )r    rg   r   r  r4   r!   r"   rm   !  s
    zCmfCreateDateTime.cast)r$   r%   r&   r   rm   rQ   r!   r!   r4   r"   r    s   r  c                       s   e Zd ZdZdZdZejd Zdd Z f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.r7   )r6  r   ry   rL   rr   rd   re   rs   )setattr_fieldsc                 C   s   t d S rI   r8  rk   r!   r!   r"   rl   9  s    zCmfRelationBase.validatec                    s   t   }| jr| jjjpd |d< | jr2| jjjp4d |d< | jrJ| jjjpLd |d< | jrb| jjjpdd |d< | jrz| jjjp|d |d< | jr| jjjpd |d< |S )NZfrom_value_nameZto_value_nameZfrom_value_codeZto_value_codera   rb   )r-   rj   rd   r0   rg   re   rh   rf   )r    r   r4   r!   r"   rj   <  s    
zCmfRelationBase.historyc                    s   t   |  g S rI   )r-   r   id_fieldnamer   r4   r!   r"   r   F  s    z#CmfRelationBase.get_required_fieldsc                 C   s
   | j d S )Nr  r9   r   r!   r!   r"   r  J  s    zCmfRelationBase.id_fieldnamec                 C   s   t | j|  S rI   )rA   rL   r  ri   r!   r!   r"   rf   N  s    zCmfRelationBase.idc                 C   sr   t |tr|j}t||  }|jdkrZ|j|_ddlm} |	d| d| j
 d|  ||_|j|jk|_dS )u}   
        Обновим служебное поле
        :param instance:
        :param new_id:
        :return:
        .r   r   u?   DEV: INFO: пессиместичный is_changed у поля r   r   N)rB   rR   rg   rA   r  rs   rr   r~   r   r   r9   ry   )rE   rL   new_idZfk_fieldr   r!   r!   r"   
_update_fkR  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-   rO   r$   rr   r   rg   rf   r  _update_backref)rE   rL   rg   Zinserted_valuer  r4   r!   r"   rO   g  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!   rf   r  rc   r!   r!   r"   
<listcomp>  s     z3CmfRelationBase._update_backref.<locals>.<listcomp>)rA   r$   r   r  rr   rf   rg   r3  rs   rd   r   r5  )rE   rL   r   Zbackref_fieldrc   r!   r!   r"   r  v  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  r  r;  z(DEV: FATAL Potential RelationCache leak target)r   r   r-   rw   rr   r   rg   ry   rf   is_recursion_saver   rs   rD  remove_field_referencerd   add_field_referencer   r  rL   )r    r  rF   r   r   r  r   r4   r!   r"   rw     s*    



zCmfRelationBase.savec                    s<   |dkrd S | j dk	r.| js.| jj|d d t   d S )Nr  .r  )rr   r   rg   r|   r-   )r    r  r4   r!   r"   r|     s
    zCmfRelationBase.flushc                 C   s   t | j|S rI   )rA   rg   )r    r0   r!   r!   r"   __getattr__  s    zCmfRelationBase.__getattr__c                    s8   || j ks|t| kr&t || nt| j|| d S rI   )r  r?   r-   __setattr__r   rg   )r    r0   rg   r4   r!   r"   r    s    zCmfRelationBase.__setattr__NFc           	         s  ddl m}  jdk	rV|sV jr. jrV jjsV|rR fdd|D } jj|d  S d|krfd|d< d	|krvd|d	<  j   }|jdkrć fd
d|pg D    jg } jj|d ntt	 dr"t
| j}|j jfd|i| _ jdks jrȈ jjrȈ j _n jr jdd }t
||d}|sZtd| |j jfd|i| _ jdks jrȈ jjrȈ j _n,d _ jdks jrȈ jjrȈ j _ S )u1   Ленивая загрузка Relation поляr   r;  .c                    s   g | ]} j  d | qS r   r  r  Z
load_fieldri   r!   r"   r    s     z(CmfRelationBase.load.<locals>.<listcomp>r   r=  Tr>  c                    s   g | ]} j  d | qS r  r  r  ri   r!   r"   r    s     r<  rp   r?  Nu$   Нет класса с именем )r   r   rs   Zis_ellipsis_idobjrL   rt   r  r9   r  r   rA   r<  rJ   rf   rr   rB  rN  )	r    rp   rq   r   r   Zfields_listZid_fieldr<  Zcls_namer!   ri   r"   ru     sD    


zCmfRelationBase.loadc                 C   s"   |dk	r|rt |dr|jjS d S )N.r0   )r  r0   rg   rk   r!   r!   r"   r     s    z%CmfRelationBase._format_for_html_diffc                 C   s   | j r
d S | jjS rI   )r   rg   r   ri   r!   r!   r"   r     s    zCmfRelationBase.json)r   )NF)r$   r%   r&   r   r^   r  r/  r@   rl   rj   r-  r   r  rC   rf   r  rO   r  rw   r|   r  r  ru   r   r   rQ   r!   r!   r4   r"   r  *  s4   







0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)r  c                 C   s8   t |j| jkr4td| j dt |j d| j d S )Nu   Тип u    не совпадает: z != )r   r$   r<  r   r9   rk   r!   r!   r"   rl     s    zCmfRelation.validatec                 C   s   ddl m} t|| j gS r  r   r   varsr<  rE   r   r!   r!   r"   r:    s    zCmfRelation.related_models)r$   r%   r&   r   r)  r  r<  r  r@   rl   r-  r:  r!   r!   r!   r"   r    s   
r  c                   @   s,   e Zd ZdZd ZdZdd Zedd ZdS )CmfGenericRelation.Nc                 C   s2   | j r.t|j| j kr.tdt|t|j|d S )NuJ   Тип не совпадает, неизвестное имя модели)r   r   r$   r   rk   r!   r!   r"   rl   !  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  r3  )rE   r   r   r<  r!   r!   r"   r:  &  s    
z!CmfGenericRelation.related_models)	r$   r%   r&   r   r)  r   rl   r-  r:  r!   r!   r!   r"   r    s   r  c                   @   s2   e Zd ZdZdZdgZg Zedd Zdd Z	dS )CmfSubclassedGenericRelation.	CmfEntityc                 C   s"   dd l }t|j| j}t| S r  )
cmf.modelsrA   r   
base_modelrz   Ziter_subclasses)rE   cmfr  r!   r!   r"   r:  8  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  
issubclassr   rA   r   r  r   rL   r9   )r    rg   r  r!   r!   r"   rl   @  s    z%CmfSubclassedGenericRelation.validateN)
r$   r%   r&   r   r  r   Zfield_options_list_limitr-  r:  rl   r!   r!   r!   r"   r  2  s   
r  c                       sF   e Zd ZdZdZdZdd ZdddZ fdd	Z fd
dZ	  Z
S )CmfBackrefBase.Nc                 C   s   t d S rI   r8  ri   r!   r!   r"   rj   M  s    zCmfBackrefBase.historyFc                 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.rp   r  )	rs   rz   r:  rF  r  rL   rf   rr   r   )r    rp   rq   r   r<  r!   r!   r"   ru   P  s    "
zCmfBackrefBase.loadc                    s   t  | _t j|| d S rI   )rz   rT   r-   r#   rv   r4   r!   r"   r#   \  s    zCmfBackrefBase.__init__c                    s   t  j|| d S rI   )r-   r|   rv   r4   r!   r"   r|   `  s    zCmfBackrefBase.flush)NF)r$   r%   r&   r   r<  r  rj   ru   r#   r|   rQ   r!   r!   r4   r"   r  H  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   r<  r  r  r!   r!   r"   r:  n  s    zCmfBackref.related_models)r$   r%   r&   r)  r   r<  r-  r:  r!   r!   r!   r"   r  i  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:  y  s    z CmfGenericBackref.related_models)r$   r%   r&   r)  r   r   r-  r:  r!   r!   r!   r"   r  t  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d
d Zedd Z fddZd0ddZedd Zedd Zd1ddZd2ddZd3ddZ fddZedd  Zd!d" Zd4d$d%Zd5d&d'Zd(d) Zd*d#d#d+ fd,d-
Zd6 fd.d/	Z  ZS )7
CmfM2MBase.N)changes_appendedchanges_removedc                 C   s   t d S rI   r8  rk   r!   r!   r"   rl     s    zCmfM2MBase.validatec                 C   s   t d S rI   r8  ri   r!   r!   r"   rj     s    zCmfM2MBase.historyc                 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 )NrS   r   r  r3  u    добавлено: ,c                 S   s   g | ]}t |qS r!   r   r  cr!   r!   r"   r    s     z)CmfM2MBase._html_diff.<locals>.<listcomp>r5  u    удалено: c                 S   s   g | ]}t |qS r!   r   r  r!   r!   r"   r    s     u    остальное: rQ  )_changesr3  r   r   )r    Zhtml_strchangeschangeactrc   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   r  )ry   r  rf   rg   r3  )r    r  r  r  Zobj_idr!   r!   r"   r     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 rI   )r-   r#   r  _changes_bufferrz   rT   rv   r4   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    rc   actionchange_action
change_objr8   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 )r3  r!   r  r  r  r8   r!   r!   r"   r    s      z/CmfM2MBase.changes_appended.<locals>.<listcomp>r  ri   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 )r5  r!   r  r!   r!   r"   r    s      z.CmfM2MBase.changes_removed.<locals>.<listcomp>r  ri   r!   r!   r"   r    s    zCmfM2MBase.changes_removedr  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   Должен работать в т.ч. с незагруженными полями, для оптимизации.NFr  r   r3  Tr5  r  .)rB   rR   rg   r'   rA  r  rl   r6  r   r  rf   r5  r  r3  ry   rL   r  rA   rr   )r    rc   descriptionr  rF   r   Zalready_appendedrowr!   r!   r"   r3    s@    



zCmfM2MBase.appendc                 C   s0   t |D ]"\}}| j||r"|| p$d d qd S )N)r  )	enumerater3  )r    ZobjsZdescriptionsirc   r!   r!   r"   rF    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  NFr  r   r3  r5  Tr  .)r6  rB   r'   rA  r  r   r  rf   r5  r  r3  ry   r  rL   rA   rr   )r    rc   r  rF   r   Zalready_removedr  r!   r!   r"   r5    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  G  s     z#CmfM2MBase.cast.<locals>.<listcomp>c                 S   s   h | ]
}|j qS r!   r  r  r!   r!   r"   	<setcomp>J  s     z"CmfM2MBase.cast.<locals>.<setcomp>)rB   rR   rg   r{   r'   r-   rm   r3  rr   rL   r   ru   r   rf   r5  )r    rg   rI  valZ	value_idsr4   r!   r"   rm   0  s,    


zCmfM2MBase.castc                 C   s   t d S rI   r8  r   r!   r!   r"   r  P  s    zCmfM2MBase.m2m_model_cls_namec                 C   s(   |   D ]}||}|r|  S qd S rI   )r:  rJ   )r    rf   r<  Zrelated_objr!   r!   r"   get_related_objT  s
    

zCmfM2MBase.get_related_objFc                    s    j dk	r|s S  j g}|r2 fdd|D } jj|fd|i|  S ]4} j|j	f | jd jj
ggddd| qNn  j j jd _   t j _  S )	N.c                    s   g | ]} j  d | qS r  r  )r  fri   r!   r"   r  b  s     z#CmfM2MBase.load.<locals>.<listcomp>rq   rC  T)rp   r@  TECHCOM_nocacheZinclude_archived)rc   left)rs   r9   rL   rt   rr   r6  r  r:  rF  rz   rf   r  Zselect_relatedr  apply_changesr   )r    rp   rq   r   paramsr<  r!   ri   r"   ru   \  s     
   4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;  r  Zchild_idr  Zchild_fieldZparent_modelrC  	parent_id)r@  rp   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  rp   rc   r!   r"   r    s      )
r   r   r  r  r<  rL   rf   r9   rD  Zslist)	r    Zid_onlyrp   rH  r   Zgroup_model_namesZrelation_filterZrelation_listrI  r!   r  r"   all_parentsz  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 )Nr3  r5  u*   Неизвестное изменение )r  rr   r3  rN  r5  )r    Zchange_typerL   rF   r!   r!   r"   r    s    zCmfM2MBase.apply_changesr   )r  	only_datainvalidate_donec             
      s  t  j|||d| ddlm} ddlm} ddlm} ddlm}	 |s|t	
d | jjrn|| jd n|| jd	 | jD ]z^}
}}d }| jr|}| j}| }n6| jr|}| j}| jrt|| j}ntd
| j d|j|jgd |	jr\d}|   d|j d|j }t	
d| d |jjj |d|i}t|}t	
d| d |  j |j|jd dd}|
dkr|rddlm!} |d| j d| j d| dd q|  ||d}|r|d |_"|# . |j|d|d i| |j$j%| |d W 5 Q R X nn|
d kr|sTddlm!} |d!| j d| j d| dd q|#   |&  |j$'| |jj( W 5 Q R X |j| j|
|| jd" t|d#d s|
d krt)|d$r|j*+  |j*s|j|d|d i| q|j|d|d i| qg | _d | _,d S )%N)r  r  r   )	CMF_CACHEr;  r  r   u`   WARNING CmfM2MBase.save имеем прямой save делаем доп.инвалидацию!Zcreater"  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(T)Zleft_idZright_idZroot_idr  r3  r  u]   DEV: попытка добавления уже существующей м2м связи у r   rQ  Fabort)r  rightr  r  r  r5  uV   DEV: попытка удаления несуществующей м2м связи у )Zm2m_field_namer  cmf_deleted)-r-   rw   Zcmf.appr  r   r   r  r  r   r   r   rL   r   Z
invalidater  r  r  r  rA   r   r9   Z_acl_check_writeZM2M_DUB_PROTECT_LOCKr  rf   Z
CmfProjectZdpZdata_driverZSessionZexecuterz   r  rJ   r   r  Zdisable_aclrD  r  deleter  rg   r  r  ru   r6  )r    r  r  r  rF   r   r  r   r  r   r  rc   ZcargsZ
left_fieldr  r  Zlock_sqlr  Zlock_resr  r   r4   r!   r"   rw     s|    	
 
"


"

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 )Nr  .r  )rr   r   rg   rA   r|   r  r-   )r    r  rH   r4   r!   r"   r|   	  s    

zCmfM2MBase.flush)N)Nr  )N)r  )NF)FN)r   ) r$   r%   r&   r   r  r  r  r/  r@   rl   rj   r   r   r-  r  r#   r   rC   r  r  r3  rF  r5  rm   r  r	  ru   r  r  rw   r|   rQ   r!   r!   r4   r"   r    s:   






'

$ 


ar  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_   r9   r<  r  r   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"   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   )r   rz   r$   r<  r   rL   r9   rk   r!   r!   r"   rl   1	  s    zCmfM2M.validate)r$   r%   r&   r)  r   r<  r  r  r  r-  r  r:  rl   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 rI   )r  r<  r  
capitalizer_   r9   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  r0   r;  r!   r"   r  I	  s     z0CmfGenericM2M.related_models.<locals>.<listcomp>c                    s   g | ]}t  | qS r!   r  r"  r;  r!   r"   r  L	  s     )r   r   r  r  r<  r   r!   r;  r"   r:  D	  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   r   rz   r$   r   rL   r9   rk   r!   r!   r"   rl   O	  s    zCmfGenericM2M.validate)r$   r%   r&   r)  r   r   r<  r  r-  r  r:  rl   r!   r!   r!   r"   r   7	  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#  U	  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 rI   r   ri   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  rL   r  r_   _build_ui_formr&  rJ   r9   r-   r   r    r   r   r  Zui_form_customr&  r4   r!   r"   r   b	  s    
zCmfChoice._simple_html_diff)	r$   r%   r&   r   r&  r)  r   r   rQ   r!   r!   r4   r"   r$  Z	  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  rL   r  r_   r'  r&  rJ   r9   rZ  r-   r   r(  r4   r!   r"   r   	  s    
zCmfChoiceInt._simple_html_diff)r$   r%   r&   r   r&  r)  r   rQ   r!   r!   r4   r"   r)  z	  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: )rr  matchr   r-   rl   rk   r4   r!   r"   rl   	  s    zCmfEmail.validate.r$   r%   r&   rl   r   rQ   r!   r!   r4   r"   r*  	  s   r*  c                       s    e Zd Z fddZdZ  ZS )
CmfOrgNamec                    s(   t d}||stdt |S )Nz^([a-z0-9-]+)+$u=   Неправильный формат имени домена)rr  compiler+  r   r-   rl   )r    rg   patternr4   r!   r"   rl   	  s    

zCmfOrgName.validate.r,  r!   r!   r4   r"   r-  	  s   r-  c                   @   s   e Zd ZdZdS )CmfLogin.Nr^  r!   r!   r!   r"   r0  	  s   r0  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    rg   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
        Nr3  )
r2  r+  r-   rl   r6  numberr4  is_valid_numberis_possible_numberr   )r    rg   r+  phoner4   r!   r"   rl   	  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;rS   r3  z ,;r  u   доб. z, )r6  r7  r4  r8  r9  r   startendstripformat_numberPhoneNumberFormatE164	extension)r    rg   r+  r:  infor!   r!   r"   rm   	  s$    

 zCmfPhone.castc                 C   s&   | j r"| j dd }| r"|S d S )Nr;  r   )rg   	partitionr  )r    r  r!   r!   r"   r7  	  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 )Nr3  r  r;  )r6  r7  r4  r8  r9  r   r?  r@  rA  rC  rg   )r    rg   r+  r:  r   r!   r!   r"   r7  	  s    

c                 C   s8   | j r4td| j dd  d }t|tjjS d S N+r;  r   )rg   r4  re  rD  r?  r@  rA  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 rE  )rg   r4  re  rD  r?  r@  ZNATIONALrG  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 rE  )rg   r4  re  rD  r?  r@  ZINTERNATIONALrG  r!   r!   r"   number_international
  s    zCmfPhone.number_internationalc                 C   s   | j s| j S | j dd S )Nr;  r   )rg   rD  ri   r!   r!   r"   rC  
  s    zCmfPhone.infoc                 C   s.   | j r| j  d}nd}|r$||7 }|| _d S )Nr;  )r7  rg   )r    rg   r   r!   r!   r"   rC  "
  s    )r$   r%   r&   r%  r   r)  r&  rr  r.  r2  ry  r@   r6  rl   rm   rC   r7  r,  rH  rI  rJ  rC  rQ   r!   r!   r4   r"   r1  	  s.   







r1  c                   @   s   e Zd ZdZd ZdS )CmfMarkdown.Nru  r!   r!   r!   r"   rK  4
  s   rK  c                   @   s   e Zd ZdZd ZdS )	CmfMarkup.Nru  r!   r!   r!   r"   rL  9
  s   rL  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!   rk   r!   r!   r"   rm   B
  s
    zCmfUrl.castN)r$   r%   r&   r)  r   rm   r!   r!   r!   r"   rM  >
  s   rM  c                   @   s   e Zd ZdZdZdS )CmfUrlShort.r~  Nrx  r!   r!   r!   r"   rN  K
  s   rN  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)rg   r   ri   r!   r!   r"   ro   U
  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!   rm   r  ri   r!   r"   r  \
  s      z CmfJson.cast.<locals>.<dictcomp>c                    s   g | ]}  |qS r!   rQ  r  rH   ri   r!   r"   r  ^
  s     z CmfJson.cast.<locals>.<listcomp>)rB   r{   rE  rz   rR   r   rk   r!   ri   r"   rm   Z
  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 #   , т.к. значение поля     не список: Tr  )
r   r   r   ru   rg   rB   rz   r3  ry   rL   r    rg   rF   r   r   r!   r!   r"   r3  e
  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 rS  rT  Tr  )
r   r   r   ru   rg   rB   rz   r5  ry   rL   rU  r!   r!   r"   r5  v
  s    
 
zCmfJson.remove)
r$   r%   r&   r   r,   r)  ro   rm   r3  r5  r!   r!   r!   r"   rO  P
  s   rO  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   r  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)rE   rg   Zctxr!   r!   r"   _as_str
  s    zCmfNumeric._as_strc                 C   s@   | j s
i S | jd krd n
| | j| jd kr0d n
| | jdS r  )ry   rd   rZ  re   ri   r!   r!   r"   r   
  s
    zCmfNumeric.audit_diffc                 C   s   |d krdS |  |S )Nr   )rZ  rk   r!   r!   r"   r   
  s    z CmfNumeric._format_for_html_diffc                 C   s&   |d kr| j sdS |s|S t|S d S r  )r   r   rk   r!   r!   r"   rm   
  s
    zCmfNumeric.castc                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rR  rS  rU  r4   r!   r"   r   
  s    zCmfNumeric.__lt__c                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rR  rW  rU  r4   r!   r"   r   
  s    zCmfNumeric.__le__c                    s4   t jr(t| |}| jr(|dk r$dS dS t |S rR  rX  rU  r4   r!   r"   r   
  s    zCmfNumeric.__gt__c                    s4   t jr(t| |}| jr(|dkr$dS dS t |S rR  rY  rU  r4   r!   r"   r   
  s    zCmfNumeric.__ge__)r$   r%   r&   r   r,   r)  Z	precisionrY  r[  r\  stepr&  r-  rZ  r   r   rm   r   r   r   r   rQ   r!   r!   r4   r"   rV  
  s$   


	rV  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   rz   r,   r)  r   rT   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   rT   r-  r:  r!   r!   r!   r"   r]  
  s   r]  c                   @   s   e Zd ZdZdS )CmfLikes.Nr^  r!   r!   r!   r"   r^  
  s   r^  c                   @   s   e Zd ZdZdS )CmfViews.Nr^  r!   r!   r!   r"   r_  
  s   r_  c                   @   s   e Zd ZdZdS )CmfTags.Nr^  r!   r!   r!   r"   r`  
  s   r`  c                   @   s   e Zd ZdZdZd ZdS )CmfObjectJsonu@   Сохраняем и отдаём объект в виде JSON.Nr`  r!   r!   r!   r"   ra    s   ra  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 rI   )r-   rm   rb  db_castrk   r4   r!   r"   rm   	  s    zCmfIPv4NetworkList.castc                 C   s   d S rI   r!   rk   r!   r!   r"   rl     s    zCmfIPv4NetworkList.validatec                 C   s   | j r
d S dd | jD S )Nc                 S   s   g | ]}t |qS r!   r   rR  r!   r!   r"   r    s     z+CmfIPv4NetworkList.json.<locals>.<listcomp>)r   rg   ri   r!   r!   r"   r     s    zCmfIPv4NetworkList.jsonc                 C   s   | j d kr| j S t| jddS rP  )rg   r   r   ri   r!   r!   r"   ro     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  rR  r!   r!   r"   r  %  s     z.CmfIPv4NetworkList.db_cast.<locals>.<listcomp>)rB   r'   r   )rE   rg   r!   r!   r"   rc    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   rR  r!   r!   r"   r  +  s     z1CmfIPv4NetworkList.audit_diff.<locals>.<listcomp>c                 S   s   g | ]}t |qS r!   r   rR  r!   r!   r"   r  ,  s     r   r   ri   r!   r!   r"   r   '  s
    zCmfIPv4NetworkList.audit_diff)r$   r%   r&   r   r)  rm   rl   rC   r   ro   r-  rc  r   rQ   r!   r!   r4   r"   rb    s   

	rb  c                       s@   e Zd ZdZdZddgZdZdZdZdZ	dZ
 fdd	Z  ZS )
CmfCodeu   КодTrT   gin_trgmu3   Код в реальном мире из жизниrI   r   c                    sd   ddl m} |s|S | }| jdkrXt|| jkrX|d | jd   d||d }t |S )Nr   )cmf_hashlibr      r     )	r  rf  r>  truncater   rj  Zshort_str_encr-   rm   )r    rg   rf  r4   r!   r"   rm   8  s    $zCmfCode.cast)r$   r%   r&   r   r]   r(  r\   r(   r'  ri  r   rm   rQ   r!   r!   r4   r"   rd  .  s   rd  c                   @   s    e Zd ZdZdZdZddgZdS )CmfNameu   Имя объектаu   object.name - статичное поле для представления в ui, аналог repr, генерируем методом если не заданоTrT   re  N)r$   r%   r&   r   r'  r]   r(  r!   r!   r!   r"   rj  A  s   rj  __main__ababza:bzb:a)NF)kr  rr  r   r   r   r   r   r   typingr   r	   r
   r  r   r   decimalr   r   r   Zdateutil.parserrc  r4  Zujsonr   r   Zcmf.base_errorr   r   r   r   r  r   r~   r   r   r   r'   r   r*   r   r+   rR   r/  rM  rO  r]  r_  ra  rg  rh  rt  rv  ry  r{  r}  r  rA  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  rK  rL  rM  rN  rO  rV  r\  r]  r^  r_  r`  ra  rb  rd  rj  r$   AssertionErrorZlikesZtestrg   r  r   r!   r!   r!   r"   <module>   s   1     -vB11"!a1 $ b!    
 8Q(	
