
    oih+                     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   r1   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   r7   r4   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)r6   include_deleted)r   r9   r:   r;   r<   restorer*   )r   r3   r4   r>   r,   s       r   rA   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
   rI   r&   current_personr%   )rJ   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striprF   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)   rF   s    r   r0   zCmfPerson._calc_emails   s    ::ZZ
r   c                 R    | j                    d| j                   d| j                   S )N/)	ui_moduleui_namecoderF   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choicesrh   )rJ   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parentnamehashtypeexpiration_date
is_revoked	cmf_owneru   Создан API токен k   , отображается только один раз, скопируйте его и сохраните.rr   r   r   nowr   CmfAccessTokenr1   r$   r   ry   expiration_daysalertrT   rg   
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   rT   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   rt   webhookFrw   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_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   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 )
Nrt   Tlast_ping_at<r6   zperson.auth_inactive_blockr   d   )filterrP   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_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)   )z	API Tokenm  T)zWebhook Tokenr   T)!__name__
__module____qualname__r   r
   api_methodsr   r'   r+   r1   r=   rA   propertyrG   classmethodrK   r   r/   r0   ra   staticmethodrh   rr   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"Hl""H5$  Z	 r   r
   )r   r   rc   rn   syscmf.include
cmf.fieldsr   pathlibr   r
   r8   r   r   <module>r      s.    (   
  ! N
$$ Nr   