
    iY                    |    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T d dlZd dl	m
Z
  G d de
j                  ZdS )    N)commit_all_ds)*)
cmf_personc                   d    e Zd Zej         dZej        j        g dz   Zd Z	e
dddd fd
            Zd Ze
d	             Ze
drd            Ze
dsd            Zed             Zd Zd ZdtdZdudZdtdZe
d             Zd Zd Zd Zd Ze
dsd            Ze ed
d
          dud                        Ze ed
d
d          dsd                        Z ddddddddZ! fd Z"d! Z#d" Z$d# Z%e
ddd$ fd%
            Z&d& Z'd' Z(d( Z)d) Z*d* Z+ fd+Z,d, Z-d- Z.dvd0Z/d1 Z0dwd3Z1d4 Z2d5 Z3dxd7Z4d8 Z5dd9 fd:
Z6dsd;Z7d< Z8 fd=Z9dyd?Z: fd@Z;dA Z<dB Z=ds fdC	Z> fdDZ? fdEZ@e
dsdF            ZAdG ZBe edHdIJ          dK                         ZCe ed
dLM          d6dNdOe&fdP                        ZDe
ddQdR            ZEe
dddSdT            ZFdU ZGedV             ZHe
dt fdW	            ZIe
dudX            ZJdY ZKe
dudZ            ZLd[ ZMd\ ZNdzd]ZOd^ ZPe ed
d_d`a          db                         ZQe
dc             ZRdxddZSe
de             ZTdf ZUe
dg             ZVe eWdhi          dj                         ZXdk ZYdl ZZdm Z[dn Z\e ed
d
do          dp                         Z]dq Z^ xZ_S ){	CmfPersonz/custom/static/avatar/)get_current_projectsget_current_userget_home_folderget_org_units_listget_auth_fail_block_end_dateset_auth_fail_block_end_dateget_auth_fail_permanent_blockset_auth_fail_permanent_blockmark_viewedpfeed_post_listregister_personsremove_avatarsearchsend_message
set_avatar
start_chatpublic_none_classmethodpublic_listpublic_get_org_units_list
public_getunblockc                    |                                  st          d           d S t          j                            d          s5t          d           t          j                            dd| dd	           d S |                     d            t          j                            dd| d
d	           t          d           d S )Nu6   Пользователь не заблокированFraise_erroru   У вас нет правuser_unblockr   fail   )operatecmf_model_nameparentresult_statussecurity_levelsuccessu3   Пользователь разблокирован)r   	cmf_alertmodelsCmfAccessListcheck_admin_modeCmfAuditaudit_eventr   selfargskwargss      %./modules/person/models/cmf_person.pyr   zCmfPerson.unblock)   s    0022 	NOOOF#444GG 	1222O''{37v^_ ( a a aF))$///##N;37yab 	$ 	d 	d 	dGHHHHH     Nqueryfieldsfilterc                v    |                     d          pg d|d<    t                      j        ||||d|S )Nfields_filter)	nametextcodephoneemailphone_internalphone_mobilephone_2phone_assistantr6   )getsuperr   )clsr7   r8   r9   r1   r2   	__class__s         r3   r   zCmfPerson.search:   sd    "(**_"="=  #l  Bl  Bl  Bluww~vf
 
@F
 
 	
r4   c                 j    t          d                    t          | j                                      S )Nr5   )strjoinreversedr<   r/   s      r3   reverse_namezCmfPerson.reverse_nameA   s&    2778DI..//000r4   c                 .    |                      d          S )N.CmfPerson:00000000-0000-0000-0000-000000000001idrE   )rG   s    r3   system_personzCmfPerson.system_personD   s    wwJwKKKr4   Tc                 f    t           j                            t          j        j        g d          S )N)r   online_statuson_vacationrg_member_ofis_admin
two_factor)rQ   r8   )r*   r   rE   gcurrent_personrQ   )rG   create_args_kwargss       r3   r	   zCmfPerson.get_current_userH   s9     ##"+z+z+z $ | | 	|r4   c                     g }t           j                            dddt          j        j        ggddt          j        j        gg|          D ]}|                    |           |S )NOR	executorsINcmf_owner_id==r9   r8   )r*   
CmfProjectlistrZ   r[   rQ   append)rG   r8   resultprojects       r3   r   zCmfPerson.get_current_projectsN   sx    (--d[$QRQaQdPe<f7EtQM]M`6a6ckq . s s 	# 	#GMM'""""r4   c                 ~    | j         p| j        pd}| j        pd}| j        pd}| d| d|                                 S Nr5    )	last_namelogin
first_namesecond_namestrip)r0   r1   r2   rn   rp   rq   s         r3   	full_namezCmfPerson.full_nameV   sV    N6dj6B	_*
&,"88j88;88>>@@@r4   c                    |                      dg           | j        st                              d | ddd          }|                    d           || _        t
                                          5  |                                  d d d            n# 1 swxY w Y   t                              |dd	                              d           | j        S )
Nhome_folderi'  u   Мои документыhome)tree_parent	cmf_ownerordernor<   sys_typeF)notifyu   Документ1)rw   ry   r<   )load_fieldsru   r*   	CmfFoldersavecmfutildisable_aclCmfDocument)r0   r1   r2   folders       r3   r
   zCmfPerson.get_home_folder]   s   -))) 
	o%% 06	 & C CF
 KKuK%%%%D$$&&  		              65GZ[[``hm`nnns   3BBBc                 ,    | j         p| j        p| j        S N)rs   ro   r@   r0   s    r3   gen_namezCmfPerson.gen_namel   s    ~99tz9r4   c           	         d}|rt                               |d          }n_|r.t          j                            |ddgd          }|r|j        }n/|r-t          j                            |ddgd          }|r|j        }|st          d| d	| d
| d           dS | t          j        k    rt          j	        }n!t          j
                            | d          }||v rdS dS )u   
        ! Публичное API для bzPython
        Метод проверки, что пользователь находится в группе
        NCmfPersonGroup--rQ   T)r>   r8   cache_inmemory)r<   r8   r   uX   Ошибка вызова in_person_group: не найдена группа (group_code=z, group_name=z, group=)F)id_only)r   get_obj_id_by_anyr*   r   sgetrQ   r)   rZ   current_usercurrent_person__member_ofr+   subject_full_group_list)r0   group
group_code
group_namegroup_id	member_ofs         r3   in_person_groupzCmfPerson.in_person_groupo   sA   
  		$008HIIHH 	$)..Jd|dh.iiE $ 8 	$)..Jd|dh.iiE $ 8 	 \&0\ \?I\ \SX\ \ \ ] ] ]5 1>!!3II,DDTSWDXXIy  4ur4   c                 2    |                      |||          S )u   
        ! DEPRICATED
        ! Публичное API для bzPython
        Для обратной совместимости
        )rj   	role_coderole)in_project_role)r0   rj   r   r   s       r3   has_project_rolezCmfPerson.has_project_role   s     ##Gyt#TTTr4   c           	         d}|rt                               |d          }n]|r-t          j                            |ddg          }|r|j        }n.|r,t          j                            |ddg          }|r|j        }|st          d| d| d	| d
           dS t                               |d          }| j        j        t          j        	                    ||          v S )u   
        ! Публичное API для bzPython
        Метод проверки, что пользователь назначен на Проектную роль
        role и project могут быть: объект, tuuid, code, name
        NCmfProjectRoler   rQ   )r>   r8   )r<   r8   ug   Ошибка вызова in_project_role - не найдена Проектная роль (role_code=z, role_name=z, role=r   Frf   )
r   r   r*   r   r   rQ   r)   valuer   get_project_role_members)r0   rj   r   r   	role_namerole_id
project_ids          r3   r   zCmfPerson.in_project_role   s)     		"//6FGGGG 	"(--9dD\-RRD "' 	"(--9dD\-RRD "' 	 V%.V V<EV VNRV V V W W W5..wEE
w} 0 I I*V] ^ ^^^r4   c                    t           j                            |t                                 t           j        |         }|                    |d            ||         }|t	          |          S t                      }t          j                            dd|gdd|ggddg          D ]=}|j        	                                D ]!}|
                    |j        j                   ">|t           j        |         |<   t	          |          S )Nr%   =project_rolemembersproject_role_idre   )APPcache_in_project_role
setdefaultdictrg   setr*   CmfProjectRoleAssignr   
all_nestedaddrQ   r   )rG   r   r   project_cacherole_cache_setrulemembers          r3   r   z"CmfPerson.get_project_role_members   s    	!,,Z@@@1*=  $///&w/%'''/44!3
3nc75ST!#45 5 7 7 	4 	4D ,1133 4 4""69?33334 :H!*-g6N###r4   c                 d   |                      g d           d}| j        r{| j        rt| j        t          j                                                                        k    r;| j        t          j                                                                        k    rd}| j        |k    r	|| _        d S d S )N)rV   vacation_startvacation_endFT)r|   r   r   datetimeutcnowdaterV   )r0   cur_on_vacations     r3   _calc_vacationzCmfPerson._calc_vacation   s    JJJKKK	#$($5	##x'8'?'?'A'A'F'F'H'HHH!X%6%=%=%?%?%D%D%F%FFF"O...D /.r4   c                    | j         j        r| j         j        s| j         dk    rd S | j         j        }|                    | j        d          }|                    | j        d                                          }|                    d          }t          |          dk    r| j
        s|d         | _
        t          |          dk    r| j        s|d         | _        t          |          dk    r| j        s|d         | _        d S d S d S )Nr5   rm   r      r"   )r<   
is_changedis_nullr   replaceVACATION_SUFFIXDOES_NOT_WORK_SUFFIXrr   splitlenrn   rp   rq   )r0   tmpname_arrs      r3   _calc_from_namezCmfPerson._calc_from_name   s    y# 	ty'8 	DIOOFiokk$.33kk$3R88>>@@99S>>x==1T^%a[DNx==1T_&qkDOx==1T%5'{D r4   c                    | j         j        sJ| j        j        s>| j        j        s2| j        j        s&| j        j        s| j        j        s| j        j        sd S d}| j        r
d| j         }| j        r
d| j	         }| j
         | | _         d S rl   )r<   r   rp   rq   rn   ro   rV   does_not_workr   r   rs   )r0   add_strs     r3   
_calc_namezCmfPerson._calc_name   s    I 		)		 *		 ~(			
 z$		 *		 !,		 F 	10$.00G 	65$355G~0w00	r4   c                    |                      g d           t          t          j        j        j        t          j        j        j        t          j        j        j        t          j        j        j                  }| j	        r4|D ]1}| j	        j        
                    |          r| j	        |         ||<   2| j        rd|d<   nJ| j	        rC| j	        j        
                    d          s| j	        j        
                    d          rd|d<   |S )N)auth_optionsrX   
is_support)
allow_base
allow_ldapallow_oauth	allow_ssoTr   sso_block_allow_basedisable_base_authF)r|   r   rZ   global_settingsauth_options_allow_baser   auth_options_allow_ldapauth_options_allow_oauthauth_options_allow_ssor   rE   rX   )r0   reskeys      r3   get_auth_optionszCmfPerson.get_auth_options>  s%   AAABBBa/GM/GM 0IO.EKN N N  	6 6 6$*..s33 6#05CH = 	& $C 	&D$5$;$?$?@V$W$W 	&[_[l[r[v[v  xK  \L  \L 	& %C
r4   c                    ddg dg dgg ddg dg dgg}|r|s|                     dd	|g           g }t                              d
t          j                            |                      t          j                            |g dd          D ]"}g }t          |j        j	        |j
        j	        |j        j	        |j        j	        ||j        j	        |                                |j        j	                  }|j        rd|_        |                    d           |j        sB|j        s;t          j        j        rd |j        D             |d<   nKd |j        D             |d<   n6|j        r-|j        j	        |d<   d|_        |                    d           n|                     |           $|sdS t-                      |ddd}t                              d
t/          |           d           t1          d|           dS )u   
        Отправляем учетки в аккаунт
        https://bcrm.carbonsoft.ru/project/Document/DOC-003025#spec-0-ldap
        ANDr`   
user_localrd   T)servicedesk_allowrd   T)ro   !=N)r   r   T)r   rd   Ncmf_modified_at>u   Синхронизируем r9   )zrg_member_of.ext_idcmf_deletedr   deleted_loginr@   r   	ext_loginzrg_member_of.systemTr9   r8   include_deleted)ro   r   r@   r<   rW   r   r   	old_loginN	only_datac                 4    g | ]}|j         	|j        j        S  )systemr>   r   .0objs     r3   
<listcomp>z/CmfPerson.account_sync_push.<locals>.<listcomp>r  s%    +h+h+hs]`]g+hCHN+h+h+hr4   rW   c                 &    g | ]}|j         j        S r   )r>   r   r   s     r3   r   z/CmfPerson.account_sync_push.<locals>.<listcomp>t  s    +Z+Z+ZsCHN+Z+Z+Zr4   ro   )eva_app_tokenusersrpc_account_sync_push)r2   methodu    учетокzauth/sync_accounts)rh   rZ   debugr*   r   countrg   r   ro   r   r   r@   r<   r   r   r   r~   r   r   only_system_grp_syncrW   r   gen_eva_app_tokenr   call_eva_account)rG   account_sync_lastforce_filterr   personrW   datas           r3   account_sync_pushzCmfPerson.account_sync_pushQ  s    4 : : :;\;\;\]_t_t_t4446P6P6PQS 	HU 	HNN-s4EFGGG	X0@0F0Fg0F0V0VXXYYY&++/ / / !% , & & !	 !	F Lfl0"("2"8$l0#[.%1$*$6$<%+%<%<%>%>"("2"8: : :D  ,#' d+++& &*> $9 [+h+hfFY+h+h+hD((+Z+ZfFY+Z+Z+ZD((%  & 4 :W'+$d++++ LL 	F,=,?,?%PP13 3	IE

IIIJJJ-t44444r4   )	only_once
system_jobc                 j   g }d}| sg dg dg} t           j                            | g d          D ]}	 |                    |           |j        r"|                                 t                       |dz  }H# t          $ rT}t                       |	                    t          |                     t                              |           Y d }~d }~ww xY wd| }|r| d	d
                    |          z   }t                              |           t                              d|           d S )Nr   r   )rY   rd   N)r   two_factor.two_factor_optrB   r@   re   )two_factor_optr   u   Обработано u-   </br> Не удалось настроить:z</br>u)   Закончили настройку 2FA)r=   )r*   r   rg   _calc_two_factorr   	save_datacommit_with_event	Exceptionrollback_purge_eventrh   rJ   rZ   r   rK   r   admin_alert)r  r
  r^   fail_personperson_countr  er=   s           r3   init_2fa_settingszCmfPerson.init_2fa_settings  sy     	O1113M3M3MNG&++'k'k'k , m m 	 	F	''~'FFF$ ($$&&&%'''!   $&&&""3v;;///







 6|55 	dIII',,WbJcJccD	GdSSSSSs   AA::
CA
CCz@hourly)r  r  schedulec                    t                               d           t           j        j        dk    rFt           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                       	 t          j                            ||            dt           j        _        t           j        	                                 dS # t          $ r}t          |           t                              |           t#          |           |t           j        _        d	t           j        _        t           j        	                                 Y d}~dS d}~ww xY w)
uz   
        Синхронизируем уровень доступа с accounts сервером
        :return:
        u6   Запуск синхронизации с eva_accountin_progressi  u   Синхронизация пользователей зависла, запускаем форсированно повторноu2   Синхронизация уже запущенаN)r  closederror)rZ   r   
global_varaccount_sync_statusr   ager)   r   set_nowr~   r  r*   r   r  r  logging	exceptionr   )r  r   r  s      r3   account_sync_userszCmfPerson.account_sync_users  s    	
HIII<+}<<|-1G;;  _  `  `  `  `LMMM+8(L:@	&..000	
	 ../@.NNN/7AL,L 	  	  	 aLLLa   !->AL*/6AL,L	 s   -AD? ?
G	A8GG)slicer8   order_bydo_count	do_unreadsearch_filterc                   t           j                            g dddg          }	t                      }
|	D ]}|j        rFt	          |j        j        t           j                  r"|j        j        r|
                    |           O| j	        j        d |
                                D             v r|
                    |           |rit           j                            dddd	| j	        j        ggd
g dddt          j        j	        ggddt          t          d |
                    gg          S d
g dddt          j        j	        ggddt          t          d |
                    gg}|rg ddddd	| j	        j        gg|g}|r|                    |           t           j                            ||ddg|          }|S )N)	list_typerd   pfeedr%   zparent.is_defaultre   c                 &    g | ]}|j         j        S r   )rQ   r   )r   r  s     r3   r   z-CmfPerson.pfeed_post_list.<locals>.<listcomp>  s     Z Z ZV Z Z Zr4   person_viewsz
NOT EXISTS	person_idr   r`   )cache_status_typer   OPENrc   rd   listsrb   c                     | j         S r   rP   xs    r3   <lambda>z+CmfPerson.pfeed_post_list.<locals>.<lambda>      qt r4   r   c                     | j         S r   rP   r0  s    r3   r2  z+CmfPerson.pfeed_post_list.<locals>.<lambda>  r3  r4   z-status_in_progress_start-cmf_created_at)r9   r8   r"  r!  )r*   CmfListrg   r%   
isinstancer   rf   
is_defaultrh   rQ   all_relation_personsCmfTaskr   rZ   r[   map)r0   r!  r8   r"  r#  r$  r%  r1   r2   r.  my_listslstflt	post_lists                 r3   r   zCmfPerson.pfeed_post_list  s!   ##+G+G+G "56 $ 8 866 	% 	%Cz j)96;LMM RUR\Rg $$$w} Z Zs?W?W?Y?Y Z Z ZZZ$$$ 	K>''{\_aeahanNo0p:::*D!2B2EFHdD^^X)F)F$G$GH0J' K K K 999*D!2B2EFHdD^^X)F)F$G$GHJ  	666WbdgimipivVw8xz}~C 	&JJ}%%%N''13DE	 (  	
 r4   c                 F     t                      j        |fd| j        i|S )Nr+  )rF   r   rQ   )r0   obj_idr]   r2   rH   s       r3   r   zCmfPerson.mark_viewed  s+    
 #uww"6GGTWGGGGr4   c                     d S r   r   r/   s      r3   public_mark_viewedzCmfPerson.public_mark_viewed  s    tr4   c                    g }| j         j        rit          j                                        }|j        d | j         D             v r2t          j                            dd| j        ggdg          }|rd |D             }|sdd|j        ggdd	d
| j        ggg}t          j                            |dg          D ]}t                                          }|g|_	        d|_
        |                                 |j	                            |            |                    d           |j        D ]2}|j	                            |            |                    d           3|                    |           |S )Nc                     g | ]	}|j         
S r   rP   r   s     r3   r   z.CmfPerson.create_p2p_chats.<locals>.<listcomp>  s    BBBcfBBBr4   ra   rb   p2pre   c                      g | ]}|j         	|S r   )rF  r   s     r3   r   z.CmfPerson.create_p2p_chats.<locals>.<listcomp>  s     E E ESW E E E Er4   rW   rQ   zNOT INrO   Tr   )rW   r   r*   r   
user_grouprQ   CmfChatGrouprg   r   ra   rF  r~   rh   topics)r0   r   usr_grp	cur_chatsr  r  r   topics           r3   create_p2p_chatszCmfPerson.create_p2p_chats  s   ' 	*+6688GzBB0ABBBBB"/44[$QUQXPY<Zdicj4kk	 F E E	 E E EI  * .wzlC $h1a151:  ;<G #)"2"7"7wPTv"7"V"V * * & 3 3 5 5+1($(	

..t444

T
222%*\ 7 7E!O224888!JJJ6666

5))))
r4   c                     | j         sd S t          j        j        | j        k    rt	          dd           t
          j                                         d S )Nu1   Нельзя удалить самого себяTabort)r   rZ   r[   rQ   r)   r*   r+   r,   r   s    r3   
_check_delzCmfPerson._check_del  sU     	F$'))IQUVVVV--/////r4   )include_systemis_userc                x    |s|                     dd           |du rd|d<    t                      j        |i |S )Nr   FTr   )r   rF   rg   )rG   rS  rT  r1   r2   rH   s        r3   rg   zCmfPerson.list  sO     	/h...d??#'F< uww|T,V,,,r4   c                 T   | j         r t          j                            |           rd S | j        rd S t          j                            | d          }|r%|                                 t          d           d S t                              |                                            d S )Nr  Tr  r   u   Warning. CmfPerson был удален и некорректно востановлен. Обратитесь в Техническую поддержку)	r   r*   CmfPersonVarr   r   rE   restorer)   r~   )r0   
deleted_pvs     r3   _check_person_varzCmfPerson._check_person_var  s     	&"5":":$":"G"G 	F 	F(,,D$,OO
 	      s  t  t  tF4((--/////r4   c                 
   | j         s| j        j        sd S |                     d          rUt          j                                        }|                     |j                  s| j                            |           d S d S d S )NAdminsr   )	is_newrW   r   r   r*   r   contact_admins_groupr>   rh   )r0   contact_admin_groups     r3   _calc_contact_adminzCmfPerson._calc_contact_admin#  s    { 	4#4#? 	F844 	>"("7"L"L"N"N''3F3K'LL >!(()<=====	> 	>> >r4   c                 r   | j         s| j        rd S | j        j        rP| j        j        rD| j        j        s8| j        j        j                                        dk    rt          dd           | j        j	        r>t                              d| j                  }|                                 || _        d S d S )Nr  u?   Контакт не может быть без компанииTrP  )typer<   )r   r   companyr   oldnewre  loadr)   r   r*   
CmfCompanyrs   r~   )r0   new_companys     r3   _calc_companyzCmfPerson._calc_company-  s    ? 	dk 	F<" 	i| i(8 iT\=M=R=W=W=Y=Y]e=e=e[cghhhh< 	' +++OOK&DLLL		' 	'r4   c                     | j         r| j        sdS t          j                            dg           | j        D ]6}t          j        j        D ]"}|j        |_        |                                 #7dS )u   
        Вычисляем список избранного по умолчанию для новых пользователей
        Nzperson_var.favorites)r`  r   rZ   r[   r|   
person_var	favoritesr~   )r0   rn  current_person_vars      r3   _calc_default_favoritesz!CmfPerson._calc_default_favorites9  s     { 	$/ 	F	$$&<%=>>>/ 	" 	"J&'&6&A " ""'9'C
$!!!!"	" 	"r4   c                 &    | j         r| j        sd S d S r   )r`  r   r   s    r3   _calc_avatarzCmfPerson._calc_avatarF  s$     	 	F	 	r4   c                 N    t                                                      g dz   S )N)ro   notify_email
notify_smsr?   rB   rolesprimary_rolezcompany.typer   rn  r   rV   r   r   rn   rp   rq   ro   r@   r   r	  r   calendar_id)rF   save_preload_fields)r0   rH   s    r3   rz  zCmfPerson.save_preload_fieldsL  s4    ww**,, 0G 0G 0G G 	Gr4   c                    | j         r| j         j        sdS g }t          j                            dd| gg dg          D ](}|                    d|j         d|j         d           )|rnd	                    |          }d| j         d| j         d
| }t                              | 	                                d|d          
                                 dS dS )zY
        https://bcrm.carbonsoft.ru/project/Document/DOC-003685#spec-eva-account
        Nresponsiblerd   r,  r   CLOSEDr   z	<a href="z">z</a>z<br>z</a> uM   Обработайте задачи уволенного сотрудника	9_disable)r|  r<   r=   full_search_type)r   r   r*   r:  rg   rh   hrefr<   rK   get_supervisorr~   )r0   linkstaskr=   s       r3   _check_does_not_workzCmfPerson._check_does_not_workT  s    " 	t'9'D 	FN''d0K0U0U0U0W' X X 	C 	CDLLATYAA$)AAABBBB 	$;;u%%DBtyBBDIBBDBBDNNt':':'<'< p $,7    "TVVVVV	$ 	$r4   c                 f    t           j                            | j        dg          }|r|j        S d S )Nfail_block_end_datero   r8   )r*   CmfAuthr   ro   r  r0   auths     r3   r   z&CmfPerson.get_auth_fail_block_end_dateh  s=    ~""=R<S"TT 	,++	, 	,r4   r   datetime.datetime | Nonec                     t           j                            | j                  }|r||_        |                                 d S d S Nro   )r*   r  rE   ro   r  r~   r0   r   r  s      r3   r   z&CmfPerson.set_auth_fail_block_end_datem  sG    ~!!
!33 	',D$IIKKKKK	 	r4   c                 f    t           j                            | j        dg          }|r|j        S d S )Nfail_permanent_blockr  )r*   r  r   ro   r  r  s     r3   r   z'CmfPerson.get_auth_fail_permanent_blocks  s=    ~""=S<T"UU 	-,,	- 	-r4   boolc                     t           j                            | j                  }|r||_        |                                 d S d S r  )r*   r  rE   ro   r  r~   r  s      r3   r   z'CmfPerson.set_auth_fail_permanent_blockx  sG    ~!!
!33 	(-D%IIKKKKK	 	r4   c                    fd|                      ddg           d}| j        rP| j        j        r#| j        j        j        r| j        j        j        }n!| j        j        r | j        j                  }|s]t
          j                                        }|j        	                                 |j        r|j        
                                d         }|S )u   
        Идем по структуре отделов роли и получаем первого руководителя
        c                     | j         r%t          j                            | j                   S |                     dg           | j        r | j                  S d S )N)rx  ztree_parent.head)headr*   r   rE   r|   rw   )org_unit	recursions    r3   r  z+CmfPerson.get_supervisor.<locals>.recursion  se    } H'+++GGG  "4!5666# 7 y!56664r4   zprimary_role.supervisor.personzprimary_role.tree_parent.headNr   )r|   rx  
supervisorr  rw   r*   r   admin_group
rg_membersri  r   )r0   r  	admin_grpr  s      @r3   r  zCmfPerson.get_supervisor~  s    	 	 	 	 	 	:<[\]]]
 	F + F0A0L0S F!.9@

". F&Yt'8'DEE
 	B-99;;I %%'''# B&1<<>>qA
r4   c           
      F   | j         j        sd S i }|                     dg           | j         D ]r}|j        s
t	          |j                                      d          D ]@}|                                }||v r!t          d||          d| d| d           ;|||<   Asd S )Nz*rg_member_of.incompatible_combination_code,u\   Пользователь не может участвовать одновременно в u    и uS   , так как у них указан Код запрета совмещения: TrP  )rW   r   r|   incompatible_combination_coderJ   r   rr   r)   )r0   codesgrgr_codes       r3   %_check_roles_incompatible_combinationz/CmfPerson._check_roles_incompatible_combination  s#    (	 FFGHHH# 		( 		(B3 r?@@FFsKK ( (!--//e## F  ~C  DK  ~L F F%'F F }DF F NRS S S S S &(E'NN(		( 		(r4   Fc                     | j         j        s|sd S | j         s	d | _        d S | j        j        r| j         d         | _        d S | j        | j         vr| j         d         | _        d S d S )Nr   )rw  r   rx  r   )r0   r  s     r3   _calc_primary_rolezCmfPerson._calc_primary_role  s    
% 	 	Fz 	. $D& 	. $
1Ddj00 $
1D 10r4   c                     | j         r t          j                            |           sdS t          j                            |           D ]}d|_        |                    d            dS )uN   Надо пометить что данные не засинканы
        rW  NTr   )r   r*   CmfAuthPluginDatar   rg   dirtyr~   )r0   	auth_datas     r3   _check_auth_datazCmfPerson._check_auth_data  sy      	F$<$B$B$$B$O$O 	F166d6CC 	+ 	+I IONNTN****	+ 	+r4   )save_kwargsc                    |                     d          rt          dd            t                      j        |d|i| d S )Nrw  u   Назначение или открепление должности пользователю необходимо производить в "Структуре" в карточке должностиTrP  r  )rE   r)   rF   update)r0   r  r1   r2   rH   s       r3   r  zCmfPerson.update  s_    ::g 	}   
 	@+@@@@@@r4   c                    | j         rt| j        so| t          j        k    rat                              | j        | j        |          }|                                 || _        | j                                         d S d S d S d S )N)r?   r@   r
  )	r   rY   rZ   rS   r*   CmfAuthTwoFactorrB   r@   r~   )r0   r
  rY   s      r3   r  zCmfPerson._calc_two_factor  s    ? 	#4? 	#tq7N7N00t7H7;z@N 1 P PJ OO(DOO  """""	# 	# 	# 	#7N7Nr4   c                    | j         j        sd S d }| j         j        D ])}|j                                        r|j        j        } n*|sd S || j        j        k    r'|| j        _        | j                                         d S d S r   )rW   r   rh  r
  ri  r   rY   r  )r0   r
  grps      r3   _calc_two_factor_groupsz!CmfPerson._calc_two_factor_groups  s     + 	F $( 	 	C!&&(( !$!3!9  	FT_;;;-;DO*O%%''''' <;r4   c                     | j         r| j        | j         k    r| j         | _        |                                  |                                   t	                      j        |i | d S r   )ro   r>   r   _calc_servicedesk_allowrF   _save_import)r0   r1   r2   rH   s      r3   r  zCmfPerson._save_import  sh    : 	#$)tz11
DI$$&&&d-f-----r4   r   c                 v   |dk    rd S | j         j        sd S t          j        sGt          j        s;t          j        t          j        k    s!t          j        	                    dd          rd S t          j
                            g d          }|j        j        t          j        v rt          dd	           d S d S )
Nr   r5   Fr   )r>   rd   ProjectAdminsr   u  Изменение членства в группах на карточке пользователя для Проектных администраторов временно недоступно. Откройте группу и добавьте пользователя там.TrP  )rW   r   rZ   disable_permissionsacl_admin_moder[   rS   r*   r+   r,   r   rE   rQ   r   r   r)   )r0   depthr2   project_admins_groups       r3   _tmp_changing_member_of_alertz'CmfPerson._tmp_changing_member_of_alert  s    199F  + 	F  	A$4 	8HAO8[8['888OO 9\F%488@_@_@_8``"(A,GGG T \`a a a a a a HGr4   c                    g d}|                      | j                   | j        r+t          j                            | j        j                   d S | j        r+t          j                            | j        j                   d S | j	        j        pd}| j
        r|d| j
        j        z   z  }| j        r"| j        | j
        k    r|d| j        j        z   z  }||d<   |                                s+t          j                            | j        j                   d S d}|D ]}|dk    r)| j        D ] }|j	        j        r|d|j	        j         z  }!1|dk    r0| j        r(| j        j	        j        r|d| j        j	        j         z  }g| |         j        r|d| |         j         z  }||d<    t                      j        d	i |S )
N)r   r@   r?   rA   rB   rC   rD   
ip_addressemail_2zoomsnapchatlinkedinfacebookvkok	instagramskypeslackwhatsapp	messengervibertelegramwork_positionemployee_number
roles.nameprimary_role.namer   r5   z - r<   r  rm   r  r=   r   )r|   full_search_preload_fieldsr   r*   CmfFullSearch
mark_cleanrQ   r   
cmf_hiddenr<   ro   r@   rr   rw  rx  rF   full_search_index)r0   r2   text_fieldsr<   r=   frrH   s          r3   r  zCmfPerson.full_search_index  s   W W W 	8999; 	 ++DGM:::F? 	 ++DGM:::Fy$": 	-EDJ,,,D: 	-$*
22EDJ,,,Dv zz|| 	 ++DGM:::F 	, 	,AL   3 3Av| 3 2AFL 2 223 )))$ ?):)?)E ?> 1 6 <>>>D a ,+DGM+++v(uww(226222r4   c                    | j         j        sdS t          j                            g ddg          D ]V}|                     |j        j                  r4g dg ddd	|j        gg}t          j	        
                    |d
di           WdS )u   
        Для новых пользователей или при смене группы надо проверить нет ли его в АД
        N)
sync_groupr   Nzsync_group.codere   r_  )r  rd   F)r  rd   Nauth_pluginrd   r  T)r9   values)rW   r   r*   CmfAuthLdapPluginslistr   r  r>   rQ   r  bulk_update)r0   pr  s      r3   _check_ad_grpzCmfPerson._check_ad_grp7  s      + 	F)//7O7O7OYjXk/ll 	] 	]A##q|/@#AA ]111111M$qt3LN(44GWVZO4\\\	] 	]r4   c           
         | j         s| j        j        r+d }| j        r| j        r| j                            dg           | j        r| j        j        | j        k    rt          j        	                    dg d          }t                              d| j
        j         | ||j        |j        |j        |j        d          }|                    d           || _        |                     d           | j        sF|s#t          j        	                    dg d          }|| _        |                     d           d S d S d S )	N	parent_idT)timezonecalc_num_yearscalc_num_back_years
calc_until)r8  r8   u   Календарь F)r<   r%   parent_calendarr  r  r  r  r  r   )r`  r   r   calendarr|   r  rQ   r*   CmfCalendarrE   r>   r   r  r  r  r  r~   )r0   default_calendarnew_calendars      r3   _calc_calendarzCmfPerson._calc_calendarD  s   ; 	*$/4 	*# .= =M--{m<<<} .(?47(J(J'-'9'='=#' E  E  E (> (F (F$ $*#5#5D49?DD#(8!1!:'7'F,<,P#3#># $6 	$ 	$L !%%%555$0DMIII---= *' F'-'9'='=#' E  E  E (> (F (F$ !1		D	)))))=	* 	*.* *r4   c                 	    | j         di | |                                  | j        j        r| j        r|                                  | j        r| j        | j        k    r| j        | _        |                                  |                                  | 	                                 | 
                                 |                                  |                                  |                                  | j        j        r0| j        r)| j        j        s| j        j        st%          dd           |                                  |                                  |s|                                  |                                  |                                  |                                  |                                  | j        j        rZt6          j                            dd| ddd| j        | j        d	d
 | j        j        D             d | j        D             di	  	         t@          j!        dk    r| j"        j        s| j#        j        rtH          j%        &                    d          st%          dd           t6          j'        (                    | j                  }|st%          d           nP| j"        j        r| j"        rd|_)        nd |_)        | j#        j        r| j#        |_#        |*                    d           | j+        s$| j,        j        r| j-        rt%          dd           | j.        j        rkt6          j/        0                    d          rnJtH          j%        | 1                                k    rn't%          d| 1                                 dd           | j+        s| j2        j        r|tH          j3        sp| j2        r t6          j4        5                    |            nI| j        D ]A}t6          j4        6                    |          r t6          j4        7                    | |           B tq          tr          |           j*        |i |}| :                                 | ;                                 | j-        s| j<        rt{          t6          j9        j>                   | ?                                 | j+        r/t6          @                    |           }|*                                 |S )Nu   Для включения SMS уведомлений необходимо указать номер мобильного телефонаTrP  perm_updater   r  Fr"   r  c                     g | ]	}|j         
S r   r>   r   rZ   s     r3   r   z"CmfPerson.save.<locals>.<listcomp>  s    FFF1FFFr4   c                     g | ]	}|j         
S r   r  r  s     r3   r   z"CmfPerson.save.<locals>.<listcomp>  s    BBB1BBBr4   )rg  rh  )	r#   r$   r%   r&   ignore_transactionr'   parent_nameparent_code
audit_dataFalseIBAdminsr_  u   Изменять настройки паролей разрешено только Администраторам ИБ из группы IBAdminsr  uG   Пользователь не синхронизирован с accountr   r   ua   Нельзя изменять календарь у локальных пользователейr   uw   Поле может редактировать только Администратор или Руководитель(r   r%   r   )Ar  r  r   r   rR  ro   r>   r   r   r   rq  r  rl  rs  rv  rB   numberr?   r)   r  r  r  r  r  r  rc  rW   r*   r-   r.   r<   rg  configEVA_ACCOUNT_USEpassword_must_changepassword_changed_daterZ   r   r   r  rE   password_expires_must_changer~   r`  r  r   no_staff_control_todayr+   r,   r  r    license_disable_user_count_hooks
CmfLicenserelease_all_user_licensesis_license_grouptake_user_licenserF   r   r  r\  r   schedule_deferred_jobr   _check_notify_opt_cache_reloadCmfTimeTracker)	r0   	from_ldapr1   r2   r  r   r   person_timetrackerrH   s	           r3   r~   zCmfPerson.savee  s   **44V444!!###& 	4+; 	OO: 	#$)tz11
DI$$&&&!!!?% 	s$/ 	s$+ sDJ4E s  f  nr  s  s  s  s22444$$&&& 	$!!###$$&&&  """ ' 	O''%*"#(  I I FF0A0EFFFBB0ABBB# # (   " !W,,(3 .t7Q7\ .~555LL *  r$(* * * *~))
);; 
.ghhhh0; E4 E@AD==@DD=1< P595O2III---{ 	Gt}7 	GDO 	Gy  BF  G  G  G  G&1 	&#444GG &4#6#6#8#888  m  UY  Uh  Uh  Uj  Uj  m  m  m $& & & & { 	It1< 	IQEg 	I! I!;;DAAAA!. I IE(99%@@ I);;D%HHH)eIt$$)4:6::   ? 	Gd4 	G!&"2"EFFF++---; 	&!'!6!6d!6!C!C##%%%
r4   c                    |                      dddgt          j        j                                                   t          j                            dd| gdg          }|rt          d| d	d
           d S | j        rEdt          j	        
                                                    d           }| d| j         | _        |                                  t          j        st          j                            |            |                    d          r1t          j                            | d
          D ]} |j        |i | t          j                            |           D ]} |j        |i | t          j                            |           }|rA|                    d          rd | _        |                     d
            |j        |dd
i|  t/                      j        |i | t1          t2          j        | j        j        g           t1          t2          j                   t          j                                         d S )Nrx   r   r  r  rd   r  re   u;   Пользователь синхронизирован с u9   , сначала отключите интеграцию.TrP  DELz%Y%m%d%H%M%Srm   TEXKOM_db_deleterX  rW  r  r   from_person_deleter1   ) r|   r*   r  PERSON_LIC_FIELDSr  r  rE   r)   r  r   nowstrftimerR  rZ   r  r  CmfPersonViewrg   deleterY  r  r  r~   rF   r  r   sync_person_task_resourcesrQ   r   r   CmfProjectNotifySchemetrigger_reload)	r0   r1   r2   r  prefixr  varr  rH   s	           r3   r  zCmfPerson.delete  s   (9;07799; 	< 	< 	< ,0048NXeWf0gg	 	  YT]  Y  Y  Y  ae  f  f  f  fF 	FM8,0022;;NKKMMF&,#E#Et/C#E#ED 1 	>77===::()) 	*)..dD.QQ * *$)&))))&++4+88 	( 	(CCJ'''''%)))66 	Fzz,-- * $		D	)))HOTEdEfEEE''''iB$'-YYYY 	i:;;;
 	%4466666r4   c                 :   | j         r0t                              | j        d| j         j                  | _          t                      j        |i | t          j        	                    | d          }|r |j        |i | t          t          j                   d S )Nr5   T)r%   r   )r  resubdelete_prefix_patternr   rF   rZ  r*   r  rE   r  r   r   )r0   r1   r2   r  rH   s       r3   rZ  zCmfPerson.restore  s     	f#%66$*Db$J^Jd#e#eD ((((%))t)LL 	.Hd-f---i:;;;;;r4   c                 >   |rt          j                    }|                    |                    d                     |                                }t
          j         d| d}t          j        	                    |          st          
                    |           |S )Nutf8/)hashlibmd5r  encode	hexdigestr0   _AVATAR_DIRECTORYospathexistsmakedirs)rG   ro   mavatar_hashavatar_directorys        r3   
avatar_dirzCmfPerson.avatar_dir  s     	.AHHU\\&))***++--K"&"8II;III7>>"233 .,---r4   c                    t           j                            | j        j                  }t
          j                            |          r\t
                              |          D ]A}| | }t
          j        	                    |          rt
          
                    |           Bt          t          j        | j        j        g           d S )Nr  )r*   r   r/  ro   r   r(  r)  isdirlistdirisfileremover  set_gravatarrQ   )r0   r1   r2   r.  filefilepaths         r3   r   zCmfPerson.remove_avatar  s    !+66tz7GHH7==)** 	(

#344 ( (.6667>>(++ (IIh'''i4DGM?KKKKKKr4   uV   Пересчет ресурсов после удаления пользователяr   )descriptionpriorityc                    t           j                            dd| gdgd          }|rY|j        rTg dddd| gd	d
| gggg}t           j                            |          D ]%}t           j                            |           "d S d S d S )NrQ   rd   r   Tr   r}  r`   r|  ra   rb   r   )r*   r   rE   r   r:  rg   CmfTaskResAssignsync_task_resources)r+  r  r  r  s       r3   r  z$CmfPerson.sync_person_task_resources  s     !%%dD)-Dm_nr%ss 	Bf( 	B555tY7+ti[9YZG ++7+;; B B';;DAAAA	B 	B 	B 	B
B Br4   u<   Регистрация нового пользователя)r  r8  )guestemailsc                   ddl m} g }t          j                            t
          j        dz             st                              d           |S t          j	        t          j
        k    rt          j        j        rBt          j	        j        sxt          j        j        sgt          j	                            d          sG| D ](}t"          j                            ddd	d
d||           )t)          dt          j	                    |            }|rg }nt"          j                                        g}| D ]}|t"          j                            ddd	dd||           t/          |t
          j        t3          t5          t7          j                                        t3          t5          t7          j                    dz                       d|          }	t                              d|	            t          j	        j        j        |	d<   t=          |	          }
t?          |
          }t"          j         !                    dgd          j"        j        }|d||d}|#                    tI          dd           d|tJ          j&        d          }t                              d| d|            |j'        dk    s|j(        d k    r6|)                                }t                              d!| d"|            d#d$|g}t                              d%|            t"          j*        !                    |d&d'g(          }|s:t                              d)           t"          *                    |||| *          }nM|D ]A}t                              d+|j+         d,|            |j,        -                    |           B|sd|_        t\          /                                5  |0                                 d	d	d	           n# 1 swxY w Y   |-                    |j1        j                   t                              d-           |S ).u   
        Регистрируем новых пользователей по email
        :param emails:
        :param guest:  пригласить как гостей
        :return:
        r   )sessionz/custom/org_namezCregister_persons: WARNING: org_name is not set, can't invite peopleAllowInviter_  user_inviter   Nr!   r"   )r#   r$   r%   r&   r'   r  r  u.   Операция не доступна для r  r   i:	 guid)ro   issiatexpjtir  zregister_persons:frominvite_must_change_passwordT)r8   r   invite_by_email)r@   actioninvite_tokenrI  )absoluteinternalzauth/signup   )r  cookiestimeout,    zSigned up successfullyuE   ERROR: Не удалось отправить приглашение z: r>   rd   u"   Ищем пользователя rW   r   re   u)   Создадим пользователя)ro   r@   rW   r   u(   Добавим пользователя u    в группу z!register_persons: person saved ok)2requestsr@  r(  r)  r*  r  PROJECT_DIRrZ   r   r[   rS   r   r   rX   r   allow_user_inviter   r*   r-   r.   CmfPermissionErrorr   rH  r   APP_FQDNrJ   inttimer@   r   
create_jwtrsa_sign_pack_jwtCmfGlobalSettingsrE   rI  postauth_base_hrefrequestrP  status_coder=   jsonr   r<   rW   rh   r   r   r~   rQ   )r>  r=  r1   r2   r@  ri   r@   sgroupspayloadjwtrL  rI  r  r   r  r  r   s                     r3   r   zCmfPerson.register_persons  s    	%$$$$$w~~f03EEFF 	GGYZZZM //N- 0 (1	 0
 -? 0 ,<<<VV 0   R R++MR]37v^_8=5 , R R R R %%hVWVf%h%hiiiGII 	:FF+66889F 7	9 7	9E}O''k/34XY49u ( N N N %"3ty{{#3#344"3ty{{5E'E#F#FGG%$  G GG111222.4:GFOW%%C,S11L(,,5R4Sdh,ii  F  L ("/$03N D &&ND4HHHUUU"!("  > >C GG555t55666#%%5M)M)Mq`eqqioqqrrrtU+GGGBBBCCC%)).R^A_)``F 
-CDDD))UQWhmdm)nn# 6 6EGGlv{llejllmmm'..u5555 -(,F%$$&&                 MM&)/***GG78888s   (P		P	P	)r8   c                *    dg} | j         |d|i|}|S )Navatar_filenamer8   rR   )rG   r8   r1   r2   r   s        r3   r   zCmfPerson.public_get{  s,     $$cgt5F5f55
r4   )r8   r9   c                    d S r   r   )rG   r8   r9   r1   r2   s        r3   r   zCmfPerson.public_list  s    tr4   c                     | j         sdS t          j                            dd| j        gdg          }|r	|d         }nOt                              | j                  }| j        |_        | g|_        | |_        |	                                 |S )uq   
        Возвращаем объект, с которым нужно начать переписку
        Nprimary_contact_idr   r5  )r9   r"  r   )r<   )
r?   r*   CmfDealrg   rQ   r<   rf  contactsprimary_contactr~   )r0   r1   r2   dealsdeals        r3   r   zCmfPerson.start_chat  s     z 	4##,@#tw+O[lZm#nn 	8DD>>ty>11D<DL!FDM#'D IIKKKr4   c                    | j         j        r| j         j        | j         j        S t          j                            dd| j        gddg          }|r%|j         dk    rO|j        t          j	        j        k    r5dt          j        j         j
        d         d| j         _        | j         j        S |j         r|j         j
        |j         j                 pd}|j         j        |d| j         _        | j         j        S )	Nr+  rd   rU   re   	invisibleoffline)js_idr<   r5   )rU   
is_defined_valuer*   rY  rE   rQ   r+  rZ   r[   choicesr   )r0   rn  r<   s      r3   _online_statuszCmfPerson._online_status  s    ( 	-T-?-F-R%,,(,,[$4PZikvYw,xx
 	-Z5DDI]abaqatItIt2;VEXEfEnoxEy(z(zD%%,,'lJ,D,LZMeMk,lrpr.8.F.L% %!!((r4   c                     |sg }|dk    r|dd|gg}|dk    r|r|                     d          r|g dg}|dk    r|dg d	g d
g dgg}|dk    r|g dg} t                      j        |f|||d|S )Nrx  r+  rd   rf  r   )is_internalrd   TruerW   r`   )r   rd   F)r>   r   r^  )r>   r   Usersr  )r%   rd   N)object_fields	object_idr9   )rE   rF   field_options_list)rG   relation_field_namer}  r~  r9   r2   rH   s         r3   r  zCmfPerson.field_options_list  s     	F.00{D)<=F)++ A!2!2<!@!@ A "?"?"?@.00t%<%<%<>U>U>UWmWmWmnoF*,,4445F)uww)*= X]4=fX XPVX X 	Xr4   c                    t                               d|            |sg d}	 t          j        |d          }t          j        |t          j        j                  dd          d}ddd	|gd
d|gdd	|gdd	|gg}|r||g}t          j        	                    ||          }t                               d|            |S # t          $ r(}t                               d|            Y d}~dS d}~ww xY w)us   
        Ищем персону по номеру телефона
        :param phone:
        :return:
        u4   Ищем пользователя по номеру )r?   rA   rB   rC   r   RUr   Nz;%r`   r?   LIKErA   rd   rB   rC   re   u.   Возвращаем пользователя %   Неправильный номер: )rZ   r   phonenumbersparseformat_numberPhoneNumberFormatE164r*   r   rE   r  )	rG   r?   r8   r9   	phone_objformat_phoner  r   r  s	            r3   get_by_phonezCmfPerson.get_by_phone  s>    	
NuNNOOO 	ZYYYF	$*5$77I*8LDbDghhijikiklpppLgv|<($6&=!6<8:G  ,!7+"&&gf&EECGGJSJJKKKJ 	 	 	GGCECCDDD44444	s   BC 
C4C//C4c                     g }i }|                      dg           | j        D ]/}|j        r&g }|||j        j        <   |                    |           0fd |           |S )Nzroles.tree_parent_idc                     i }t           j                            dd| gddg          D ]?}| |j                                     d|           |j        r| |j                 ||j        <   @|r |           d S d S )NrQ   rb   tree_parent_idr  re   r   )r*   
CmfOrgUnitr  rQ   insertr  )ou_idsou_ids_nextouquery_ous      r3   r  z.CmfPerson.get_org_units_list.<locals>.query_ou  s    K'--dD&5IScekRl-mm C Cru$$Qr***$ C5;BE]K 12 &%%%%%& &r4   )r|   rw  r  r   rh   )r0   r]   r^   ri   ou_ids_firstr  ou_listr  s          @r3   r   zCmfPerson.get_org_units_list  s    01222 	' 	'A '7>Q-34g&&&	& 	& 	& 	& 	& 	r4   c                    |                      |||          }|s	 t                              d|            t                              ||          }|                                 n8# t          $ r+}t                              d| d|            Y d }~d S d }~ww xY wt                              d|j                    |S )Nr   u:   Создаем пользователя с номером )r?   r<   r  rR  u@   Возвращаем пользователя с номером )r  rZ   r   r*   r   r~   r  r?   )rG   r?   r8   r9   r   r  s         r3   get_or_create_by_phonez CmfPerson.get_or_create_by_phone  s    ufV<< 	\UZ\\]]]&&U&??



   LLLLLMMMttttt 	
^SVS\^^___
s   AA* *
B4 BBc                     t          t                    |                    d          d                                      |          }|                    | j        j        |           dS )u3   
        Позвонить клиенту
        :r   rP   N)varsr*   r   rE   callbackr?   number_e164)r0   
channel_idr  channels       r3   
phone_callzCmfPerson.phone_call  sY     v,,z//44Q78<<
<KK/:::::r4   c                     t           j                            | j                  st                               | j                   t          j        | j         d|           S )Nr"  )r(  r)  r*  r'  r+  pathlibPath)r0   
image_hashr1   r2   s       r3   avatar_pathzCmfPerson.avatar_path  sQ    w~~d455 	0KK.///|t5DD
DDEEEr4   c                 "   |s| j                                         rB|                     | j                   }|                                r|                                 d | _         |                     d           |r&t          t          j        | j	        j
        g           d S |}t          |t                    rt          j        |          }t          j        | j        j
                            d                                                    }| d| _         |                     | j                   }	|	                    d          5 }
|
                    |           d d d            n# 1 swxY w Y   |                     d           d S )NTr   r  r!  z.jpegwb)rh  ri  r  r*  unlinkr~   r  r   r5  rQ   r   r7  rJ   base64urlsafe_b64decoder#  r$  ro   r%  r&  openwrite)r0   image
image_typer5  r1   r2   r  
image_datar  
image_path
image_files              r3   r   zCmfPerson.set_avatar  s    		#((** )"..t/CDD%%'' )&&(((#'D III%%% T%i&<DGM?SSSSF
eS!! 	91%88J[!1!8!8!@!@AAKKMM
",333%%d&:;;
__T"" 	)jZ(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)		D	!!!!!s   E..E25E2c                    | j         st                              d           dS t          j                    }|                    | j         j                                                                        	                    d                     d}d|
                                 d| d}	 t                                                              |t          j        d	          }nF# t           $ r9}t"                              d
                    ||                     Y d}~dS d}~ww xY w|j        dk    r5t"                              d
                    ||j                             dS |j        S )u>   
        Получаем аватарку с gavatar
        u/   Fetch gravatar skip: не задан логинNr!  qwez https://www.gravatar.com/avatar/z/avatar.jpg?d=z&s=200r   )rQ  u.   Ошибка запроса к gravatar {}: {}rS  )ro   rZ   r   r#  r$  r  r   lowerrr   r%  r&  r   requests_sessionrE   r`  r1   r  r  r  formatra  r  content)r0   r,  defaulturlr   r  s         r3   fetch_gravatarzCmfPerson.fetch_gravatar  sY    z 	GGEFFF4KMM	!''))//1188@@AAA]]]g]]]	**,,00glA0NNCC 	 	 	NUUVY[\]]^^^44444	 ?c!!MMJQQRUWZWfgghhh4{s   +9C% %
D(/.D##D(<   u   Установка gravatar)r  soft_time_limitr8  c                    t           j                            |           }|                    t           j                            |                     |                                }|                    |dd           d S )NrP   jpegF)r  r5  )r*   r   rE   r|   rz  r  r   )r+  r^   r  r  s       r3   r5  zCmfPerson.set_gravatar2  st     !%%%336+??GGHHH%%''%FGGGGGr4   c                     d S r   r   )rG   r1   r2   s      r3   r   z#CmfPerson.public_get_org_units_list:  s	     tr4   c                    |                      dg           | j        j        s|s| j        j        sd S | j        j        rt          j                            d          }|t          | j        j                  t          | j        j	                  z
  v rd| _        |t          | j        j	                  t          | j        j                  z
  v rd| _        d}t          j        j        r	| j        sd}| j        j        r| j        s|rt          dd           n|r| j        |k    r|| _        | j        j        rt          j                            d          }|                      dg           | j        r'|| j        vr| j                            |           d S d S || j        v r| j                            |           d S d S d S )	Nr   ServiceDeskClientr  TFu   Нельзя снять опцию у пользователя, т.к. она активирована через Проектную роль или включена глобальная опция "Разрешить доступ всем"rP  rW   )r|   r   r   rW   r*   r   rE   r   rh  rg  rZ   r   servicedesk_allow_auth_guestsr   r)   rh   r4  )r0   r  sdesk_groupr   s       r3   r  z!CmfPerson._calc_servicedesk_allow?  s0    	-./// "-		  +	
 F ' 	/ /339L3MMKc$"3"7883t?P?T;U;UUUU)-&c$"3"7883t?P?T;U;UUUU).& " : 	%4? 	% $ !, 	;) P.? P C KOP P P P ! ;T%;?P%P%P):& !, 		: /339L3MMKn-...% :d&777%,,[99999 87 $"333%,,[99999		: 		: 43r4   c                    |t           j        v rt           j        |         S t          j                            |dg d          }|st          d| d           dS |j        s|j        r t          	                    d| d           dS |j
        j        |j        j        |j        j        |j        j        |j        j        |j        j        |j        j        |j        j        |j        j        |j        j        |j        j        |j        j        |j        j        |j        j        dt           j        |<   t           j        |         S )	u_   
        Кешированное получение опций уведомления
        T)email_if_spectatoremail_if_authoremail_if_owneremail_if_responsibleemail_if_mentionsemail_if_self_changesrv  ru  	notify_osr?   rB   r<   r@   ro   r   r   )rQ   r   r8   u8   Пользователь не существует (ID: r   NuV   Пользователь удален или не работает(уволен) (ID: )r  r  r  r  r  r  rv  ru  r  r?   rB   r<   r@   ro   )r   cache_person_notify_optr*   r   rE   r)   r   r   rZ   r   r  r   r  r  r  r  r  rv  ru  r  r?   r  rB   r<   r@   ro   )rG   r+  r  s      r3   get_notify_opt_cachedzCmfPerson.get_notify_opt_cachedw  sT    333.y99!%%D R
 R
 R
%  &  	]QZ]]]^^^4 	!5 	GGymvyyyzzz4 #)";"A%5;$39$*$?$E!'!9!?%+%A%G +1"/5)/\("/6K%\'\'2
 2
#I.  *955r4   c                    | j         s| j        j        s| j        j        s| j        j        s| j        j        s| j        j        s| j        j        sz| j        j        sn| j	        j        sb| j
        j        sV| j        j        sJ| j        j        s>| j        j        s2| j        j        s&| j        j        s| j        j        s| j        j        sd S t%          d           d| j        j        i}t+          d|           d S )Nz!person_notify_opt::reload triggerr+  CmfPerson:changed)r`  r   r   r   r  r  r  r  r  r  rv  ru  r  r?   rB   r<   r@   ro   printrQ   r   cmf_emit_server_eventr0   r  s     r3   r	  z(CmfPerson._check_notify_opt_cache_reload  s?   K	*	 !,	 &1		
 #.	 "-	 (3	 %0	 )4	 )	  +	 ~(	 z$	  +	 y#	  z$!	" z$#	& F1222TW]+1488888r4   c                 L    t          d           ddi}t          d|           d S )Nz"flush_all_notify_opt_cache triggerr+  ALLr  )r  r  r  s     r3   flush_all_notify_opt_cachez$CmfPerson.flush_all_notify_opt_cache  s2    2333U#1488888r4   r  )r  c                      t          d           |                     d          }|                    d          }|dk    ri t          _        n t          j                            |d            t          d           d S )Nz&person_notify_opt_change::reload startr  r+  r  z%person_notify_opt_change::reload done)r  rE   r   r  pop)r^   r  r+  s      r3   on_person_notify_opt_changez%CmfPerson.on_person_notify_opt_change  sy     	6777{{6""HH[))	*,C'''++It<<<566666r4   c                     t           j                            | dg          }|r|j        r|j        S t
          j                            t
          j        j                  S )Nbrowser_timezone)r  r8   )tz)r*   rY  rE   r  r  r   r  utcr0   rn  s     r3   get_current_datetimezCmfPerson.get_current_datetime  s]     (,,DBTAU,VV
 	"*5 	">! $$(9(=$>>>r4   c                 `   | xj         dz  c_         | j         t          j        j        k    rmt          j        j        rd| _        nMt
          j                                        t          j        t          j        j        j	                  z   | _
        d| _         |                     d           d S )Nr   T)minutesr   r   )auth_fail_try_counterrZ   r   auth_fail_try_countauth_fail_permanent_blockr   r  	timedeltaauth_fail_timeoutr   auth_fail_block_end_dater~   r   s    r3   auth_fail_hookzCmfPerson.auth_fail_hook  s    ""a'""%):)NNN : 15..080A0E0E0G0G(J\-?EK K K 1- *+D&		D	!!!!!r4   c                 @    d| _         |                     d           d S )Nr   Tr   )r  r~   r   s    r3   auth_success_hookzCmfPerson.auth_success_hook  s$    %&"		D	!!!!!r4   c                 p    |                      ddg           | j        D ]}|                                 d S )Nzperson_var.browser_timezonez,person_var.person.staff_control_blocked_date)r|   rn  get_overdue_deadline_tasksr  s     r3   calc_staff_control_blockedz$CmfPerson.calc_staff_control_blocked  sM    79ghiii/ 	4 	4J113333	4 	4r4   z@dailyc                      t           j                            g d          D ]} d| _        |                                  d S )N)r  r   Tr   F)r*   r   rg   r  r~   rW  s    r3   %cron_drop_no_staff_control_today_flagz/CmfPerson.cron_drop_no_staff_control_today_flag  sO     &++3X3X3X+YY 	 	F,1F)KKMMMM	 	r4   c                     |                      ddg           d}| j        D ].}|j        r|j        j        s|j        j        
 dz  |j        z  }/|S )u0   
        Ставка за минуту
        zroles.job.rate_per_hourz
roles.rater   r  )r|   rw  jobrate_per_hourrate)r0   r  r   s      r3   rate_per_minutezCmfPerson.rate_per_minute   sm     	3\BCCCJ 	< 	<D8 48#9 H**R/$);DDr4   )Tr   )NNN)NN)r   r  )r   r  )F)r   )NNT)`__name__
__module____qualname__r  rU  r'  r   r   api_methodsr   classmethodr   rM   rS   r	   r   propertyrs   r
   r   r   r   r   r   r   r   r   r   r  staticmethodcmf_deferred_jobr  r   r   r   rC  rN  rR  rg   r\  rc  rl  rq  rs  rz  r  r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r~   r  rZ  r/  r   r  r   r   r   r   rx  r  r  r   r  r  r  r   r  r5  r   r  r  r	  r  on_server_eventr  r  r  r  r  r  r  __classcell__)rH   s   @r3   r   r      s       !-EEE&2 6
 6
 6
 
K0I I I" !#D 
 
 
 
 
 
 [
1 1 1 L L [L | | | [|
    [ A A XA     : : :   @U U U U_ _ _ _6 $ $ [$0/ / /+ + +   n  & 25 25 25 [25h 666T T T 76 \T. 	JJJ      KJ \ B ,0tVZfjz~     :H H H H H    40 0 0 (,d - - - - - - [-0 0 0> > >
' 
' 
'" " "  G G G G G$ $ $(, , ,
   - - -
     <( ( (*	. 	. 	. 	.+ + + )- A A A A A A A# # # #( ( (&. . . . .a a a a 23 23 23 23 23h] ] ]* * *Bf f f f f fP#7 #7 #7 #7 #7J< < < < <       [ L L L "z  FG  H  H  H	B 	B H  H \	B 2pqqq49 Z Z Z Z Z Z rq \Zx &*     [ '+D     [  & 
) 
) X
) X X X X X [X     [2  0    [; ; ;F F F
" " " "0  , bFcdddH H ed \H   [6: 6: 6: 6:p 36 36 [36j9 9 92 9 9 [9
 _01117 7 21 \7? ? ?" " "" " "4 4 4 III  JI \

 
 
 
 
 
 
r4   r   )r  r#  r  rZ  r  cmf.data_providers.baser   cmf.includer   modules.person.fieldsr   r   r   r4   r3   <module>r     s            1 1 1 1 1 1      , , , , , ,{ { { { {
$ { { { { {r4   