U
    Eh#                     @   s^   d dl m Z mZ d dlZd dlZd dlZd dlT d dlmZ d dlm	Z	 G dd dej
Z
dS )    )datetime	timedeltaN)*)
cmf_person)Pathc                       s  e Zd Zejjddddg Zdd Zdd Z fd	d
Z fddZ	d5 fdd	Z
 fddZedd Zedd Zed6ddZdd Zdd Zedd Zedd Zed7d!d"Zd8d#d$Zd9d%d&Zd:d'd(Z fd)d*Zd+d, Zed-d.d/Zeedd0dd1d2d3d4 Z  Z S );	CmfPersonget_current_usergenerate_api_tokengenerate_webhook_tokenreset_passwordc                 C   sT   | j js| jjsdS tj }| j r>|| jjkrP| j| n|| jjkrPd| _ dS )u   
        Вычилсяем является ли пользователь сотрудником техподдержки
        NT)
is_support
is_changedrg_member_ofmodelsCmfPersonGroupsupport_groupvalueappend)selfr    r   ./cmf/models/cmf_person.py_check_support   s    
zCmfPerson._check_supportc                 C   s   | j js"| jjs"| js"| j js"dS tj }| jjrt| j  || jkrPd| _ n || jj	krjt
ddd nd| _ dS | j jr|| jk| _ dS | j jr| j r| j  |jjdd | jD kr| j| dS )u\   
        Вычисляем локальный ли это пользователь
        NTu   Удаление из группы "Пользователи" временно недоступно. Для отключения пользователя можете воспользоваться удалением или увольнением.)abortFc                 S   s   g | ]}|j jqS r   )idr   ).0gr   r   r   
<listcomp>C   s     z.CmfPerson._calc_user_local.<locals>.<listcomp>)
user_localis_nullr   r   Zis_newr   r   
user_grouploadold	cmf_alertr   r   r   )r   r   r   r   r   _calc_user_local   s6    



zCmfPerson._calc_user_localc                    s   t   ddddg S )Nr   r   r   login)supersave_preload_fieldsr   	__class__r   r   r&   F   s    zCmfPerson.save_preload_fieldsc                    s2   |    |   |   |   tt| j||S N)r#   r   _calc_login_calc_emailr%   r   saver   argskwargsr(   r   r   r-   I   s
    zCmfPerson.saveTc                    sH   t j  t jj| dD ]}|jf d|i| qt jf d|i|S )N)person	recursive)r   CmfAccessListcheck_admin_modeCmfPersonVarlistdeleter%   )r   r2   r0   rowr(   r   r   r7   P   s    
zCmfPerson.deletec                    s:   t j  t jj| ddD ]}|j|| qt j||S )NT)r1   Zinclude_deleted)r   r3   r4   r5   r6   restorer%   )r   r/   r0   r8   r(   r   r   r9   W   s    
zCmfPerson.restorec                 C   s   | t j j kp| jS r*   )r   r   Zadmin_groupZ
rg_membersZ
all_nestedr   r'   r   r   r   	_is_admin]   s    zCmfPerson._is_adminc                 C   s   | j ddS )Nz.CmfPerson:00000000-0000-0000-0000-000000000001)r   )get)clsr   r   r   system_persona   s    zCmfPerson.system_personc                 O   s   t jjtjjdddddgdS )Nr   Zonline_statusZon_vacationr   Zis_admin)r   fields)r   r   r;   r   Zcurrent_personr   )r<   Zcreate_args_kwargsr   r   r   r   e   s     zCmfPerson.get_current_userc                 C   sD   | j jrd S | j jr.| j j| j jkr.| j j| _| j j  | _ d S r*   )	r$   r   r   r!   newZ	old_loginr   lowerstripr'   r   r   r   r+   k   s
    
zCmfPerson._calc_loginc                 C   s   | j r
d S | j| _ d S r*   )Zemailr$   r'   r   r   r   r,   s   s    zCmfPerson._calc_emailc                 C   s   | j  d| j d| j S )N/)Z	ui_moduleZui_namecoder'   r   r   r   hrefy   s    zCmfPerson.hrefc                 C   s   t |   S r*   )hashlibZsha1encodeZ	hexdigest)tokenr   r   r   
hash_token}   s    zCmfPerson.hash_token   c                 C   s"   d tjd|d}|| |fS )N Z>qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890)k)joinrandomchoicesrJ   )r<   Ztoken_lengthZ
auth_tokenr   r   r   
_gen_token   s
    zCmfPerson._gen_tokenc                 K   s*   |   \}}|| _|r&td| d |S )Nu   Создан API токен k   , отображается только один раз, скопируйте его и сохраните.)rQ   Zapi_token_hashr"   r   alertr@   rI   Z
token_hashr   r   r   r	      s
    zCmfPerson.generate_api_tokenc              
   K   sX   zt j| jj W n2 ttfk
rF } ztt| W 5 d}~X Y nX |rTtd dS )u"  Отправляет ссылку для смены пароля на почту пользователя

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

        Returns:
            _type_: _description_
        NuQ   На почту отправили ссылку для сброса пароля.)	r   ZCmfAuthZsend_pass_linkr$   r   ZCmfErrorZCmfAuthErrorr"   str)r   rT   r@   er   r   r   r      s    	zCmfPerson.reset_passwordc                 K   s*   |   \}}|| _|r&td| d |S )Nu    Создан Webhook токен rR   )rQ   Zwebhook_token_hashr"   rS   r   r   r   r
      s
    z CmfPerson.generate_webhook_tokenc                    s&   |    |   |   t j||S r*   )r#   r+   r,   r%   _save_importr.   r(   r   r   rW      s    zCmfPerson._save_importc                 C   s"   t jj}| jr| jjr| jj}|S r*   )r   global_settingsZtwo_factor_optZ
two_factor)r   resr   r   r   get_two_factor_opt   s    zCmfPerson.get_two_factor_opt)returnc                 O   s2   |  dg ttjd| jjd}|jddd |S )u   
        Возвращает путь до директории для хранения личных временных файлов
        r$   ZUsersZtmpT)exist_okparents)Zload_fieldsr   ZconfigZ
UPLOAD_DIRr$   r   mkdir)r   r/   r0   rY   r   r   r   tmp_dir   s    zCmfPerson.tmp_diruD   Блокировка неактивных пользователейz@daily)Z	only_oncedescriptionZ
system_jobZschedulec                  C   s|   t jjj} | sd S t t| d }tjj	dd|gddgddgd}d	d
 |D }|sXqx|D ]}d|_
|  q\t  q$d S )N)ZdaysZlast_ping_at<r1   zperson.auth_inactive_blockr   d   )filterr>   slicec                 S   s   g | ]}|j js|j qS r   )r1   auth_inactive_block)r   pr   r   r   r      s      z7CmfPerson.cron_block_inactive_users.<locals>.<listcomp>T)r   rX   Zauth_inactive_block_daysr   r   Znowr   r   r5   r6   re   r-   Z
cmf_commit)Zdays_inactivity_limitZend_dtZperson_varsZpersons_to_blockr1   r   r   r   cron_block_inactive_users   s     

z#CmfPerson.cron_block_inactive_users)T)T)rK   )T)T)T)!__name__
__module____qualname__r   r   Zapi_methodsr   r#   r&   r-   r7   r9   propertyr:   classmethodr=   r   r+   r,   rF   staticmethodrJ   rQ   r	   r   r
   rW   rZ   r   r_   Zcmf_deferred_jobrg   __classcell__r   r   r(   r   r   
   sP   '



	



r   )r   r   rG   rO   sysZcmf.includeZ
cmf.fieldsr   pathlibr   r   r   r   r   r   <module>   s   