U
    Įwh                     @   sV   d dl Z d dlZd dlmZ d dlZd dlZd dlT d dlm	Z	 G dd de	j
Z
dS )    N)urlparse)*)cmf_backbone_peerc                       s  e Zd Zddddddddd	d
dddgZedVddZedWddZ fddZdd Zdd Z	 fddZ
 fddZedXddZed d! Zed"d# ZedYd$d%Zed&d' Zed(d) Zed*d+ Zed,d- Zed.d/ ZedZed0d1d2d3Zed[d4d5Zed\d6d7Zed]d8d9Zed^d:d;Zed_d<d=Zed`d>d?Zedad@dAZdBdC ZdDdE Z dbdFdGZ!dHdI Z"G dJdK dKe#Z$dLdM Z%dcdNdOZ&dddPdQZ'dedRdSZ(dfdTdUZ)  Z*S )gCmfBackbonePeergetsgetlistslistcountdelete
setup_peer	log_applylog_listlog_mark_doneget_objpeer_project_nclist	full_syncNc                 C   s:   | r6zt | }W n tk
r$   Y nX |jtjkr6dS dS )Neva_apilocal)r   
ValueErrorhostnameconfigZHOSTNAME_FQDN)urlZ
parsed_url r   ../modules/backbone/models/cmf_backbone_peer.pyget_peer_type   s    zCmfBackbonePeer.get_peer_typec                 C   sR   t j  |pddg}t j|} t jj|| ||d}t jjdt jt	|d|dS )Nr   d   )r   typetoken
ssl_verifyr   )slice)kwargspeer)
modelsZCmfAccessListZcheck_admin_moder   r   ZCmfBackboneInstanceZPeer	call_peer
CmfProjectdict)r   r   r   r   r    r"   r   r   r   r   !   s"    
z#CmfBackbonePeer.peer_project_nclistc                    s   t  jf | d S N)superr   selfr!   	__class__r   r   r   7   s    zCmfBackbonePeer.deletec                 C   s(   | j  d| j d| jo| jj | _d S )N@ )backbone_instance_domainbackbone_instance_codepeer_projectcodenamer*   r   r   r   
_calc_name;   s    zCmfBackbonePeer._calc_namec                 C   s,   | j jr(| j r"tj| j j| _nd | _d S r'   )src_task_filter_ubql
is_changedr#   CmfTaskZubql2bqlvaluesrc_task_filter_bqlr4   r   r   r   _calc_src_task_filter_bql?   s    z)CmfBackbonePeer._calc_src_task_filter_bqlc                    s   t   ddddg S )Nr/   r0   r1   r6   )r(   save_preload_fieldsr4   r+   r   r   r<   F   s       z#CmfBackbonePeer.save_preload_fieldsc                    s   |    t jf |S r'   )r5   r(   saver)   r+   r   r   r=   J   s    zCmfBackbonePeer.saveFc                 C   s   t jrtd d S tjrd S t|tjr6| 	||S t|tj
rN| ||S t|tjrf| ||S t|tjr~| ||S tt||d S )Nz_CmfBackbonePeer.obj_after_save_hook(): Skip write changelog due config.MODULE_BACKBONE_DISABLED)r   MODULE_BACKBONE_DISABLEDloggingwarninggbackbone_sync
isinstancer#   r8   _task_after_save_hook
CmfComment_comment_after_save_hookCmfAttachment_attachment_after_save_hookCmfRelationOption _relation_option_after_save_hook	TypeErrorr   )clsobjforce_is_newr   r   r   obj_after_save_hookQ   s     z#CmfBackbonePeer.obj_after_save_hookc              
   C   s  t jrtd d S tjrd S t|tjr@| j	|j
|jd}nt|tjrvt|jtjk	rbd S | j	|j
|jd}nt|tjrt|jjtjr|jjrt|jjtjk	rd S |jj}nt|jjtjr|j
}nd S | j	|j
|d}nft|tjrB| j	|jj
|jjd}|sd S | j	|jj
|jjd}t|t|}ntt|||sZd S d|jjd}|D ]H}td|j d t   tj||j|j|d   W 5 Q R X qld S )NzdCmfBackbonePeer.obj_after_delete_hook(): Skip write changelog due to config.MODULE_BACKBONE_DISABLED
project_idtask_idr   )actionr2   z7CmfBackbonePeer.obj_after_delete_hook(): add record id=z, action=deletebackbone_peer	obj_modelobj_idobj_changes)!r   r>   r?   r@   rA   rB   rC   r#   r8   _get_sync_peersrQ   idrE   cmfutilZget_model_by_id	parent_idrG   parentr9   rI   in_linkout_linksetintersectionrK   r   r2   jsoninfodisable_aclCmfBackboneLog
class_namer=   )rL   rM   peersrR   in_link_peersout_link_peersrX   r"   r   r   r   obj_after_delete_hooke   sh    

z%CmfBackbonePeer.obj_after_delete_hookc                 C   s   |d krd S |j |jj|jjd}t|tjrH|jj|d< |jj|d< nt|tj	rb|j
j|d< nnt|tjr||jj|d< nTt|tjr|ddg |jjj|d< |jj|d< nt|tjtjfr|jj|d< |S )N)rf   r3   r2   login
user_localstatus_typerZ   
logic_typelogic_prefix)rf   r3   rb   r2   rC   r#   	CmfPersonrk   rl   	CmfStatusrm   r8   rZ   ZCmfListload_fieldsrn   ro   rE   rG   )rL   rM   obj_datar   r   r   _serialize_relation_obj   s(    z'CmfBackbonePeer._serialize_relation_objc                    s"  i }dddddh}|j |ddD ]\}}|js>|j|f|kr>q |dkrHq |d	rTq |d
r`q t|tjjrpq i }t|tjj	rd|d< |r fdd|j
D |d<  fdd|jD |d< n fdd|D |d< n<t|tjjrd|d<  |j|d< nd|d< |j|d< |||< q |S )N)rE   
cmf_author)rE   cmf_created_at)rG   rv   )r8   rv   )r8   Zparent_taskT)r7   Z
is_defined>   r]   cmf_modified_atcmf_versionlikesstatus_in_progress_endcache_fieldsstatus_modified_atr2   cmf_viewed_atprojectcmf_modified_byviewsstatus_closed_atZ_idZcache_object_listr   c                    s   g | ]}  |qS r   rt   .0Zobj_rL   r   r   
<listcomp>  s     z4CmfBackbonePeer._get_fields_data.<locals>.<listcomp>appendedc                    s   g | ]}  |qS r   r   r   r   r   r   r   	  s     removedc                    s   g | ]}  |qS r   r   r   r   r   r   r     s     r9   object)itemsZvisiblerf   endswith
startswithrC   cmffieldsZCmfBackrefBaseZ
CmfM2MBaseZchanges_appendedZchanges_removedZCmfRelationBasert   r9   rb   )rL   rM   changes_onlyZfields_dataZadd_model_fields
field_namefieldZfield_changesr   r   r   _get_fields_data   s@    	



z CmfBackbonePeer._get_fields_datac                 C   s`   | j dgdddgdd|ggd}g }|D ]2}|jrPtjj||t|jjdsPq(|| q(|S )Nr:   is_src_peer=Tpeer_project_idr   filter)rZ   r\   r   )	r   r:   r#   r8   r
   astZliteral_evalr9   append)rL   rQ   rR   rg   Zresult_peersr"   r   r   r   rY     s    zCmfBackbonePeer._get_sync_peersc                 C   s  | j |j|jd}|sd S |p"|j}|r,dnd| j|| dd}|d r|jj|d< |dd	g |jd
kr|j	rd|d kr|d d= |D ]^}t
dd|j d|d  dt|d   t   tj||j|j|d  W 5 Q R X q|s|js||jjr|tjj|dddddgdgd}|D ]}||_tjj|dd q(tjj|ddgd}	|	D ]}
||
_tjj|
dd q^d S )NrP   createupdater   rS   r   r   r2   epicro   ztask.sub4CmfBackbonePeer.obj_after_save_hook(): add record %sid=	, action=rS   	, fields=rT   	log_levelis_dummyru   texttree_parentrv   )r]   r   order_byTrN   r   st_sizer]   r   )rY   r\   rZ   is_newr   r2   rb   rr   ro   r   r?   rc   r   r[   rd   r#   re   rf   r=   r   r7   rE   r]   r   rO   rG   )rL   ZtaskrN   rg   r   rX   r"   Zcommentscommentattachments
attachmentr   r   r   rD   &  sJ    


"
   z%CmfBackbonePeer._task_after_save_hookc           	      C   s`  |j dks |js t|jds$d S |ddg |jjr>d S | j|j|jd}|sXd S |ph|j	ph|jj
}|rrdnd| j|| dd	}|d
 r|jj|d< |jj|d< |D ]^}tdd|j d|d  dt|d
   t   tj||j|j|d  W 5 Q R X q|js |jjs&|r\tjj|ddgd}|D ]}||_tjj|dd q>d S )Nr   CmfTask:zparent.is_dummyr   rP   r   r   r   r   r   r2   r\   r   r   r   rS   r   rT   r   r   r   Tr   )r   r   strr\   r   rr   r]   rY   rQ   r   oldr   r2   rb   r?   rc   rZ   r   r[   rd   r#   re   rf   r=   r7   rG   r   rO   )	rL   r   rN   rg   r   rX   r"   r   r   r   r   r   rF   X  s@     

"
   z(CmfBackbonePeer._comment_after_save_hookc                 C   s   |j j|j jkrd S |jj|jjkr(d S |j j|jjkr<d S |sJ|jsJd S | j|j j|j jd}|shd S | j|jj|jjd}t|t|}|sd S d| 	||j
jd}|d r|D ]^}tdd|j d|d  d	t|d   t   tj||j|j|d
  W 5 Q R X qd S )NrP   r   )rS   r   r2   r   r   r   r   rS   r   rT   )r^   rQ   r\   r_   r   rY   rZ   r`   ra   r   r2   rb   r?   rc   r   r[   rd   r#   re   rf   r=   )rL   Zrelation_optionsrN   rh   ri   rg   rX   r"   r   r   r   rJ     sL    
  
"
  z0CmfBackbonePeer._relation_option_after_save_hookc                 C   s  t |jjtjtjfr|js d S t |jjtjrT|jjrF|jjdsJd S |jj}n&t |jjtjrl|j}nt	||jj|jj
  |jj
rd S |js|sd S | j|j|d}|sd S d| ||jjd}|d r|jj|d< |jj|d< |D ]}|jdkr*td	d
|j d|j d|j  qtdd
|j d|d  dt|d   t   tj||j|j|d  W 5 Q R X qd S )Nr   rP   r   )rS   r   content_pathr   r2   r\   i -1z:CmfBackbonePeer.obj_after_save_hook(): skip attachment: %sr   z, name=z, size=r   r   rS   r   rT   )rC   r]   r9   r#   rE   r8   rQ   r\   r   rK   r   loadZcontent_updatedrY   r   r   rb   r2   r   r?   rc   rZ   r3   r   r[   rd   re   rf   r=   )rL   r   rN   rR   rg   rX   r"   r   r   r   rH     sT    


"
   z+CmfBackbonePeer._attachment_after_save_hookzcmf.models.BaseModel | None)methodmodelc           
      C   s   |s| }|j dkrt||}d}t|ttfsPt|d }|f|dd }t||}||pbg |phi }	|r|j	r|
  n>|j dkr| j|j d| |||j|j|jd}	n
t|j |	S )u   
        !!! Локально работаем в той же транзакции
        :param method:
        :param model:
        :param args:
        :param kwargs:
        :param peer:
        :return:
        r   Nr      r   .)r   argsr!   r   r   r   )r   inspectZgetattr_staticrC   classmethodstaticmethodr[   get_obj_by_idgetattrr7   r=   _eva_api_callrf   r   r   r   r   )
rL   r   r   r   r!   r"   Zmethod_attrZself_Zmethod_funcresultr   r   r   r$     s.    




    
zCmfBackbonePeer.call_peerc              
   C   s   dd l }|jdkr>tjj|dgd}| D ]}|   S nf|jdkrz| j||j|j	|j
dW S  |jk
r } ztd||| W 5 d }~X Y qX n
t|jd S )Nr   r   r]   rZ   r   r   )r   r   r   zFCmfBackbonePeer.peer_get_attachment_content(%s, %s): download error %s)requestsr   r#   rG   r   Zget_contentread_eva_http_getr   r   r   RequestExceptionr?   errorr   )rL   attachment_idr   r"   r   r   fileer   r   r   peer_get_attachment_content  s*    

     z+CmfBackbonePeer.peer_get_attachment_contentc              
   C   s   dd l }|jdkr0tjj|dgd}|| nl|jdkrz | j|d|i|j|j|j	dW S  |j
k
r } ztd||| W 5 d }~X Y qX n
t|jd S )	Nr   r   r]   r   r   r   )filesr   r   r   zDCmfBackbonePeer.peer_put_attachment_content(%s, %s): upload error %s)r   r   r#   rG   r   Zupload_file_eva_http_postr   r   r   r   r?   r   r   )rL   r   r   contentr"   r   r   r   r   r   r   peer_put_attachment_content  s*    

  z+CmfBackbonePeer.peer_put_attachment_contentc                 C   s@   dd l }i }| |kr*| }||_||| < ||  }|j  |S )Nr   )r   ZSessionZverifyZcookiesclear)r   r   r   Zhttp_sessionsZsession_r   r   r   _get_eva_http_session(  s    
z%CmfBackbonePeer._get_eva_http_sessionc                 C   sJ   | dsd| }| j||dj| | dd| id}|  |jS )N/r   r   AuthorizationBearer )headers)r   r   r   raise_for_statusr   )rL   pathr   r   r   responser   r   r   r   8  s    

 zCmfBackbonePeer._eva_http_getc           	      C   sj   | dsd| }t| | dd| id}|r<||d< |rH||d< | j||djf |}|  d S )Nr   r   r   )r   r   datar   r   )r   r&   r   postr   )	rL   r   r   r   r   r   r   Zpost_kwargsr   r   r   r   r   A  s    

zCmfBackbonePeer._eva_http_postc              
   C   s   |pi }d|d< dt t d||p&g |p,i d|d}z2| j||dj| d| |dd	| id
}	W n4 tk
r }
 ztd||t |
W 5 d}
~
X Y nX |	jstd|	j|	j	|	j
|	|	 }|drtd||||d rtd||||d }|S )u\   Адаптированный код, из нагрузочного тестирования.TZ
admin_modez2.2N)ZjsonrpcZcallidZjsverr   r   r!   Zno_metaflagsr   z/api/?m=r   r   )rb   r   z&CmfBackbonePeer._eva_api_call(): errorzAPI call error r   abortz&CmfBackbonePeer._eva_api_call(): abortr   )r   uuidZuuid1r   r   	ExceptionZCmfErrorokZstatus_codereasonr   rb   r   )rL   r   r   r!   r   r   r   r   r   r   r   Zjson_resultr   r   r   r   r   R  s8    

$
zCmfBackbonePeer._eva_api_callc              	   K   s   | j ||ddddddgd}	|	sPtjj |d}
|
sDtd	| d
d | ||
d}	||	_||	_||	_||	_||	_|	j	r||	
  |	jj|	jjj|	jjjdS )Nr1   r0   backbone_instance_namer/   r   r6   )backbone_instance_idr   r   rZ   u   Проект не найден T)r   )r   r1   )rZ   Zproject_codeZproject_name)r   r#   r%   Z	cmf_alertr0   r   r/   r   r6   r7   r=   rZ   rb   r1   r2   r3   )rL   r   r0   r   r/   r   r   r6   _kwargsr"   r1   r   r   r   r     s6         zCmfBackbonePeer.setup_peerc                    sN  dd g }j    fdd}dg d| rfD ]}tjj|dd || q>t  q4dg d| rD ]}j|j|j	d	}|s d S d
j
|ddd}|jj|d< |D ]@}tdd|j	 dt|d   tj||j|j	|d  qq|t  qptjjdd|gdd|ggdddgdD ]}tjj|dd q2d S )Ni  c                      s4   t jjjj   gdgd7 S )Nrv   )rQ   r   r   r    r   )r#   r8   r   r   r:   r   r   r   r   r*   Z
slice_sizestartr   r   get_data  s    
z+CmfBackbonePeer.full_sync.<locals>.get_datar   r   Tr   ***rP   r   Fr   r   r2   z*CmfBackbonePeer.full_sync(): add record %sr   z, action=update, fields=r   rT   r^   INr_   Zrelation_type)r   r   )r   r   r#   r   rO   r   
cmf_commitrY   r\   rZ   r   r2   rb   r?   rc   r   re   rf   r=   rI   )r*   Ztasksr   trg   rX   r"   Zrelationr   r   r   r     sP    
   
zCmfBackbonePeer.full_syncc                 K   s   t d| jd| | jdgd tj|dgdd| jgd}|sFd	S d
|jj| |d}t	|t
jt
jfrz|jj|d< td	|j|jj|jj|d}t d| j| |S )u9  
        Получаем объект целиком.
        {
            id: log.id,  # CmfBackboneLog:...
            obj_model: obj.class_name,  # CmfTask
            obj_id: obj.id,  # CmfTask:...
            datetime: log.cmf_created_at.isoformat(),  # 2025-01-01T01:02:03Z
            obj_changes: {
                action: create/update/remove,
                code: obj.code,
                fields: {
                    name: {
                        type: 'value',  # value/object/object_list
                        value: 'New Name'
                    },
                    executors: {
                        type: 'object_list',
                        value: [
                            {
                                class_name: CmfPerson,
                                name: 'Joe',
                                login: 'joe@eva.com',
                                user_local: true,
                            },
                            ...
                        ]
                    }
                },
            },
        }
        zCmfBackbonePeer.get_obj(%s): %szobj_id=r   r   r   r~   r   r   Nr   )rS   r2   r   r\   rZ   rV   rW   ZdatetimerX   z&CmfBackbonePeer.get_obj(%s): result %s)r?   rc   r2   rr   r[   r   r   rb   r   rC   r#   rE   rG   r\   r&   rf   rZ   rw   debug)r*   rW   r   rM   rs   r   r   r   r   r     s8         zCmfBackbonePeer.get_objc                 K   s@   dd t jjdd| gdd|pg gdddgg|d	d
ddgdD S )u(  
        Получаем список изменений по точке синхронизации
        [
            {
                id: log.id,  # CmfBackboneLog:...
                obj_model: obj.class_name,  # CmfTask
                obj_id: obj.id,  # CmfTask:...
                datetime: log.cmf_created_at.isoformat(),  # 2025-01-01T01:02:03Z
                obj_changes: {
                    action: create/update/remove,
                    code: obj.code,
                    fields: {
                        name: {
                            type: 'value',  # value/object/object_list
                            value: 'New Name'
                        },
                        executors: {
                            type: 'object_list',
                            # for update
                            appended: [
                                {
                                    class_name: CmfPerson,
                                    name: 'Joe',
                                    login: 'joe@eva.com',
                                    user_local: true,
                                },
                                ...
                            ]
                            removed: [
                                ...
                            ],
                            # on full obj sync
                            value: [
                                ...
                            ]
                        }
                    },
                },
            },
            ...
        ]
        c              	   S   s,   g | ]$}t |j|j|j|j |jd qS )r   )r&   rZ   rV   rW   rv   Z	isoformatrX   )r   itemr   r   r   r   C  s   z,CmfBackbonePeer.log_list.<locals>.<listcomp>rU   r   rW   zNOT INstatusZqueuedrv   rV   rX   )r   r    r   )r#   re   r	   )r*   r    Zskip_idsr   r   r   r   r     s    ,
zCmfBackbonePeer.log_listc                 K   s   |D ]}t d| jd|dd|d |d }tjj|dgd}|d }|dkrjd	|_|  q|d
krd|_| jd7  _|d|_	|
  qd|_| jd7  _d| |_	|
  t d|| qdS )u1  
        Отмечаем записи лога как обработанные
        [
            {
                id: log.id,  # CmfBackboneLog:...
                status: success,  # success|fail|skip
                [error_text: 'some backtrace',]
            },
            ...
        ]
        z5CmfBackbonePeer.log_mark_done(%s): changes applied %szlog_mark.get("id")=rZ   z, log_mark.get("status")=r   error_countr   )successskipZsynced)failZfailedr   
error_textzUnknown apply status: zBCmfBackbonePeer.log_mark_done(): unknown apply status %s for id %sN)r?   r   r2   r   r#   re   r   r   r   r   r=   r@   )r*   Zlog_mark_listr   Zlog_markZlog_idlogr   r   r   r   r   T  s,     

zCmfBackbonePeer.log_mark_donec                   @   s   e Zd ZdZdS )zCmfBackbonePeer._ApplySkipErroru<   Пропускаем применение измененийN)__name__
__module____qualname____doc__r   r   r   r   _ApplySkipErrorx  s   r   c                 K   s   | j ddddgd tj}g }|D ]}td| jd|dd	|d
d|dd|di ddt|di dg 
 td| j| d}d}d}d}	z^zdt_|d }|d
 }|d }t	
|}
|o|
j|dd| jgd}	|	rp|	  |d d dkr|	  nL|d d dkrZ| j|	|d d |d d d |	  ntd|jd d}n|d d dkr|dkr|d d }t	j|| jd}|s| d | d!n| j}|
|d"}	| j|	|d d |d d d |	  |	jj}d}n| d#| t||||	o,|	jj|d$}t|	tjrN|	jj|d%< || W n | jk
r } z6|t||||	o|	jjd&d$ td'||| W 5 d}~X Y nV tk
r   td(|d |t|d|d
|dd)t  d* Y nX W 5 |t_X t!  q"|S )+u  
        Применяем список изменений на точке синхронизации
        [
            {
                id: log.id,  # CmfBackboneLog:...
                obj_model: obj.class_name,  # CmfTask
                obj_id: obj.id,  # CmfTask:...
                datetime: log.cmf_created_at.isoformat(),  # 2025-01-01T01:02:03Z
                obj_changes: {
                    action: create/update/remove,
                    code: obj.code,
                    fields: {
                        name: {
                            type: 'value',  # value/object/object_list
                            value: 'New Name'
                        },
                        executors: {
                            type: 'object_list',
                            # for update
                            appended: [
                                {
                                    class_name: CmfPerson,
                                    name: 'Joe',
                                    login: 'joe@eva.com',
                                    user_local: true,
                                },
                                ...
                            ]
                            removed: [
                                ...
                            ],
                            # on full obj sync
                            value: [
                                ...
                            ]
                        }
                    },
                },
            },
            ...
        ]
        return:
        [
            {
                id: log.id,  # CmfBackboneLog:...
                obj_model: obj.class_name,  # CmfTask
                obj_id: obj.id,  # CmfTask:...
                obj_code: obj.code,  # TSK-1
                status: success,  # success|fail|skip
                [error_text: 'some backtrace',]
            },
            ...
        ]
        r1   Zdst_create_listsZdst_create_usersZdst_create_users_as_guestr   z/CmfBackbonePeer.log_apply(%s): apply changes %szchange change.get("id")=rZ   z, change.get("obj_model")=rV   z, change.get("obj_id")=rW   z., change.get("obj_changes", {}).get("action")=rX   rS   z7,list(change.get("obj_changes", {}).get("fields", []))=r   NTr~   r   )rZ   r   r   )r   r   rS   zInvalid actionr   r   )rE   rG   r\   )r~   zparent z absent)r]   zobj not found )rZ   rV   rW   obj_coder   r   r   z7CmfBackbonePeer.log_apply(): skip record %s, obj %s: %sz2CmfBackbonePeer.log_apply(): apply record %s errorr   )rZ   rV   rW   r   r   )"rr   rA   rB   r?   rc   r2   r   r   r   r[   get_model_by_namer1   Zsave_preparer   _apply_obj_changesr=   r   rX   r   r   rZ   rb   r&   rC   r#   rG   r   r   r@   r   	exception	traceback
format_excr   )r*   Zchanges_listr   Zg_backbone_sync_bkr   ZchangeZ	change_idrV   rW   rM   r   Zsync_statusr\   r]   Zresult_datar   r   r   r   r   {  s    9

 T

 
 



 
 
 zCmfBackbonePeer.log_applyc           
   	   C   s  |d krd S |d }t |}|sDtd|  d| d| d d S t|tjjsrtd|  d| d|  d S |d}|d}d }|d	kr|d
}|r|j|d}|s|r|j|d}n|dkr|r|j|d}|s|r|j|d}n|dkr*|rtj	j|d}|s|rtj	j|d}nt|dkrPd|kr|j|d d}nNg }	t|tj
tjtjfsd|jkr|	dd| jg |r|j||	d}|std|  d| d |S )Nrf   %sz%._map_object_value(): cannot map obj(z	): model z - not foundz): invalid model r3   r2   rp   rk   )rk   )r3   ZCmfRelationType)r2   CmfLogicTyperE   rZ   r   r~   r   )r3   r   z): not mapped)r[   r   r?   r@   
issubclassr   r#   ZCmfModelr   r  ZCmfActivityZCmfPersonGroupZCmfTagr   r   r1   )
r*   rs   	obj_fieldZobj_class_namerV   Zobj_namer   rM   rk   Z
obj_filterr   r   r   _map_object_value  s`    
  





z!CmfBackbonePeer._map_object_valuec                 C   s   d|kr$|  |d d }|r$||_|  d|krP|  |d d }|rP||_|  d|kr|d d }|rtj|d|d|ddnd	}||_|	  d	S )
 activityr9   rn   r   r3   r2   rm   )r3   r2   rm   N)
r  r	  Z_calc_scheme_wfrn   Z_calc_workflowr#   rq   r   r   Z_calc_status)r*   rM   fields_changesrS   r	  rn   Zstatus_datar   r   r   r   _apply_wf_logicN  s,      zCmfBackbonePeer._apply_wf_logicc                 C   sN   |dkrJ|j sJ|di d}|rJd|d d|d d|j |_d S )	Nr   ru   r9   u   <p>Автор: r3   z &lt;rk   z&gt;</p><br>)ru   r   r   )r*   rM   r
  rS   Zcmf_author_datar   r   r   _add_comment_metaq  s
    "z!CmfBackbonePeer._add_comment_metac              
   C   s  d}|  D ]\}}t|tjr0|dkr0d}q|j|}|sbtd|  d| d|j d qt	||}|d }	|	d	krt
|||d	  q|	d
kr| j|d	 |d}
|
s|js| d| d| d|d	  t
|||
 q|	dkrd	|kr0g }|d	 D ]$}| j||d}| r||  qt
||| d|krh|d D ]$}| j||d}|rB|| qBd|kr|d D ]$}| j||d}|rx|| qxq|r| j|||d t|tjr| j|||d d S )NF>   r	  rn   	scheme_wfworkflowr   Tr  z._apply_obj_changes(): field z not found in z. Field changes lost.r   r9   r   )r  zskip apply z', object not mapped for required field z, r   r   r   r   )r   rC   r#   r8   r   r   r?   r@   rf   r   setattrr  Znullabler   r   remover  rE   r  )r*   rM   r
  rS   Zhas_wf_changesr   Z
field_datar   r  Zfield_data_typeZ	value_objr9   rs   Z
mapped_objr   r   r   r   z  sZ    



z"CmfBackbonePeer._apply_obj_changes)N)NNNN)F)F)NNNN)N)N)NF)NNF)NNNNF)NNNNNF)NNNNNNN)NN)N)N)N)N)+r   r   r   Zapi_methodsr   r   r   r   r5   r;   r<   r=   r   rO   rj   rt   r   rY   rD   rF   rJ   rH   r   r$   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r   __classcell__r   r   r+   r   r      s             
C
"H

1
&
&
4"-            <?
=$ 
<
#
	r   )r   r  urllib.parser   r   Z
cmf.modelsr   Zcmf.includeZmodules.backbone.fieldsr   r   r   r   r   r   <module>   s   