
    @i#                     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                   R    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ed	        Zed
        Zed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_fieldsF   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   r0   zCmfPerson.saveI   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   r6   r3   rowr+   s       r   r<   zCmfPerson.deleteP   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)r5   include_deleted)r   r8   r9   r:   r;   restorer)   )r   r2   r3   r=   r+   s       r   r@   zCmfPerson.restoreW   sa    --/&&++4+N 	)CCKK((	)w///r   c                     | t         j                  j                         j                  j	                         v xs | j
                  S r-   )r   r   admin_group
rg_members
all_nestedr   r   s    r   	_is_adminzCmfPerson._is_admin]   s7    v,,88:EEPPRReVZVeVeer   c                 &    | j                  d      S )Nz.CmfPerson:00000000-0000-0000-0000-000000000001)r$   )get)clss    r   system_personzCmfPerson.system_persona   s    wwJwKKr   c                 x    t         j                  j                  t        j                  j
                  g d      S )N)r   online_statuson_vacationr   is_admin)r$   fields)r   r	   rH   r%   current_personr$   )rI   create_args_kwargss       r   r
   zCmfPerson.get_current_usere   s6     ##""+l $ n 	n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striprE   s    r   r.   zCmfPerson._calc_logink   sh    ::::  TZZ^^tzz~~%E!ZZ^^DNZZ%%++-335
r   c                 @    | j                   ry | j                  | _         y r-   )emailr(   rE   s    r   r/   zCmfPerson._calc_emails   s    ::ZZ
r   c                 R    | j                    d| j                   d| j                   S )N/)	ui_moduleui_namecoderE   s    r   hrefzCmfPerson.hrefy   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choicesrg   )rI   token_length
auth_tokens      r   
_gen_tokenzCmfPerson._gen_token   s=     WWV^^ 	 

 3>>*555r   c                 \    | j                         \  }}|| _        |rt        d| d       |S )Nu   Создан API токен k   , отображается только один раз, скопируйте его и сохраните.)rq   api_token_hashr#   r   alertrS   rf   
token_hashs        r   r   zCmfPerson.generate_api_token   s?     OO-z(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   rv   rS   es       r   r   zCmfPerson.reset_password   s\    	NN))$***:*:; ik  ,' 	c!f	s   3A A1A,,A1c                 \    | j                         \  }}|| _        |rt        d| d       |S )Nu    Создан Webhook токен rs   )rq   webhook_token_hashr#   ru   s        r   r   z CmfPerson.generate_webhook_token   s@     OO-z",8  @k  l  mr   c                     | j                          | j                          | j                          t        |   |i |S r-   )r&   r.   r/   r)   _save_importr1   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_opt
two_factor)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   r2   r3   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 )
N)daysTlast_ping_at<r5   zperson.auth_inactive_blockr   d   )filterrO   slice)r%   r   auth_inactive_block_daysr   r   nowr   r   r:   r;   r5   auth_inactive_blockr0   
cmf_commit)days_inactivity_limitend_dtperson_varsppersons_to_blockr5   s         r   cron_block_inactive_usersz#CmfPerson.cron_block_inactive_users   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)   )!__name__
__module____qualname__r   r	   api_methodsr   r&   r*   r0   r<   r@   propertyrF   classmethodrJ   r
   r.   r/   r`   staticmethodrg   rq   r   r   r   r   r   r   r   cmf_deferred_jobr   __classcell__)r+   s   @r   r	   r	   
   s   &&22 6
 
K#%5Ne<=0 f f L L n n
6  > > 8 8 6 6l"5$  Z	 r   r	   )r   r   rb   rm   syscmf.include
cmf.fieldsr   pathlibr   r	   r7   r   r   <module>r      s.    (   
  ! V
$$ Vr   