
    i                        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 d dlZd dl	m
Z
 d dlmZ  G d de
j                        Zy)    N)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
dnd       Ze
dod       Zed        Zd Zd ZdpdZdqdZdpdZe
d        Zd Zd Zd Zd Ze
dod       Ze ed
d
      dqd              Ze ed
d
d      dod              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.drd.Z/d/ Z0dsd0Z1d1 Z2d2 Z3dtd4Z4d5 Z5dd6 fd7
Z6dod8Z7d9 Z8 fd:Z9dud;Z: fd<Z;d= Z<d> Z=do fd?	Z> fd@Z? fdAZ@e
dodB       ZAdC ZBe edDdEF      dG               ZCe ed
dHI      d3dJdKe&fdL              ZDe
ddMdN       ZEe
dddOdP       ZFdQ ZGedR        ZHe
dp fdS	       ZIe
dqdT       ZJdU ZKe
dqdV       ZLdW ZMdX ZNdvdYZOdZ ZPe ed
d[d\]      d^               ZQe
d_        ZRdtd`ZSe
da        ZTdb ZUe
dc        ZVe eWdde      df               ZXdg ZYdh ZZdi Z[dj Z\e ed
d
dk      dl               Z]dm Z^ xZ_S )w	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                 \   | 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_assistantr7   )getsuperr   )clsr8   r9   r:   r2   r3   	__class__s         r4   r   zCmfPerson.search;   sE    "(**_"=  #l  Blw~vf
@F
 	
r5   c                 \    t        dj                  t        | j                                    S )Nr6   )strjoinreversedr=   r0   s      r4   reverse_namezCmfPerson.reverse_nameB   s    2778DII./00r5   c                 &    | j                  d      S )N.CmfPerson:00000000-0000-0000-0000-000000000001idrF   )rH   s    r4   system_personzCmfPerson.system_personE   s    wwJwKKr5   Tc                 x    t         j                  j                  t        j                  j
                  g d      S )N)r   online_statuson_vacationrg_member_ofis_admin
two_factor)rR   r9   )r+   r   rF   gcurrent_personrR   )rH   create_args_kwargss       r4   r
   zCmfPerson.get_current_userI   s6     ##""+z $ | 	|r5   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:   r9   )r+   
CmfProjectlistr[   r\   rR   append)rH   r9   resultprojects       r4   r	   zCmfPerson.get_current_projectsO   sz    ((--d[$QRQaQaQdQdPe<f7EtQM]M]M`M`6a6ckq . s 	#GMM'"	# r5   c                     | j                   xs | j                  xs d}| j                  xs d}| j                  xs d}| d| d| j	                         S Nr6    )	last_namelogin
first_namesecond_namestrip)r1   r2   r3   ro   rq   rr   s         r4   	full_namezCmfPerson.full_nameW   sW    NN6djj6B	__*
&&,"Aj\;-8>>@@r5   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)rx   rz   r=   )load_fieldsrv   r+   	CmfFoldersavecmfutildisable_aclCmfDocument)r1   r2   r3   folders       r4   r   zCmfPerson.get_home_folder^   s    -)%% 06	 & CF
 KKuK%%D$$& 		65GZ[``hm`n s   &B33B<c                 R    | j                   xs | j                  xs | j                  S N)rt   rp   rA   r1   s    r4   gen_namezCmfPerson.gen_namem   s    ~~99tzz9r5   c           	         d}|rt         j                  |d      }ni|r3t        j                  j	                  |ddgd      }|rA|j
                  }n4|r2t        j                  j	                  |ddgd      }|r|j
                  }|st        d| d	| d
| d       y| t        j                  k(  rt        j                  }n!t        j                  j                  | d      }||v ryy)u   
        ! Публичное API для bzPython
        Метод проверки, что пользователь находится в группе
        NCmfPersonGroup--rR   T)r?   r9   cache_inmemory)r=   r9   r   uX   Ошибка вызова in_person_group: не найдена группа (group_code=z, group_name=z, group=)F)id_only)r   get_obj_id_by_anyr+   r   sgetrR   r*   r[   current_usercurrent_person__member_ofr,   subject_full_group_list)r1   group
group_code
group_namegroup_id	member_ofs         r4   in_person_groupzCmfPerson.in_person_groupp   s    
 008HIH))..Jd|dh.iE 88))..Jd|dh.iE 88 &&0\zl(SXRYYZ\ ] 1>>!33I,,DDTSWDXIy r5   c                 *    | j                  |||      S )u   
        ! DEPRICATED
        ! Публичное API для bzPython
        Для обратной совместимости
        )rk   	role_coderole)in_project_role)r1   rk   r   r   s       r4   has_project_rolezCmfPerson.has_project_role   s     ##Gyt#TTr5   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CmfProjectRoler   rR   )r?   r9   )r=   r9   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)r1   rk   r   r   	role_namerole_id
project_ids          r4   r   zCmfPerson.in_project_role   s     //6FGG((--9dD\-RD''((--9dD\-RD'' %%.K|I;gdVSTV W..wE
ww}} 0 0 I I*V] ^^^r5   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_idrf   )APPcache_in_project_role
setdefaultdictrh   setr+   CmfProjectRoleAssignr   
all_nestedaddrR   r   )rH   r   r   project_cacherole_cache_setrulemembers          r4   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##r5   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)rW   vacation_startvacation_endFT)r}   r   r   datetimeutcnowdaterW   )r1   cur_on_vacations     r4   _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 /r5   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 )Nr6   rn   r      r#   )r=   
is_changedis_nullr   replaceVACATION_SUFFIXDOES_NOT_WORK_SUFFIXrs   splitlenro   rq   rr   )r1   tmpname_arrs      r4   _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r5   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 rm   )r=   r   rq   rr   ro   rp   rW   does_not_workr   r   rt   )r1   add_strs     r4   
_calc_namezCmfPerson._calc_name   s    II  ))**~~((zz$$**!!,,$../0G$3345G~~&wi0	r5   c                    | j                  g d       t        t        j                  j                  j
                  t        j                  j                  j
                  t        j                  j                  j
                  t        j                  j                  j
                        }| j                  r?|D ]:  }| j                  j
                  j                  |      s)| j                  |   ||<   < | j                  rd|d<   |S | j                  rO| j                  j
                  j                  d      s%| j                  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   rF   rY   )r1   reskeys      r4   get_auth_optionszCmfPerson.get_auth_options?  s(   ABa//GGMM//GGMM 00IIOO..EEKKN  6$$**..s3#005CH6
 == $C 
 D$5$5$;$;$?$?@V$W[_[l[l[r[r[v[v  xK  \L %C
r5   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
        ANDra   
user_localre   T)servicedesk_allowre   T)rp   !=N)r   r   T)r   re   Ncmf_modified_at>u   Синхронизируем r:   )zrg_member_of.ext_idcmf_deletedr   deleted_loginrA   r   	ext_loginzrg_member_of.systemTr:   r9   include_deleted)rp   r   rA   r=   rX   r   r   	old_loginN	only_datarX   rp   )eva_app_tokenusersrpc_account_sync_push)r3   methodu    учетокzauth/sync_accounts)ri   r[   debugr+   r   countrh   r   rp   r   r   rA   r=   r   r   r   r   r   r   only_system_grp_syncrX   systemr?   r   gen_eva_app_tokenr   call_eva_account)	rH   account_sync_lastforce_filterr   personrX   dataobjs	            r4   account_sync_pushzCmfPerson.account_sync_pushR  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)	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   )rZ   re   N)r   two_factor.two_factor_optrC   rA   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           r4   init_2fa_settingszCmfPerson.init_2fa_settings  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_nowr   r  r+   r   r   r	  logging	exceptionr   )r   r   r  s      r4   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!)slicer9   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_typere   pfeedr&   zparent.is_defaultrf   person_viewsz
NOT EXISTS	person_idr   ra   )cache_status_typer   OPENrd   re   listsrc   c                     | j                   S r   rQ   xs    r4   <lambda>z+CmfPerson.pfeed_post_list.<locals>.<lambda>  
    qtt r5   r   c                     | j                   S r   rQ   r*  s    r4   r,  z+CmfPerson.pfeed_post_list.<locals>.<lambda>  r-  r5   z-status_in_progress_start-cmf_created_at)r:   r9   r  r  )r+   CmfListrh   r&   
isinstancer   rg   
is_defaultri   rR   all_relation_personsCmfTaskr   r[   r\   map)r1   r  r9   r  r  r  r   r2   r3   r(  my_listslstr   flt	post_lists                  r4   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%  )rG   r   rR   )r1   obj_idr^   r3   rI   s       r4   r   zCmfPerson.mark_viewed  s#    
 w"6GTWWGGGr5   c                      y r    r0   s      r4   public_mark_viewedzCmfPerson.public_mark_viewed  s    r5   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 )Nrb   rc   p2prf   rX   rR   zNOT INrP   Tr   )rX   r   r+   r   
user_grouprR   CmfChatGrouprh   r@  r   rb   r   ri   topics)	r1   r   usr_grpr   	cur_chatsr   r   r   topics	            r4   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\   rR   r*   r+   r,   r-   r   s    r4   
_check_delzCmfPerson._check_del  sD    $'')IQUV--/r5   )include_systemis_userc                \    |s|j                  dd       |du rd|d<   t        |   |i |S )Nr   FTr   )r   rG   rh   )rH   rL  rM  r2   r3   rI   s        r4   rh   zCmfPerson.list  s;    h.d?#'F< w|T,V,,r5   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   rF   restorer*   r   )r1   
deleted_pvs     r4   _check_person_varzCmfPerson._check_person_var  s    &"5"5":":$":"G((,,D$,O
    s  t4(--/r5   c                    | j                   s| j                  j                  sy | j                  d      rWt        j
                  j                         }| j                  |j                        s| j                  j                  |       y y y )NAdminsr   )	is_newrX   r   r   r+   r   contact_admins_groupr?   ri   )r1   contact_admin_groups     r4   _calc_contact_adminzCmfPerson._calc_contact_admin$  sx    {{4#4#4#?#?84"("7"7"L"L"N''3F3K3K'L!!(()<= M 5r5   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?   Контакт не может быть без компанииTrI  )typer=   )r   r   companyr   oldnewr^  loadr*   r   r+   
CmfCompanyrt   r   )r1   new_companys     r4   _calc_companyzCmfPerson._calc_company.  s    ??dkk<<""||(8(8T\\=M=M=R=R=W=W=Y]e=e[cgh<< +++OK&DL	  r5   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)rY  r   r[   r\   r}   
person_var	favoritesr   )r1   rg  current_person_vars      r4   _calc_default_favoritesz!CmfPerson._calc_default_favorites:  ss     {{$//	$$&<%=>// 	"J&'&6&6&A&A ""'9'C'C
$!"	"r5   c                 6    | j                   r| j                  sy y r   )rY  r   r   s    r4   _calc_avatarzCmfPerson._calc_avatarG  s     !0r5   c                 *    t         |          g dz   S )N)rp   notify_email
notify_smsr@   rC   rolesprimary_rolezcompany.typer   rg  r   rW   r   r   ro   rq   rr   rp   rA   r   r  r   calendar_id)rG   save_preload_fields)r1   rI   s    r4   rs  zCmfPerson.save_preload_fieldsM  s     w*, 0G G 	Gr5   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responsiblere   r&  r   CLOSEDr   z	<a href="z">z</a>z<br>z</a> uM   Обработайте задачи уволенного сотрудника	9_disable)ru  r=   r>   full_search_type)r   r   r+   r4  rh   ri   hrefr=   rL   get_supervisorr   )r1   linkstaskr>   s       r4   _check_does_not_workzCmfPerson._check_does_not_workU  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 r5   c                 x    t         j                  j                  | j                  dg      }|r|j                  S y )Nfail_block_end_daterp   r9   )r+   CmfAuthr   rp   r  r1   auths     r4   r   z&CmfPerson.get_auth_fail_block_end_datei  s7    ~~""=R<S"T+++ r5   c                     t         j                  j                  | j                        }|r||_        |j                          y y Nrp   )r+   r  rF   rp   r  r   r1   r   r  s      r4   r   z&CmfPerson.set_auth_fail_block_end_daten  s6    ~~!!

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

!3(-D%IIK r5   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)rq  ztree_parent.head)headr+   r   rF   r}   rx   )org_unit	recursions    r4   r  z+CmfPerson.get_supervisor.<locals>.recursion  sW    }}''+++GG  "4!56## !5!566r5   zprimary_role.supervisor.personzprimary_role.tree_parent.headNr   )r}   rq  
supervisorr   rx   r+   r   admin_group
rg_membersrb  r   )r1   r  	admin_grpr  s      @r4   r{  zCmfPerson.get_supervisor  s    	 	:<[\]
  ++0A0A0L0L0S0S!..99@@
""..&t'8'8'D'DE
--99;I  %%'##&11<<>qA
r5   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   , так как у них указан Код запрета совмещения: TrI  )rX   r   r}   incompatible_combination_coderK   r   rs   r*   )r1   codesgrgr_codes       r4   %_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(		(r5   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   )rp  r   rq  r   )r1   r   s     r4   _calc_primary_rolezCmfPerson._calc_primary_role  si    

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

1Ddjj0 $

1D 1r5   c                     | j                   r t        j                  j                  |       syt        j                  j	                  |       D ]  }d|_        |j                  d        y)uN   Надо пометить что данные не засинканы
        rP  NTr   )r   r+   CmfAuthPluginDatar   rh   dirtyr   )r1   	auth_datas     r4   _check_auth_datazCmfPerson._check_auth_data  s\     F$<$<$B$B$$B$O1166d6C 	+I IONNTN*	+r5   )save_kwargsc                d    |j                  d      rt        dd       t        |   |d|i| y )Nrp  u   Назначение или открепление должности пользователю необходимо производить в "Структуре" в карточке должностиTrI  r  )rF   r*   rG   update)r1   r  r2   r3   rI   s       r4   r  zCmfPerson.update  s8    ::g}
 	@+@@r5   c                    | j                   r| j                  sr| t        j                  k7  r^t        j                  | j                  | j                  |      }|j                          || _        | j                  j                          y y y y )N)r@   rA   r  )	r   rZ   r[   rT   r+   CmfAuthTwoFactorrC   rA   r   )r1   r  rZ   s      r4   r  zCmfPerson._calc_two_factor  so    ??4??tq7N00t7H7H7;zz@N 1 PJ OO(DOOO  " 8O??r5   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   )rX   r   ra  r  rb  r   rZ   r  )r1   r  grps      r4   _calc_two_factor_groupsz!CmfPerson._calc_two_factor_groups  s      ++ $$(( 	C!!&&(!$!3!3!9!9	 T__;;;-;DOO*OO%%' <r5   c                     | j                   r*| j                  | j                   k7  r| j                   | _        | j                          | j                          t	        |   |i | y r   )rp   r?   r   _calc_servicedesk_allowrG   _save_import)r1   r2   r3   rI   s      r4   r  zCmfPerson._save_import  sL    ::$))tzz1

DI$$&d-f-r5   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   r6   Fr   )r?   re   ProjectAdminsr   u  Изменение членства в группах на карточке пользователя для Проектных администраторов временно недоступно. Откройте группу и добавьте пользователя там.TrI  )rX   r   r[   disable_permissionsacl_admin_moder\   rT   r+   r,   r-   r   rF   rR   r   r   r*   )r1   depthr3   project_admins_groups       r4   _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r5   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   rA   r@   rB   rC   rD   rE   
ip_addressemail_2zoomsnapchatlinkedinfacebookvkok	instagramskypeslackwhatsapp	messengervibertelegramwork_positionemployee_number
roles.nameprimary_role.namer   r6   z - r=   r  rn   r  r>   r=  )r}   full_search_preload_fieldsr   r+   CmfFullSearch
mark_cleanrR   r   
cmf_hiddenr=   rp   rA   rs   rp  rq  rG   full_search_index)r1   r3   text_fieldsr=   r>   frrI   s          r4   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2r5   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.coderf   rX  )r  re   F)r   re   Nauth_pluginre   r  T)r:   values)rX   r   r+   CmfAuthLdapPluginslistr   r  r?   rR   r  bulk_update)r1   pr   s      r4   _check_ad_grpzCmfPerson._check_ad_grp8  s       ++))//7OYjXk/l 	]A##q||/@/@#A11M$qtt3LN((44GWVZO4\	]r5   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)r2  r9   u   Календарь F)r=   r&   parent_calendarr  r  r  r  r  r   )rY  r   r   calendarr}   r  rR   r+   CmfCalendarrF   r?   r   r  r  r  r  r   )r1   default_calendarnew_calendars      r4   _calc_calendarzCmfPerson._calc_calendarE  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	) !/ 5r5   c                 .    | j                   di | | j                          | j                  j                  r| j                  r| j	                          | j
                  r*| j                  | j
                  k7  r| 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+                          | j-                          | j/                          | j1                          | j3                          | j4                  j                  rt6        j8                  j;                  dd| ddd| j<                  | j                  d	| j4                  j>                  D cg c]  }|j                   c}| j4                  D cg c]  }|j                   c}d
i	       t@        jB                  s| jD                  j                  s| jF                  j                  rtH        jJ                  jM                  d      st%        dd       t6        jN                  jQ                  | j
                        }|st%        d       nj| jD                  j                  r| jD                  rd|_)        nd |_)        | jF                  j                  r| jF                  |_#        |jU                  d       | jV                  s/| jX                  j                  r| jZ                  rt%        dd       | j\                  j                  rbt6        j^                  ja                  d      rnAtH        jJ                  | jc                         k(  rnt%        d| jc                          dd       | jV                  s| jd                  j                  rtH        jf                  s}| jd                  r t6        jh                  jk                  |        nQ| j4                  D ]B  }t6        jh                  jm                  |      s#t6        jh                  jo                  | |       D tq        tr        |   |i |}| ju                          | jw                          | jZ                  s| jx                  r#t{        t6        jr                  j|                         | j                          | jV                  r&t6        j                  |       }|jU                          |S c c}w c c}w )Nu   Для включения SMS уведомлений необходимо указать номер мобильного телефонаTrI  perm_updater   r  Fr#   r  )r`  ra  )	r$   r%   r&   r'   ignore_transactionr(   parent_nameparent_code
audit_dataIBAdminsrX  u   Изменять настройки паролей разрешено только Администраторам ИБ из группы IBAdminsr  uG   Пользователь не синхронизирован с accountr   r   ua   Нельзя изменять календарь у локальных пользователейr   uw   Поле может редактировать только Администратор или Руководитель(r   r&   r=  )Ar  r~  r   r   rK  rp   r?   r   r   r   rj  r  re  rl  ro  rC   numberr@   r*   r  r  r  r  r  r  r\  rX   r+   r.   r/   r=   r`  configEVA_ACCOUNT_USEpassword_must_changepassword_changed_dater[   r   r   r  rF   password_expires_must_changer   rY  r  r   no_staff_control_todayr,   r-   r{  r    license_disable_user_count_hooks
CmfLicenserelease_all_user_licensesis_license_grouptake_user_licenserG   r   r  rU  r   schedule_deferred_jobr  _check_notify_opt_cache_reloadCmfTimeTracker)
r1   	from_ldapr2   r3   r[   r  r   r   person_timetrackerrI   s
            r4   r   zCmfPerson.savef  sd   ***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V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 )Nry   r   r  r   re   r  rf   u;   Пользователь синхронизирован с u9   , сначала отключите интеграцию.TrI  DELz%Y%m%d%H%M%Srn   TEXKOM_db_deleterQ  rP  r  r   from_person_deleter2   ) r}   r+   r  PERSON_LIC_FIELDSr  r  rF   r*   r  r   nowstrftimerK  r[   r  r  CmfPersonViewrh   deleterR  r  r  r   rG   r  r   sync_person_task_resourcesrR   r   r  CmfProjectNotifySchemetrigger_reload)	r1   r2   r3   r  prefixr  varr  rI   s	           r4   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6r5   c                 L   | j                   r:t        j                  | j                  d| j                   j                        | _         t        |   |i | t        j                  j                  | d      }|r |j                  |i | t        t        j                         y )Nr6   T)r&   r   )r  resubdelete_prefix_patternr   rG   rS  r+   r  rF   r  r   r  )r1   r2   r3   r  rI   s       r4   rS  zCmfPerson.restore  s    #%66$*D*Db$J^J^JdJd#eD ((%%))t)LHd-f-i::;r5   c                 &   |rt        j                         }|j                  |j                  d             |j	                         }t
        j                   d| d}t        j                  j                  |      st        j                  |       S )Nutf8/)hashlibmd5r  encode	hexdigestr1   _AVATAR_DIRECTORYospathexistsmakedirs)rH   rp   mavatar_hashavatar_directorys        r4   
avatar_dirzCmfPerson.avatar_dir  sn    AHHU\\&)*++-K"&"8"8!9;-qI77>>"23,-r5   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!  rp   r   r  r  isdirlistdirisfileremover  set_gravatarrR   )r1   r2   r3   r   filefilepaths         r4   r   zCmfPerson.remove_avatar  s    !++66tzz7G7GH77==)*

#34 (./v677>>(+IIh'( 	i44DGGMM?Kr5   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 )NrR   re   r   Tr   rv  ra   ru  rb   rc   r   )r+   r   rF   r   r4  rh   CmfTaskResAssignsync_task_resources)r%  r   r   r}  s       r4   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 )6r5   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AllowInviterX  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)r9   r   invite_by_email)rA   actioninvite_tokenr;  )absoluteinternalzauth/signup   )r   cookiestimeout,    zSigned up successfullyuE   ERROR: Не удалось отправить приглашение z: r?   re   u"   Ищем пользователя rX   r   rf   u)   Создадим пользователя)rp   rA   rX   r   u(   Добавим пользователя u    в группу z!register_persons: person saved ok)2requestsr2  r  r  r  r  PROJECT_DIRr[   r   r\   rT   r   r   rY   r   allow_user_inviter   r+   r.   r/   CmfPermissionErrorr   rA  r   APP_FQDNrK   inttimerA   r   
create_jwtrsa_sign_pack_jwtCmfGlobalSettingsrF   r;  postauth_base_hrefrequestrB  status_coder>   jsonr   r=   rX   ri   r   r   r   rR   )r0  r/  r2   r3   r2  rj   rA   sgroupspayloadjwtr>  r;  r   r   r   r   r   s                     r4   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	)r9   c                4    dg} | j                   |d|i|}|S )Navatar_filenamer9   rS   )rH   r9   r2   r3   r   s        r4   r   zCmfPerson.public_get|  s+     $$cggt5F5f5
r5   )r9   r:   c                     y r   r=  )rH   r9   r:   r2   r3   s        r4   r   zCmfPerson.public_list  s    r5   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=   )
r@   r+   CmfDealrh   rR   r=   r_  contactsprimary_contactr   )r1   r2   r3   dealsdeals        r4   r   zCmfPerson.start_chat  s     zz##,@#tww+O[lZm#n8D  >>tyy>1D<<DL!FDM#'D IIKr5   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%  re   rV   rf   	invisibleoffline)js_idr=   r6   )rV   
is_defined_valuer+   rR  rF   rR   r%  r[   r\   choicesr   )r1   rg  r=   s      r4   _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%!!!(((r5   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	g d
g dgg}|dk(  r|g dg}t        |   |f|||d|S )Nrq  r%  re   r_  r   )is_internalre   TruerX   ra   )r   re   F)r?   r   rW  )r?   r   Usersr  )r&   re   N)object_fields	object_idr:   )rF   rG   field_options_list)rH   relation_field_namero  rp  r:   r3   rI   s         r4   rq  zCmfPerson.field_options_list  s    F.0{D)<=F)+!2!2<!@ "?@.0t%<>UWmnoF*,45Fw)*= X]4=fXPVX 	Xr5   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   Ищем пользователя по номеру )r@   rB   rC   rD   r   RUr   Nz;%ra   r@   LIKErB   re   rC   rD   rf   u.   Возвращаем пользователя %   Неправильный номер: )r[   r   phonenumbersparseformat_numberPhoneNumberFormatE164r+   r   rF   r	  )	rH   r@   r9   r:   	phone_objformat_phoner   r   r  s	            r4   get_by_phonezCmfPerson.get_by_phone  s    	
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 )NrR   rc   tree_parent_idr  rf   r   )r+   
CmfOrgUnitr  rR   insertr  )ou_idsou_ids_nextouquery_ous      r4   r  z.CmfPerson.get_org_units_list.<locals>.query_ou  s    K''--dD&5IScekRl-m Cruu$$Qr*$$5;BEE]K 1 12C % r5   )r}   rp  r  r   ri   )r1   r^   r_   rj   ou_ids_firstr  ou_listr  s          @r4   r   zCmfPerson.get_org_units_list  sv    012 	'A7>Q--334g&		'	& 	r5   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:   Создаем пользователя с номером )r@   r=   rv  rD  u@   Возвращаем пользователя с номером )r~  r[   r   r+   r   r   r	  r@   )rH   r@   r9   r:   r   r  s         r4   get_or_create_by_phonez CmfPerson.get_or_create_by_phone  s    ufV<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   rQ   N)varsr+   r   rF   callbackr@   number_e164)r1   
channel_idr  channels       r4   
phone_callzCmfPerson.phone_call  sJ     v,z//4Q78<<
<K//:r5   c                     t         j                  j                  | j                        st         j	                  | j                         t        j                  | j                   d|       S )Nr  )r  r  r  r  r  pathlibPath)r1   
image_hashr2   r3   s       r4   avatar_pathzCmfPerson.avatar_path   sK    ww~~d445KK../||t556a
|DEEr5   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)rZ  rb  r  r  unlinkr   r  r   r'  rR   r   r1  rK   base64urlsafe_b64decoder  r  rp   r  r  openwrite)r1   image
image_typer'  r2   r3   r  
image_datar  
image_path
image_files              r4   r   zCmfPerson.set_avatar  s*   ##((*"..t/C/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   )rC  u.   Ошибка запроса к gravatar {}: {}rE  )rp   r[   r   r  r  r  r   lowerrs   r  r  r   requests_sessionrF   rR  r2   r	  r  r  formatrS  r  content)r1   r  defaulturlr   r  s         r4   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 )NrQ   jpegF)r  r'  )r+   r   rF   r}   rs  r  r   )r%  r_   r   r  s       r4   r'  zCmfPerson.set_gravatar3  s_     !!%%%36++??GH%%'%FGr5   c                      y r   r=  )rH   r2   r3   s      r4   r   z#CmfPerson.public_get_org_units_list;  s     r5   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   Нельзя снять опцию у пользователя, т.к. она активирована через Проектную роль или включена глобальная опция "Разрешить доступ всем"rI  rX   )r}   r   r   rX   r+   r   rF   r   ra  r`  r[   r   servicedesk_allow_auth_guestsr   r*   ri   r&  )r1   r   sdesk_groupr   s       r4   r  z!CmfPerson._calc_servicedesk_allow@  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 -r5   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_changesro  rn  	notify_osr@   rC   r=   rA   rp   r   r   )rR   r   r9   u8   Пользователь не существует (ID: r   NuV   Пользователь удален или не работает(уволен) (ID: )r  r  r  r  r  r  ro  rn  r  r@   rC   r=   rA   rp   ) r   cache_person_notify_optr+   r   rF   r*   r   r   r[   r   r  r   r  r  r  r  r  ro  rn  r  r@   r  rC   r=   rA   rp   r  METRICS_NOTIFYr   cache_person_notify_opt_sizer  r   )rH   r%  r   s      r4   get_notify_opt_cachedzCmfPerson.get_notify_opt_cachedx  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5r5   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)rY  r   r   r   r  r  r  r  r  r  ro  rn  r  r@   rC   r=   rA   rp   printrR   r   cmf_emit_server_eventr1   r   s     r4   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8r5   c                 :    t        d       ddi}t        d|       y )Nz"flush_all_notify_opt_cache triggerr%  ALLr  )r  r  r  s     r4   flush_all_notify_opt_cachez$CmfPerson.flush_all_notify_opt_cache  s     23U#148r5   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  rF   r   r  pop)r_   r   r%  s      r4   on_person_notify_opt_changez%CmfPerson.on_person_notify_opt_change  sX     	67{{6"HH[)	*,C'''++It<56r5   c                     t         j                  j                  | dg      }|r|j                  r|j                  S t
        j
                  j	                  t
        j                  j                        S )Nbrowser_timezone)r   r9   )tz)r+   rR  rF   r  r  r   r  utcr1   rg  s     r4   get_current_datetimezCmfPerson.get_current_datetime  s^     ((,,DBTAU,V
*55>>!  $$(9(9(=(=$>>r5   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_dater   r   s    r4   auth_fail_hookzCmfPerson.auth_fail_hook  s    ""a'"%%):):)N)NN  ::15.080A0A0E0E0G(J\J\--??EEK 1- *+D&		D	!r5   c                 6    d| _         | j                  d       y )Nr   Tr   )r  r   r   s    r4   auth_success_hookzCmfPerson.auth_success_hook  s    %&"		D	!r5   c                 l    | j                  ddg       | j                  D ]  }|j                           y )Nzperson_var.browser_timezonez,person_var.person.staff_control_blocked_date)r}   rg  get_overdue_deadline_tasksr  s     r4   calc_staff_control_blockedz$CmfPerson.calc_staff_control_blocked  s6    79ghi// 	4J113	4r5   z@dailyc                      t         j                  j                  g d      D ]  } d| _        | j	                           y )N)r  r   Tr   F)r+   r   rh   r  r   rP  s    r4   %cron_drop_no_staff_control_today_flagz/CmfPerson.cron_drop_no_staff_control_today_flag  s9     &&++3X+Y 	F,1F)KKM	r5   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  )r}   rp  jobrate_per_hourrate)r1   r  r   s      r4   rate_per_minutezCmfPerson.rate_per_minute  sm     	3\BCJJ 	<D88488#9#9HH***R/$));D	< r5   )Tr   )NNN)NN)r   zdatetime.datetime | None)r   bool)F)r   )NNT)`__name__
__module____qualname__r  rG  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   r>  rG  rK  rh   rU  r\  re  rj  rl  rs  r~  r   r   r   r   r{  r  r  r  r  r  r  r  r  r  r  r  r   r  rS  r!  r   r	  r   r   r   r   rj  rq  r~  r   r  r  r  r   r  r'  r   r  r  r  r  on_server_eventr  r  r  r  r  r  r  __classcell__)rI   s   @r4   r   r      s   !--..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 23h]*BfP#7J<    L "z  FG  H	B H 	B 2pq49 Z Z r Zx &*   '+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 

r5   r   )r  r  r  rL  rw  cmf.data_providers.baser   cmf.includer   modules.person.fieldsr   cmf.metricsr   r   r=  r5   r4   <module>r     s7         1   , *}
$$ }r5   