
    ]iV'                     ^    d dl mZmZ d dl d dl ddlmZ  G d dej                        Zy)    )or_and_)*   )cmf_chat_groupc                        e Zd Zej                  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                 *    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    w*,o?O-PPP    c                 v   | j                   r)| j                  j                  t        j                         | j                  j
                  rB| j                   s6| j                  rt        dd       n| j                  dk(  rt        dd       | j                  j
                  s,| j                  j
                  s| j                  j
                  rn| j                  D ]_  }|j                  j                  dk(  r| j                  r'| j                  j
                  r| j                  |_
        |j                          a t        | 4  |i |}| j                  s_t        j!                  | d      }| j"                  rd	|_	        |j                          | j                  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   s<   ;;NN!!!"2"23>>$$T[[""bjnog%`hlm>>$$		(<(<@V@V <<++x7;;4;;#9#9#';;EL

 glD+F+{{''d9N'OExx%
JJLKK$$U+
r   c           	      f   | j                  g d       | j                  j                         }dt        |      D ci c]E  }|j                  j
                  |j                  j
                  |j                  j
                  ddG c}i}| j                  D ]  }t               ||j                  j
                  <   t        |j                  j                               D ]  }|j                  dk7  r|j                  j
                  |j                  j
                  dd||j                  j
                     |j                  j
                  <   |j                  s||j                  |j                  v sd||j                  j
                     |j                  j
                     d<     |S c c}w )	N)ztopics.muted_peopletopics.executorsr   )fieldstotalF)loginr   muted	CmfPersonTr6   )load_fieldsr   
all_nestedsetr$   r,   r5   r   r&   dictid
class_namemuted_people)r   r-   r.   personspersonresultr/   s          r   r
   zCmfChatGroup.executors_count,   sb    XY..++- !'l, !!V\\-?-?IZIZej#kk,-
 [[ 	NE%)VF588>>"eoo88:; N$$3#\\//9J9JUZ=\uxx~~&v{{'8'89%%&++9K9K*KIMF588>>*6;;+<+<=gFN	N ,s   A
F.c           	         t         j                  }t        j                  }|j                  j                  |j                        }t        j                  j                  }|j                  ||j                  j                  |j                  k(        }|j                  |j                  |j                  j                  k(        j                  |j                  j                        }|j                  t        j                   j                  t        j                  j                  j"                  t        j                   j                  j                  k(        }|j                  t%        t        j                  j                  j"                  d k(  t'        t        j                   j                  j(                  dk7                    }|S )Nr   )r    r!   r)   r*   dpquery_deprecateddp_modelCmfChatTopicExecutorsjoinr<   left_idfilterright_idr,   group_by	outerjoin	CmfStatus	status_idr   r   r'   )clsr!   
chat_modelchat_qr   s        r   person_queryzCmfChatGroup.person_query@   sG   ))((
//
0C0CD0099	Y
(;(;(>(>)BSBS(STy11^5F5F5L5LLMVVWaWjWjWmWmn!!&"2"2";";"("5"5">">"H"HFL\L\LeLeLhLh"hjs6#6#6#?#?#I#IT#Q#'(8(8(A(A(M(MQY(Y#\ ^ _r   c                     | j                   j                         D ]I  }t        d|j                   | j                  j                  | j
                  j                  d|g       K t        |           y )Nzchat-group-)group_id
group_name)event_persons)r   r9   cmf_emit_eventr<   r,   r   r   emit)r   r@   r   s     r   rX   zCmfChatGroup.emitP   sa    nn//1 	'F[4 GGMM"iioo7 %X'	'
 	r    N)queryr3   c                8   | j                  |      }t        j                  j                  ddt        j
                  j                  gggdg      }dd|D cg c]  }|j                   c}gdd|gg}t        j                  j                  ||      }	|	S c c}w )	N)rZ   r   INr<   rI   r3   	parent_idtextILIKE)_get_stemmed_queryr)   r*   listr    r!   r<   
CmfComment)
rO   rZ   r3   r-   r.   stemmed_queryperson_chatsobj_filterrA   s
             r   r   zCmfChatGroup.searchX   s    ..U.;**//dQM]M]M`M`La8b7cmqlr/s,'G3'GHG]35""''wv'F (Hs   Bc           
         g ddg dg dgddt         j                  j                  ggg}t        j                  j                  |ddg      }g }|D ]M  }|j                  j                  r&|j                  |j                  j                         ?||j                  z  }O t        j                  j                  d	d
t        |D cg c]  }|j                   c}      gg d      }|S c c}w )u|   
        Контакты с которыми у текущего пользователя еще нет чатов
        )cache_status_type=OPENOR)z	group.p2p==T)zgroup.contact_id!=Nr   r\   zgroup.contactr]   r<   zNOT IN)emailcompanyonline_status
user_local)r    r!   r<   r)   r*   slistr   contactr   r   r7   r:   )	rO   r-   r.   rg   	p2p_chatsr   chatrf   contactss	            r   contact_listzCmfChatGroup.contact_lista   s    
 635UV(8(8(;(;'<= ''--WkSbEc-d		 	,Dzz!!  !3!34T^^+		, ##))$#YbFcRUsvvFcBd1e1d * f Gds   C+c           	      ~   i }t         j                  j                  ddt        j                  j
                  gdg      }t         j                  j                  dd|D cg c]  }|d   	 c}gdg      }|D ]  }d	}|D ]  }|j
                  |d   k(  s n |s#|j                  |j                        }|;t        |j                  i |j                  j                  
      }|||j                  <   |d   j                  |d         }|t        |d   |d   |j                        }||d   |d   <    |S c c}w )uU   
        Вычисляем количество не прочитанных
        	person_idrm   chat_topic_id)rI   rK   r<   r\   r   r]   N)rT   r&   
group_coder&   count)cnttopic_id
topic_code)r)   CmfChatTopicUnreadMessager}   r    r!   r<   r*   rs   getrT   r;   r   r$   )rO   r0   unread_comments_countunread_commentr&   r/   chat_res	topic_ress           r   unread_countzCmfChatGroup.unread_countv   si   
  & @ @ F F{\`bcbrbrbubuNvQ`Pa !G !c$$**$Wl m^!@ mn9 +  4 	PNE 88~o>> wwu~~.H')ekk6F6FH&.ENN# *..~o/NOI  ^G%<~VeGf,1JJ8	FO">/#BC!	P" 
' !ns   D:c                    |sg }|$t         j                  j                  j                  }||k(  ryt        j
                  j                  |g d      }||j                  g}|j                  r| j                  dd|ggg dg dg|dgz         D ]<  }|j                  D cg c]  }|j                   }}|j                  |v s5||v s:|c S  t        j                  |d	
      }|j                          |S | j                  dd|gg dgt        ddg|z               }|s4t        j                  |||j                        }|j                          |S |j                  j                  t         j                         |j                          |j                   D ];  }	|	j                  j                  t         j                         |	j                          = |S c c}w )um   
        Возвращает чат текущего пользователя с контактом
        N)rr   rp   rq   )r<   r3   r   r\   )r+   rm   T)ri   rn   r   r]   T)r   r+   
contact_idrm   r2   )r   rt   rp   )r    r!   r<   r,   r)   r7   sgetrr   rs   r   r	   r(   r   r:   
company_idr   r&   )
rO   r   r3   rz   rt   r   rv   rf   chat_executorsr/   s
             r   r   zCmfChatGroup.p2p_chat   s   
 F((++11I """'':>h'i

+			;yk*JL_*O*QY_cnboYo " q  48NN!CS#&&!C!C::/I4OK	  &&&EDIIKK 77L$
#CEj"k"%{4F&G&&P"Q  SD**Y
\c\n\n*o		 K %%a&6&67		![[ !EOO**1+;+;<JJL! K+ "Ds   !Gc                     | j                  g d       | j                  D ]  }|j                           d| _        | j	                          | S )uG   
        Архивируем чат и все его темы
        )workflowr%   activityztopics.workflowr   ztopics.activityT)r8   r&   archivecmf_archivedr(   )r   r-   r.   r/   s       r   r   zCmfChatGroup.archive   sM     	 C 	D [[ 	EMMO	 		r   c                 J   | j                  dg       |s$t        j                  j                  j                  }| j
                  j                  |       | j                  D ]/  }|j
                  j                  |       |j                  d       1 | j                  d       y )Nr2   T)	only_data)	r8   r    r!   r<   r,   r   remover&   r(   )r   rz   r-   r.   r/   s        r   r   zCmfChatGroup.leave   s    ,-.((++11Ii([[ 	'EOO""9-JJJ&	' 			D	!r   F)TEXKOM_db_deletec                    t         j                  j                  dd| g|      D ]  } |j                  |d|i|  t	        |   |d|i|S )Nr   rm   )rI   include_deletedr   )r)   r*   rb   deleter   )r   r   r-   r.   r/   r   s        r   r   zCmfChatGroup.delete   se    ((--gtT5J\l-m 	MEELL$L1ALVL	Mw~tQ6FQ&QQr   )NN)N)__name__
__module____qualname__r   r	   api_methodsr   r(   r
   classmethodrR   rX   r   rx   r   r   r   r   r   __classcell__)r   s   @r   r	   r	      s     --99 =
 
KQ2(   !#D    (  : ( (T" .3 R Rr   r	   N)
sqlalchemyr   r   cmf.include
cmf.fieldsr3   r   r	    r   r   <module>r      s'        #QR>.. QRr   