U
    `cl}                     @   s   d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZ d dlmZ d dl	Z	d dl
mZ d dlZd dlmZ d dlmZ d dlT d dlZd dlmZ d d	lmZ G d
d dejZejdd  dS )    N)md5)	randrange)Random)post)commit_all_ds)*)BeautifulSoup)
cmf_personc                       s  e Zd Zedddd fdd
Zdd Zedd	 Zed`ddZedaddZe	dd Z
dd Zdd Zdd Zedd Zedd Zeejd
d
ddd Zddddddddd Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zeddd+ fd,d-
Zd.d/ Z fd0d1Zd2d3 Zd4d5 Zd6d7 Z fd8d9Z  fd:d;Z!edbd<d=Z"d>d? Z#eejd
d@edAdBdCZ$dDdE Z%dFdG Z&e	dHdI Z'e	dJdK Z(edc fdLdM	Z)edddNdOZ*dPdQ Z+ededRdSZ,dTdU Z-dVdW Z.dfdXdYZ/dZd[ Z0eejd
d\d]d^d_ Z1  Z2S )g	CmfPerson Nqueryfieldsfilterc             	      s>   | dpdddddddd	d
g	|d< t j||||d|S )NZfields_filternametextcodephoneemailphone_internalphone_mobilephone_2Zphone_assistantr   )getsupersearch)clsr   r   r   argskwargs	__class__ %./modules/person/models/cmf_person.pyr      s    $   zCmfPerson.searchc                 O   s   t dt| jS )Nr   )strjoinreversedr   selfr   r   r    r    r!   reverse_name    s    zCmfPerson.reverse_namec                 C   s   | j ddS )N.CmfPerson:00000000-0000-0000-0000-000000000001id)r   r   r    r    r!   system_person#   s    zCmfPerson.system_personTc                 O   s   t jjtjjdddddgdS )Nr   online_statuson_vacationrg_member_ofZis_admin)r*   r   )modelsr
   r   gcurrent_personr*   )r   Zcreate_args_kwargsr    r    r!   get_current_user'   s     zCmfPerson.get_current_userc                 C   sD   g }t jjdddtjjggddtjjgg|dD ]}|| q0|S )NOR	executorsINcmf_owner_id==r   r   )r0   
CmfProjectlistr1   r2   r*   append)r   r   resultZprojectr    r    r!   get_current_projects-   s    
zCmfPerson.get_current_projectsc                 O   s6   | j pd}| jpd}| jpd}| d| d|  S )Nr    )	last_name
first_namesecond_namestrip)r&   r   r   rB   rC   rD   r    r    r!   	full_name5   s    


zCmfPerson.full_namec              	   O   s|   |  dg | jsvtjd | d| j dddd}|jdd || _t  |   W 5 Q R X tj|dd	d
jdd | jS )Nhome_folderzhome-i'  u   Мои документыhome)tree_parent	cmf_ownerr   ordernor   Zsys_typeF)notifyu   Документ1)rI   rK   r   )	load_fieldsrG   r0   Z	CmfFolderr*   savecmfutildisable_aclZCmfDocument)r&   r   r   Zfolderr    r    r!   get_home_folder<   s     
 
zCmfPerson.get_home_folderc                 C   s   | j p| jp| jS N)rF   r   loginr&   r    r    r!   gen_nameL   s    zCmfPerson.gen_namec                 C   s   | j pd}|| jr*|d t| j  }|| jrJ|d t| j  }| j jr|r|d}| jpl|d | _t|dkr| jp|d | _t|dkr| j	p|d | _	| j js| jjs| j	js| jjs| j
js| jjr|  }|r|| j kr|  | _ d S )Nr   rA   r         )r   endswithVACATION_SUFFIXlenDOES_NOT_WORK_SUFFIX
is_changedsplitrB   rC   rD   rS   r   rU   )r&   Z
clean_nameZ
name_partsnew_namer    r    r!   
_calc_nameO   s4    

zCmfPerson._calc_namec              	   C   s  ddddgdddgdd	ddgd	ddggg}|r>| d
d|g g }tjj|ddddddgddD ]}g }t|jj|jj|jj||j	j|j
jd}|j	s|jsdd |jD |d< n(|jr`|jj|d< d|_|jdd nq`| | q`|sdS t |ddd}td| dS )u   
        Отправляем учетки в аккаунт
        https://bcrm.carbonsoft.ru/project/Document/DOC-003025#spec-0-ldap
        ZAND
user_localr:   TrS   !=Nr6   Z
is_supportZcmf_modified_at>zrg_member_of.ext_idcmf_deletedauth_optionsdeleted_loginr   does_not_work)r   r   Zinclude_deleted)rS   r   r   r/   rc   rd   c                 S   s   g | ]}|j jqS r    )r   value.0objr    r    r!   
<listcomp>   s     z/CmfPerson.account_sync_push.<locals>.<listcomp>r/   Z	only_data)Zeva_app_tokenusersZrpc_account_sync_push)r   methodz/auth/sync_accounts)r>   r0   r
   r=   dictrS   rg   r   r   rc   rd   rf   r/   re   rN   Zgen_eva_app_tokenZcall_eva_account)r   account_sync_last_filterrm   personr/   datar    r    r!   account_sync_push   sB    

zCmfPerson.account_sync_pushc                 C   s   t td t| j d S )Ni  )timesleepr   cmf_deferred_taskaccount_sync_usersr+   r    r    r!   cron_account_sync_users   s    z!CmfPerson.cron_account_sync_users)	only_onceZsystem_taskc               
   O   s   t d t jjdkr<t jjjdkr.td nt d dS dt j_t jjj}t jj  t j	  t
  z"tj| dt j_t j	  W nV tk
r } z8t| t| t| |t j_dt j_t j	  W 5 d}~X Y nX dS )	uz   
        Синхронизируем уровень доступа с accounts сервером
        :return:
        u6   Запуск синхронизации с eva_accountZin_progressi  u   Синхронизация пользователей зависла, запускаем форсированно повторноu2   Синхронизация уже запущенаNclosederror)r1   debugZ
global_varZaccount_sync_statusrp   Zage	cmf_alertrg   Zset_nowrN   Zcommit_with_eventr0   r
   rt   	Exceptionlogging	exceptionr   )r   r   rp   er    r    r!   rx      s,    





zCmfPerson.account_sync_users)slicer   order_bydo_count	do_unreadsearch_filterc             	   O   sN  t jjdddgddgd}	t }
|	D ]R}|jrRt|jjt jrR|jjrR|
| q$| j	jdd |
 D kr$|
| q$|rt jjd	d
dd| j	jggddddgddtjj	ggddttdd |
ggdS ddddgddtjj	ggddttdd |
gg}|r"dddgd	d
dd| j	jgg|g}|r2|| t jj||ddg|d}|S )NZ	list_typer:   Zpfeedparentzparent.is_defaultr;   c                 S   s   g | ]}|j jqS r    )r*   rg   )ri   rr   r    r    r!   rk     s     z-CmfPerson.pfeed_post_list.<locals>.<listcomp>Zperson_viewsz
NOT EXISTS	person_id=r6   cache_status_typera   openr9   listsr8   c                 S   s   | j S rR   r)   xr    r    r!   <lambda>	      z+CmfPerson.pfeed_post_list.<locals>.<lambda>r   c                 S   s   | j S rR   r)   r   r    r    r!   r     r   z-status_in_progress_start-cmf_created_at)r   r   r   r   )r0   ZCmfListr=   r   
isinstancerg   r<   Z
is_defaultr>   r*   Zall_relation_personsCmfTaskcountr1   r2   map)r&   r   r   r   r   r   r   r   r   r   Zmy_listsZlstZfltZ	post_listr    r    r!   pfeed_post_list   sB    


 
zCmfPerson.pfeed_post_listc                 O   s(   t jj| j|ds$t j| |d  d S )N)r   obj_id)rr   rj   )r0   ZCmfPersonViewr   r*   rN   )r&   r   r   r   r    r    r!   mark_viewed  s    zCmfPerson.mark_viewedc                 C   s   g }| j jrtj }|jdd | j D krtjjdd| jggdgd}|rZdd |D }|sdd|jggd	d
d| jggg}tjj|d	gdD ]h}t }|g|_	d|_
|  |j	|  |jdd |jD ]}|j	|  |jdd q|| q|S )Nc                 S   s   g | ]
}|j qS r    r)   rh   r    r    r!   rk      s     z.CmfPerson.create_p2p_chats.<locals>.<listcomp>r7   r8   p2pr;   c                 S   s   g | ]}|j r|qS r    )r   rh   r    r    r!   rk   #  s      r/   r*   zNOT INr(   Trl   )r/   r\   r0   CmfPersonGroup
user_groupr*   ZCmfChatGroupr=   r
   r7   r   rN   r>   Ztopics)r&   resZusr_grpZ	cur_chatsrq   rr   groupZtopicr    r    r!   create_p2p_chats  s2    

zCmfPerson.create_p2p_chatsc                 C   s2   | j s
d S tjj| jkr$tddd tj  d S )Nu1   Нельзя удалить самого себяTabort)rc   r1   r2   r*   r~   r0   ZCmfAccessListZcheck_admin_moderT   r    r    r!   
_check_del6  s
    zCmfPerson._check_delc                 C   sV   | j }t| j| j}|s2|r2|  j| j7  _n |rR|sR| jd t| j  | _d S rR   )_on_vacationr"   r   rX   rY   rZ   )r&   Zis_vacation
has_prefixr    r    r!   set_vacation_suffix>  s    zCmfPerson.set_vacation_suffixc                 C   s`   |  dg t| j| j}|s:| jr:|  j| j7  _n"|r\| js\| jd t| j  | _d S )Nrf   )rM   r"   r   rX   r[   rf   rZ   )r&   r   r    r    r!   set_doesnt_work_suffixH  s    

z CmfPerson.set_doesnt_work_suffix)include_systemis_userc                   s.   |s| dd |dkr d|d< t j||S )NsystemFTr`   )
setdefaultr   r=   )r   r   r   r   r   r   r    r!   r=   R  s
    zCmfPerson.listc                 C   s$   | j r| jrd S tj| d  d S )N)rr   )r`   
person_varr0   CmfPersonVarrN   rT   r    r    r!   _check_person_varZ  s    zCmfPerson._check_person_varc                    s"   t   ddddddddd	d
g
 S )NrS   Znotify_email
notify_smsr   r   rolesprimary_rolezcompany.typer   r   )r   save_preload_fieldsrT   r   r    r!   r   _  s            zCmfPerson.save_preload_fieldsc                 C   sp   | j s| jrd S | jjrF| jjrF| jjsF| jjj dkrFtddd | jj	rlt
jd| jd}|  || _d S )Nrr   u?   Контакт не может быть без компанииTr   )typer   )r`   r   companyr\   oldnewr   loadr~   is_nullr0   Z
CmfCompanyrF   rN   )r&   Znew_companyr    r    r!   _calc_companyd  s    "zCmfPerson._calc_companyc                 C   sL   | j r| jsdS tjdg | jD ]"}tjjD ]}|j|_|  q0q$dS )u   
        Вычисляем список избранного по умолчанию для новых пользователей
        Nzperson_var.favorites)is_newr`   r1   r2   rM   r   Z	favoritesrN   )r&   r   Zcurrent_person_varr    r    r!   _calc_default_favoritesp  s    
z!CmfPerson._calc_default_favoritesc                 C   s   | j r| jsd S d S rR   )r   r`   rT   r    r    r!   _calc_avatar}  s    zCmfPerson._calc_avatarc                    s   | j jr| j r|   | jr0| j| jkr0| j| _|   |   |   |   | j	j
rj| jrj| jd | _	|   |   | jjr| jr| jjs| jjstddd tt| j||}|   | jr| jrttj | jrtj| d}|  |S )Nr   u   Для включения SMS уведомлений необходимо указать номер мобильного телефонаTr   )r   )rc   r\   r   rS   r   r   r   r_   r   r   r   r   r   r   r   r   Znumberr   r~   r   r
   rN   r   r`   rw   rx   r   r0   ZCmfTimeTracker)r&   r   r   r   Zperson_timetrackerr   r    r!   rN     s.    
zCmfPerson.savec                    s2   |  ddg |   t j|| ttj d S )NrJ   rc   )rM   r   r   deleterw   r
   rx   r%   r   r    r!   r     s    zCmfPerson.deletec                 C   sZ   t j d}|rVt }||d | }| d| d}tj	|sVt
| |S )Nz/common/static/avatar/utf8/)configPROJECT_DIRhashlibr   updateencode	hexdigestospathexistsmakedirs)r   rS   avatar_directorymZavatar_hashr    r    r!   
avatar_dir  s    
zCmfPerson.avatar_dirc                 O   sf   t j| jj}tj|rNt|D ]&}| | }tj	|r&t
| q&ttj| jjgd d S )Nr   )r0   r
   r   rS   rg   r   r   isdirlistdirisfileremoverw   set_gravatarr*   )r&   r   r   r   filefilepathr    r    r!   remove_avatar  s    zCmfPerson.remove_avatar)rz   )emailsc              
   O   s  ddl m} g }tjtjd s0td |S tj	sFt
dtj | }tj }| D ]h}|dkrjqZt|tjttt ttt d d|d	}td
|  tjjj|d< t|}	t|	}
|d|
d}|jtj d|tjdd}td
| d|  |jdkr$td|  qZdd|g}td|  tjj|d}|sptd tj|||gd}n td|j  d |j!"| t#$  |%  W 5 Q R X |"|j&j td qZ|S )u   
        Регистрируем новых пользователей по email
        :param emails:
        :return:
        r   )sessionz/custom/org_namezCregister_persons: WARNING: org_name is not set, can't invite peopleu.   Операция не доступна для Ni:	 Zguid)rS   ZissZiatZexpZjtisubzregister_persons:fromZinvite_by_email)r   actioninvite_tokenz/auth/signup   )rs   cookiestimeout,    u>   Не удалось отправить приглашение r   r:   u"   Ищем пользователя r   u)   Создадим пользователя)rS   r   r/   u(   Добавим пользователя u    в группуz!register_persons: person saved ok)'requestsr   r   r   r   r   r   r1   r}   Zis_local_userZCmfPermissionErrorr2   r0   r   r   ro   ZAPP_FQDNr"   intru   r   rg   Z
create_jwtZrsa_sign_pack_jwtr   ZAUTH_SERVER_URLrequestr   status_coder~   r
   r   r   r/   r>   rO   rP   rN   r*   )r   r   r   r   r?   sr   r   ZpayloadZjwtr   rs   r   rq   rr   r    r    r!   register_persons  sb    


 


zCmfPerson.register_personsc                 O   sv   t jjrd S dd| jgdddgddd gdd	tjjtjjd
gg}tj	j
|dddgdD ]}|jd|_|  qVd S )NZresponsible_idr:   r   r8   )r{   Z	in_reviewZperiod_intervalra   Zperiod_next_datez<=)Ztzzlists.ordernoZactivityworkflowr;   r   )r1   r2   r.   r*   datetimeZnowtimezoneZutcr0   r   r=   r   Zget_default_statusstatusrN   )r&   r   r   rq   taskr    r    r!   check_periodic  s    	zCmfPerson.check_periodicc                 O   sb   | j s
dS tjjdd| jgdgd}|r2|d }n,tj| jd}| j|_| g|_| |_|	  |S )uq   
        Возвращаем объект, с которым нужно начать переписку
        NZprimary_contact_idr   r   )r   r   r   )r   )
r   r0   ZCmfDealr=   r*   r   r   ZcontactsZprimary_contactrN   )r&   r   r   ZdealsZdealr    r    r!   
start_chat  s    
zCmfPerson.start_chatc                 C   s2   | j r| jsdS | j tj   ko,| jkS   S )NF)Zvacation_startZvacation_endr   dateZtodayrT   r    r    r!   r     s    zCmfPerson._on_vacationc                 C   s   | j jr| j jd k	r| j jS tjjdd| jgddgd}|rT|j dkrt|jtj	jkrtdtjj j
d d| j _| j jS |j r|j j
|j j pd}|j j|d| j _| j jS )	Nr   r:   r-   r;   Z	invisibleZoffline)Zjs_idr   r   )r-   Z
is_defined_valuer0   r   r   r*   r   r1   r2   choicesrg   )r&   r   r   r    r    r!   _online_status$  s    
zCmfPerson._online_statusc                    sj   |dkr|sg }|dd|gg}|dkrP|s.g }|ddddgdd	d
gdd	dggg}t  j|f||d|S )Nr   r   r:   r/   r6   r   Fr   r   ZAdminsZUsers)	object_idr   )r   field_options_list)r   Zrelation_field_namer   r   r   r   r    r!   r   1  s    "zCmfPerson.field_options_listc           	   
   C   s   t d|  |s"dddddg}zt|d}t|tjjdd	  d
}ddd|gdd|gdd|gdd|gg}|r||g}tjj	||d}t d|  |W S  t
k
r } zt d|  W Y d	S d	}~X Y nX d	S )us   
        Ищем персону по номеру телефона
        :param phone:
        :return:
        u4   Ищем пользователя по номеру r   r   r   r   r`   ZRUrV   Nz;%r6   ZLIKEr:   r;   u.   Возвращаем пользователя %   Неправильный номер: )r1   r}   phonenumbersparseZformat_numberZPhoneNumberFormatZE164r0   r
   r   r   )	r   r   r   r   Z	phone_objZformat_phonerq   r   r   r    r    r!   get_by_phone>  s&    
zCmfPerson.get_by_phonec                    sX   g }i }|  dg | jD ]$}|jrg }|||jj< || q fdd  | |S )Nzroles.tree_parent_idc                    s\   i }t jjdd| gddgdD ],}| |j d| |jr| |j ||j< q|rX | d S )Nr*   r8   tree_parent_idheadr;   r   )r0   Z
CmfOrgUnitZslistr*   insertr   )Zou_idsZou_ids_nextZouquery_our    r!   r   c  s    z.CmfPerson.get_org_units_list.<locals>.query_ou)rM   r   r   rg   r>   )r&   r3   r4   r?   Zou_ids_firstrZou_listr    r   r!   get_org_units_listX  s    
	zCmfPerson.get_org_units_listc              
   C   s   | j |||d}|s~z*td|  tj||d}|  W n> tk
r| } z td| d|  W Y d S d }~X Y nX td|j  |S )Nr   u:   Создаем пользователя с номером )r   r   r   r   u@   Возвращаем пользователя с номером )r   r1   r}   r0   r
   rN   r   r   )r   r   r   r   r   r   r    r    r!   get_or_create_by_phonep  s    z CmfPerson.get_or_create_by_phonec                 C   s2   t t|dd  j|d}|| jj| dS )u3   
        Позвонить клиенту
        :r   r)   N)varsr0   r]   r   callbackr   Znumber_e164)r&   Z
channel_idr  Zchannelr    r    r!   
phone_call~  s    zCmfPerson.phone_callc                 O   s6   t j d}tj|s"t| t| d| S )Nz/common/static/avatarr   )r   r   r   r   r   r   pathlibPath)r&   
image_hashr   r   Z	directoryr    r    r!   avatar_path  s    
zCmfPerson.avatar_pathc              	   O   s   |sX| j  r*| | j }| r*|  d | _ | jdd |rTttj| j	j
gd d S |}t|trpt|}t| jj
d }| d| _ | | j }	|	d}
|
| W 5 Q R X | jdd d S )NTrl   r   r   z.jpegwb)Zavatar_filenamer   r  r   unlinkrN   rw   r
   r   r*   rg   r   r"   base64Zurlsafe_b64decoder   r   rS   r   r   r   write)r&   image
image_typer   r   r   r  Z
image_datar  Z
image_pathZ
image_filer    r    r!   
set_avatar  s&    


zCmfPerson.set_avatarc              
   C   s   | j std dS t }|| j j  	d d}d|
  d| d}ztj|tjdd	}W n: tk
r } ztd
|| W Y dS d}~X Y nX |jdkrtd
||j dS |jS )u>   
        Получаем аватарку с gavatar
        u/   Fetch gravatar skip: не задан логинNr   Zqwez https://www.gravatar.com/avatar/z/avatar.jpg?d=z&s=200rV   )r   u.   Ошибка запроса к gravatar {}: {}r   )rS   r1   r}   r   r   r   rg   lowerrE   r   r   r   r   r   r   r   r   r   formatr   r|   Zcontent)r&   r   defaultZurlr   r   r    r    r!   fetch_gravatar  s     

zCmfPerson.fetch_gravatar<   )rz   Zsoft_time_limitc                 K   s<   t jj| d}|t j| | }|j|ddd d S )Nr)   ZjpegF)r  r   )r0   r
   r   rM   r   r  r  )r   r4   rr   r  r    r    r!   r     s    zCmfPerson.set_gravatar)T)N)N)NN)NN)NN)NNT)3__name__
__module____qualname__classmethodr   r'   r,   r5   r@   propertyrF   rQ   rU   r_   rt   ry   staticmethodZ
celery_appr   rx   r   r   r   r   r   r   r=   r   r   r   r   r   rN   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r   __classcell__r    r    r   r!   r
      s|   

\
&
!

	
;


r
   c                   C   s
   t j S rR   )r0   r
   ry   r    r    r    r!   r     r   r   )r
  Zbinasciir   r  shutilru   r   Zrandomr   r   ZCryptor   r   Zrequests.apir   Zcmf.data_providers.baser   Zcmf.includer   Zbs4r   Zmodules.person.fieldsr	   r
   ZAPPZHOOK_CRON_HOURLYr>   r    r    r    r!   <module>   s.        /