
    /i1.                     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                   X    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 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   r2   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   r8   r5   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)r7   include_deleted)r   r:   r;   r<   r=   restorer+   )r   r4   r5   r?   r-   s       r   rB   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
   rJ   r'   current_personr&   )rK   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striprG   s    r   r0   zCmfPerson._calc_logink   sh    ::::  TZZ^^tzz~~%E!ZZ^^DNZZ%%++-335
r   c                 @    | j                   ry | j                  | _         y r/   )emailr*   rG   s    r   r1   zCmfPerson._calc_emails   s    ::ZZ
r   c                 R    | j                    d| j                   d| j                   S )N/)	ui_moduleui_namecoderG   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choicesri   )rK   token_length
auth_tokens      r   
_gen_tokenzCmfPerson._gen_token   s=     WWV^^ 	 

 3>>*555r   c                     t         j                  j                  rdt         j                  sSt        j
                  j                         j                  j                  }|t         j                  vrt        dd       yyyy)u]   Проверяем право пользователя на генерацию токеновu\   Создание токенов доступно только администраторамTr   N)r'   global_settingstoken_gen_require_adminacl_admin_moder   r   rD   r&   r   current_person__member_ofr%   )r   admin_group_ids     r   _check_token_gen_permissionz%CmfPerson._check_token_gen_permission   si    44Q=M=M#22>>@CCIINQ%@%@@x  AE  F A >N4r   c           	         | j                          | 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   , отображается только один раз, скопируйте его и сохраните.	rz   rs   r   r   nowr   CmfAccessTokenr2   r%   r   r   expiration_daysalertrU   rh   
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   rU   es       r   r   zCmfPerson.reset_password   s\    	NN))$***:*:; ik  ,' 	c!f	s   3A A1A,,A1c           	         | j                          | 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(   r0   r1   r+   _save_importr3   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'   ru   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   r4   r5   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<r7   zperson.auth_inactive_blockr   d   )filterrQ   slice)r'   ru   auth_inactive_block_daysr   r   r   r   r   r<   r=   r7   auth_inactive_blockr2   
cmf_commit)days_inactivity_limitend_dtperson_varsppersons_to_blockr7   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,   r2   r>   rB   propertyrH   classmethodrL   r   r0   r1   rb   staticmethodri   rs   rz   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F$Ll"$L5$  Z	 r   r
   )r   r   rd   ro   syscmf.include
cmf.fieldsr   pathlibr   r
   r9   r   r   <module>r      s.    (   
  ! Y
$$ Yr   