
    oi                        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
  G d de
j                        Zy)    N)commit_all_ds)*)
cmf_personc                       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
dnd       Zed        Zd Zd ZdodZdpdZdodZe
d        Zd Zd Zd Zd Ze
dnd       Ze ed
d
      dpd              Ze ed
d
d      dnd              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.dqd.Z/d/ Z0drd0Z1d1 Z2d2 Z3dsd4Z4d5 Z5dd6 fd7
Z6dnd8Z7d9 Z8 fd:Z9dtd;Z: fd<Z;d= Z<dn fd>	Z= fd?Z> fd@Z?e
dndA       Z@dB ZAe edCdDE      dF               ZBe ed
dGd
H      d3dIdJe&fdK              ZCe
ddLdM       ZDe
dddNdO       ZEdP ZFedQ        ZGe
do fdR	       ZHe
dpdS       ZIdT ZJe
dpdU       ZKdV ZLdW ZMdudXZNdY ZOe ed
dZd[d
\      d]               ZPe
d^        ZQdsd_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 )v	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_assistantr6   )getsuperr   )clsr7   r8   r9   r1   r2   	__class__s         r3   r   zCmfPerson.search:   sE    "(**_"=  #l  Blw~vf
@F
 	
r4   c                 \    t        dj                  t        | j                                    S Nr5   )strjoinreversedr<   r/   s      r3   reverse_namezCmfPerson.reverse_nameA   s    2778DII./00r4   c                 &    | j                  d      S )N.CmfPerson:00000000-0000-0000-0000-000000000001idrE   )rG   s    r3   system_personzCmfPerson.system_personD   s    wwJwKKr4   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   r8   )r*   r   rE   gcurrent_personrR   )rG   create_args_kwargss       r3   r	   zCmfPerson.get_current_userH   s6     ##""+z $ | 	|r4   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==r9   r8   )r*   
CmfProjectlistr[   r\   rR   append)rG   r8   resultprojects       r3   r   zCmfPerson.get_current_projectsN   sz    ((--d[$QRQaQaQdQdPe<f7EtQM]M]M`M`6a6ckq . s 	#GMM'"	# r4   c                     | j                   xs | j                  xs d}| j                  xs d}| j                  xs d}| d| d| j	                         S Nr5    )	last_namelogin
first_namesecond_namestrip)r0   r1   r2   ro   rq   rr   s         r3   	full_namezCmfPerson.full_nameV   sW    NN6djj6B	__*
&&,"Aj\;-8>>@@r4   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)r0   r1   r2   folders       r3   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   r@   r0   s    r3   gen_namezCmfPerson.gen_namel   s    ~~99tzz9r4   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>   r8   cache_inmemory)r<   r8   r   uX   Ошибка вызова in_person_group: не найдена группа (group_code=z, group_name=z, group=)F)id_only)r   get_obj_id_by_anyr*   r   sgetrR   r)   r[   current_usercurrent_person__member_ofr+   subject_full_group_list)r0   group
group_code
group_namegroup_id	member_ofs         r3   in_person_groupzCmfPerson.in_person_groupo   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 r4   c                 *    | j                  |||      S )u   
        ! DEPRICATED
        ! Публичное API для bzPython
        Для обратной совместимости
        )rk   	role_coderole)in_project_role)r0   rk   r   r   s       r3   has_project_rolezCmfPerson.has_project_role   s     ##Gyt#TTr4   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>   r8   )r<   r8   ug   Ошибка вызова in_project_role - не найдена Проектная роль (role_code=z, role_name=z, role=r   Frg   )
r   r   r*   r   r   rR   r)   valuer   get_project_role_members)r0   rk   r   r   	role_namerole_id
project_ids          r3   r   zCmfPerson.in_project_role   s     //6FGG((--9dD\-RD''((--9dD\-RD'' %%.K|I;gdVSTV W..wE
ww}} 0 0 I I*V] ^^^r4   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   )rG   r   r   project_cacherole_cache_setrulemembers          r3   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##r4   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   )r0   cur_on_vacations     r3   _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 /r4   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 )Nr5   rn   r      r"   )r<   
is_changedis_nullr   replaceVACATION_SUFFIXDOES_NOT_WORK_SUFFIXrs   splitlenro   rq   rr   )r0   tmpname_arrs      r3   _calc_from_namezCmfPerson._calc_from_name   s    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r4   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   )r0   add_strs     r3   
_calc_namezCmfPerson._calc_name   s    II  ))**~~((zz$$**!!,,$../0G$3345G~~&wi0	r4   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   rE   rY   )r0   reskeys      r3   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
r4   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   Синхронизируем r9   )zrg_member_of.ext_idcmf_deletedr   deleted_loginr@   r   	ext_loginzrg_member_of.systemTr9   r8   include_deleted)rp   r   r@   r<   rX   r   r   	old_loginN	only_datarX   rp   )eva_app_tokenusersrpc_account_sync_push)r2   methodu    учетокzauth/sync_accounts)ri   r[   debugr*   r   countrh   r   rp   r   r   r@   r<   r   r   r   r   r   r   only_system_grp_syncrX   systemr>   r   gen_eva_app_tokenr   call_eva_account)	rG   account_sync_lastforce_filterr   personrX   dataobjs	            r3   account_sync_pushzCmfPerson.account_sync_pushQ  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_optrB   r@   rf   )two_factor_optr   u   Обработано u-   </br> Не удалось настроить:z</br>u)   Закончили настройку 2FA)r=   )r*   r   rh   _calc_two_factorr   	save_datacommit_with_event	Exceptionrollback_purge_eventri   rK   r[   r   rL   r   admin_alert)r   r  r_   fail_personperson_countr   er=   s           r3   init_2fa_settingszCmfPerson.init_2fa_settings  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      r3   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!)slicer8   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    r3   <lambda>z+CmfPerson.pfeed_post_list.<locals>.<lambda>  
    qtt r4   r   c                     | j                   S r   rQ   r*  s    r3   r,  z+CmfPerson.pfeed_post_list.<locals>.<lambda>  r-  r4   z-status_in_progress_start-cmf_created_at)r9   r8   r  r  )r*   CmfListrh   r%   
isinstancer   rg   
is_defaultri   rR   all_relation_personsCmfTaskr   r[   r\   map)r0   r  r8   r  r  r  r   r1   r2   r(  my_listslstr   flt	post_lists                  r3   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%  )rF   r   rR   )r0   obj_idr^   r2   rH   s       r3   r   zCmfPerson.mark_viewed  s#    
 w"6GTWWGGGr4   c                      y r    r/   s      r3   public_mark_viewedzCmfPerson.public_mark_viewed  s    r4   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)	r0   r   usr_grpr   	cur_chatsr   r   r   topics	            r3   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    r3   
_check_delzCmfPerson._check_del  sD    $'')IQUV--/r4   )include_systemis_userc                \    |s|j                  dd       |du rd|d<   t        |   |i |S )Nr   FTr   )r   rF   rh   )rG   rL  rM  r1   r2   rH   s        r3   rh   zCmfPerson.list  s;    h.d?#'F< w|T,V,,r4   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   rE   restorer)   r   )r0   
deleted_pvs     r3   _check_person_varzCmfPerson._check_person_var  s    &"5"5":":$":"G((,,D$,O
    s  t4(--/r4   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   )r0   contact_admin_groups     r3   _calc_contact_adminzCmfPerson._calc_contact_admin#  sx    {{4#4#4#?#?84"("7"7"L"L"N''3F3K3K'L!!(()<= M 5r4   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   )r0   new_companys     r3   _calc_companyzCmfPerson._calc_company-  s    ??dkk<<""||(8(8T\\=M=M=R=R=W=W=Y]e=e[cgh<< +++OK&DL	  r4   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   )r0   rg  current_person_vars      r3   _calc_default_favoritesz!CmfPerson._calc_default_favorites9  ss     {{$//	$$&<%=>// 	"J&'&6&6&A&A ""'9'C'C
$!"	"r4   c                 6    | j                   r| j                  sy y r   )rY  r   r   s    r3   _calc_avatarzCmfPerson._calc_avatarF  s     !0r4   c                 *    t         |          g dz   S )N)rp   notify_email
notify_smsr?   rB   rolesprimary_rolezcompany.typer   rg  r   rW   r   r   ro   rq   rr   rp   r@   r   r  r   )rF   save_preload_fields)r0   rH   s    r3   rr  zCmfPerson.save_preload_fieldsL  s    w*, 08 8 	8r4   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)rt  r<   r=   full_search_type)r   r   r*   r4  rh   ri   hrefr<   rL   get_supervisorr   )r0   linkstaskr=   s       r3   _check_does_not_workzCmfPerson._check_does_not_workT  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 r4   c                 x    t         j                  j                  | j                  dg      }|r|j                  S y )Nfail_block_end_daterp   r8   )r*   CmfAuthr   rp   r  r0   auths     r3   r   z&CmfPerson.get_auth_fail_block_end_dateh  s7    ~~""=R<S"T+++ r4   c                     t         j                  j                  | j                        }|r||_        |j                          y y Nrp   )r*   r  rE   rp   r  r   r0   r   r  s      r3   r   z&CmfPerson.set_auth_fail_block_end_datem  s6    ~~!!

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

!3(-D%IIK r4   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   rE   r}   rx   )org_unit	recursions    r3   r  z+CmfPerson.get_supervisor.<locals>.recursion  sW    }}''+++GG  "4!56## !5!566r4   zprimary_role.supervisor.personzprimary_role.tree_parent.headNr   )r}   rq  
supervisorr   rx   r*   r   admin_group
rg_membersrb  r   )r0   r  	admin_grpr  s      @r3   rz  zCmfPerson.get_supervisor~  s    	 	:<[\]
  ++0A0A0L0L0S0S!..99@@
""..&t'8'8'D'DE
--99;I  %%'##&11<<>qA
r4   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)   )r0   codesgrgr_codes       r3   %_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(		(r4   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   )r0   r   s     r3   _calc_primary_rolezCmfPerson._calc_primary_role  si    

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

1Ddjj0 $

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

DI$$&d-f-r4   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   r5   Fr   )r>   re   ProjectAdminsr   u  Изменение членства в группах на карточке пользователя для Проектных администраторов временно недоступно. Откройте группу и добавьте пользователя там.TrI  )rX   r   r[   disable_permissionsacl_admin_moder\   rT   r*   r+   r,   r   rE   rR   r   r   r)   )r0   depthr2   project_admins_groups       r3   _tmp_changing_member_of_alertz'CmfPerson._tmp_changing_member_of_alert  s    19   ++  A$4$48H8HAOO8[''888O%4488@_8`""((A,G,GG S \`a Hr4   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   r@   r?   rA   rB   rC   rD   
ip_addressemail_2zoomsnapchatlinkedinfacebookvkok	instagramskypeslackwhatsapp	messengervibertelegramwork_positionemployee_number
roles.nameprimary_role.namer   r5   z - r<   r  rn   r  r=   r=  )r}   full_search_preload_fieldsr   r*   CmfFullSearch
mark_cleanrR   r   
cmf_hiddenr<   rp   r@   rs   rp  rq  rF   full_search_index)r0   r2   text_fieldsr<   r=   frrH   s          r3   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2r4   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)r9   values)rX   r   r*   CmfAuthLdapPluginslistr   r  r>   rR   r  bulk_update)r0   pr   s      r3   _check_ad_grpzCmfPerson._check_ad_grp7  s       ++))//7OYjXk/l 	]A##q||/@/@#A11M$qtt3LN((44GWVZO4\	]r4   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                  dk(  r| 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                  r1| jX                  s%t6        jZ                  jQ                  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                          | jv                  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FalseIBAdminsrX  u   Изменять настройки паролей разрешено только Администраторам ИБ из группы IBAdminsr  uG   Пользователь не синхронизирован с accountr   r   )r2  r   uw   Поле может редактировать только Администратор или Руководитель(r   )r%   r=  )Ar  r}  r   r   rK  rp   r>   r   r   r   rj  r  re  rl  ro  rB   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  rE   password_expires_must_changer   rY  calendarCmfCalendarno_staff_control_todayr+   r,   rz  r    license_disable_user_count_hooks
CmfLicenserelease_all_user_licensesis_license_grouptake_user_licenserF   r   rU  r   r   schedule_deferred_jobr  _check_notify_opt_cache_reloadCmfTimeTracker)
r0   	from_ldapr1   r2   r[   r  r   r   person_timetrackerrH   s
            r3   r   zCmfPerson.saveD  sY   ***4V4!!#&&4+;+;OO::$))tzz1

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

);gh00;;44@AD=@DD=11<<595O5O2III-;;t}}"..22d2CDM&&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##%
m  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)        | H  |i | t+        t,        j.                  | j0                  j2                  g       t+        t,        j4                         t        j6                  j9                          y )Nry   r   r  r   re   r  rf   u;   Пользователь синхронизирован с u9   , сначала отключите интеграцию.TrI  DELz%Y%m%d%H%M%Srn   TEXKOM_db_deleterQ  rP  r1   )r}   r*   r  PERSON_LIC_FIELDSr  r  rE   r)   r  r   nowstrftimerK  r[   r  r  CmfPersonViewrh   deleterR  rF   r  r   sync_person_task_resourcesrR   r   r  CmfProjectNotifySchemetrigger_reload)r0   r1   r2   r  prefixr  varrH   s          r3   r  zCmfPerson.delete  s   (9;0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''	(''iBB$''--Y 	i::;
 	%%446r4   c                     | j                   r:t        j                  | j                  d| j                   j                        | _         t        |   |i | t        t        j                         y rJ   )
r  resubdelete_prefix_patternr   rF   rS  r  r   r  r  s      r3   rS  zCmfPerson.restore  sR    #%66$*D*Db$J^J^JdJd#eD ((i::;r4   c                 &   |rt        j                         }|j                  |j                  d             |j	                         }t
        j                   d| d}t        j                  j                  |      st        j                  |       S )Nutf8/)hashlibmd5r  encode	hexdigestr0   _AVATAR_DIRECTORYospathexistsmakedirs)rG   rp   mavatar_hashavatar_directorys        r3   
avatar_dirzCmfPerson.avatar_dir  sn    AHHU\\&)*++-K"&"8"8!9;-qI77>>"23,-r4   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   )r0   r1   r2   r  filefilepaths         r3   r   zCmfPerson.remove_avatar  s    !++66tzz7G7GH77==)*

#34 (./v677>>(+IIh'( 	i44DGGMM?Kr4   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   ru  ra   rt  rb   rc   r   )r*   r   rE   r   r4  rh   CmfTaskResAssignsync_task_resources)r%  r   r   r|  s       r3   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 )6r4   u<   Регистрация нового пользователя)r  r  show_bg_progressbar)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)r8   r   invite_by_email)r@   actioninvite_tokenr1  )absoluteinternalzauth/signup   )r   cookiestimeout,    zSigned up successfullyuE   ERROR: Не удалось отправить приглашение z: r>   re   u"   Ищем пользователя rX   r   rf   u)   Создадим пользователя)rp   r@   rX   r   u(   Добавим пользователя u    в группу z!register_persons: person saved ok)2requestsr(  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timer@   r   
create_jwtrsa_sign_pack_jwtCmfGlobalSettingsrE   r1  postauth_base_hrefrequestr8  status_coder=   jsonr   r<   rX   ri   r   r   r   rR   )r&  r%  r1   r2   r(  rj   r@   sgroupspayloadjwtr4  r1  r   r   r   r   r   s                     r3   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	)r8   c                4    dg} | j                   |d|i|}|S )Navatar_filenamer8   rS   )rG   r8   r1   r2   r   s        r3   r   zCmfPerson.public_getP  s+     $$cggt5F5f5
r4   )r8   r9   c                     y r   r=  )rG   r8   r9   r1   r2   s        r3   r   zCmfPerson.public_listX  s    r4   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/  )r9   r  r   )r<   )
r?   r*   CmfDealrh   rR   r<   r_  contactsprimary_contactr   )r0   r1   r2   dealsdeals        r3   r   zCmfPerson.start_chat\  s     zz##,@#tww+O[lZm#n8D  >>tyy>1D<<DL!FDM#'D IIKr4   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<   r5   )rV   
is_defined_valuer*   rR  rE   rR   r%  r[   r\   choicesr   )r0   rg  r<   s      r3   _online_statuszCmfPerson._online_statuso  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%!!!(((r4   c                     |dk(  r|sg }|dd|gg}|dk(  r|r|j                  d      r
|sg }|g dg}|dk(  r|sg }|dg d	g d
g dgg}t        |   |f|||d|S )Nrq  r%  re   r_  r   )is_internalre   TruerX   ra   )r   re   F)r>   r   rW  )r>   r   Users)object_fields	object_idr9   )rE   rF   field_options_list)rG   relation_field_namere  rf  r9   r2   rH   s         r3   rg  zCmfPerson.field_options_list|  s    .0{D)<=F)+!2!2<!@F "?@.0t%<>UWmnoFw)*= X]4=fXPVX 	Xr4   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?   rA   rB   rC   r   RUr   Nz;%ra   r?   LIKErA   re   rB   rC   rf   u.   Возвращаем пользователя %   Неправильный номер: )r[   r   phonenumbersparseformat_numberPhoneNumberFormatE164r*   r   rE   r	  )	rG   r?   r8   r9   	phone_objformat_phoner   r   r  s	            r3   get_by_phonezCmfPerson.get_by_phone  s    	
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   insertrw  )ou_idsou_ids_nextouquery_ous      r3   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 % r4   )r}   rp  rw  r   ri   )r0   r^   r_   rj   ou_ids_firstr  ou_listr}  s          @r3   r   zCmfPerson.get_org_units_list  sv    012 	'A7>Q--334g&		'	& 	r4   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<   rl  r:  u@   Возвращаем пользователя с номером )rt  r[   r   r*   r   r   r	  r?   )rG   r?   r8   r9   r   r  s         r3   get_or_create_by_phonez CmfPerson.get_or_create_by_phone  s    ufV<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   rE   callbackr?   number_e164)r0   
channel_idr  channels       r3   
phone_callzCmfPerson.phone_call  sJ     v,z//4Q78<<
<K//:r4   c                     t         j                  j                  | j                        st         j	                  | j                         t        j                  | j                   d|       S )Nr	  )r  r  r  r  r  pathlibPath)r0   
image_hashr1   r2   s       r3   avatar_pathzCmfPerson.avatar_path  sK    ww~~d445KK../||t556a
|DEEr4   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)rP  rb  r  r  unlinkr   r  r   r  rR   r   r1  rK   base64urlsafe_b64decoder
  r  rp   r  r  openwrite)r0   image
image_typer  r1   r2   r  
image_datar  
image_path
image_files              r3   r   zCmfPerson.set_avatar  s*   ##((*"..t/C/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   )r9  u.   Ошибка запроса к gravatar {}: {}r;  )rp   r[   r   r
  r  r  r   lowerrs   r  r  r   requests_sessionrE   rH  r1   r	  r  r  formatrI  r  content)r0   r  defaulturlr   r  s         r3   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  r$  c                     t         j                  j                  |       }|j                  t         j                  j	                  |             |j                         }|j                  |dd       y )NrQ   jpegF)r  r  )r*   r   rE   r}   rr  r  r   )r%  r_   r   r  s       r3   r  zCmfPerson.set_gravatar	  s_     !!%%%36++??GH%%'%FGr4   c                      y r   r=  )rG   r1   r2   s      r3   r   z#CmfPerson.public_get_org_units_list  s     r4   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   rE   r   ra  r`  r[   r   servicedesk_allow_auth_guestsr   r)   ri   r  )r0   r   sdesk_groupr   s       r3   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 -r4   c                    |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                  |<   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?   rB   r<   r@   rp   r   r   )rR   r   r8   u8   Пользователь не существует (ID: r   NuV   Пользователь удален или не работает(уволен) (ID: )r  r  r  r  r  r  ro  rn  r  r?   rB   r<   r@   rp   )r   cache_person_notify_optr*   r   rE   r)   r   r   r[   r   r  r   r  r  r  r  r  ro  rn  r  r?   r  rB   r<   r@   rp   )rG   r%  r   s      r3   get_notify_opt_cachedzCmfPerson.get_notify_opt_cachedN  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.  **955r4   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?   rB   r<   r@   rp   printrR   r   cmf_emit_server_eventr0   r   s     r3   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8r4   c                 :    t        d       ddi}t        d|       y )Nz"flush_all_notify_opt_cache triggerr%  ALLr  )r  r  r  s     r3   flush_all_notify_opt_cachez$CmfPerson.flush_all_notify_opt_cache  s     23U#148r4   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  rE   r   r  pop)r_   r   r%  s      r3   on_person_notify_opt_changez%CmfPerson.on_person_notify_opt_change  sX     	67{{6"HH[)	*,C'''++It<56r4   c                     t         j                  j                  | dg      }|r|j                  r|j                  S t
        j
                  j	                  t
        j                  j                        S )Nbrowser_timezone)r   r8   )tz)r*   rR  rE   r  r  r   timezoneutcr0   rg  s     r3   get_current_datetimezCmfPerson.get_current_datetime  s^     ((,,DBTAU,V
*55>>!  $$(9(9(=(=$>>r4   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    r3   auth_fail_hookzCmfPerson.auth_fail_hook  s    ""a'"%%):):)N)NN  ::15.080A0A0E0E0G(J\J\--??EEK 1- *+D&		D	!r4   c                 6    d| _         | j                  d       y )Nr   Tr   )r  r   r   s    r3   auth_success_hookzCmfPerson.auth_success_hook  s    %&"		D	!r4   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     r3   calc_staff_control_blockedz$CmfPerson.calc_staff_control_blocked  s6    79ghi// 	4J113	4r4   z@dailyc                      t         j                  j                  g d      D ]  } d| _        | j	                           y )N)r  r   Tr   F)r*   r   rh   r  r   rP  s    r3   %cron_drop_no_staff_control_today_flagz/CmfPerson.cron_drop_no_staff_control_today_flag  s9     &&++3X+Y 	F,1F)KKM	r4   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)r0   r  r   s      r3   rate_per_minutezCmfPerson.rate_per_minute  sm     	3\BCJJ 	<D88488#9#9HH***R/$));D	< r4   )Tr   )NNN)NN)r   zdatetime.datetime | None)r   bool)F)r   )NNT)___name__
__module____qualname__r  r=  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  rr  r}  r   r   r   r   rz  r  r  r  r  r  r  r  r  r  r  r   r  rS  r  r   r  r   r   r   r   r`  rg  rt  r   r  r  r  r   r  r  r   r  r  r  r  on_server_eventr  r  r  r  r  r  r  __classcell__)rH   s   @r3   r   r      s   !--..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>
'"8$(,
-
<(*	.+ )- A#(&.a 23h]eN7><    L "z  FG  H	B H 	B 2p  GK  L49 Z Z L Zx &*   '+D  & 
) 
) X X$  20  ;F
"0, bFcy}~H  H  6:p 36 36j92 9 9
 017 2 7?""4 I J 

r4   r   )r  r
  r  rB  rm  cmf.data_providers.baser   cmf.includer   modules.person.fieldsr   r   r=  r4   r3   <module>r     s4         1   ,R
$$ Rr4   