
    ti4                     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                   p    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e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_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   r2   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   r8   r5   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)r7   include_deleted)r   r:   r;   r<   r=   restorer+   )r   r4   r5   r?   r-   s       r   rB   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   z--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_ofr:   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                 x    | j                   xs- | j                  t        j                  j	                               S r/   )r   rU   r   r   admin_groupr   s    r   	_is_adminzCmfPerson._is_admin~   s+    [$"6"6v7L7L7X7X7Z"[[r   c                 Z    | j                   xs t        j                  j                         S r/   )r   r   r:   is_ib_adminrX   s    r   _is_ib_adminzCmfPerson._is_ib_admin   s"     D&"6"6"B"B"DDr   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   is_adminr[   
two_factor)r&   rE   )r   r
   r^   r'   current_personr&   )r_   create_args_kwargss       r   r   zCmfPerson.get_current_user   s6     ##""q $ s 	s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striprX   s    r   r0   zCmfPerson._calc_login   sh    ::::  TZZ^^tzz~~%E!ZZ^^DNZZ%%++-335
r   c                 @    | j                   ry | j                  | _         y r/   )emailr*   rX   s    r   r1   zCmfPerson._calc_email   s    ::ZZ
r   c                 R    | j                    d| j                   d| j                   S )N/)	ui_moduleui_namerD   rX   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|   )r_   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   rW   r&   r   rN   r%   )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parentrG   hashtypeexpiration_date
is_revoked	cmf_owneru   Создан API токен k   , отображается только один раз, скопируйте его и сохраните.	r   r   r   r   nowr   CmfAccessTokenr2   r%   r   rG   expiration_daysalertri   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   ri   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'   r   two_factor_optre   )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   )filterrE   slice)r'   r   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)NNN)   )z	API Tokenm  T)zWebhook Tokenr   T)$__name__
__module____qualname__r   r
   api_methodsr   r(   r,   r2   r>   rB   rU   propertyrY   r\   classmethodr`   r   r0   r1   ru   staticmethodr|   r   r   r   r   r   r   r   r   r   cmf_deferred_jobr   __classcell__)r-   s   @r   r
   r
      s=   &&22 6
 
K#%5Ne<=0@ \ \ E E L L s s6  > > 8 8 6 6F$Ll"$L5$  Z	 r   r
   )r   r   rw   r   syscmf.include
cmf.fieldsr   pathlibr   r
   r9   r   r   <module>r      s.    (   
  ! 
$$ r   