
    8(j5                     x    d dl m Z mZ d dlZd dlZd dlZd dl d dlmZ d dlm	Z	  G d dej                        Z
y)    datetime	timedeltaN)*)
cmf_person)Pathc                   ~    e Zd Zej                  j
                  g dz   Zd Zd Z fdZ fdZ	d  fd	Z
 fdZd!d	Zd
 Zed        Zed        Zed        Zed        Zed        Zd Zd Zed        Zed        Zed"d       Zd#dZd dZd$dZ fdZd Zde fdZ!e e"dddd      d               Z# xZ$S )%	CmfPerson)get_current_usergenerate_api_tokengenerate_webhook_tokenreset_passwordc                 \   | j                   j                  s| j                  j                  syt        j                  j                         }| j                   r5|| j                  j                  vr| j                  j                  |       yy|| j                  j                  v rd| _         yy)u   
        Вычилсяем является ли пользователь сотрудником техподдержки
        NT)
is_support
is_changedrg_member_ofmodelsCmfPersonGroupsupport_groupvalueappend)selfr   s     ./cmf/models/cmf_person.py_check_supportzCmfPerson._check_support   s     **d.?.?.J.J--;;=??D$5$5$;$;;!!((7 <d//555"DO 6    c                 `   | j                   j                  s9| j                  j                  s#| j                  s| j                   j                  syt
        j                  j                         }| j                  j                  r^| j                  j                          || j                  v rd| _         y|| j                  j                  v rt        dd       yd| _         y| j                   j                  r|| j                  v | _         y| j                   j                  r| j                   r{| j                  j                          |j                  j                  | j                  D cg c]  }|j                  j                   c}vr| j                  j                  |       yyyyc c}w )u\   
        Вычисляем локальный ли это пользователь
        NTu   Удаление из группы "Пользователи" временно недоступно. Для отключения пользователя можете воспользоваться удалением или увольнением.)abortF)
user_localis_nullr   r   is_newr   r   
user_grouploadold	cmf_alertidr   r   )r   r!   gs      r   _calc_user_localzCmfPerson._calc_user_local    s]   
 ''$$//;;??--**557
 ''""$T..."&  t00444  o $&
  #( ??""(D,=,==DO ??%%$//""$}}""t?P?P*Q!144::*QQ!!((4 R +:%*Qs   +F+c                 *    t         |          g dz   S )N)r   r   r   login)supersave_preload_fields)r   	__class__s    r   r+   zCmfPerson.save_preload_fieldsG   s    w*,/dddr   c                     | j                          | j                          | j                          | j                          t	        t
        |   |i |S N)r'   r   _calc_login_calc_emailr*   r
   saver   argskwargsr,   s      r   r1   zCmfPerson.saveJ   sJ    Y*D;F;;r   Tc                     t         j                  j                          t         j                  j	                  |       D ]  } |j
                  dd|i|  t        |   dd|i|S )N)person	recursive )r   CmfAccessListcheck_admin_modeCmfPersonVarlistdeleter*   )r   r7   r4   rowr,   s       r   r=   zCmfPerson.deleteQ   se    --/&&++4+8 	6CCJJ55f5	6w~<	<V<<r   c                     t         j                  j                          t         j                  j	                  | d      D ]  } |j
                  |i |  t        |   |i |S )NT)r6   include_deleted)r   r9   r:   r;   r<   restorer*   )r   r3   r4   r>   r,   s       r   rA   zCmfPerson.restoreX   sa    --/&&++4+N 	)CCKK((	)w///r   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
        Метод проверки, что пользователь находится в группе
        Nr   --r%   T)codefieldscache_inmemory)namerE   rF   uX   Ошибка вызова in_person_group: не найдена группа (group_code=z, group_name=z, group=)Fid_only)cmfutilget_obj_id_by_anyr   r   sgetr%   r$   r&   current_usercurrent_person__member_ofr9   subject_full_group_list)r   group
group_code
group_namegroup_id	member_ofs         r   in_person_groupzCmfPerson.in_person_group^   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 r   c                 l   t        | dd      t        j                  | k(  rt        j                  }n!t        j
                  j                  | d      }t        j                  j                  ddgddt        |      gg d	g
      D ch c]  }|j                   c}| _        || j                  v S c c}w )uR   метод с кешем для виртуальных флаговых полей_sys_group_codes_setNTrI   rC   rD   r%   IN)system=T)rE   filter)getattrr&   rN   rO   r   r9   rP   r   slistr<   rD   rX   )r   rR   rU   rQ   s       r   _has_sys_groupzCmfPerson._has_sys_group~   s    4/6>~~%77	"00HHW[H\	 $2288 &>!4i9;PQ 9 S)T 

)TD%
 T6666)Ts   B1c                 @    | j                   xs | j                  d      S )NAdminsr   r_   r   s    r   	_is_adminzCmfPerson._is_admin   s    ?$"5"5h"??r   c                 @    | j                   xs | j                  d      S )NIBAdminsrb   rc   s    r   _is_ib_adminzCmfPerson._is_ib_admin   s    A$"5"5j"AAr   c                 $    | j                  d      S )NAuditors)r_   rc   s    r   _is_auditorzCmfPerson._is_auditor   s    "":..r   c                 &    | j                  d      S )Nz.CmfPerson:00000000-0000-0000-0000-000000000001)r%   )get)clss    r   system_personzCmfPerson.system_person   s    wwJwKKr   c                 x    t         j                  j                  t        j                  j
                  g d      S )N)r   online_statuson_vacationr   
two_factoris_adminis_ib_admin
is_auditor)r%   rE   )r   r
   rl   r&   current_personr%   )rm   _args_kwargss      r   r   zCmfPerson.get_current_user   s6     ##""9 $ : 	:r   c                 \   | j                   j                  ry | j                   j                  rH| j                   j                  | j                   j                  k7  r| j                   j                  | _        | j                   j                  j                         j                         | _         y r.   )	r)   r   r   r#   new	old_loginr   lowerstriprc   s    r   r/   zCmfPerson._calc_login   sh    ::::  TZZ^^tzz~~%E!ZZ^^DNZZ%%++-335
r   c                 @    | j                   ry | j                  | _         y r.   )emailr)   rc   s    r   r0   zCmfPerson._calc_email   s    ::ZZ
r   c                 R    | j                    d| j                   d| j                   S )N/)	ui_moduleui_namerD   rc   s    r   hrefzCmfPerson.href   s&    ..!4<<.$))==r   c                 d    t        j                  | j                               j                         S r.   )hashlibsha1encode	hexdigest)tokens    r   
hash_tokenzCmfPerson.hash_token   s     ||ELLN+5577r   c                 t    dj                  t        j                  d|            }|| j                  |      fS )N >qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890)k)joinrandomchoicesr   )rm   token_length
auth_tokens      r   
_gen_tokenzCmfPerson._gen_token   s=     WWV^^ 	 

 3>>*555r   c           	          | j                         \  }}ddlm}m}  |j                          ||      z   }	t        j                  | ||d|	d|       }
|
j                          |rt        d| d       |S )	u  
        Создает новый API токен для пользователя.
        
        Args:
            name: Название токена
            expiration_days: Срок действия в днях (None = бессрочный)
            alert: Показать уведомление с токеном
        
        Returns:
            Сгенерированный токен (показывается только один раз)
        r   r   daysapiFparentrG   hashtypeexpiration_date
is_revoked	cmf_owneru   Создан API токен k   , отображается только один раз, скопируйте его и сохраните.r   r   r   nowr   CmfAccessTokenr1   r$   r   rG   expiration_daysalertrx   r   
token_hashr   r   r   access_tokens              r   r   zCmfPerson.generate_api_token   s     !OO-z 	1&(,,.9/+JJ ,,+ - 
 	 4UG  <g  h  ir   c                     	 t         j                  j                  | j                  j                         |rt        d       yy# t
        t        f$ r}t        t        |             Y d}~7d}~ww xY w)u"  Отправляет ссылку для смены пароля на почту пользователя

        Args:
            alert (bool, optional): Отправить сообщение на фронт. Defaults to True.

        Returns:
            _type_: _description_
        NuQ   На почту отправили ссылку для сброса пароля.)	r   CmfAuthsend_pass_linkr)   r   CmfErrorCmfAuthErrorr$   str)r   r   rx   es       r   r   zCmfPerson.reset_password   s\    	NN))$***:*:; ik  ,' 	c!f	s   3A A1A,,A1c           	          | j                         \  }}ddlm}m}  |j                          ||      z   }	t        j                  | ||d|	d|       }
|
j                          |rt        d| d       |S )	u  
        Создает новый Webhook токен для пользователя.
        
        Args:
            name: Название токена
            expiration_days: Срок действия в днях (None = бессрочный)
            alert: Показать уведомление с токеном
        
        Returns:
            Сгенерированный токен (показывается только один раз)
        r   r   r   webhookFr   u    Создан Webhook токен r   r   r   s              r   r   z CmfPerson.generate_webhook_token   s     !OO-z 	1&(,,.9/+JJ ,,+ - 
 	 8  @k  l  mr   c                     | j                          | j                          | j                          t        |   |i |S r.   )r'   r/   r0   r*   _save_importr2   s      r   r   zCmfPerson._save_import   s<    w#T4V44r   c                     t         j                  j                  }| j                  r,| j                  j                  r| j                  j                  }|S r.   )r&   global_settingstwo_factor_optrr   )r   ress     r   get_two_factor_optzCmfPerson.get_two_factor_opt&  s:    ..??t==//00C
r   returnc                     | j                  dg       t        t        j                  d| j                  j
                  d      }|j                  dd       |S )u   
        Возвращает путь до директории для хранения личных временных файлов
        r)   UserstmpT)exist_okparents)load_fieldsr   config
UPLOAD_DIRr)   r   mkdir)r   r3   r4   r   s       r   tmp_dirzCmfPerson.tmp_dir,  sI    
 	'#6$$gtzz/?/?G		4	.
r   uD   Блокировка неактивных пользователейz@daily)	only_oncedescription
system_jobschedulec                     t         j                  j                  j                  } | sy t	        j
                         t        |       z
  }	 t        j                  j                  dd|gddgddg	      }|D cg c]%  }|j                  j                  r|j                  ' }}|sy |D ]  }d|_        |j                           t                c c}w )
Nr   Tlast_ping_at<r6   zperson.auth_inactive_blockr   d   )r\   rE   slice)r&   r   auth_inactive_block_daysr   r   r   r   r   r;   r<   r6   auth_inactive_blockr1   
cmf_commit)days_inactivity_limitend_dtperson_varsppersons_to_blockr6   s         r   cron_block_inactive_usersz#CmfPerson.cron_block_inactive_users6  s     !" 1 1 J J P P$)1F"GG --22&V4 ">?#h 3 K 3>bQQXXEaEabb#* -1* L!   cs   7CC)T)NNN)   )z	API Tokenm  T)zWebhook Tokenr   T)%__name__
__module____qualname__r   r
   api_methodsr   r'   r+   r1   r=   rA   rV   r_   propertyrd   rg   rj   classmethodrn   r   r/   r0   r   staticmethodr   r   r   r   r   r   r   r   r   cmf_deferred_jobr   __classcell__)r,   s   @r   r
   r
      sN   &&22 6
 
K#%5Ne<=0@7 @ @ B B / / L L : :6  > > 8 8 6 6"Hl""H5$  Z	 r   r
   )r   r   r   r   syscmf.include
cmf.fieldsr   pathlibr   r
   r8   r   r   <module>r      s.    (   
  ! I
$$ Ir   