U
    -c%                     @   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 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  ZS )CmfChatGroupc                    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>.   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$   r-   r   r   r   executors_count)   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joinr4   Zleft_idfilterZright_idr!   group_byZ	outerjoinZ	CmfStatusZ	status_idr   r   r   )clsr   Z
chat_modelZchat_qr   r   r   r   person_query=   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   r1   Zcmf_emit_eventr4   r!   r   r
   emit)r   r-   r   r   r   r>   N   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   INr4   r9   r'   Z	parent_idc                 S   s   g | ]
}|j qS r   r4   r,   objr   r   r   
<listcomp>[   s     z'CmfChatGroup.search.<locals>.<listcomp>textZILIKE)Z_get_stemmed_queryr   r   listr   r   r4   Z
CmfComment)	r;   r@   r'   r"   r#   Zstemmed_queryZperson_chats_filterr6   r   r   r   searchW   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   rA   zgroup.contactrB   r4   zNOT INc                 S   s   g | ]
}|j qS r   rC   rD   r   r   r   rF   q   s     z-CmfChatGroup.contact_list.<locals>.<listcomp>Zemailcompanyonline_status
user_local)r   r   r4   r   r   slistr   contactr   r   r/   r2   )r;   r"   r#   rI   Z	p2p_chatsr   chatZcontactsr   r   r   contact_list`   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_idrN   chat_topic_id)r9   r:   r4   rA   c                 S   s   g | ]}|d  qS )rX   r   )r,   unread_commentr   r   r   rF   ~   s     z-CmfChatGroup.unread_count.<locals>.<listcomp>r   rB   N)r=   r   Z
group_coder   count)ZcntZtopic_idZ
topic_code)r   ZCmfChatTopicUnreadMessagerZ   r   r   r4   r   rS   getr=   r3   r   r   )r;   r%   Zunread_comments_countr   rY   r$   Zchat_resZ	topic_resr   r   r   unread_countu   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   
        Возвращает чат текущего пользователя с контактом
        NrR   rP   rQ   )r4   r'   r   rA   r    rN   TrK   rO   r   rB   c                 S   s   g | ]
}|j qS r   rC   rD   r   r   r   rF      s     z)CmfChatGroup.p2p_chat.<locals>.<listcomp>)r   r    
contact_idr&   )r   rT   rP   )r   r   r4   r!   r   r/   sgetrR   rS   r   r   r   r[   r2   Z
company_idr   r   )	r;   r]   r'   rW   rT   r   rU   Zchat_executorsr$   r   r   r   p2p_chat   s@    





zCmfChatGroup.p2p_chatc                 O   sD   |  ddddddg | jD ]}|  q| jd| _|   | S )uG   
        Архивируем чат и все его темы
        workflowr   Zactivityztopics.workflowr   ztopics.activityr   )r0   r   archiver`   Zget_default_statusr   r   )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)	r0   r   r   r4   r!   r   remover   r   )r   rW   r"   r#   r$   r   r   r   leave   s    

zCmfChatGroup.leave)NN)N)__name__
__module____qualname__r   r   r7   classmethodr<   r>   rJ   rV   r\   r_   ra   rc   __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
   