U
    Įwhp'                     @   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 )N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r| jD ]0}|j
jdkr|qj| j
r| j
jr| j
|_
|  qjt 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resr   r   r   r!      s,    


zCmfChatGroup.savec                 O   s   | j dddgd | j }ddd t|D i}| jD ]}t ||jj< t|j D ]^}|jdkrhqX|j	j|j
jd	d
||jj |jj< |jrX|j|jkrXd||jj |jj d< qXq8|S )Nztopics.muted_peopletopics.executorsr   )fieldstotalc                 S   s&   i | ]}|j j|jj|jjd dqS )Floginr   muted)r   r%   r.   r   ).0personr   r   r   
<dictcomp>4   s    z0CmfChatGroup.executors_count.<locals>.<dictcomp>	CmfPersonFr-   Tr/   )load_fieldsr   
all_nestedsetr   dictidr%   
class_namer.   r   r   Zmuted_people)r   r&   r'   Zpersonsresultr(   r1   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joinr8   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                    sD   | j  D ]*}td|j | jj| jjd|gd q
t   d S )Nzchat-group-)group_idZ
group_name)Zevent_persons)r   r5   Zcmf_emit_eventr8   r%   r   r   emit)r   r1   r   r   r   rA   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)rC   r   INr8   r<   r+   Z	parent_idc                 S   s   g | ]
}|j qS r   r8   r0   objr   r   r   
<listcomp>a   s     z'CmfChatGroup.search.<locals>.<listcomp>textZILIKE)Z_get_stemmed_queryr"   r#   listr   r   r8   Z
CmfComment)	r>   rC   r+   r&   r'   Zstemmed_queryZperson_chats_filterr:   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 }|D ]&}|jjrf||jj qJ||j	7 }qJtj
jddtdd |D gddddgd}|S )u|   
        Контакты с которыми у текущего пользователя еще нет чатов
        cache_status_type=ZOPENORz	group.p2p==Tzgroup.contact_id!=Nr   rD   zgroup.contactrE   r8   zNOT INc                 S   s   g | ]
}|j qS r   rF   rG   r   r   r   rI   w   s     z-CmfChatGroup.contact_list.<locals>.<listcomp>Zemailcompanyonline_status
user_local)r   r   r8   r"   r#   slistr   contactr   r   r3   r6   )r>   r&   r'   rL   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
}|D ]}d}|D ]}|j|d krR qjqR|spqF||j	}|dkrt
|j	i |jjd}|||j	< |d |d }|dkrFt
|d |d |jd}||d |d < qF|S )uU   
        Вычисляем количество не прочитанных
        	person_idrP   chat_topic_id)r<   r=   r8   rD   c                 S   s   g | ]}|d  qS )rZ   r   )r0   unread_commentr   r   r   rI      s     z-CmfChatGroup.unread_count.<locals>.<listcomp>r   rE   N)r@   r   Z
group_coder   count)ZcntZtopic_idZ
topic_code)r"   ZCmfChatTopicUnreadMessager\   r   r   r8   r#   rU   getr@   r7   r   r   )r>   r)   Zunread_comments_countr   r[   r(   Zchat_resZ	topic_resr   r   r   unread_count{   s:     
zCmfChatGroup.unread_countc           	      C   sR  |sg }|dkrt jjj}||kr&dS tjj|dddgd}||jg}|jr| jdd|ggdd	d
gdddgg|dg dD ].}dd |j	D }|j|krz||krz|  S qzt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 |  |jD ]}|j	t j |  q,|S dS )um   
        Возвращает чат текущего пользователя с контактом
        NrT   rR   rS   )r8   r+   r   rD   r$   rP   TrM   rQ   r   rE   c                 S   s   g | ]
}|j qS r   rF   rG   r   r   r   rI      s     z)CmfChatGroup.p2p_chat.<locals>.<listcomp>)r   r$   
contact_idr*   )r   rV   rR   )r   r   r8   r%   r"   r3   sgetrT   rU   r   r   r!   r]   r6   Z
company_idr   r   )	r>   r_   r+   rY   rV   r   rW   Zchat_executorsr(   r   r   r   r	      s@    





zCmfChatGroup.p2p_chatc                 O   s<   |  ddddddg | jD ]}|  qd| _|   | S )uG   
        Архивируем чат и все его темы
        Zworkflowr   Zactivityztopics.workflowr   ztopics.activityT)r4   r   archiveZcmf_archivedr!   )r   r&   r'   r(   r   r   r   ra      s        

zCmfChatGroup.archivec                 O   sZ   |  dg |stjjj}| j| | jD ]}|j| |jdd q,| jdd d S )Nr*   T)Z	only_data)	r4   r   r   r8   r%   r   remover   r!   )r   rY   r&   r'   r(   r   r   r   r      s    

zCmfChatGroup.leaveF)TEXKOM_db_deletec                   sF   t jjdd| g|dD ]}|j|d|i| qt j|d|i|S )Nr   rP   )r<   Zinclude_deletedrc   )r"   r#   rK   deleter   )r   rc   r&   r'   r(   r   r   r   rd      s    zCmfChatGroup.delete)NN)N)__name__
__module____qualname__r   Zapi_methodsr   r!   r   classmethodr?   rA   r
   rX   r^   r	   ra   r   rd   __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
   