
    ޙh                    |    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                   f    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
          dddd                        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.dvd1Z/d2 Z0dwd4Z1d5 Z2d6 Z3dxd8Z4d9 Z5dd: fd;
Z6d< Z7d= Z8 fd>Z9dyd@Z: fdAZ;dB Z<ds fdC	Z= fdDZ> fdEZ?e
dsdF            Z@dG ZAe edHdIJ          dK                         ZBe ed
dLd
M          d7dNdOe&fdP                        ZCe
ddQdR            ZDe
dddSdT            ZEdU ZFedV             ZGe
dt fdW	            ZHe
dudX            ZIdY ZJe
dudZ            ZKd[ ZLd\ ZMdzd]ZNd^ ZOe ed
d_d`d
a          db                         ZPe
dc             ZQdxddZRe
de             ZSdf ZTe
dg             ZUe eVdhi          dj                         ZWdk ZXdl ZYdm ZZdn 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          s6t          d           t          j                            dd| ddd	
           d S |                     d            t          j                            dd| ddd	
           t          d           d S )Nu6   Пользователь не заблокированFraise_erroru   У вас нет правuser_unblockr   failT   )operatecmf_model_nameparentresult_statuscurrent_transaction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''{37vcgxy ( { { {F))$///##N;37yfj{| 	$ 	~ 	~ 	~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_assistantr7   )getsuperr   )clsr8   r9   r:   r2   r3   	__class__s         r4   r   zCmfPerson.search:   sd    "(**_"="=  #l  Bl  Bl  Bluww~vf
 
@F
 
 	
r5   c                 j    t          d                    t          | j                                      S Nr6   )strjoinreversedr=   r0   s      r4   reverse_namezCmfPerson.reverse_nameA   s&    2778DI..//000r5   c                 .    |                      d          S )N.CmfPerson:00000000-0000-0000-0000-000000000001idrF   )rH   s    r4   system_personzCmfPerson.system_personD   s    wwJwKKKr5   Tc                 f    t           j                            t          j        j        g d          S )N)r   online_statuson_vacationrg_member_ofis_admin
two_factor)rS   r9   )r+   r   rF   gcurrent_personrS   )rH   create_args_kwargss       r4   r	   zCmfPerson.get_current_userH   s9     ##"+z+z+z $ | | 	|r5   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==r:   r9   )r+   
CmfProjectlistr\   r]   rS   append)rH   r9   resultprojects       r4   r   zCmfPerson.get_current_projectsN   sx    (--d[$QRQaQdPe<f7EtQM]M`6a6ckq . s s 	# 	#GMM'""""r5   c                 ~    | j         p| j        pd}| j        pd}| j        pd}| d| d|                                 S Nr6    )	last_namelogin
first_namesecond_namestrip)r1   r2   r3   rp   rr   rs   s         r4   	full_namezCmfPerson.full_nameV   sV    N6dj6B	_*
&,"88j88;88>>@@@r5   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)ry   r{   r=   )load_fieldsrw   r+   	CmfFoldersavecmfutildisable_aclCmfDocument)r1   r2   r3   folders       r4   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)ru   rq   rA   r1   s    r4   gen_namezCmfPerson.gen_namel   s    ~99tz9r5   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--rS   T)r?   r9   cache_inmemory)r=   r9   r   uX   Ошибка вызова in_person_group: не найдена группа (group_code=z, group_name=z, group=)F)id_only)r   get_obj_id_by_anyr+   r   sgetrS   r*   r\   current_usercurrent_person__member_ofr,   subject_full_group_list)r1   group
group_code
group_namegroup_id	member_ofs         r4   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ur5   c                 2    |                      |||          S )u   
        ! DEPRICATED
        ! Публичное API для bzPython
        Для обратной совместимости
        )rl   	role_coderole)in_project_role)r1   rl   r   r   s       r4   has_project_rolezCmfPerson.has_project_role   s     ##Gyt#TTTr5   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   rS   )r?   r9   )r=   r9   ug   Ошибка вызова in_project_role - не найдена Проектная роль (role_code=z, role_name=z, role=r   Frh   )
r   r   r+   r   r   rS   r*   valuer   get_project_role_members)r1   rl   r   r   	role_namerole_id
project_ids          r4   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] ^ ^^^r5   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_idrg   )APPcache_in_project_role
setdefaultdictri   setr+   CmfProjectRoleAssignr   
all_nestedaddrS   r   )rH   r   r   project_cacherole_cache_setrulemembers          r4   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###r5   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)rX   vacation_startvacation_endFT)r~   r   r   datetimeutcnowdaterX   )r1   cur_on_vacations     r4   _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 /.r5   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 )Nr6   ro   r      r"   )r=   
is_changedis_nullr   replaceVACATION_SUFFIXDOES_NOT_WORK_SUFFIXrt   splitlenrp   rr   rs   )r1   tmpname_arrs      r4   _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 r5   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 rn   )r=   r   rr   rs   rp   rq   rX   does_not_workr   r   ru   )r1   add_strs     r4   
_calc_namezCmfPerson._calc_name   s    I 		)		 *		 ~(			
 z$		 *		 !,		 F 	10$.00G 	65$355G~0w00	r5   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|d         s| j        rd|d<   |S )N)auth_optionsrZ   
is_support)
allow_base
allow_ldapallow_oauth	allow_ssor   T)r~   r   r\   global_settingsauth_options_allow_baser   auth_options_allow_ldapauth_options_allow_oauthauth_options_allow_ssor   rF   rZ   )r1   reskeys      r4   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<  	%T] 	% $C
r5   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
        ANDrb   
user_localrf   T)servicedesk_allowrf   T)rq   !=N)r   r   T)r   rf   Ncmf_modified_at>u   Синхронизируем r:   )zrg_member_of.ext_idcmf_deletedr   deleted_loginrA   r   	ext_loginzrg_member_of.systemTr:   r9   include_deleted)rq   r   rA   r=   rY   r   r   	old_loginN	only_datac                 4    g | ]}|j         	|j        j        S  )systemr?   r   .0objs     r4   
<listcomp>z/CmfPerson.account_sync_push.<locals>.<listcomp>o  s%    +h+h+hs]`]g+hCHN+h+h+hr5   rY   c                 &    g | ]}|j         j        S r   )r?   r   r   s     r4   r   z/CmfPerson.account_sync_push.<locals>.<listcomp>q  s    +Z+Z+ZsCHN+Z+Z+Zr5   rq   )eva_app_tokenusersrpc_account_sync_push)r3   methodu    учетокzauth/sync_accounts)rj   r\   debugr+   r   countri   r   rq   r   r   rA   r=   r   r   r   r   r   r   only_system_grp_syncrY   r   gen_eva_app_tokenr   call_eva_account)rH   account_sync_lastforce_filterr   personrY   datas           r4   account_sync_pushzCmfPerson.account_sync_pushN  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4r5   )	only_once
system_job)r  two_factor_optc                    g }d}| sg dg dg} t           j                            | g d          D ]}	 |j        s+t                               |j        |j                  |_        ||j        _        |j                                         |                                 t                       |dz  }# 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   )r[   rf   N)r[   rC   rA   rg   r@   rA   r   u   Обработано u-   </br> Не удалось настроить:z</br>u)   Закончили настройку 2FA)r>   )r+   r   ri   r[   CmfAuthTwoFactorrC   rA   r  r   commit_with_event	Exceptionrollback_purge_eventrj   rL   r\   r   rM   r   admin_alert)	r  r  r2   r3   fail_personcntr  er>   s	            r4   init_2fa_settingszCmfPerson.init_2fa_settings  s     	O1113M3M3MNG&++7CjCjCj+kk 	 	F( T(.(?(?fFYFLl )@ )T )TF%3A!0!&&(((!###Q   $&&&""3v;;///







 -s,, 	dIII',,WbJcJccD	GdSSSSSs   A>B44
D>A
DD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)r\   r   
global_varaccount_sync_statusr   ager*   r   set_nowr   r  r+   r   r  r  logging	exceptionr   )r  r   r  s      r4   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)slicer9   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_typerf   pfeedr%   zparent.is_defaultrg   c                 &    g | ]}|j         j        S r   )rS   r   )r   r  s     r4   r   z-CmfPerson.pfeed_post_list.<locals>.<listcomp>  s     Z Z ZV Z Z Zr5   person_viewsz
NOT EXISTS	person_idr   rb   )cache_status_typer   OPENre   rf   listsrd   c                     | j         S r   rR   xs    r4   <lambda>z+CmfPerson.pfeed_post_list.<locals>.<lambda>      qt r5   r   c                     | j         S r   rR   r/  s    r4   r1  z+CmfPerson.pfeed_post_list.<locals>.<lambda>  r2  r5   z-status_in_progress_start-cmf_created_at)r:   r9   r!  r   )r+   CmfListri   r%   
isinstancer   rh   
is_defaultrj   rS   all_relation_personsCmfTaskr   r\   r]   map)r1   r   r9   r!  r"  r#  r$  r2   r3   r-  my_listslstflt	post_lists                 r4   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	 (  	
 r5   c                 F     t                      j        |fd| j        i|S )Nr*  )rG   r   rS   )r1   obj_idr_   r3   rI   s       r4   r   zCmfPerson.mark_viewed  s+    
 #uww"6GGTWGGGGr5   c                     d S r   r   r0   s      r4   public_mark_viewedzCmfPerson.public_mark_viewed  s    tr5   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   rR   r   s     r4   r   z.CmfPerson.create_p2p_chats.<locals>.<listcomp>  s    BBBcfBBBr5   rc   rd   p2prg   c                      g | ]}|j         	|S r   )rE  r   s     r4   r   z.CmfPerson.create_p2p_chats.<locals>.<listcomp>  s     E E ESW E E E Er5   rY   rS   zNOT INrQ   Tr   )rY   r   r+   r   
user_grouprS   CmfChatGroupri   r   rc   rE  r   rj   topics)r1   r   usr_grp	cur_chatsr  r  r   topics           r4   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))))
r5   c                     | j         sd S t          j        j        | j        k    rt	          dd           t
          j                                         d S )Nu1   Нельзя удалить самого себяTabort)r   r\   r]   rS   r*   r+   r,   r-   r   s    r4   
_check_delzCmfPerson._check_del  sU     	F$'))IQUVVVV--/////r5   )include_systemis_userc                x    |s|                     dd           |du rd|d<    t                      j        |i |S )Nr   FTr   )r   rG   ri   )rH   rR  rS  r2   r3   rI   s        r4   ri   zCmfPerson.list  sO     	/h...d??#'F< uww|T,V,,,r5   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   rF   restorer*   r   )r1   
deleted_pvs     r4   _check_person_varzCmfPerson._check_person_var  s     	&"5":":$":"G"G 	F 	F(,,D$,OO
 	      s  t  t  tF4((--/////r5   c                 
   | j         s| j        j        sd S |                     d          rUt          j                                        }|                     |j                  s| j                            |           d S d S d S )NAdminsr   )	is_newrY   r   r   r+   r   contact_admins_groupr?   rj   )r1   contact_admin_groups     r4   _calc_contact_adminzCmfPerson._calc_contact_admin#  s    { 	4#4#? 	F844 	>"("7"L"L"N"N''3F3K'LL >!(()<=====	> 	>> >r5   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?   Контакт не может быть без компанииTrO  )typer=   )r   r   companyr   oldnewrd  loadr*   r   r+   
CmfCompanyru   r   )r1   new_companys     r4   _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		' 	'r5   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   r\   r]   r~   
person_var	favoritesr   )r1   rm  current_person_vars      r4   _calc_default_favoritesz!CmfPerson._calc_default_favorites9  s     { 	$/ 	F	$$&<%=>>>/ 	" 	"J&'&6&A " ""'9'C
$!!!!"	" 	"r5   c                 &    | j         r| j        sd S d S r   )r_  r   r   s    r4   _calc_avatarzCmfPerson._calc_avatarF  s$     	 	F	 	r5   c                 N    t                                                      g dz   S )N)rq   notify_email
notify_smsr@   rC   rolesprimary_rolezcompany.typer   rm  r   rX   r   r   rp   rr   rs   rq   rA   r   ztwo_factor.two_factor_optr   )rG   save_preload_fields)r1   rI   s    r4   rx  zCmfPerson.save_preload_fieldsL  s/    ww**,, 08 08 08 8 	8r5   c                    | j         r| j         j        sdS g }t          j                            dd| gg dg          D ](}|                    d|j         d|j         d           )|rmd	                    |          }d| j         d| j         d
| }t                              | 	                                d|          
                                 dS dS )zY
        https://bcrm.carbonsoft.ru/project/Document/DOC-003685#spec-eva-account
        Nresponsiblerf   r+  r   CLOSEDr   z	<a href="z">z</a>z<br>z</a> uM   Обработайте задачи уволенного сотрудника)rz  r=   r>   )r   r   r+   r9  ri   rj   hrefr=   rM   get_supervisorr   )r1   linkstaskr>   s       r4   _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 $  & &&*dfffff	- 	-r5   c                 f    t           j                            | j        dg          }|r|j        S d S )Nfail_block_end_daterq   r9   )r+   CmfAuthr   rq   r  r1   auths     r4   r   z&CmfPerson.get_auth_fail_block_end_datef  s=    ~""=R<S"TT 	,++	, 	,r5   r   datetime.datetime | Nonec                     t           j                            | j                  }|r||_        |                                 d S d S Nrq   )r+   r  rF   rq   r  r   r1   r   r  s      r4   r   z&CmfPerson.set_auth_fail_block_end_datek  sG    ~!!
!33 	',D$IIKKKKK	 	r5   c                 f    t           j                            | j        dg          }|r|j        S d S )Nfail_permanent_blockr  )r+   r  r   rq   r  r  s     r4   r   z'CmfPerson.get_auth_fail_permanent_blockq  s=    ~""=S<T"UU 	-,,	- 	-r5   boolc                     t           j                            | j                  }|r||_        |                                 d S d S r  )r+   r  rF   rq   r  r   r  s      r4   r   z'CmfPerson.set_auth_fail_permanent_blockv  sG    ~!!
!33 	(-D%IIKKKKK	 	r5   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)rw  ztree_parent.head)headr+   r   rF   r~   ry   )org_unit	recursions    r4   r  z+CmfPerson.get_supervisor.<locals>.recursion  se    } H'+++GGG  "4!5666# 7 y!56664r5   zprimary_role.supervisor.personzprimary_role.tree_parent.headNr   )r~   rw  
supervisorr  ry   r+   r   admin_group
rg_membersrh  r   )r1   r  	admin_grpr  s      @r4   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
r5   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   , так как у них указан Код запрета совмещения: TrO  )rY   r   r~   incompatible_combination_coderL   r   rt   r*   )r1   codesgrgr_codes       r4   %_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(		( 		(r5   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   )rv  r   rw  r   )r1   r  s     r4   _calc_primary_rolezCmfPerson._calc_primary_role  s    
% 	 	Fz 	. $D& 	. $
1Ddj00 $
1D 10r5   c                     | j         r t          j                            |           sdS t          j                            |           D ]}d|_        |                    d            dS )uN   Надо пометить что данные не засинканы
        rV  NTr   )r   r+   CmfAuthPluginDatar   ri   dirtyr   )r1   	auth_datas     r4   _check_auth_datazCmfPerson._check_auth_data  sy      	F$<$B$B$$B$O$O 	F166d6CC 	+ 	+I IONNTN****	+ 	+r5   )save_kwargsc                    |                     d          rt          dd            t                      j        |d|i| d S )Nrv  u   Назначение или открепление должности пользователю необходимо производить в "Структуре" в карточке должностиTrO  r  )rF   r*   rG   update)r1   r  r2   r3   rI   s       r4   r  zCmfPerson.update  s_    ::g 	}   
 	@+@@@@@@r5   c                     | j         rTt          j        j        rE| j        s@| t          j        fvr3t                              | j        | j	                  | _        d S d S d S d S d S )Nr
  )
r   r\   r   r  r[   rU   r+   r  rC   rA   r   s    r4   
_check_2fazCmfPerson._check_2fa  s    ? 	Hq0? 	H 	H\`ijixhz\z\z$55D<M<@J 6 H HDOOO	H 	H 	H 	H 	H 	H\z\zr5   c                 L   | j         j        sd S d }| j         j        D ])}|j                                        r|j        j        } n*|sd S | j        s+t                              | j	        | j
                  | _        || j        _        | j                            d           d S )Nr
  Tr   )rY   r   rg  r  rh  r   r[   r+   r  rC   rA   r   )r1   r  grps      r4   _check_2fa_groupzCmfPerson._check_2fa_group  s     + 	F$( 	 	C!&&(( !$!3!9  	F 	H$55D<M<@J 6 H HDO)7&t,,,,,r5   c                     | j         r| j        | j         k    r| j         | _        |                                  |                                   t	                      j        |i | d S r   )rq   r?   r   _calc_servicedesk_allowrG   _save_importr1   r2   r3   rI   s      r4   r  zCmfPerson._save_import  sh    : 	#$)tz11
DI$$&&&d-f-----r5   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   r6   Fr   )r?   rf   ProjectAdminsr   u  Изменение членства в группах на карточке пользователя для Проектных администраторов временно недоступно. Откройте группу и добавьте пользователя там.TrO  )rY   r   r\   disable_permissionsacl_admin_moder]   rU   r+   r,   r-   r   rF   rS   r   r   r*   )r1   depthr3   project_admins_groups       r4   _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Gr5   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   rA   r@   rB   rC   rD   rE   
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   r6   ro   r=   r  r  r>   r   )r~   full_search_fieldsr   r+   CmfFullSearch
mark_cleanrS   r   
cmf_hiddenr=   rq   rA   rt   rv  rw  rG   full_search_index)r1   r3   text_fieldsr=   r>   frrI   s          r4   r  zCmfPerson.full_search_index  s   W W W 	0111; 	 ++DGM:::F? 	 ++DGM:::Fy$": 	+C$****D: 	+$*
22C$****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2r5   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.coderg   r^  )r  rf   F)r  rf   Nauth_pluginrf   r  T)r:   values)rY   r   r+   CmfAuthLdapPluginslistr   r  r?   rS   r  bulk_update)r1   pr  s      r4   _check_ad_grpzCmfPerson._check_ad_grp-  s      + 	F)//7O7O7OYjXk/ll 	] 	]A##q|/@#AA ]111111M$qt3LN(44GWVZO4\\\	] 	]r5   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+        r,| j,        s%t6          j-        (                    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 уведомлений необходимо указать номер мобильного телефонаTrO  perm_updater   r  r"   r  c                     g | ]	}|j         
S r   r?   r   r\   s     r4   r   z"CmfPerson.save.<locals>.<listcomp>j  s    FFF1FFFr5   c                     g | ]	}|j         
S r   r  r  s     r4   r   z"CmfPerson.save.<locals>.<listcomp>k  s    BBB1BBBr5   )rf  rg  )	r#   r$   r%   r&   r'   r(   parent_nameparent_code
audit_dataFalseIBAdminsr^  u   Изменять настройки паролей разрешено только Администраторам ИБ из группы IBAdminsr  uG   Пользователь не синхронизирован с accountr   r   )r7  Fr   uw   Поле может редактировать только Администратор или Руководитель(r   )r%   r   )Ar  r  r   r   rQ  rq   r?   r   r   r   rp  r  rk  rr  ru  rC   numberr@   r*   r  r  r  r  r  r  rb  rY   r+   r.   r/   r=   rf  configEVA_ACCOUNT_USEpassword_must_changepassword_changed_dater\   r   r   r  rF   password_expires_must_changer   r_  calendarCmfCalendarno_staff_control_todayr,   r-   r~  r    license_disable_user_count_hooks
CmfLicenserelease_all_user_licensesis_license_grouptake_user_licenserG   r   r[  r   r   schedule_deferred_jobr  _check_notify_opt_cache_reloadCmfTimeTracker)	r1   	from_ldapr2   r3   r  r   r   person_timetrackerrI   s	           r4   r   zCmfPerson.save;  sZ   **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---; 	Dt} 	D".22d2CCDM&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##%%%
r5   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        |i | t+          t,          j        | j        j        g           t+          t,          j                   t          j                                         d S )Nrz   r   r  r  rf   r  rg   u;   Пользователь синхронизирован с u9   , сначала отключите интеграцию.TrO  DELz%Y%m%d%H%M%Sro   TEXKOM_db_deleterW  rV  r2   )r~   r+   r  PERSON_LIC_FIELDSr  r  rF   r*   r  r   nowstrftimerQ  r\   r  r  CmfPersonViewri   deleterX  rG   r  r   sync_person_task_resourcesrS   r   r  CmfProjectNotifySchemetrigger_reload)r1   r2   r3   r  prefixr  varrI   s          r4   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'''''''''iB$'-YYYY 	i:;;;
 	%4466666r5   c                     | j         r0t                              | j        d| j         j                  | _          t                      j        |i | t          t          j	                   d S rK   )
r  resubdelete_prefix_patternr   rG   rY  r  r   r  r  s      r4   rY  zCmfPerson.restore  sb     	f#%66$*Db$J^Jd#e#eD ((((i:;;;;;r5   c                 >   |rt          j                    }|                    |                    d                     |                                }t
          j         d| d}t          j        	                    |          st          
                    |           |S )Nutf8/)hashlibmd5r  encode	hexdigestr1   _AVATAR_DIRECTORYospathexistsmakedirs)rH   rq   mavatar_hashavatar_directorys        r4   
avatar_dirzCmfPerson.avatar_dir  s     	.AHHU\\&))***++--K"&"8II;III7>>"233 .,---r5   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  rq   r   r  r  isdirlistdirisfileremover  set_gravatarrS   )r1   r2   r3   r  filefilepaths         r4   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Kr5   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 )NrS   rf   r   Tr   r{  rb   rz  rc   rd   r   )r+   r   rF   r   r9  ri   CmfTaskResAssignsync_task_resources)r*  r  r  r  s       r4   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r5   u<   Регистрация нового пользователя)r  r(  show_bg_progressbar)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        syt          j        j        sht          j	                            d          sH| D ])}t"          j                            ddd	d
dd||           *t)          dt          j	                    |            }|rg }nt"          j                                        g}| D ]}|t"          j                            d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!   Tr"   )r#   r$   r%   r&   r'   r(   r  r  u.   Операция не доступна для r  r   i:	 guid)rq   issiatexpjtir  zregister_persons:frominvite_must_change_password)r9   r   invite_by_email)rA   actioninvite_tokenr:  )absoluteinternalzauth/signup   )r  cookiestimeout,    zSigned up successfullyuE   ERROR: Не удалось отправить приглашение z: r?   rf   u"   Ищем пользователя rY   r   rg   u)   Создадим пользователя)rq   rA   rY   r   u(   Добавим пользователя u    в группу z!register_persons: person saved ok)2requestsr1  r  r  r  r  PROJECT_DIRr\   r   r]   rU   r   r   rZ   r   allow_user_inviter   r+   r.   r/   CmfPermissionErrorr   rG  r   APP_FQDNrL   inttimerA   r   
create_jwtrsa_sign_pack_jwtCmfGlobalSettingsrF   r:  postauth_base_hrefrequestrA  status_coder>   jsonr   r=   rY   rj   r   r   r   rS   )r/  r.  r2   r3   r1  rk   rA   sgroupspayloadjwtr=  r:  r  r   r  r  r   s                     r4   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]37vcgxy8=5 , R R R R %%hVWVf%h%hiiiGII 	:FF+66889F 7	9 7	9E}O''k/34]ars49u ( 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	)r9   c                *    dg} | j         |d|i|}|S )Navatar_filenamer9   rT   )rH   r9   r2   r3   r   s        r4   r   zCmfPerson.public_getF  s,     $$cgt5F5f55
r5   )r9   r:   c                    d S r   r   )rH   r9   r:   r2   r3   s        r4   r   zCmfPerson.public_listN  s    tr5   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   r4  )r:   r!  r   )r=   )
r@   r+   CmfDealri   rS   r=   re  contactsprimary_contactr   )r1   r2   r3   dealsdeals        r4   r   zCmfPerson.start_chatR  s     z 	4##,@#tw+O[lZm#nn 	8DD>>ty>11D<DL!FDM#'D IIKKKr5   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*  rf   rW   rg   	invisibleoffline)js_idr=   r6   )rW   
is_defined_valuer+   rX  rF   rS   r*  r\   r]   choicesr   )r1   rm  r=   s      r4   _online_statuszCmfPerson._online_statuse  s    ( 	-T-?-F-R%,,(,,[$4PZikvYw,xx
 	-Z5DDI]abaqatItIt2;VEXEfEnoxEy(z(zD%%,,'lJ,D,LZMeMk,lrpr.8.F.L% %!!((r5   c                     |dk    r|sg }|dd|gg}|dk    r!|r|                     d          r
|sg }|g dg}|dk    r|sg }|dg d	g d
g dgg} t                      j        |f|||d|S )Nrw  r*  rf   re  r   )is_internalrf   TruerY   rb   )r   rf   F)r?   r   r]  )r?   r   Users)object_fields	object_idr:   )rF   rG   field_options_list)rH   relation_field_namern  ro  r:   r3   rI   s         r4   rp  zCmfPerson.field_options_listr  s    .00 {D)<=F)++ A!2!2<!@!@ A  F "?"?"?@.00 t%<%<%<>U>U>UWmWmWmnoF)uww)*= X]4=fX XPVX X 	Xr5   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@   rB   rC   rD   r   RUr   Nz;%rb   r@   LIKErB   rf   rC   rD   rg   u.   Возвращаем пользователя %   Неправильный номер: )r\   r   phonenumbersparseformat_numberPhoneNumberFormatE164r+   r   rF   r  )	rH   r@   r9   r:   	phone_objformat_phoner  r   r  s	            r4   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 )NrS   rd   tree_parent_idr  rg   r   )r+   
CmfOrgUnitr  rS   insertr  )ou_idsou_ids_nextouquery_ous      r4   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 &%%%%%& &r5   )r~   rv  r  r   rj   )r1   r_   r`   rk   ou_ids_firstr  ou_listr  s          @r4   r   zCmfPerson.get_org_units_list  s    01222 	' 	'A '7>Q-34g&&&	& 	& 	& 	& 	& 	r5   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=   ru  rC  u@   Возвращаем пользователя с номером )r}  r\   r   r+   r   r   r  r@   )rH   r@   r9   r:   r   r  s         r4   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   rR   N)varsr+   r   rF   callbackr@   number_e164)r1   
channel_idr  channels       r4   
phone_callzCmfPerson.phone_call  sY     v,,z//44Q78<<
<KK/:::::r5   c                     t           j                            | j                  st                               | j                   t          j        | j         d|           S )Nr  )r  r  r  r  r  pathlibPath)r1   
image_hashr2   r3   s       r4   avatar_pathzCmfPerson.avatar_path  sQ    w~~d455 	0KK.///|t5DD
DDEEEr5   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)rY  rh  r  r  unlinkr   r  r   r%  rS   r   r6  rL   base64urlsafe_b64decoder  r  rq   r  r  openwrite)r1   image
image_typer%  r2   r3   r  
image_datar  
image_path
image_files              r4   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   )rB  u.   Ошибка запроса к gravatar {}: {}rD  )rq   r\   r   r  r  r  r   lowerrt   r  r  r   requests_sessionrF   rQ  r2   r  r  r  formatrR  r  content)r1   r  defaulturlr   r  s         r4   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_limitr(  r-  c                    t           j                            |           }|                    t           j                            |                     |                                }|                    |dd           d S )NrR   jpegF)r  r%  )r+   r   rF   r~   rx  r  r   )r*  r`   r  r  s       r4   r%  zCmfPerson.set_gravatar  st     !%%%336+??GGHHH%%''%FGGGGGr5   c                     d S r   r   )rH   r2   r3   s      r4   r   z#CmfPerson.public_get_org_units_list  s	     tr5   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   Нельзя снять опцию у пользователя, т.к. она активирована через Проектную роль или включена глобальная опция "Разрешить доступ всем"rO  rY   )r~   r   r   rY   r+   r   rF   r   rg  rf  r\   r   servicedesk_allow_auth_guestsr   r*   rj   r$  )r1   r  sdesk_groupr   s       r4   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3r5   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_changesru  rt  	notify_osr@   rC   r=   rA   rq   r   r   )rS   r   r9   u8   Пользователь не существует (ID: r   NuV   Пользователь удален или не работает(уволен) (ID: )r  r  r  r  r  r  ru  rt  r  r@   rC   r=   rA   rq   )r   cache_person_notify_optr+   r   rF   r*   r   r   r\   r   r  r   r  r  r  r  r  ru  rt  r  r@   r  rC   r=   rA   rq   )rH   r*  r  s      r4   get_notify_opt_cachedzCmfPerson.get_notify_opt_cachedD  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5r5   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  ru  rt  r  r@   rC   r=   rA   rq   printrS   r   cmf_emit_server_eventr1   r  s     r4   r  z(CmfPerson._check_notify_opt_cache_reloadz  s?   K	*	 !,	 &1		
 #.	 "-	 (3	 %0	 )4	 )	  +	 ~(	 z$	  +	 y#	  z$!	" z$#	& F1222TW]+1488888r5   c                 L    t          d           ddi}t          d|           d S )Nz"flush_all_notify_opt_cache triggerr*  ALLr  )r  r  r  s     r4   flush_all_notify_opt_cachez$CmfPerson.flush_all_notify_opt_cache  s2    2333U#1488888r5   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  rF   r   r  pop)r`   r  r*  s      r4   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6r5   c                     t           j                            | dg          }|r|j        r|j        S t
          j                            t
          j        j                  S )Nbrowser_timezone)r  r9   )tz)r+   rX  rF   r  r  r   timezoneutcr1   rm  s     r4   get_current_datetimezCmfPerson.get_current_datetime  s]     (,,DBTAU,VV
 	"*5 	">! $$(9(=$>>>r5   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_counterr\   r   auth_fail_try_countauth_fail_permanent_blockr   r  	timedeltaauth_fail_timeoutr   auth_fail_block_end_dater   r   s    r4   auth_fail_hookzCmfPerson.auth_fail_hook  s    ""a'""%):)NNN : 15..080A0E0E0G0G(J\-?EK K K 1- *+D&		D	!!!!!r5   c                 @    d| _         |                     d           d S )Nr   Tr   )r  r   r   s    r4   auth_success_hookzCmfPerson.auth_success_hook  s$    %&"		D	!!!!!r5   c                 p    |                      ddg           | j        D ]}|                                 d S )Nzperson_var.browser_timezonez,person_var.person.staff_control_blocked_date)r~   rm  get_overdue_deadline_tasksr  s     r4   calc_staff_control_blockedz$CmfPerson.calc_staff_control_blocked  sM    79ghiii/ 	4 	4J113333	4 	4r5   z@dailyc                      t           j                            g d          D ]} d| _        |                                  d S )N)r  r   Tr   F)r+   r   ri   r  r   rV  s    r4   %cron_drop_no_staff_control_today_flagz/CmfPerson.cron_drop_no_staff_control_today_flag  sO     &++3X3X3X+YY 	 	F,1F)KKMMMM	 	r5   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~   rv  jobrate_per_hourrate)r1   r  r   s      r4   rate_per_minutezCmfPerson.rate_per_minute  sm     	3\BCCCJ 	< 	<D8 48#9 H**R/$);DDr5   )Tr   )NNN)NN)r   r  )r   r  )F)r   )NNT)___name__
__module____qualname__r  rF  r  r   r   api_methodsr   classmethodr   rO   rU   r	   r   propertyru   r
   r   r   r   r   r   r   r   r   r   r  staticmethodcmf_deferred_jobr  r  r   r   rB  rM  rQ  ri   r[  rb  rk  rp  rr  rx  r  r   r   r   r   r~  r  r  r  r  r  r  r  r  r  r  r   r  rY  r  r   r  r   r   r   r   ri  rp  r}  r   r  r  r  r   r  r%  r   r  r  r  r  on_server_eventr  r  r  r  r  r  r  __classcell__)rI   s   @r4   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)-d T T T T 76 \T4 	JJJ      KJ \ B ,0tVZfjz~     :H H H H H    40 0 0 (,d - - - - - - [-0 0 0> > >
' 
' 
'" " "  8 8 8 8 8- - -$, , ,
   - - -
     <( ( (*	. 	. 	. 	.+ + + )- A A A A A A AH H H- - - . . . . .a a a a 23 23 23 23 23h] ] ]e e e e e eN7 7 7 7 7>< < < < <       [ L L L "z  FG  H  H  HB B H  H \B 2p  GK  L  L  L49 Z Z Z Z Z Z L  L \Zx &*     [ '+D     [  & 
) 
) X
) X X X X X [X$    [2  0    [; ; ;F F F
" " " "0  , bFcy}~~~H H ~ \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 \

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