
    bh~'                     Z    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e          Z	dS )    )defaultdict)or_and_)*)CmfActiveEntityc                        e Zd Zej        g dz   Z fdZ fdZd Zed             Z	 fdZ
eddd	d
            Zed             Zed             Zedd            Zd ZddZdd fd
Z xZS )CmfChatGroup)executors_countp2p_chatsearchleavec                 N    t                                                      ddgz   S )Ntopics.statustree_parent_id)supersave_preload_fields)self	__class__s    !./common/models/cmf_chat_group.pyr   z CmfChatGroup.save_preload_fields   s$    ww**,,o?O-PPP    c                    | j         r$| j                            t          j                   | j        j        r<| j         s5| j        rt          dd           n| j        dk    rt          dd           | j        j        s| j	        j        s| j
        j        rN| j        D ]F}|j
        j        dk    r| j
        r| j
        j        r| j
        |_
        |                                 G t                      j        |i |}| j        s]t                              | d          }| j        rd	|_	        |                                 | j        j                            |           |S )
NuF   Нельзя менять участников чата проектаT)abortUsersuD   Нельзя менять участников общего чатаCLOSEDu   Чат группы)groupnameu   Чат)is_new	executorsappendgcurrent_person
is_changedr   	cmf_alertcoder   statustopicsstatus_typesaver   modelsCmfChatTopicp2pvalue)r   argskwargstopicresr   s        r   r(   zCmfChatGroup.save   st   ; 	4N!!!"2333>$ 	nT[ 	n" nbjnooooog%%`hlmmmm>$ 		(< 	@V 	  <+x77; /4;#9 /#';EL

egglD+F++{ 	,''d9N'OOEx &%
JJLLLK$$U+++
r   c                 4   |                      g d           | j                                        }dd t          |          D             i}| j        D ]}t                      ||j        j        <   t          |j                                                  D ]}|j        dk    r|j	        j        |j
        j        dd||j        j                 |j        j        <   |j        r3|j        |j        v r%d||j        j                 |j        j                 d	<   |S )
N)ztopics.muted_peopletopics.executorsr   )fieldstotalc                 X    i | ]'}|j         j        |j        j        |j        j        d d(S )Floginr   muted)r$   r,   r7   r   ).0persons     r   
<dictcomp>z0CmfChatGroup.executors_count.<locals>.<dictcomp>4   sD     , , , !V\-?IZej#k#k, , ,r   	CmfPersonFr6   Tr8   )load_fieldsr   
all_nestedsetr&   dictidr,   
class_namer7   r   r$   muted_people)r   r-   r.   personsresultr/   r:   s          r   r
   zCmfChatGroup.executors_count/   s9    X X XYYY.++--  , ,!'ll, , ,-
 [ 	N 	NE%)VVF58>"eo88::;; N N$33#\/9JUZ=\ =\ux~&v{'89% N&+9K*K*KIMF58>*6;+<=gFN r   c           	         t           j        }t          j        }|j                            |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*   dpquery_deprecateddp_modelCmfChatTopicExecutorsjoinrA   left_idfilterright_idr,   group_by	outerjoin	CmfStatus	status_idr   r   r'   )clsr!   
chat_modelchat_qr   s        r   person_queryzCmfChatGroup.person_queryC   s   )(
//
0CDD09	Y
(;(>)BS(STTy1^5F5LLMMVVWaWjWmnn!!&"2";"("5">"HFL\LeLh"hj js6#6#?#IT#Q#'(8(A(MQY(Y#\#\ ^  ^ _ _r   c                     | j                                         D ]4}t          d|j         | j        j        | j        j        d|g           5t                                                       d S )Nzchat-group-)group_id
group_name)event_persons)r   r>   cmf_emit_eventrA   r,   r   r   emit)r   r:   r   s     r   r\   zCmfChatGroup.emitT   s    n//11 	' 	'F444 GM"io7 7 %X' ' ' ' ' 	r    N)queryr3   c                   |                      |          }t          j                            ddt          j        j        gggdg          }ddd |D             gdd	|gg}t          j                            ||          }|S )
N)r^   r   INrA   rM   r3   	parent_idc                     g | ]	}|j         
S  rA   r9   objs     r   
<listcomp>z'CmfChatGroup.search.<locals>.<listcomp>a   s    'G'G'G3'G'G'Gr   textILIKE)_get_stemmed_queryr)   r*   listr    r!   rA   
CmfComment)	rS   r^   r3   r-   r.   stemmed_queryperson_chats_filterrE   s	            r   r   zCmfChatGroup.search]   s    ..U.;;*//dQM]M`La8b7cmqlr/ss'G'G,'G'G'GHG]35"''wv'FFr   c                    g ddg dg dgddt           j        j        ggg}t          j                            |ddg          }g }|D ]8}|j        j        r |                    |j        j                   .||j	        z  }9t          j
                            d	d
t          d |D                       gg d          }|S )u|   
        Контакты с которыми у текущего пользователя еще нет чатов
        )cache_status_type=OPENOR)z	group.p2p==T)zgroup.contact_id!=Nr   r`   zgroup.contactra   rA   zNOT INc                     g | ]	}|j         
S rd   re   rf   s     r   rh   z-CmfChatGroup.contact_list.<locals>.<listcomp>w   s    FcFcFcRUsvFcFcFcr   )emailcompanyonline_status
user_local)r    r!   rA   r)   r*   slistr   contactr   r   r<   r?   )rS   r-   r.   rp   	p2p_chatsr   chatcontactss           r   contact_listzCmfChatGroup.contact_listf   s    
 6553335U5U5UV(8(;'<= '--WkSbEc-dd		 	, 	,Dz! ,  !34444T^+		#))$#FcFcYbFcFcFcBdBd1e1d1d1d * f fr   c                 P   i }t           j                            ddt          j        j        gdg          }t           j                            ddd |D             gdg	          }|D ]}d
}|D ]}|j        |d         k    r n|s|                    |j	                  }|+t          |j	        i |j        j                  }|||j	        <   |d                             |d                   }|4t          |d         |d         |j                  }||d         |d         <   |S )uU   
        Вычисляем количество не прочитанных
        	person_idrv   chat_topic_id)rM   rO   rA   r`   c                     g | ]
}|d          S )r   rd   )r9   unread_comments     r   rh   z-CmfChatGroup.unread_count.<locals>.<listcomp>   s     m m m^!@ m m mr   r   ra   N)rX   r&   
group_coder&   count)cnttopic_id
topic_code)r)   CmfChatTopicUnreadMessager   r    r!   rA   r*   r}   getrX   r@   r   r$   )rS   r0   unread_comments_countr&   r   r/   chat_res	topic_ress           r   unread_countzCmfChatGroup.unread_count{   sz   
  & @ F F{\`bcbrbuNvQ`Pa !G !c !c$**$ m mWl m m mn9 +   4 	P 	PNE  8~o>>>E ? wwu~..H')ek6FH H H&.EN# *..~o/NOOI  ^G%<~VeGf,1J8 8 8	FO">/#BC
r   c                 t   |sg }|t           j        j        j        }||k    rdS t          j                            |g d          }||j        g}|j        r}|                     dd|ggg dg dg|dgz             D ]$}d	 |j	        D             }|j        |v r||v r|c S %t          
                    |d
          }|                                 |S |                     dd|gg dgt          ddg|z                       }|s7t          
                    |||j                  }|                                 nz|j	                            t           j                   |                                 |j        D ]:}|j	                            t           j                   |                                 ;|S )um   
        Возвращает чат текущего пользователя с контактом
        N)r|   rz   r{   )rA   r3   r   r`   )r+   rv   T)rr   rw   r   ra   c                     g | ]	}|j         
S rd   re   rf   s     r   rh   z)CmfChatGroup.p2p_chat.<locals>.<listcomp>   s    !C!C!CS#&!C!C!Cr   T)r   r+   
contact_idrv   r2   )r   r~   rz   )r    r!   rA   r,   r)   r<   sgetr|   r}   r   r	   r(   r   r?   
company_idr   r&   )	rS   r   r3   r   r~   r   r   chat_executorsr/   s	            r   r   zCmfChatGroup.p2p_chat   s   
  	F(+1I ""4"'':>h>h>h'ii
+	 			;yk*JL_L_L_*O*O*O*QY_cnboYo " q q    !C!CDN!C!C!C://I4O4OKKK&&&EEDIIKKKK 77L$
#CEjEjEj"k"%{4F&G&&P"Q"Q  S SD 	!**Y
\c\n*oo		 %%a&6777		![ ! !EO**1+;<<<JJLLLLKr   c                     |                      g d           | j        D ]}|                                 d| _        |                                  | S )uG   
        Архивируем чат и все его темы
        )workflowr%   activityztopics.workflowr   ztopics.activityT)r=   r&   archivecmf_archivedr(   )r   r-   r.   r/   s       r   r   zCmfChatGroup.archive   sm     	 C C C 	D 	D 	D [ 	 	EMMOOOO 		r   c                 6   |                      dg           |st          j        j        j        }| j                            |           | j        D ]2}|j                            |           |                    d           3|                     d           d S )Nr2   T)	only_data)	r=   r    r!   rA   r,   r   remover&   r(   )r   r   r-   r.   r/   s        r   r   zCmfChatGroup.leave   s    ,-... 	2(+1Ii((([ 	' 	'EO""9---JJJ&&&&		D	!!!!!r   F)TEXKOM_db_deletec                    t           j                            dd| g|          D ]} |j        |d|i|  t	                      j        |d|i|S )Nr   rv   )rM   include_deletedr   )r)   r*   rl   deleter   )r   r   r-   r.   r/   r   s        r   r   zCmfChatGroup.delete   ss    (--gtT5J\l-mm 	M 	MEEL$L1ALVLLLLuww~tQ6FQ&QQQr   )NN)N)__name__
__module____qualname__r   api_methodsr   r(   r
   classmethodrV   r\   r   r   r   r   r   r   r   __classcell__)r   s   @r   r	   r	      s       !- 1
 1
 1
 
KQ Q Q Q Q    2  (   [      !#D     [   [(   [: ( ( ( [(T  " " " " .3 R R R R R R R R R R Rr   r	   N)
collectionsr   
sqlalchemyr   r   cmf.include
cmf.fieldscommon.models.cmf_active_entityr   r	   rd   r   r   <module>r      s    # # # # # #                         ; ; ; ; ; ;SR SR SR SR SR? SR SR SR SR SRr   