B
    Yfp'                 @   sL   d dl mZ d dlmZmZ d dlT d dlT d dlmZ G dd deZ	dS )    )defaultdict)or_and_)*)CmfActiveEntityc                   s   e Zd Zejddddg Z fddZ fddZd	d
 Zedd Z	 fddZ
edddddZedd Zedd Zed"ddZdd Zd#ddZdd fd d!
Z  ZS )$CmfChatGroupexecutors_countp2p_chatsearchleavec                s   t   ddg S )Nztopics.statustree_parent_id)supersave_preload_fields)self)	__class__ !./common/models/cmf_chat_group.pyr      s    z CmfChatGroup.save_preload_fieldsc                s   | j r| jtj | jjrL| j sL| jr6tddd n| jdkrLtddd | jjsd| j	jsd| j
jrx:| jD ]0}|j
jdkr~ql| j
r| j
jr| j
|_
|  qlW t j||}| jstj| dd}| jrd	|_	|  | jj| |S )
NuF   Нельзя менять участников чата проектаT)abortZUsersuD   Нельзя менять участников общего чатаCLOSEDu   Чат группы)groupnameu   Чат)Zis_new	executorsappendgcurrent_personZ
is_changedr   Z	cmf_alertcoder   statustopicsstatus_typesaver   modelsCmfChatTopicp2pvalue)r   argskwargstopicres)r   r   r   r      s,    
zCmfChatGroup.savec             O   s   | j dddgd | j }ddd t|D i}x| jD ]}t ||jj< xpt|j D ]^}|jdkrlq\|j	j|j
jd	d
||jj |jj< |jr\|j|jkr\d||jj |jj d< q\W q:W |S )Nztopics.muted_peopleztopics.executorsr   )fieldsZtotalc             S   s&   i | ]}|j j|jjd d|jjqS )F)loginr   muted)r)   r#   r   r   ).0personr   r   r   
<dictcomp>4   s   z0CmfChatGroup.executors_count.<locals>.<dictcomp>	CmfPersonF)r)   r   r*   Tr*   )load_fieldsr   
all_nestedsetr   dictidr#   
class_namer)   r   r   Zmuted_people)r   r$   r%   Zpersonsresultr&   r,   r   r   r   r   /   s    

$ zCmfChatGroup.executors_countc             C   s   t j}tj}| }tjj}|||jj|j	k}|
|j|jjk|jj}|tjjtjjjtjjjk}|
ttjjjd kttjjjdk}|S )Nr   )r   r   r    r!   Zquery_deprecatedZCmfChatTopicExecutorsZdp_modeljoinr3   Zleft_idfilterZright_idr#   group_byZ	outerjoinZ	CmfStatusZ	status_idr   r   r   )clsr   Z
chat_modelZchat_qr   r   r   r   person_queryC   s    
zCmfChatGroup.person_queryc                sH   x8| j  D ]*}td|j | jj| jjd|gd qW t   d S )Nzchat-group-)group_idZ
group_name)Zevent_persons)r   r0   Zcmf_emit_eventr3   r#   r   r   emit)r   r,   )r   r   r   r<   T   s    
zCmfChatGroup.emit N)queryr(   c      	      O   s^   | j |d}tjjddtjjgggdgd}dddd |D gd	d
|gg}tjj||d}|S )N)r>   r   INr3   )r7   r(   Z	parent_idc             S   s   g | ]
}|j qS r   )r3   )r+   objr   r   r   
<listcomp>a   s    z'CmfChatGroup.search.<locals>.<listcomp>textZILIKE)Z_get_stemmed_queryr    r!   listr   r   r3   Z
CmfComment)	r9   r>   r(   r$   r%   Zstemmed_queryZperson_chats_filterr5   r   r   r   r
   ]   s     zCmfChatGroup.searchc             O   s   dddgddddgdd	d
ggddt jjggg}tjj|ddgd}g }x.|D ]&}|jjrh||jj qL||j	7 }qLW tj
jddtdd |D gddddgd}|S )u|   
        Контакты с которыми у текущего пользователя еще нет чатов
        cache_status_type=ZOPENORz	group.p2pz==Tzgroup.contact_idz!=Nr   r?   zgroup.contact)r7   r(   r3   zNOT INc             S   s   g | ]
}|j qS r   )r3   )r+   r@   r   r   r   rA   w   s    z-CmfChatGroup.contact_list.<locals>.<listcomp>Zemailcompanyonline_status
user_local)r   r   r3   r    r!   slistr   contactr   r   r.   r1   )r9   r$   r%   rD   Z	p2p_chatsr   chatZcontactsr   r   r   contact_listf   s    
zCmfChatGroup.contact_listc             C   s   i }t jjddtjjgdgd}t jjdddd |D gd	gd
}x|D ]}d}x|D ]}|j|d krVP qVW |stqH||j	}|dkrt
|j	i |jjd}|||j	< |d |d }|dkrHt
|d |d |jd}||d |d < qHW |S )uU   
        Вычисляем количество не прочитанных
        	person_idz==chat_topic_id)r7   r8   r3   r?   c             S   s   g | ]}|d  qS )rP   r   )r+   unread_commentr   r   r   rA      s    z-CmfChatGroup.unread_count.<locals>.<listcomp>r   )r7   r(   N)r;   r   Z
group_coder   count)ZcntZtopic_idZ
topic_code)r    ZCmfChatTopicUnreadMessagerR   r   r   r3   r!   rK   getr;   r2   r   r   )r9   r'   Zunread_comments_countr   rQ   r&   Zchat_resZ	topic_resr   r   r   unread_count{   s0    





zCmfChatGroup.unread_countc       	      C   sV  |sg }|dkrt jjj}||kr&dS tjj|dddgd}||jg}|jrx\| jdd|ggdd	d
gdddgg|dg dD ]*}dd |j	D }|j|kr|||kr||S q|W tj
|d
d}|  |S | jdd	|gdddggtddg| d}|stj
|||jd}|  n>|j	t j |  x&|jD ]}|j	t j |  q.W |S dS )um   
        Возвращает чат текущего пользователя с контактом
        NrJ   rH   rI   )r3   r(   r   r?   r"   z==TrE   z!=r   )r7   r(   c             S   s   g | ]
}|j qS r   )r3   )r+   r@   r   r   r   rA      s    z)CmfChatGroup.p2p_chat.<locals>.<listcomp>)r   r"   
contact_idztopics.executors)r   rL   rH   )r   r   r3   r#   r    r.   sgetrJ   rK   r   r   r   rS   r1   Z
company_idr   r   )	r9   rU   r(   rO   rL   r   rM   Zchat_executorsr&   r   r   r   r	      s8    


zCmfChatGroup.p2p_chatc             O   s@   |  ddddddg x| jD ]}|  qW d| _|   | S )uG   
        Архивируем чат и все его темы
        Zworkflowr   Zactivityztopics.workflowztopics.statusztopics.activityT)r/   r   archiveZcmf_archivedr   )r   r$   r%   r&   r   r   r   rW      s    zCmfChatGroup.archivec             O   s^   |  dg |stjjj}| j| x&| jD ]}|j| |jdd q.W | jdd d S )Nztopics.executorsT)Z	only_data)	r/   r   r   r3   r#   r   remover   r   )r   rO   r$   r%   r&   r   r   r   r      s    
zCmfChatGroup.leaveF)TEXKOM_db_deletec               sJ   x2t jjdd| g|dD ]}|j|d|i| qW t j|d|i|S )Nr   z==)r7   Zinclude_deletedrY   )r    r!   rC   deleter   )r   rY   r$   r%   r&   )r   r   r   rZ      s    zCmfChatGroup.delete)NN)N)__name__
__module____qualname__r   Zapi_methodsr   r   r   classmethodr:   r<   r
   rN   rT   r	   rW   r   rZ   __classcell__r   r   )r   r   r      s&   	*

r   N)
collectionsr   Z
sqlalchemyr   r   Zcmf.includeZ
cmf.fieldsZcommon.models.cmf_active_entityr   r   r   r   r   r   <module>   s
   