
    _1j                        d dl Z d dlZd dlZd dlZd dlmZ d dlZd dlmZ d dl	 d dl
Z
d dlmZ d dlmZ  G d dej                        Zy)	    N)Decimal)commit_all_ds)*)
cmf_person)cmf_notify_metricsc                       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
dmd
       Zed        Zd Zd ZdndZdodZe
d        Zd Zd Zd Zd Ze
dmd       Ze edd      dnd              Ze eddd      dmd              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,d, Z-dpd-Z.d. Z/dqd/Z0d0 Z1d1 Z2drd3Z3d4 Z4dd5 fd6
Z5dmd7Z6d8 Z7 fd9Z8dsd:Z9 fd;Z:d< Z;d= Z<dm fd>	Z= fd?Z> fd@Z?e
dmdA       Z@dB ZAe edCdDE      dF               ZBe eddGH      d2dIdJe$fdK              ZCe
ddddLdM       ZDe
dddNdO       ZEdP ZFedQ        ZGe
do fdR	       ZHe
dndS       ZIdT ZJe
dndU       ZKdV ZLdW ZMdtdXZNdY ZOe eddZd[\      d]               ZPe
d^        ZQdrd_ZRe
d`        ZSda ZTe
db        ZUe eVdcd      de               ZWdf ZXdg ZYdh ZZdi Z[e edddj      dk               Z\dl Z] xZ^S )u	CmfPersonz/custom/static/avatar/)get_current_projectsget_auth_options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                 \   | j                         st        d       y t        j                  j	                  d      s0t        d       t        j
                  j                  dd| dd	       y | j                  d        t        j
                  j                  dd| d
d	       t        d       y )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NO##444G12OO''{37v^_ ( a))$/##N;37yab 	$ 	dGH     Nqueryfieldsfilterc                ^    |j                  d      xs g d|d<   t        |   ||||d|S )Nfields_filter)	nametextcodephoneemailphone_internalphone_mobilephone_2phone_assistantr8   )getsuperr   )clsr9   r:   r;   r3   r4   	__class__s         r5   r   zCmfPerson.search<   sE    "(**_"=  #l  Blw~vf
@F
 	
r6   c                 \    t        dj                  t        | j                                    S )Nr7   )strjoinreversedr>   r1   s      r5   reverse_namezCmfPerson.reverse_nameC   s    2778DII./00r6   c                 &    | j                  d      S )N.CmfPerson:00000000-0000-0000-0000-000000000001idrG   )rI   s    r5   system_personzCmfPerson.system_personF   s    wwJwKKr6   c                     g }t         j                  j                  dddt        j                  j
                  ggddt        j                  j
                  gg|      D ]  }|j                  |        |S )NOR	executorsINcmf_owner_id==r;   r:   )r,   
CmfProjectlistgcurrent_personrS   append)rI   r:   resultprojects       r5   r
   zCmfPerson.get_current_projectsJ   sz    ((--d[$QRQaQaQdQdPe<f7EtQM]M]M`M`6a6ckq . s 	#GMM'"	# r6   c                     | j                   xs | j                  xs d}| j                  xs d}| j                  xs d}| d| d| j	                         S Nr7    )	last_namelogin
first_namesecond_namestrip)r2   r3   r4   rg   ri   rj   s         r5   	full_namezCmfPerson.full_nameR   sW    NN6djj6B	__*
&&,"Aj\;-8>>@@r6   c                 ~   | j                  dg       | j                  st        j                  d | ddd      }|j	                  d       || _        t
        j                         5  | j	                          d d d        t        j                  |dd	      j	                  d       | j                  S # 1 sw Y   =xY w)
Nhome_folderi'  u   Мои документыhome)tree_parent	cmf_ownerordernor>   sys_typeF)notifyu   Документ1)rp   rr   r>   )load_fieldsrn   r,   	CmfFoldersavecmfutildisable_aclCmfDocument)r2   r3   r4   folders       r5   r   zCmfPerson.get_home_folderY   s    -)%% 06	 & CF
 KKuK%%D$$& 		65GZ[``hm`n s   &B33B<c                 R    | j                   xs | j                  xs | j                  S N)rl   rh   rB   r2   s    r5   gen_namezCmfPerson.gen_nameh   s    ~~99tzz9r6   c                 *    | j                  |||      S )u   
        ! DEPRICATED
        ! Публичное API для bzPython
        Для обратной совместимости
        )rc   	role_coderole)in_project_role)r2   rc   r   r   s       r5   has_project_rolezCmfPerson.has_project_rolek   s     ##Gyt#TTr6   c           	         d}|rt         j                  |d      }ng|r2t        j                  j	                  |ddg      }|r@|j
                  }n3|r1t        j                  j	                  |ddg      }|r|j
                  }|st        d| d| d	| d
       yt         j                  |d      }| j
                  j                  t        j                  j                  ||      v S )u   
        ! Публичное API для bzPython
        Метод проверки, что пользователь назначен на Проектную роль
        role и project могут быть: объект, tuuid, code, name
        NCmfProjectRole--rS   )r@   r:   )r>   r:   ug   Ошибка вызова in_project_role - не найдена Проектная роль (role_code=z, role_name=z, role=)Fr]   )
rx   get_obj_id_by_anyr,   r   sgetrS   r+   valuer	   get_project_role_members)r2   rc   r   r   	role_namerole_id
project_ids          r5   r   zCmfPerson.in_project_roles   s     //6FGG((--9dD\-RD''((--9dD\-RD'' %%.K|I;gdVSTV W..wE
ww}} 0 0 I I*V] ^^^r6   c                    t         j                  j                  |t                      t         j                  |   }|j                  |d        ||   }|t	        |      S t               }t        j                  j	                  dd|gdd|ggddg      D ]F  }|j                  j                         D ]'  }|j                  |j                  j                         ) H |t         j                  |   |<   t	        |      S )Nr'   =project_rolemembersproject_role_idr\   )APPcache_in_project_role
setdefaultdictr^   setr,   CmfProjectRoleAssignr   
all_nestedaddrS   r   )rI   r   r   project_cacherole_cache_setrulemembers          r5   r   z"CmfPerson.get_project_role_members   s     	!!,,Z@11*=  $/&w/%''//44!3
3nc75ST!#45 5 7 	4D ,,113 4""699??34	4 :H!!*-g6N##r6   c                 t   | j                  g d       d}| j                  r| j                  rt| j                  t        j                  j	                         j                         k  r;| j                  t        j                  j	                         j                         k\  rd}| j                  |k7  r|| _        y y )N)on_vacationvacation_startvacation_endFT)ru   r   r   datetimeutcnowdater   )r2   cur_on_vacations     r5   _calc_vacationzCmfPerson._calc_vacation   s    JKD$5$5##x'8'8'?'?'A'F'F'HH!!X%6%6%=%=%?%D%D%FF"O..D /r6   c                 2   | j                   j                  r%| j                   j                  s| j                   dk(  ry | j                   j                  }|j	                  | j
                  d      }|j	                  | j                  d      j                         }|j                  d      }t        |      dkD  r| j                  s
|d   | _
        t        |      dkD  r| j                  s
|d   | _        t        |      dkD  r| j                  s|d   | _        y y y )Nr7   rf   r      r$   )r>   
is_changedis_nullr   replaceVACATION_SUFFIXDOES_NOT_WORK_SUFFIXrk   splitlenrg   ri   rj   )r2   tmpname_arrs      r5   _calc_from_namezCmfPerson._calc_from_name   s    yy##tyy'8'8DIIOiiookk$..3kk$33R8>>@99S>x=1T^^%a[DNx=1T__&qkDOx=1T%5%5'{D &6r6   c                    | j                   j                  s| j                  j                  so| j                  j                  sY| j                  j                  sC| j
                  j                  s-| j                  j                  s| j                  j                  sy d}| j                  rd| j                   }| j                  rd| j                   }| j                   | | _         y re   )r>   r   ri   rj   rg   rh   r   does_not_workr   r   rl   )r2   add_strs     r5   
_calc_namezCmfPerson._calc_name   s    II  ))**~~((zz$$**!!,,$../0G$3345G~~&wi0	r6   c                 
   | j                  g d       t        t        j                  j                  j
                  t        j                  j                  j
                  t        j                  j                  j
                  t        j                  j                  j
                        }| j                  j
                  xs i }|D ]&  }|j                  |      s| j                  |   ||<   ( | j                  rd|d<   |S d}t        j                  j                  dd| gg dgd	g
      D ])  }|j                  s|j                  j                   s'd} n |j                  d      s|j                  d      s|rd|d<   |S )N)auth_optionsis_admin
is_support)
allow_base
allow_ldapallow_oauth	allow_ssoTr   Fpersonr[   )ldap_deletedr[   Fzauth_plugin.disable_base_authr\   sso_block_allow_basedisable_base_auth)ru   r   r_   global_settingsauth_options_allow_baser   auth_options_allow_ldapauth_options_allow_oauthauth_options_allow_ssor   rG   r   r,   CmfAuthPluginDataslistauth_pluginr   )r2   resr   keyldap_disable_base_auth	auth_datas         r5   r   zCmfPerson.get_auth_options  se   ABa//GGMM//GGMM 00IIOO..EEKKN ((..4" 	2C$,,S1C	2
 == $CJ!&1177!4.0MN78 8 : 	I $$)>)>)P)P)-&	   !78##$78) %C
r6   c                 &   ddg dg dgg ddg dg dgg}|r|s|j                  dd	|g       g }t        j                  d
t        j                  j                  |              t        j                  j                  |g dd      D ]  }g }t        |j                  j                  |j                  j                  |j                  j                  |j                  j                  ||j                  j                  |j                         |j                  j                        }|j                  rd|_        |j!                  d       |j                  s|j"                  st        j$                  j&                  r?|j(                  D cg c]%  }|j*                  s|j,                  j                  ' c}|d<   ns|j(                  D cg c]  }|j,                  j                   c}|d<   nA|j.                  r3|j.                  j                  |d<   d|_        |j!                  d       n|j                  |        |syt1               |ddd}t        j                  d
t3        |       d       t5        d|       yc c}w c c}w )u   
        Отправляем учетки в аккаунт
        https://bcrm.carbonsoft.ru/project/Document/DOC-003025#spec-0-ldap
        ANDrW   
user_localr[   T)servicedesk_allowr[   T)rh   !=N)r   r   T)r   r[   Ncmf_modified_at>u   Синхронизируем r;   )zrg_member_of.ext_idcmf_deletedr   deleted_loginrB   r   	ext_loginzrg_member_of.systemTr;   r:   include_deleted)rh   r   rB   r>   rg_member_ofr   r   	old_loginN	only_datar   rh   )eva_app_tokenusersrpc_account_sync_push)r4   methodu    учетокzauth/sync_accounts)ra   r_   debugr,   r	   countr^   r   rh   r   r   rB   r>   r   r   r   rw   r   r   only_system_grp_syncr   systemr@   r   gen_eva_app_tokenr   call_eva_account)	rI   account_sync_lastforce_filterr   r   r   dataobjs	            r5   account_sync_pushzCmfPerson.account_sync_push:  s8    4 :;\]_t46PQSUNN-s4EFG	/0@0@0F0Fg0F0V/WXY&&++/ !% , & !	F Lfll00"("2"2"8"8$ll00#[[..%1$*$6$6$<$<%+%<%<%>"("2"2"8"8:D #' d+&&&*>*>$$99FLFYFY+hs]`]g]gCHHNN+hD(FLFYFY+ZsCHHNN+ZD(%% & 4 4 : :W'+$d+ LLC!	D ,=,?%P13	/E
|=IJ-t4% ,i+Zs   J	!J	JT)	only_once
system_jobc                    g }d}| sg dg dg} t         j                  j                  | g d      D ]@  }	 |j                  |       |j                  r|j                          t                |dz  }B d| }|r| d	d
j                  |      z   }t        j                  |       t        j                  d|       y # t        $ rC}t                |j                  t        |             t        j                  |       Y d }~d }~ww xY w)Nr   r   )
two_factorr[   N)r   two_factor.two_factor_optrD   rB   r\   )two_factor_optr   u   Обработано u-   </br> Не удалось настроить:z</br>u)   Закончили настройку 2FA)r?   )r,   r	   r^   _calc_two_factorr   	save_datacommit_with_event	Exceptionrollback_purge_eventra   rL   r_   r   rM   rx   admin_alert)r   r   _kwargsfail_personperson_countr   er?   s           r5   init_2fa_settingszCmfPerson.init_2fa_settingso  s    13MNG&&++'k , m 	F	''~'F$$$$&%'!	 '|n5VHI',,WbJccD	GdS  $&""3v;/

s   =C  	D	9DDz@hourly)r   r   schedulec                    t         j                  d       t         j                  j                  dk(  rIt         j                  j                  j
                  dkD  rt        d       nt         j                  d       ydt         j                  _        t         j                  j                  j                  }t         j                  j                  j                          t         j                  j                          t                	 t        j                  j                  ||        dt         j                  _        t         j                  j                          y# t        $ r}}t        |       t        j!                  |       t#        |       |t         j                  _        d	t         j                  _        t         j                  j                          Y d}~y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_nowrw   r   r,   r	   r   r   logging	exceptionr   )r   r   r  s      r5   account_sync_userszCmfPerson.account_sync_users  s;    	
HI<<++}<||--11G;  _  `LM+8(LL::@@	&&..0	
	 ../@.N/7ALL,LL 	 aLa !->ALL*/6ALL,LL	 s   AE 	G!$A3GG!)slicer:   order_bydo_count	do_unreadsearch_filterc                   t         j                  j                  g dddg      }	t               }
|	D ]  }|j                  rVt	        |j                  j
                  t         j                        r(|j                  j                  r|
j                  |       e| j                  j
                  |j                         D cg c]  }|j                  j
                   c}v s|
j                  |        |rtt         j                  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|j                  |       t         j                  j                  ||ddg|      }|S c c}w )N)	list_typer[   pfeedr'   zparent.is_defaultr\   person_viewsz
NOT EXISTS	person_idr   rW   )cache_status_typer   OPENrZ   r[   listsrY   c                     | j                   S r}   rR   xs    r5   <lambda>z+CmfPerson.pfeed_post_list.<locals>.<lambda>  
    qtt r6   r   c                     | j                   S r}   rR   r  s    r5   r!  z+CmfPerson.pfeed_post_list.<locals>.<lambda>  r"  r6   z-status_in_progress_start-cmf_created_at)r;   r:   r  r  )r,   CmfListr^   r'   
isinstancer   r]   
is_defaultra   rS   all_relation_personsCmfTaskr   r_   r`   map)r2   r  r:   r  r  r  r  r3   r4   r  my_listslstr   flt	post_lists                  r5   r   zCmfPerson.pfeed_post_list  s   ##+G "56 $ 86 	%Czzj)9)96;L;LMRUR\R\RgRg$ww}}s?W?W?Y ZV ZZ$	% >>''{\_aeahahananNo0p:*D!2B2B2E2EFHdD^X)F$GH0J' K K 9*D!2B2B2E2EFHdD^X)F$GHJ 6WbdgimipipivivVw8xz}~CJJ}%NN''13DE	 ( 	
 ' ![s   >Hc                 <    t        |   |fd| j                  i|S )Nr  )rH   r   rS   )r2   obj_id_argsr4   rJ   s       r5   r   zCmfPerson.mark_viewed  s#    
 w"6GTWWGGGr6   c                      y r}    r1   s      r5   public_mark_viewedzCmfPerson.public_mark_viewed  s    r6   c                 x   g }| j                   j                  rt        j                  j	                         }|j
                  | j                   D cg c]  }|j
                   c}v rGt        j                  j                  dd| j
                  ggdg      }|r|D cg c]  }|j                  s| }}|sdd|j
                  ggddd| j
                  ggg}t        j                  j                  |dg      D ]  }t        j                         }|g|_
        d	|_        |j                          |j                  j                  |        |j                  d	
       |j                  D ]/  }|j                  j                  |        |j                  d	
       1 |j                  |        |S c c}w c c}w )NrX   rY   p2pr\   r   rS   zNOT INrQ   Tr   )r   r   r,   CmfPersonGroup
user_grouprS   CmfChatGroupr^   r6  r	   rX   rw   ra   topics)	r2   r   usr_grpr   	cur_chatsr   r   grouptopics	            r5   create_p2p_chatszCmfPerson.create_p2p_chats  s   ''++668Gzz0A0ABcffBB"//44[$QUQXQXPY<Zdicj4k	09 ESWW EI E  .wzzlC $h1a151:  ;<G #)"2"2"7"7wPTv"7"V * & 3 3 5+1($(	

..t4

T
2%*\\ 7E!OO2248!JJJ67 

5)* 
) C !Fs   F2F71F7c                     | j                   sy t        j                  j                  | j                  k(  rt	        dd       t
        j                  j                          y )Nu1   Нельзя удалить самого себяTabort)r   r_   r`   rS   r+   r,   r-   r.   r~   s    r5   
_check_delzCmfPerson._check_del  sD    $'')IQUV--/r6   )include_systemis_userc                \    |s|j                  dd       |du rd|d<   t        |   |i |S )Nr   FTr   )r   rH   r^   )rI   rD  rE  r3   r4   rJ   s        r5   r^   zCmfPerson.list  s;    h.d?#'F< w|T,V,,r6   c                 >   | j                   r t        j                  j                  |       ry | j                  ry t        j                  j                  | d      }|r|j                          t        d       y t        j                  |       j                          y )Nr   Tr   r   u   Warning. CmfPerson был удален и некорректно востановлен. Обратитесь в Техническую поддержку)	r   r,   CmfPersonVarr   r   rG   restorer+   rw   )r2   
deleted_pvs     r5   _check_person_varzCmfPerson._check_person_var  s    &"5"5":":$":"G((,,D$,O
    s  t4(--/r6   c                    | j                   s| j                  j                  sy | j                  d      rWt        j
                  j                         }| j                  |j                        s| j                  j                  |       y y y )NAdmins
group_code)	is_newr   r   in_person_groupr,   r7  contact_admins_groupr@   ra   )r2   contact_admin_groups     r5   _calc_contact_adminzCmfPerson._calc_contact_admin  sx    {{4#4#4#?#?84"("7"7"L"L"N''3F3K3K'L!!(()<= M 5r6   c                    | j                   s| j                  ry | j                  j                  rj| j                  j                  rT| j                  j
                  s>| j                  j                  j                  j                         dk(  rt        dd       | j                  j                  r9t        j                  d| j                        }|j                          || _        y y )Nr   u?   Контакт не может быть без компанииTrA  )typer>   )r   r   companyr   oldnewrX  loadr+   r   r,   
CmfCompanyrl   rw   )r2   new_companys     r5   _calc_companyzCmfPerson._calc_company  s    ??dkk<<""||(8(8T\\=M=M=R=R=W=W=Y]e=e[cgh<< +++OK&DL	  r6   c                    | j                   r| j                  syt        j                  j	                  dg       | j
                  D ]B  }t        j                  j
                  D ]#  }|j                  |_        |j                          % D y)u   
        Вычисляем список избранного по умолчанию для новых пользователей
        Nzperson_var.favorites)rR  r   r_   r`   ru   
person_var	favoritesrw   )r2   ra  current_person_vars      r5   _calc_default_favoritesz!CmfPerson._calc_default_favorites"  ss     {{$//	$$&<%=>// 	"J&'&6&6&A&A ""'9'C'C
$!"	"r6   c                 6    | j                   r| j                  sy y r}   )rR  r   r~   s    r5   _calc_avatarzCmfPerson._calc_avatar/  s     !0r6   c                 *    t         |          g dz   S )N)rh   notify_email
notify_smsrA   rD   rolesprimary_rolezcompany.typer   ra  r   r   r   r   rg   ri   rj   rh   rB   r   r   r   calendar_id)rH   save_preload_fields)r2   rJ   s    r5   rm  zCmfPerson.save_preload_fields5  s     w*, 0G G 	Gr6   c                     | j                   j                  sy | j                   t        d      k  rt        dd       | j                   t        d      kD  rt        dd       y y )N0uT   Доля участия по умолчанию должна быть больше 0TrA  z10000.00u[   Доля участия по умолчанию не может превышать 10000.00)gantt_default_unitsr   r   r+   r~   s    r5   _check_gantt_default_unitsz$CmfPerson._check_gantt_default_units=  sY    ''22##ws|3ltxy##gj&99s{  A :r6   c                    | j                   r| j                   j                  syg }t        j                  j	                  dd| gg dg      D ].  }|j                  d|j                   d|j                   d       0 |rfd	j                  |      }d| j                   d| j                   d
| }t        j                  | j                         d|d      j                          yy)zY
        https://bcrm.carbonsoft.ru/project/Document/DOC-003685#spec-eva-account
        Nresponsibler[   r  r   CLOSEDr   z	<a href="z">z</a>z<br>z</a> uM   Обработайте задачи уволенного сотрудника	9_disable)rs  r>   r?   full_search_type)r   r   r,   r)  r^   ra   hrefr>   rM   get_supervisorrw   )r2   linkstaskr?   s       r5   _check_does_not_workzCmfPerson._check_does_not_workE  s     ""t'9'9'D'DNN''d0K0U0W' X 	CDLL9TYYKr$))DAB	C ;;u%DtyykDII;eD6BDNNt':':'<"o $,7   "TV r6   c                 x    t         j                  j                  | j                  dg      }|r|j                  S y )Nfail_block_end_daterh   r:   )r,   CmfAuthr   rh   r~  r2   auths     r5   r   z&CmfPerson.get_auth_fail_block_end_dateY  s7    ~~""=R<S"T+++ r6   c                     t         j                  j                  | j                        }|r||_        |j                          y y Nrh   )r,   r  rG   rh   r~  rw   r2   r   r  s      r5   r   z&CmfPerson.set_auth_fail_block_end_date^  s6    ~~!!

!3',D$IIK r6   c                 x    t         j                  j                  | j                  dg      }|r|j                  S y )Nfail_permanent_blockr  )r,   r  r   rh   r  r  s     r5   r   z'CmfPerson.get_auth_fail_permanent_blockd  s7    ~~""=S<T"U,,, r6   c                     t         j                  j                  | j                        }|r||_        |j                          y y r  )r,   r  rG   rh   r  rw   r  s      r5   r   z'CmfPerson.set_auth_fail_permanent_blocki  s6    ~~!!

!3(-D%IIK r6   c                 ,   fd| j                  ddg       d}| j                  r| j                  j                  rA| j                  j                  j                  r!| j                  j                  j                  }n2| j                  j                  r | j                  j                        }|sat
        j                  j                         }|j                  j                          |j                  r|j                  j                         d   }|S )u   
        Идем по структуре отделов роли и получаем первого руководителя
        c                     | j                   r*t        j                  j                  | j                         S | j	                  dg       | j
                  r | j
                        S y )N)rk  ztree_parent.head)headr,   r	   rG   ru   rp   )org_unit	recursions    r5   r  z+CmfPerson.get_supervisor.<locals>.recursions  sW    }}''+++GG  "4!56## !5!566r6   zprimary_role.supervisor.personzprimary_role.tree_parent.headNr   )ru   rk  
supervisorr   rp   r,   r7  admin_group
rg_membersr\  r   )r2   r  	admin_grpr  s      @r5   ry  zCmfPerson.get_supervisoro  s    	 	:<[\]
  ++0A0A0L0L0S0S!..99@@
""..&t'8'8'D'DE
--99;I  %%'##&11<<>qA
r6   c           
      N   | j                   j                  sy i }| j                  dg       | j                   D ]k  }|j                  st	        |j                        j                  d      D ]5  }|j                         }||v rt        d||    d| d| d       1|||<   7 m y )Nz*rg_member_of.incompatible_combination_code,u\   Пользователь не может участвовать одновременно в u    и uS   , так как у них указан Код запрета совмещения: TrA  )r   r   ru   incompatible_combination_coderL   r   rk   r+   )r2   codesgrgr_codes       r5   %_check_roles_incompatible_combinationz/CmfPerson._check_roles_incompatible_combination  s     ((FGH## 		(B33r??@FFsK (!--/e# |  ~C  DK  ~L  }M $RD({  }D  |EF NRS &(E'N(		(r6   Fc                    | j                   j                  s|sy | j                   sd | _        y | j                  j                  r| j                   d   | _        y | j                  | j                   vr| j                   d   | _        y y )Nr   )rj  r   rk  r   )r2   r   s     r5   _calc_primary_rolezCmfPerson._calc_primary_role  si    

%%zz $D&& $

1Ddjj0 $

1D 1r6   c                     | j                   r t        j                  j                  |       syt        j                  j	                  |       D ]  }d|_        |j                  d        y)uN   Надо пометить что данные не засинканы
        rH  NTr   )r   r,   r   r   r^   dirtyrw   )r2   r   s     r5   _check_auth_datazCmfPerson._check_auth_data  s\     F$<$<$B$B$$B$O1166d6C 	+I IONNTN*	+r6   )save_kwargsc                d    |j                  d      rt        dd       t        |   |d|i| y )Nrj  u   Назначение или открепление должности пользователю необходимо производить в "Структуре" в карточке должностиTrA  r  )rG   r+   rH   update)r2   r  r3   r4   rJ   s       r5   r  zCmfPerson.update  s8    ::g}
 	@+@@r6   c                    | j                   r| j                  sr| t        j                  k7  r^t        j                  | j                  | j                  |      }|j                          || _        | j                  j                          y y y y )N)rA   rB   r   )	r   r   r_   rU   r,   CmfAuthTwoFactorrD   rB   rw   )r2   r   r   s      r5   r   zCmfPerson._calc_two_factor  so    ??4??tq7N00t7H7H7;zz@N 1 PJ OO(DOOO  " 8O??r6   c                 `   | j                   j                  sy d }| j                   j                  D ]4  }|j                  j	                         s|j                  j
                  } n |sy || j                  j                  k7  r,|| j                  _        | j                  j                          y y r}   )r   r   r[  r   r\  r   r   r   )r2   r   grps      r5   _calc_two_factor_groupsz!CmfPerson._calc_two_factor_groups  s      ++ $$(( 	C!!&&(!$!3!3!9!9	 T__;;;-;DOO*OO%%' <r6   c                     | j                   r*| j                  | j                   k7  r| j                   | _        | j                          | j                          t	        |   |i | y r}   )rh   r@   r   _calc_servicedesk_allowrH   _save_import)r2   r3   r4   rJ   s      r5   r  zCmfPerson._save_import  sL    ::$))tzz1

DI$$&d-f-r6   c                    |dkD  ry | j                   j                  sy t        j                  sRt        j                  sBt        j
                  t        j                  k(  s!t        j                  j                  dd      ry t        j                  j                  g d      }|j                  j                  t        j                  v rt        dd	       y y )
Nr   r7   Fr    )r@   r[   ProjectAdminsr   u  Изменение членства в группах на карточке пользователя для Проектных администраторов временно недоступно. Откройте группу и добавьте пользователя там.TrA  )r   r   r_   disable_permissionsacl_admin_moder`   rU   r,   r-   r.   r7  rG   rS   r   current_person__member_ofr+   )r2   depthr4   project_admins_groups       r5   _tmp_changing_member_of_alertz'CmfPerson._tmp_changing_member_of_alert  s    19   ++  A$4$48H8HAOO8[''888O%4488@_8`""((A,G,GG S \`a Hr6   c                    g d}| j                  | j                         | j                  r4t        j                  j                  | j                  j                         y | j                  r4t        j                  j                  | j                  j                         y | j                  j                  xs d}| j                  r|d| j                  j                  z   z  }| j                  r5| j                  | j                  k7  r|d| j                  j                  z   z  }||d<   |j                         s4t        j                  j                  | j                  j                         y d}|D ]  }|dk(  rE| j                  D ]5  }|j                  j                  s|d|j                  j                   z  }7 M|dk(  rU| j                  s_| j                  j                  j                  s|d| j                  j                  j                   z  }| |   j                  s|d| |   j                   z  } ||d<   t        | @  d	i |S )
N)r   rB   rA   rC   rD   rE   rF   
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   r7   z - r>   r  rf   r  r?   r3  )ru   full_search_preload_fieldsr   r,   CmfFullSearch
mark_cleanrS   r   
cmf_hiddenr>   rh   rB   rk   rj  rk  rH   full_search_index)r2   r4   text_fieldsr>   r?   frrJ   s          r5   r  zCmfPerson.full_search_index  s   W 	889;;  ++DGGMM:??  ++DGGMM:yy$"::EDJJ,,,,D::$**

2EDJJ,,,,Dv zz|  ++DGGMM: 	,AL  3Avv||!AFFLL> 223 ))$$):):)?)?)E)Ea 1 1 6 6 < <=>>D a!DGMM?++	,  vw(2622r6   c                 D   | j                   j                  syt        j                  j	                  g ddg      D ]b  }| j                  |j                  j                        s*g dg ddd	|j                  gg}t        j                  j                  |d
di       d y)u   
        Для новых пользователей или при смене группы надо проверить нет ли его в АД
        N)
sync_groupr   Nzsync_group.coder\   rP  )r  r[   F)r   r[   Nr   r[   r  T)r;   values)r   r   r,   CmfAuthLdapPluginr   rS  r  r@   rS   r   bulk_update)r2   pr   s      r5   _check_ad_grpzCmfPerson._check_ad_grp(  s       ++))//7OYjXk/l 	]A##q||/@/@#A11M$qtt3LN((44GWVZO4\	]r6   c           
         | j                   s| j                  j                  r\d }| j                  r| j                  r| j                  j	                  dg       | j                  r#| j                  j
                  | j                  k7  rt        j                  j                  dg d      }t        j                  d| j                  j                   | ||j                  |j                  |j                  |j                  d      }|j!                  d       || _        | j!                  d       | j                  s?|s#t        j                  j                  dg d      }|| _        | j!                  d       y y y )	N	parent_idT)timezonecalc_num_yearscalc_num_back_years
calc_until)r'  r:   u   Календарь F)r>   r'   parent_calendarr  r  r  r  r  r   )rR  r   r   calendarru   r  rS   r,   CmfCalendarrG   r@   r   r  r  r  r  rw   )r2   default_calendarnew_calendars      r5   _calc_calendarzCmfPerson._calc_calendar5  sO   ;;$//44#==MM--{m<}}(?(?477(J'-'9'9'='=#' E (> (F$ $*#5#52499??2CD#(8!1!:!:'7'F'F,<,P,P#3#>#># $6 	$L !%%%5$0DMIII-==''-'9'9'='=#' E (> (F$ !1		D	) !/ 5r6   c                 n    | j                   di | | j                          | j                          | j                  j                  r| j                  r| j                          | j                  r*| j                  | j                  k7  r| j                  | _        | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                          | j                   j                  rE| j                   r9| j"                  j$                  s#| j&                  j$                  st)        dd       | j+                          | j-                          |s| j/                          | j1                          | j3                          | j5                          | j7                          | j8                  j                  rt:        j<                  j?                  dd| ddd| j@                  | j                  d	| j8                  jB                  D cg c]  }|j                   c}| j8                  D cg c]  }|j                   c}d
i	       tD        jF                  s| jH                  j                  s| jJ                  j                  rtL        jN                  jQ                  d      st)        dd       t:        jR                  jU                  | j                        }|st)        d       nj| jH                  j                  r| jH                  rd|_+        nd |_+        | jJ                  j                  r| jJ                  |_%        |jY                  d       | jZ                  s/| j\                  j                  r| j^                  rt)        dd       | j`                  j                  rbt:        jb                  je                  d      rnAtL        jN                  | jg                         k(  rnt)        d| jg                          dd       | jZ                  s| jh                  j                  rtL        jj                  s}| jh                  r t:        jl                  jo                  |        nQ| j8                  D ]B  }t:        jl                  jq                  |      s#t:        jl                  js                  | |       D tu        tv        |   |i |}| jy                          | j{                          | j^                  s| j|                  r#t        t:        jv                  j                         | j                          | jZ                  r&t:        j                  |       }|jY                          |S c c}w c c}w )Nu   Для включения SMS уведомлений необходимо указать номер мобильного телефонаTrA  perm_updater	   r  Fr$   r  )rZ  r[  )	r%   r&   r'   r(   ignore_transactionr)   parent_nameparent_code
audit_dataIBAdminsrP  u   Изменять настройки паролей разрешено только Администраторам ИБ из группы IBAdminsr  uG   Пользователь не синхронизирован с accountr   r   ua   Нельзя изменять календарь у локальных пользователейr    uw   Поле может редактировать только Администратор или Руководитель(r   r'   r3  )Cr  r|  rq  r   r   rC  rh   r@   r   r   r   _calc_user_localrd  r  r_  rf  ri  rD   numberrA   r+   r  r  r  r   r  r  rV  r   r,   r/   r0   r>   rZ  configEVA_ACCOUNT_USEpassword_must_changepassword_changed_dater_   current_userrS  r  rG   password_expires_must_changerw   rR  r  r   no_staff_control_todayr-   r.   ry  r    license_disable_user_count_hooks
CmfLicenserelease_all_user_licensesis_license_grouptake_user_licenserH   r	   r  rM  r   schedule_deferred_jobr  _check_notify_opt_cache_reloadCmfTimeTracker)
r2   	from_ldapr3   r4   r_   r  r=  r   person_timetrackerrJ   s
            r5   rw   zCmfPerson.saveV  s~   ***4V4!!#'')&&4+;+;OO::$))tzz1

DI 	$$&!??%%$//$$++DJJ4E4E  f  nr  s224$$&!!#$$&  " ''OO''%*"#(  II II 040A0A0E0EF1F040A0AB1B# ( " %%((33t7Q7Q7\7\~~555L  r$(*~~))

);gh00;;44@AD=@DD=11<<595O5O2III-{{t}}77DOOy  BF  G&&11##444G4#6#6#88  T  UY  Uh  Uh  Uj  Tk  kl  m $& {{t11<<QEgEg!!!!;;DA!.. IE((99%@));;D%HI It)4:6: ??d44!&"2"2"E"EF++-;;!'!6!6d!6!C##%
o  GBs   V-0V2c                    | j                  dddgt        j                  j                  j	                                t        j
                  j                  dd| gdg      }|rt        d| d	d
       y | j                  rFdt        j                  j                         j                  d       }| d| j                   | _        | j                          t        j                  st        j                  j                  |        |j                  d      r8t        j                   j#                  | d
      D ]  } |j$                  |i |  t        j&                  j#                  |       D ]  } |j$                  |i |  t        j(                  j                  |       }|r>|j                  d      rd | _        | j-                  d
        |j$                  |dd
i| t/        | H  |i | t1        t2        j4                  | j6                  j8                  g       t1        t2        j:                         t        j<                  j?                          y )Nrq   r   r  r   r[   r   r\   u;   Пользователь синхронизирован с u9   , сначала отключите интеграцию.TrA  DELz%Y%m%d%H%M%Srf   TEXKOM_db_deleterI  rH  r  r   from_person_deleter3   ) ru   r,   r  PERSON_LIC_FIELDSr  r   rG   r+   r  r   nowstrftimerC  r_   r  r  CmfPersonViewr^   deleterJ  r  r  rw   rH   r  r	   sync_person_task_resourcesrS   r   r  CmfProjectNotifySchemetrigger_reload)	r2   r3   r4   r   prefixr  varr  rJ   s	           r5   r  zCmfPerson.delete  s    (9;00779; 	< ,,0048NXeWf0g	ST]S^  _X  Y  ae  f8,,002;;NKLMF&,XQt/C/C.D#ED 1177=::()))..dD.Q *$)&)*&&++4+8 	(CCJJ''	(%%)))6zz,- $		D	)HOOTEdEfE''iBB$''--Y 	i::;
 	%%446r6   c                 L   | j                   r:t        j                  | j                  d| j                   j                        | _         t        |   |i | t        j                  j                  | d      }|r |j                  |i | t        t        j                         y )Nr7   T)r'   r   )r  resubdelete_prefix_patternr   rH   rK  r,   r  rG   r  r	   r  )r2   r3   r4   r  rJ   s       r5   rK  zCmfPerson.restore  s    #%66$*D*Db$J^J^JdJd#eD ((%%))t)LHd-f-i::;r6   c                 &   |rt        j                         }|j                  |j                  d             |j	                         }t
        j                   d| d}t        j                  j                  |      st        j                  |       S )Nutf8/)hashlibmd5r  encode	hexdigestr2   _AVATAR_DIRECTORYospathexistsmakedirs)rI   rh   mavatar_hashavatar_directorys        r5   
avatar_dirzCmfPerson.avatar_dir  sn    AHHU\\&)*++-K"&"8"8!9;-qI77>>"23,-r6   c                    t         j                  j                  | j                  j                        }t
        j                  j                  |      rUt
        j                  |      D ]=  }| | }t
        j                  j                  |      s)t
        j                  |       ? t        t        j                  | j                  j                  g       y )Nr   )r,   r	   r  rh   r   r  r  isdirlistdirisfileremover  set_gravatarrS   )r2   r3   r4   r  filefilepaths         r5   r   zCmfPerson.remove_avatar  s    !++66tzz7G7GH77==)*

#34 (./v677>>(+IIh'( 	i44DGGMM?Kr6   uV   Пересчет ресурсов после удаления пользователяr   )descriptionpriorityc                    t         j                  j                  dd| gdgd      }|rb|j                  rUg dddd| gd	d
| gggg}t         j                  j                  |      D ]!  }t         j                  j                  |       # y y y )NrS   r[   r   Tr   rt  rW   rs  rX   rY   r   )r,   r	   rG   r   r)  r^   CmfTaskResAssignsync_task_resources)r  r   r   r{  s       r5   r  z$CmfPerson.sync_person_task_resources  s     !!%%dD)-Dm_nr%sf((5tY7+ti[9YZG ++7+; B'';;DAB )6r6   u<   Регистрация нового пользователя)r   r'  )guestemailsc                   ddl m} g }t        j                  j	                  t
        j                  dz         st        j                  d       |S t        j                  t        j                  k7  rt        j                  j                  rTt        j                  j                  st        j                  j                  sit        j                  j!                  d      sI| D ](  }t"        j$                  j'                  ddd	d
d||       * t)        dt        j                          |       }|rg }nt"        j*                  j-                         g}| D ]  }|t"        j$                  j'                  ddd	dd||       t/        |t
        j0                  t3        t5        t7        j6                                     t3        t5        t7        j6                         dz               d|      }	t        j                  d|	        t        j                  j8                  j:                  |	d<   t=        |	      }
t?        |
      }t"        j@                  jC                  dgd      jD                  j:                  }|d||d}|jG                  tI        dd       d|tJ        jL                  d      }t        j                  d| d|        |jN                  dk7  s|jP                  d k7  r-|jS                         }t        j                  d!| d"|        d#d$|g}t        j                  d%|        t"        jT                  jC                  |d&d'g(      }|s0t        j                  d)       t"        jU                  |||| *      }nP|D ]B  }t        j                  d+|jV                   d,|        |jX                  j[                  |       D |sd|_        t\        j_                         5  |ja                          d	d	d	       |j[                  |jb                  j:                         t        j                  d-        |S # 1 sw Y   HxY w).u   
        Регистрируем новых пользователей по email
        :param emails:
        :param guest:  пригласить как гостей
        :return:
        r   )sessionz/custom/org_namezCregister_persons: WARNING: org_name is not set, can't invite peopleAllowInviterP  user_inviter	   Nr#   r$   )r%   r&   r'   r(   r)   r  r  u.   Операция не доступна для r  r   i:	 guid)rh   issiatexpjtir  zregister_persons:frominvite_must_change_passwordT)r:   cache_inmemoryinvite_by_email)rB   actioninvite_tokenr8  )absoluteinternalzauth/signup   )r   cookiestimeout,    zSigned up successfullyuE   ERROR: Не удалось отправить приглашение z: r@   r[   u"   Ищем пользователя r   r   r\   u)   Создадим пользователя)rh   rB   r   r   u(   Добавим пользователя u    в группу z!register_persons: person saved ok)2requestsr/  r  r  r  r  PROJECT_DIRr_   r   r`   rU   r  r   r   r   allow_user_inviterS  r,   r/   r0   CmfPermissionErrorr7  r8  r   APP_FQDNrL   inttimerB   r   
create_jwtrsa_sign_pack_jwtCmfGlobalSettingsrG   r8  postauth_base_hrefrequestr@  status_coder?   jsonr	   r>   r   ra   rx   ry   rw   rS   )r-  r,  r3   r4   r/  rb   rB   sgroupspayloadjwtr<  r8  r   r   r   r   r=  s                     r5   r   zCmfPerson.register_persons  s    	%ww~~f003EEFGGYZM /NN--((11--??,,<<<V   R++MR]37v^_8=5 , RR %'UVWVfVfUg%hiiIF++6689F 7	9E}OO''k/34XY49u ( N %"3tyy{#34"3tyy{5E'E#FG%$G GG'y12..44::GFOW%C,S1L((,,5R4Sdh,i  F  F  L  L ("/$03ND &&ND4HIU"!("  >C GG'uBtf56#%5M)M_`e_ffhiohpqrtU+GGG8	BC%%)).R^A_)`FCD))UQWhmdm)n# 6EGGFv{{mSdejdklm''..u56 (,F%$$&  MM&))//*GG78o7	9p  s   +QQ	)r:   rS   r;   c                    ddg}g }|rdd|d   g}|r|d   dk(  rdd|d   g}|rdd|g}|sy | j                  ||      }|S )Nr   avatar_filenamerS   r   r   r$   r:   r;   rT   )rI   r:   rS   r;   r3   r4   
new_filterr   s           r5   r   zCmfPerson.public_getq  sp     )*
T!W-JfQi4'VAY/JRJggVJg7
r6   rY  c                     y r}   r3  )rI   r:   r;   r3   r4   s        r5   r   zCmfPerson.public_list  s    r6   c                 0   | j                   syt        j                  j                  dd| j                  gdg      }|r|d   }|S t        j                  | j
                        }| j                  |_        | g|_        | |_        |j                          |S )uq   
        Возвращаем объект, с которым нужно начать переписку
        Nprimary_contact_idr   r$  )r;   r  r   )r>   )
rA   r,   CmfDealr^   rS   r>   rY  contactsprimary_contactrw   )r2   r3   r4   dealsdeals        r5   r   zCmfPerson.start_chat  s     zz##,@#tww+O[lZm#n8D  >>tyy>1D<<DL!FDM#'D IIKr6   c                    | j                   j                  r,| j                   j                  | j                   j                  S t        j                  j                  dd| j                  gddg      }|r6|j                   dk(  rv|j                  t        j                  j                  k7  rOdt        j                  j                   j                  d   d| j                   _        | j                   j                  S |j                   xr- |j                   j                  |j                   j                     xs d}|j                   j                  |d| j                   _        | j                   j                  S )	Nr  r[   online_statusr\   	invisibleoffline)js_idr>   r7   )rd  
is_defined_valuer,   rJ  rG   rS   r  r_   r`   choicesr   )r2   ra  r>   s      r5   _online_statuszCmfPerson._online_status  s/   ((T-?-?-F-F-R%%,,,((,,[$4PZikvYw,x
Z55DI]I]abaqaqatatIt2;VEXEXEfEfEnEnoxEy(zD%%%,,,''lJ,D,D,L,LZMeMeMkMk,lrpr.8.F.F.L.L%!!!(((r6   c                     |sg }|dk(  r|dd|gg}|dk(  r|r|j                  d      r|g dg}|dk(  r|dg d	d
dg dggg}|dk(  r|g dg}t        |   |f|||d|S )Nrk  r  r[   rY  r   )is_internalr[   Truer   rW   )r   r[   Fr@   rY   )rO  Usersr  Auditorsr  )r'   r[   N)object_fields	object_idr;   )rG   rH   field_options_list)rI   relation_field_namerq  rr  r;   r4   rJ   s         r5   rs  zCmfPerson.field_options_list  s    F.0{D)<=F)+!2!2<!@ "?@.0 6Gr8stvF*,45Fw)*= X]4=fXPVX 	Xr6   c                    t         j                  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                  j                  ||      }t         j                  d|        |S # t        $ r"}t         j                  d|        Y d}~yd}~ww xY w)us   
        Ищем персону по номеру телефона
        :param phone:
        :return:
        u4   Ищем пользователя по номеру )rA   rC   rD   rE   r   RUr   Nz;%rW   rA   LIKErC   r[   rD   rE   r\   u.   Возвращаем пользователя %   Неправильный номер: )r_   r   phonenumbersparseformat_numberPhoneNumberFormatE164r,   r	   rG   r   )	rI   rA   r:   r;   	phone_objformat_phoner   r   r  s	            r5   get_by_phonezCmfPerson.get_by_phone  s    	
FugNOYF	$**5$7I*88LDbDbDgDghijiklmmopLgv|<($6&=!6<8:G !7+""&&gf&ECGGDSEJKJ 	GG;E7CD	s   BB> >	C)C$$C)c                     g }i }| j                  dg       | j                  D ];  }|j                  sg }|||j                  j                  <   |j	                  |       = fd |       |S )Nzroles.tree_parent_idc                    i }t         j                  j                  dd| gddg      D ]J  }| |j                     j	                  d|       |j
                  s/| |j                     ||j
                  <   L |r	 |       y y )NrS   rY   tree_parent_idr  r\   r   )r,   
CmfOrgUnitr   rS   insertr  )ou_idsou_ids_nextouquery_ous      r5   r  z.CmfPerson.get_org_units_list.<locals>.query_ou  s    K''--dD&5IScekRl-m Cruu$$Qr*$$5;BEE]K 1 12C % r6   )ru   rj  r  r   ra   )r2   r1  r   rb   ou_ids_firstr  ou_listr  s          @r5   r   zCmfPerson.get_org_units_list  sv    012 	'A7>Q--334g&		'	& 	r6   c                 X   | j                  |||      }|s@	 t        j                  d|        t        j	                  ||      }|j                          t        j                  d|j                          |S # t        $ r%}t        j                  d| d|        Y d }~y d }~ww xY w)Nr   u:   Создаем пользователя с номером )rA   r>   rx  rB  u@   Возвращаем пользователя с номером )r  r_   r   r,   r	   rw   r   rA   )rI   rA   r:   r;   r   r  s         r5   get_or_create_by_phonez CmfPerson.get_or_create_by_phone  s    ufV<TUZT[\]&&U&?
 	
RSVS\S\R]^_
	  ?wbLMs   ?A; ;	B)B$$B)c                     t        t              |j                  d      d      j                  |      }|j	                  | j
                  j                  |       y)u3   
        Позвонить клиенту
        :r   rR   N)varsr,   r   rG   callbackrA   number_e164)r2   
channel_idr  channels       r5   
phone_callzCmfPerson.phone_call  sJ     v,z//4Q78<<
<K//:r6   c                     t         j                  j                  | j                        st         j	                  | j                         t        j                  | j                   d|       S )Nr  )r  r  r  r  r  pathlibPath)r2   
image_hashr3   r4   s       r5   avatar_pathzCmfPerson.avatar_path  sK    ww~~d445KK../||t556a
|DEEr6   c                     |s| j                   j                         r;| j                  | j                         }|j                         r|j	                          d | _         | j                  d       |r0t        t        j                  | j                  j                  g       y |}t        |t              rt        j                  |      }t        j                   | j"                  j                  j%                  d            j'                         }| d| _         | j                  | j                         }	|	j)                  d      5 }
|
j+                  |       d d d        | j                  d       y # 1 sw Y   xY w)NTr   r   r  z.jpegwb)rX  r\  r  r  unlinkrw   r  r	   r$  rS   r   r&  rL   base64urlsafe_b64decoder  r  rh   r  r  openwrite)r2   image
image_typer$  r3   r4   r  
image_datar  
image_path
image_files              r5   r   zCmfPerson.set_avatar  s*   ##((*"..t/C/CD%%'&&(#'D III%%i&<&<DGGMM?S
eS!11%8J[[!1!1!8!8!@AKKM
",U3%%d&:&:;
__T" 	)jZ(	)		D	!	) 	)s   E44E=c                    | j                   st        j                  d       yt        j                         }|j                  | j                   j                  j                         j                         j                  d             d}d|j                          d| d}	 t        j                         j                  |t        j                  d	      }|j(                  dk7  r0t"        j+                  d
j'                  ||j(                               y|j,                  S # t         $ r/}t"        j%                  d
j'                  ||             Y d}~yd}~ww xY w)u>   
        Получаем аватарку с gavatar
        u/   Fetch gravatar skip: не задан логинNr  qwez https://www.gravatar.com/avatar/z/avatar.jpg?d=z&s=200r   )rA  u.   Ошибка запроса к gravatar {}: {}rC  )rh   r_   r   r  r  r  r   lowerrk   r  r  rx   requests_sessionrG   rP  r3   r   r  r  formatrQ  r	  content)r2   r  defaulturlr   r  s         r5   fetch_gravatarzCmfPerson.fetch_gravatar  s    zzGGEFKKM	!!'')//188@A0~gYV\]	**,00gllA0NC ??c!MMJQQRUWZWfWfgh{{  	NUUVY[\]^	s   !4D   	E)%EE<   u   Установка gravatar)r   soft_time_limitr'  c                     t         j                  j                  |       }|j                  t         j                  j	                  |             |j                         }|j                  |dd       y )NrR   jpegF)r  r$  )r,   r	   rG   ru   rm  r  r   )r  r   r   r  s       r5   r$  zCmfPerson.set_gravatar4  s_     !!%%%36++??GH%%'%FGr6   c                      y r}   r3  )rI   r3   r4   s      r5   r   z#CmfPerson.public_get_org_units_list<  s     r6   c                 N   | j                  dg       | j                  j                  s|s| j                  j                  sy | j                  j                  rt        j
                  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                  |k7  r|| _        | j                  j                  rt        j
                  j                  d      }| j                  dg       | j                  r+|| j                  vr| j                  j                  |       y y || j                  v r| j                  j!                  |       y y y )	Nr   ServiceDeskClient)r@   TFu   Нельзя снять опцию у пользователя, т.к. она активирована через Проектную роль или включена глобальная опция "Разрешить доступ всем"rA  r   )ru   r   r   r   r,   r7  rG   r   r[  rZ  r_   r   servicedesk_allow_auth_guestsr   r+   ra   r#  )r2   r   sdesk_groupr   s       r5   r  z!CmfPerson._calc_servicedesk_allowA  s    	-./ ""--  ++ '' //339L3MKc$"3"3"7"783t?P?P?T?T;UUU)-&c$"3"3"7"783t?P?P?T?T;UUU).& " ::4?? $ !!,,)).? B KOP !T%;%;?P%P):& !!,, //339L3MKn-.%%d&7&77%%,,[9 8 $"3"33%%,,[9 4 -r6   c                 B   |t         j                  v rt         j                  |   S t        j                  j	                  |dg d      }|st        d| d       y|j                  s|j                  rt        j                  d| d       y|j                  j                  |j                  j                  |j                  j                  |j                  j                  |j                  j                  |j                   j                  |j"                  j                  |j$                  j                  |j&                  j                  |j(                  j*                  |j,                  j*                  |j.                  j                  |j0                  j                  |j2                  j                  dt         j                  |<   t4        j6                  r6t8        j:                  j=                  t?        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_changesri  rh  	notify_osrA   rD   r>   rB   rh   r   r   )rS   r   r:   u8   Пользователь не существует (ID: r   NuV   Пользователь удален или не работает(уволен) (ID: )r  r  r  r  r  r  ri  rh  r  rA   rD   r>   rB   rh   ) r   cache_person_notify_optr,   r	   rG   r+   r   r   r_   r   r  r   r  r  r  r  r  ri  rh  r  rA   r  rD   r>   rB   rh   r  METRICS_NOTIFYr   cache_person_notify_opt_sizer  r   )rI   r  r   s      r5   get_notify_opt_cachedzCmfPerson.get_notify_opt_cachedy  s    333..y99!!%%D R
% & PQZP[[\]^!5!5GGlmvlwwxyz #)";";"A"A%55;;$3399$*$?$?$E$E!'!9!9!?!?%+%A%A%G%G ++11"//55))//\\(("//66KK%%\\''\\''2
##I.    ;;AA#cFaFaBbc**955r6   c                 F   | j                   se| j                  j                  sN| j                  j                  s7| j                  j                  s | j
                  j                  s	| j                  j                  s| j                  j                  s| j                  j                  s| j                  j                  s| j                  j                  s| j                  j                  s| j                  j                  so| j                  j                  sY| j                  j                  sC| j                  j                  s-| j                   j                  s| j"                  j                  sy t%        d       d| j&                  j(                  i}t+        d|       y )Nz!person_notify_opt::reload triggerr  CmfPerson:changed)rR  r   r   r   r  r  r  r  r  r  ri  rh  r  rA   rD   r>   rB   rh   printrS   r   cmf_emit_server_eventr2   r   s     r5   r  z(CmfPerson._check_notify_opt_cache_reload  s   KK**!!,,&&11##..""--((33%%00))44))  ++~~((zz$$  ++yy##zz$$zz$$12TWW]]+148r6   c                 :    t        d       ddi}t        d|       y )Nz"flush_all_notify_opt_cache triggerr  ALLr  )r  r  r  s     r5   flush_all_notify_opt_cachez$CmfPerson.flush_all_notify_opt_cache  s     23U#148r6   r  )r  c                      t        d       | j                  d      }|j                  d      }|dk(  ri t        _        n t        j                  j	                  |d        t        d       y )Nz&person_notify_opt_change::reload startr   r  r  z%person_notify_opt_change::reload done)r  rG   r   r  pop)r   r   r  s      r5   on_person_notify_opt_changez%CmfPerson.on_person_notify_opt_change  sX     	67{{6"HH[)	*,C'''++It<56r6   c                     t         j                  j                  | dg      }|r|j                  r|j                  S t
        j
                  j	                  t
        j                  j                        S )Nbrowser_timezone)r   r:   )tz)r,   rJ  rG   r  r  r   r  utcr2   ra  s     r5   get_current_datetimezCmfPerson.get_current_datetime  s^     ((,,DBTAU,V
*55>>!  $$(9(9(=(=$>>r6   c                    | xj                   dz  c_         | j                   t        j                  j                  k(  rt        j                  j                  rd| _        n\t
        j
                  j                         t        j                  t        j                  j                  j                        z   | _
        d| _         | j                  d       y )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_daterw   r~   s    r5   auth_fail_hookzCmfPerson.auth_fail_hook  s    ""a'"%%):):)N)NN  ::15.080A0A0E0E0G(J\J\--??EEK 1- *+D&		D	!r6   c                 6    d| _         | j                  d       y )Nr   Tr   )r  rw   r~   s    r5   auth_success_hookzCmfPerson.auth_success_hook  s    %&"		D	!r6   c                 l    | j                  ddg       | j                  D ]  }|j                           y )Nzperson_var.browser_timezonez,person_var.person.staff_control_blocked_date)ru   ra  get_overdue_deadline_tasksr  s     r5   calc_staff_control_blockedz$CmfPerson.calc_staff_control_blocked  s6    79ghi// 	4J113	4r6   z@dailyc                      t         j                  j                  g d      D ]  } d| _        | j	                           y )N)r  r   Tr   F)r,   r	   r^   r  rw   rH  s    r5   %cron_drop_no_staff_control_today_flagz/CmfPerson.cron_drop_no_staff_control_today_flag  s9     &&++3X+Y 	F,1F)KKM	r6   c                     | j                  ddg       d}| j                  D ]L  }|j                  r|j                  j                  s&|j                  j                  dz  |j                  z  }N |S )u0   
        Ставка за минуту
        zroles.job.rate_per_hourz
roles.rater   r  )ru   rj  jobrate_per_hourrate)r2   r  r   s      r5   rate_per_minutezCmfPerson.rate_per_minute  sm     	3\BCJJ 	<D88488#9#9HH***R/$));D	< r6   r}   )NN)NNN)r   zdatetime.datetime | None)r   bool)F)r   )NNT)___name__
__module____qualname__r  rE  r  r   r	   api_methodsr   classmethodr   rO   rU   r
   propertyrl   r   r   r   r   r   r   r   r   r   r   staticmethodcmf_deferred_jobr  r  r   r   r4  r?  rC  r^   rM  rV  r_  rd  rf  rm  rq  r|  r   r   r   r   ry  r  r  r  r  r   r  r  r  r  r  r  rw   r  rK  r  r   r  r   r   r   r   rk  rs  r  r   r  r  r  r   r  r$  r   r  r  r  r  on_server_eventr  r  r  r  r  r  r  __classcell__)rJ   s   @r5   r	   r	      s   !--..DE&&22 6
 
K0I" !#D 
 
1 L L   A A :U_6 $ $0/+ n@ 25 25h 6T 7 T. 	J  K  B ,0tVZfjz~ :H40 (,d - -0>
'"GA$(,
-
<(*	.+ )- A#(&.a 23h]*BkZ#7J<    L "z  FG  H	B H 	B 2pq49 Z Z r Zx &*tD  $ '+D  & 
) 
) X X"  20  ;F
"0, bFcdH e H  6:p 56 56n92 9 9
 017 2 7?""4 I J 

r6   r	   )r  r  r  rJ  decimalr   ry  cmf.data_providers.baser   cmf.includer   modules.person.fieldsr   cmf.metricsr   r	   r3  r6   r5   <module>r     s:          1   , *}
$$ }r6   