
    Ri                    |    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                   b    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
dqd            Ze
drd            Zed             Zd Zd ZdsdZdtdZdsdZe
d             Zd Zd Zd Zd Ze
drd            Ze ed
d
          dtd                        Ze ed
d
d          drd                        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.dud0Z/d1 Z0dvd3Z1d4 Z2d5 Z3dwd7Z4d8 Z5dd9 fd:
Z6drd;Z7d< Z8 fd=Z9dxd?Z: fd@Z;dA Z<dr fdB	Z= fdCZ> fdDZ?e
drdE            Z@dF ZAe edGdHI          dJ                         ZBe ed
dKd
L          d6dMdNe&fdO                        ZCe
ddPdQ            ZDe
dddRdS            ZEdT ZFedU             ZGe
ds fdV	            ZHe
dtdW            ZIdX ZJe
dtdY            ZKdZ ZLd[ ZMdyd\ZNd] ZOe ed
d^d_d
`          da                         ZPe
db             ZQdwdcZRe
dd             ZSde ZTe
df             ZUe eVdgh          di                         ZWdj ZXdk ZYdl ZZdm Z[e ed
d
dn          do                         Z\dp Z] xZ^S )z	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)rR   r8   )r*   r   rE   gcurrent_personrR   )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listr[   r\   rR   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   ro   rq   rr   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)rx   rz   r<   )load_fieldsrv   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)rt   rp   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--rR   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   sgetrR   r)   r[   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
        Для обратной совместимости
        )rk   	role_coderole)in_project_role)r0   rk   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   rR   )r>   r8   )r<   r8   ug   Ошибка вызова in_project_role - не найдена Проектная роль (role_code=z, role_name=z, role=r   Frg   )
r   r   r*   r   r   rR   r)   valuer   get_project_role_members)r0   rk   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_idrf   )APPcache_in_project_role
setdefaultdictrh   setr*   CmfProjectRoleAssignr   
all_nestedaddrR   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)rW   vacation_startvacation_endFT)r}   r   r   datetimeutcnowdaterW   )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   rn   r      r"   )r<   
is_changedis_nullr   replaceVACATION_SUFFIXDOES_NOT_WORK_SUFFIXrs   splitlenro   rq   rr   )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 rm   )r<   r   rq   rr   ro   rp   rW   does_not_workr   r   rt   )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_optionsrY   
is_support)
allow_base
allow_ldapallow_oauth	allow_ssoTr   sso_block_allow_basedisable_base_authF)r}   r   r[   global_settingsauth_options_allow_baser   auth_options_allow_ldapauth_options_allow_oauthauth_options_allow_ssor   rE   rY   )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
        ANDra   
user_localre   T)servicedesk_allowre   T)rp   !=N)r   r   T)r   re   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)rp   r   r@   r<   rX   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   rX   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   rp   )eva_app_tokenusersrpc_account_sync_push)r2   methodu    учетокzauth/sync_accounts)ri   r[   debugr*   r   countrh   r   rp   r   r   r@   r<   r   r   r   r   r   r   only_system_grp_syncrX   r   gen_eva_app_tokenr   call_eva_account)rG   account_sync_lastforce_filterr   personrX   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   )rZ   re   N)r   two_factor.two_factor_optrB   r@   rf   )two_factor_optr   u   Обработано u-   </br> Не удалось настроить:z</br>u)   Закончили настройку 2FA)r=   )r*   r   rh   _calc_two_factorr   	save_datacommit_with_event	Exceptionrollback_purge_eventri   rK   r[   r   rL   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)r[   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_typere   pfeedr%   zparent.is_defaultrf   c                 &    g | ]}|j         j        S r   )rR   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   ra   )cache_status_typer   OPENrd   re   listsrc   c                     | j         S r   rQ   xs    r3   <lambda>z+CmfPerson.pfeed_post_list.<locals>.<lambda>      qt r4   r   c                     | j         S r   rQ   r1  s    r3   r3  z+CmfPerson.pfeed_post_list.<locals>.<lambda>  r4  r4   z-status_in_progress_start-cmf_created_at)r9   r8   r#  r"  )r*   CmfListrh   r%   
isinstancer   rg   
is_defaultri   rR   all_relation_personsCmfTaskr   r[   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   rR   )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   rQ   r   s     r3   r   z.CmfPerson.create_p2p_chats.<locals>.<listcomp>  s    BBBcfBBBr4   rb   rc   p2prf   c                      g | ]}|j         	|S r   )rG  r   s     r3   r   z.CmfPerson.create_p2p_chats.<locals>.<listcomp>  s     E E ESW E E E Er4   rX   rR   zNOT INrP   Tr   )rX   r   r*   r   
user_grouprR   CmfChatGrouprh   r   rb   rG  r   ri   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   r[   r\   rR   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   rh   )rG   rT  rU  r1   r2   rH   s        r3   rh   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_newrX   r   r   r*   r   contact_admins_groupr>   ri   )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?   Контакт не может быть без компанииTrQ  )typer<   )r   r   companyr   oldnewrf  loadr)   r   r*   
CmfCompanyrt   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)ra  r   r[   r\   r}   
person_var	favoritesr   )r0   ro  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   )ra  r   r   s    r3   _calc_avatarzCmfPerson._calc_avatarF  s$     	 	F	 	r4   c                 N    t                                                      g dz   S )N)rp   notify_email
notify_smsr?   rB   rolesprimary_rolezcompany.typer   ro  r   rW   r   r   ro   rq   rr   rp   r@   r   r
  r   )rF   save_preload_fields)r0   rH   s    r3   rz  zCmfPerson.save_preload_fieldsL  s/    ww**,, 08 08 08 8 	8r4   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responsiblere   r-  r   CLOSEDr   z	<a href="z">z</a>z<br>z</a> uM   Обработайте задачи уволенного сотрудника)r|  r<   r=   )r   r   r*   r;  rh   ri   hrefr<   rL   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 $  & &&*dfffff	- 	-r4   c                 f    t           j                            | j        dg          }|r|j        S d S )Nfail_block_end_daterp   r8   )r*   CmfAuthr   rp   r  r0   auths     r3   r   z&CmfPerson.get_auth_fail_block_end_datef  s=    ~""=R<S"TT 	,++	, 	,r4   r   datetime.datetime | Nonec                     t           j                            | j                  }|r||_        |                                 d S d S Nrp   )r*   r  rE   rp   r  r   r0   r   r  s      r3   r   z&CmfPerson.set_auth_fail_block_end_datek  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   rp   r  r  s     r3   r   z'CmfPerson.get_auth_fail_permanent_blockq  s=    ~""=S<T"UU 	-,,	- 	-r4   boolc                     t           j                            | j                  }|r||_        |                                 d S d S r  )r*   r  rE   rp   r  r   r  s      r3   r   z'CmfPerson.set_auth_fail_permanent_blockv  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)ry  ztree_parent.head)headr*   r   rE   r}   rx   )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}   ry  
supervisorr  rx   r*   r   admin_group
rg_membersrj  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   , так как у них указан Код запрета совмещения: TrQ  )rX   r   r}   incompatible_combination_coderK   r   rs   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   )rx  r   ry  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   Надо пометить что данные не засинканы
        rX  NTr   )r   r*   CmfAuthPluginDatar   rh   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 )Nrx  u   Назначение или открепление должности пользователю необходимо производить в "Структуре" в карточке должностиTrQ  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   rZ   r[   rT   r*   CmfAuthTwoFactorrB   r@   r   )r0   r  rZ   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   )rX   r   ri  r  rj  r   rZ   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   )rp   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>   re   ProjectAdminsr   u  Изменение членства в группах на карточке пользователя для Проектных администраторов временно недоступно. Откройте группу и добавьте пользователя там.TrQ  )rX   r   r[   disable_permissionsacl_admin_moder\   rT   r*   r+   r,   r   rE   rR   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   rn   r<   r  r  r=   r   )r}   full_search_preload_fieldsr   r*   CmfFullSearch
mark_cleanrR   r   
cmf_hiddenr<   rp   r@   rs   rx  ry  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$": 	+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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.coderf   r`  )r  re   F)r  re   Nauth_pluginre   r  T)r9   values)rX   r   r*   CmfAuthLdapPluginslistr   r  r>   rR   r  bulk_update)r0   pr  s      r3   _check_ad_grpzCmfPerson._check_ad_grp5  s      + 	F)//7O7O7OYjXk/ll 	] 	]A##q|/@#AA ]111111M$qt3LN(44GWVZO4\\\	] 	]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+        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 уведомлений необходимо указать номер мобильного телефонаTrQ  perm_updater   r  Fr"   r  c                     g | ]	}|j         
S r   r>   r   r[   s     r3   r   z"CmfPerson.save.<locals>.<listcomp>q  s    FFF1FFFr4   c                     g | ]	}|j         
S r   r  r  s     r3   r   z"CmfPerson.save.<locals>.<listcomp>r  s    BBB1BBBr4   )rh  ri  )	r#   r$   r%   r&   ignore_transactionr'   parent_nameparent_code
audit_dataFalseIBAdminsr`  u   Изменять настройки паролей разрешено только Администраторам ИБ из группы IBAdminsr  uG   Пользователь не синхронизирован с accountr   r   )r9  r   uw   Поле может редактировать только Администратор или Руководитель(r   )r%   r   )Ar  r  r   r   rS  rp   r>   r   r   r   rr  r  rm  rt  rw  rB   numberr?   r)   r  r  r  r  r  r  rd  rX   r*   r-   r.   r<   rh  configEVA_ACCOUNT_USEpassword_must_changepassword_changed_dater[   r   r   r  rE   password_expires_must_changer   ra  calendarCmfCalendar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.saveB  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---; 	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##%%%
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        |i | t+          t,          j        | j        j        g           t+          t,          j                   t          j                                         d S )Nry   r   r  r  re   r  rf   u;   Пользователь синхронизирован с u9   , сначала отключите интеграцию.TrQ  DELz%Y%m%d%H%M%Srn   TEXKOM_db_deleterY  rX  r1   )r}   r*   r  PERSON_LIC_FIELDSr  r  rE   r)   r  r   nowstrftimerS  r[   r  r  CmfPersonViewrh   deleterZ  rF   r  r   sync_person_task_resourcesrR   r   r!  CmfProjectNotifySchemetrigger_reload)r0   r1   r2   r  prefixr  varrH   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'''''''''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          t          j	                   d S rJ   )
r  resubdelete_prefix_patternr   rF   r[  r  r   r!  r  s      r3   r[  zCmfPerson.restore  sb     	f#%66$*Db$J^Jd#e#eD ((((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   rp   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"  rp   r   r  r  isdirlistdirisfileremover  set_gravatarrR   )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 )NrR   re   r   Tr   r}  ra   r|  rb   rc   r   )r*   r   rE   r   r;  rh   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  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        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)rp   issiatexpjtir  zregister_persons:frominvite_must_change_passwordT)r8   r   invite_by_email)r@   actioninvite_tokenr=  )absoluteinternalzauth/signup   )r  cookiestimeout,    zSigned up successfullyuE   ERROR: Не удалось отправить приглашение z: r>   re   u"   Ищем пользователя rX   r   rf   u)   Создадим пользователя)rp   r@   rX   r   u(   Добавим пользователя u    в группу z!register_persons: person saved ok)2requestsr4  r  r  r  r  PROJECT_DIRr[   r   r\   rT   r   r   rY   r   allow_user_inviter   r*   r-   r.   CmfPermissionErrorr   rI  r   APP_FQDNrK   inttimer@   r   
create_jwtrsa_sign_pack_jwtCmfGlobalSettingsrE   r=  postauth_base_hrefrequestrD  status_coder=   jsonr   r<   rX   ri   r   r   r   rR   )r2  r1  r1   r2   r4  rj   r@   sgroupspayloadjwtr@  r=  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   rS   )rG   r8   r1   r2   r   s        r3   r   zCmfPerson.public_getN  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_listV  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   r6  )r9   r#  r   )r<   )
r?   r*   CmfDealrh   rR   r<   rg  contactsprimary_contactr   )r0   r1   r2   dealsdeals        r3   r   zCmfPerson.start_chatZ  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,  re   rV   rf   	invisibleoffline)js_idr<   r5   )rV   
is_defined_valuer*   rZ  rE   rR   r,  r[   r\   choicesr   )r0   ro  r<   s      r3   _online_statuszCmfPerson._online_statusm  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                     |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 )Nry  r,  re   rg  r   )is_internalre   TruerX   ra   )r   re   F)r>   r   r_  )r>   r   Users)object_fields	object_idr9   )rE   rF   field_options_list)rG   relation_field_namerq  rr  r9   r2   rH   s         r3   rs  zCmfPerson.field_options_listz  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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;%ra   r?   LIKErA   re   rB   rC   rf   u.   Возвращаем пользователя %   Неправильный номер: )r[   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 )NrR   rc   tree_parent_idr  rf   r   )r*   
CmfOrgUnitr  rR   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}   rx  r  r   ri   )r0   r^   r_   rj   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<   rx  rF  u@   Возвращаем пользователя с номером )r  r[   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   rQ   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)r\  rj  r  r  unlinkr   r  r   r(  rR   r   r8  rK   base64urlsafe_b64decoder  r  rp   r  r  openwrite)r0   image
image_typer(  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   )rE  u.   Ошибка запроса к gravatar {}: {}rG  )rp   r[   r   r  r  r  r   lowerrs   r  r  r   requests_sessionrE   rT  r1   r  r  r   formatrU  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_limitr+  r0  c                    t           j                            |           }|                    t           j                            |                     |                                }|                    |dd           d S )NrQ   jpegF)r  r(  )r*   r   rE   r}   rz  r  r   )r,  r_   r  r  s       r3   r(  zCmfPerson.set_gravatar  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   Нельзя снять опцию у пользователя, т.к. она активирована через Проектную роль или включена глобальная опция "Разрешить доступ всем"rQ  rX   )r}   r   r   rX   r*   r   rE   r   ri  rh  r[   r   servicedesk_allow_auth_guestsr   r)   ri   r'  )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_changesrw  rv  	notify_osr?   rB   r<   r@   rp   r   r   )rR   r   r8   u8   Пользователь не существует (ID: r   NuV   Пользователь удален или не работает(уволен) (ID: )r  r  r  r  r  r  rw  rv  r  r?   rB   r<   r@   rp   )r   cache_person_notify_optr*   r   rE   r)   r   r   r[   r   r  r   r  r  r  r  r  rw  rv  r  r?   r  rB   r<   r@   rp   )rG   r,  r  s      r3   get_notify_opt_cachedzCmfPerson.get_notify_opt_cachedL  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)ra  r   r   r   r  r  r  r  r  r  rw  rv  r  r?   rB   r<   r@   rp   printrR   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*   rZ  rE   r  r  r   timezoneutcr0   ro  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_counterr[   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}   ro  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   rh   r  r   rX  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}   rx  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  rI  r  r   r   api_methodsr   classmethodr   rN   rT   r	   r   propertyrt   r
   r   r   r   r   r   r   r   r   r   r  staticmethodcmf_deferred_jobr  r!  r   r   rD  rO  rS  rh   r]  rd  rm  rr  rt  rz  r  r   r   r   r   r  r  r  r  r  r  r  r  r  r  r  r   r	  r[  r"  r   r
  r   r   r   r   rl  rs  r  r   r  r  r  r   r  r(  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> > >
' 
' 
'" " "  8 8 8 8 8- - -$, , ,
   - - -
     <( ( (*	. 	. 	. 	.+ + + )- A A A A A A A# # # #( ( (&. . . . .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 \

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