U
     h                     @   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dXddZedYddZ fddZdd Zdd Z	 fddZ
 fddZedZddZed[d d!Zed"d# Zed\d$d%Zed]d&d'Zed^d(d)Zed_d*d+Zed`d,d-Zedad.d/Zedbed0d1d2d3Zedcd4d5Zeddd6d7Zeded8d9Zedfd:d;Zedgd<d=Zedhd>d?Zedid@dAZdjdBdCZdkdDdEZ dFdG Z!dldHdIZ"dJdK Z#G dLdM dMe$Z%dNdO Z&dmdPdQZ'dndRdSZ(dodTdUZ)dpdVdWZ*  Z+S )q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sd S | j jsd S | j| j jd | j| j jd d S )Ntask_filter)src_task_filter_bql
is_changedoldfull_sync_deletedvaluer   r4   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   src_task_filter_ubql)r(   save_preload_fieldsr4   r+   r   r   r?   R   s       z#CmfBackbonePeer.save_preload_fieldsc                    s   |    |   t jf |S r'   )r5   r=   r(   saver)   r+   r   r   r@   V   s    zCmfBackbonePeer.saveFc                 C   s   t jrtd d S tjrd S t|tjr:| j	|||dS t|tj
rV| j|||dS t|tjrr| j|||dS t|tjr| j|||dS tt||d S )Nz_CmfBackbonePeer.obj_after_save_hook(): Skip write changelog due config.MODULE_BACKBONE_DISABLEDr6   )r   MODULE_BACKBONE_DISABLEDloggingwarninggbackbone_sync
isinstancer#   CmfTask_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_newr7   r   r   r   obj_after_save_hook]   s     z#CmfBackbonePeer.obj_after_save_hookc           	   
   C   s  t jrtd d S tjrd S t|tjrB| j	|j
|j|d}nt|tjrzt|jtjk	rdd 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}njt|tjrL| j	|jj
|jj|d}|s d S | j	|jj
|jj|d}t|t|}ntt|||sdd S d|jjd}|D ]H}td|j d t   tj||j|j|d   W 5 Q R X qvd S )NzdCmfBackbonePeer.obj_after_delete_hook(): Skip write changelog due to config.MODULE_BACKBONE_DISABLED
project_idtask_idr7   r   )actionr2   z7CmfBackbonePeer.obj_after_delete_hook(): add record id=z, action=deletebackbone_peer	obj_modelobj_idobj_changes)!r   rA   rB   rC   rD   rE   rF   r#   rG   _get_sync_peersrU   idrI   cmfutilZget_model_by_id	parent_idrK   parentr<   rM   in_linkout_linksetintersectionrO   r   r2   jsoninfodisable_aclCmfBackboneLog
class_namer@   )	rP   rQ   r7   peersrV   in_link_peersout_link_peersr\   r"   r   r   r   obj_after_delete_hookq   sl    

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)rj   r3   r2   login
user_localstatus_typer^   
logic_typelogic_prefix)rj   r3   rf   r2   rF   r#   	CmfPersonro   rp   	CmfStatusrq   rG   r^   ZCmfListload_fieldsrr   rs   rI   rK   )rP   rQ   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)rI   
cmf_author)rI   cmf_created_at)rK   rz   )rG   rz   )rG   Zparent_taskT)r9   Z
is_defined>   likescache_fieldsviewsstatus_in_progress_endstatus_closed_atprojectcmf_viewed_atcmf_versionstatus_modified_atra   cmf_modified_bycmf_modified_atr2   Z_idZcache_object_listr   c                    s   g | ]}  |qS r   rx   .0Zobj_rP   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     r<   object)itemsZvisiblerj   endswith
startswithrF   cmffieldsZCmfBackrefBaseZ
CmfM2MBaseZchanges_appendedZchanges_removedZCmfRelationBaserx   r<   rf   )rP   rQ   changes_onlyZfields_dataZadd_model_fields
field_namefieldZfield_changesr   r   r   _get_fields_data   s@    	



z CmfBackbonePeer._get_fields_datac                 C   sn   | j dgdddgdd|ggd}g }|D ]@}|d k	r8|n|jj}|r^tjj||t|ds^q(|| q(|S )Nr8   is_src_peer=Tpeer_project_idr   filter)r^   r`   r   )	r   r8   r<   r#   rG   r
   astZliteral_evalappend)rP   rU   rV   r7   rk   Zresult_peersr"   r   r   r   r]   #  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rt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 qbd S )NrT   createupdater   rW   r   r   r2   epicrs   ztask.sub4CmfBackbonePeer.obj_after_save_hook(): add record %sid=	, action=rW   	, fields=rX   	log_levelis_dummyry   texttree_parentrz   )ra   r   order_byTrR   r7   r   st_sizera   r   )r]   r`   r^   is_newr   r2   rf   rv   rs   r   rB   rg   r   r_   rh   r#   ri   rj   r@   r   r9   rI   ra   r   rS   rK   )rP   ZtaskrR   r7   rk   r   r\   r"   Zcommentscommentattachments
attachmentr   r   r   rH   5  sJ    


"
   z%CmfBackbonePeer._task_after_save_hookc           
      C   sd  |j dks |js t|jds$d S |ddg |jjr>d S | j|j|j|d}|sZd S |pj|j	pj|jj
}|rtd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   rT   r   r   r   r   r   r2   r`   r   r   r   rW   r   rX   r   r   r   Tr   )r   r   strr`   r   rv   ra   r]   rU   r   r:   r   r2   rf   rB   rg   r^   r   r_   rh   r#   ri   rj   r@   r9   rK   r   rS   )
rP   r   rR   r7   rk   r   r\   r"   r   r   r   r   r   rJ   g  sH     

"
   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}|sjd 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 )NrT   r   )rW   r   r2   r   r   r   r   rW   r   rX   )rb   rU   r`   rc   r   r]   r^   rd   re   r   r2   rf   rB   rg   r   r_   rh   r#   ri   rj   r@   )	rP   Zrelation_optionsrR   r7   rl   rm   rk   r\   r"   r   r   r   rN     sP    

"
  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   rT   r   )rW   r   content_pathr   r2   r`   i -1z:CmfBackbonePeer.obj_after_save_hook(): skip attachment: %sr   z, name=z, size=r   r   rW   r   rX   )rF   ra   r<   r#   rI   rG   rU   r`   r   rO   r   loadZcontent_updatedr]   r   r   rf   r2   r   rB   rg   r^   r3   r   r_   rh   ri   rj   r@   )rP   r   rR   r7   rV   rk   r\   r"   r   r   r   rL     s\    


"
   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_staticrF   classmethodstaticmethodr_   get_obj_by_idgetattrr9   r@   _eva_api_callrj   r   r   r   r   )
rP   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   ra   r^   r   r   )r   r   r   zFCmfBackbonePeer.peer_get_attachment_content(%s, %s): download error %s)requestsr   r#   rK   r   Zget_contentread_eva_http_getr   r   r   RequestExceptionrB   errorr   )rP   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   ra   r   r   r   )filesr   r   r   zDCmfBackbonePeer.peer_put_attachment_content(%s, %s): upload error %s)r   r   r#   rK   r   Zupload_file_eva_http_postr   r   r   r   rB   r   r   )rP   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_sessionE  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   )rP   pathr   r   r   responser   r   r   r   U  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   )	rP   r   r   r   r   r   r   Zpost_kwargsr   r   r   r   r   ^  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   )rf   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   rf   r   )rP   r   r   r!   r   r   r   r   r   r   r   Zjson_resultr   r   r   r   r   o  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   r>   )backbone_instance_idr   r   r^   u   Проект не найден T)r   )r   r1   )r^   Zproject_codeZproject_name)r   r#   r%   Z	cmf_alertr0   r   r/   r   r>   r9   r@   r^   rf   r1   r2   r3   )rP   r   r0   r   r/   r   r   r>   _kwargsr"   r1   r   r   r   r     s6         zCmfBackbonePeer.setup_peerc           	         sl  dd g }d k	rn
j  jj   fdd}dg d| rD ] }tjj|dd || qXt  qNd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  qqt  qtjjdd|gdd|ggdddgdD ]}tjj|dd qNd S )N  c                      s.   t jjj  gdgd7 S )Nrz   )rU   r   r   r    r   )r#   rG   r   r   r   r   r   r*   
slice_sizestartr7   r   r   get_data  s    
z+CmfBackbonePeer.full_sync.<locals>.get_datar   r   Tr   ***)rU   rV   r   Fr   r   r2   z*CmfBackbonePeer.full_sync(): add record %sr   z, action=update, fields=r   rX   rb   INrc   Zrelation_type)r   r   )r8   r   r<   r   r#   r   rS   r   
cmf_commitr]   r`   r^   r   r2   rf   rB   rg   r   ri   rj   r@   rM   )	r*   r7   Ztasksr   trk   r\   r"   Zrelationr   r   r   r     sR    
   
zCmfBackbonePeer.full_syncc                    sN  dg g  |d k	r|n
j  j}ddg d fdd	}d|tj|dr|D ]}tjj||d	 q^t  qLdd
g |tj	rD ]}tjj||d	 qt  qd|tj
rD ]}tjj||d	 qt  qdd tjjdgjdD }dddg |tjdd|gddrJD ]}tjj||d	 q(t  qd S )Nr   r   r   Tc                    sD   t |  gdgddd}|r,j|d< | jf |7 S )Nrz   T)r   r   r    r   Zcmf_deletedZinclude_deletedrU   )r&   r   r   )r   r   by_project_idr!   r   r   r*   r   r   r   r   r     s    

z3CmfBackbonePeer.full_sync_deleted.<locals>.get_datar   )r   r6   ra   c                 S   s   g | ]}|j jqS r   )
src_obj_idr<   )r   Zrlor   r   r   r   )  s     z5CmfBackbonePeer.full_sync_deleted.<locals>.<listcomp>r   )r   r   rb   rc   r^   r   F)r   r   )NT)r8   r   r<   rv   r#   rG   r   rn   r   rI   rK   ZCmfBackboneObjMappingr   r   rM   )r*   r7   r   r   caZrelations_idsrr   r   r   r;     s@    


z!CmfBackbonePeer.full_sync_deletedc                 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   )rW   r2   r   r`   r^   rZ   r[   Zdatetimer\   z&CmfBackbonePeer.get_obj(%s): result %s)rB   rg   r2   rv   r_   r   r   rf   r   rF   r#   rI   rK   r`   r&   rj   r^   r   debug)r*   r[   r   rQ   rw   r   r   r   r   r   4  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&   r^   rZ   r[   rz   Z	isoformatr\   )r   itemr   r   r   r     s   z,CmfBackbonePeer.log_list.<locals>.<listcomp>rY   r   r[   zNOT INstatusZqueuedrz   rZ   r\   )r   r    r   )r#   ri   r	   )r*   r    Zskip_idsr   r   r   r   r   s  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")=r^   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)rB   r   r2   r   r#   ri   r   r   r   r   r@   rC   )r*   Zlog_mark_listr   Zlog_markZlog_idlogr   r   r   r   r     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   _ApplySkipError  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")=r^   z, change.get("obj_model")=rZ   z, change.get("obj_id")=r[   z., change.get("obj_changes", {}).get("action")=r\   rW   z7,list(change.get("obj_changes", {}).get("fields", []))=r   NTr   r   )r^   r   r   )r   r   rW   zInvalid actionr   r   )rI   rK   r`   )r   zparent z absent)ra   zobj not found )r^   rZ   r[   obj_coder   r   r   z7CmfBackbonePeer.log_apply(): skip record %s, obj %s: %sz2CmfBackbonePeer.log_apply(): apply record %s errorr   )r^   rZ   r[   r   r   )"rv   rD   rE   rB   rg   r2   r   r   r   r_   get_model_by_namer1   Zsave_preparer   _apply_obj_changesr@   r   r\   r   r  r^   rf   r&   rF   r#   rK   r   r   rC   r   	exception	traceback
format_excr   )r*   Zchanges_listr   Zg_backbone_sync_bkr   ZchangeZ	change_idrZ   r[   rQ   r   Zsync_statusr`   ra   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 )Nrj   %sz%._map_object_value(): cannot map obj(z	): model z - not foundz): invalid model r3   r2   rt   ro   )ro   )r3   ZCmfRelationType)r2   CmfLogicTyperI   r^   r   r   r   )r3   r   z): not mapped)r_   r	  rB   rC   
issubclassr   r#   ZCmfModelr   r  ZCmfActivityZCmfPersonGroupZCmfTagr   r   r1   )
r*   rw   	obj_fieldZobj_class_namerZ   Zobj_namer  rQ   ro   Z
obj_filterr   r   r   _map_object_valuen  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 )
 activityr<   rr   r   r3   r2   rq   )r3   r2   rq   N)
r  r  Z_calc_scheme_wfrr   Z_calc_workflowr#   ru   r   r   Z_calc_status)r*   rQ   fields_changesrW   r  rr   Zstatus_datar   r   r   r   _apply_wf_logic  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   ry   r<   u   <p>Автор: r3   z &lt;ro   z&gt;</p><br>)ry   r   r   )r*   rQ   r  rW   Zcmf_author_datar   r   r   _add_comment_meta  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>   rr   r   	scheme_wfworkflowr  Tr  z._apply_obj_changes(): field z not found in z. Field changes lost.r   r<   r   )r  zskip apply z', object not mapped for required field z, r   r   r   r  )r   rF   r#   rG   r   r   rB   rC   rj   r   setattrr  Znullabler  r   remover  rI   r  )r*   rQ   r  rW   Zhas_wf_changesr   Z
field_datar   r  Zfield_data_typeZ	value_objr<   rw   Z
mapped_objr   r   r   r
    sZ    



z"CmfBackbonePeer._apply_obj_changes)N)NNNN)FN)N)F)N)N)N)N)N)NNNN)N)N)NF)NNF)NNNNF)NNNNNF)NNNNNNN)N)N)NN)N)N)N)N),r  r  r  Zapi_methodsr   r   r   r   r5   r=   r?   r@   r   rS   rn   rx   r   r]   rH   rJ   rN   rL   r   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             E
"H1*,8"-            
=
>?
=$ 
<
#
	r   )r   r  urllib.parser   r   Z
cmf.modelsr   Zcmf.includeZmodules.backbone.fieldsr   r   r   r   r   r   <module>   s   