B
    f                  @   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g Zdd Zdd Z fdd	Z fd
dZ	d2 fdd	Z
 fddZedd Zedd Zed3ddZdd Zdd Zedd Zedd Zed4d d!Zd5d"d#Zd6d$d%Z fd&d'Zd(d) Zed*d+d,Zeedd-dd.d/d0d1 Z  ZS )7	CmfPersonget_current_usergenerate_api_tokengenerate_webhook_tokenc             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>B   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   s,    




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%   E   s    zCmfPerson.save_preload_fieldsc                s2   |    |   |   |   tt| j||S )N)r"   r   _calc_login_calc_emailr$   r   save)r   argskwargs)r&   r   r   r)   H   s
    zCmfPerson.saveTc                sL   t j  x*t jj| dD ]}|jf d|i| qW t jf d|i|S )N)person	recursive)r   CmfAccessListcheck_admin_modeCmfPersonVarlistdeleter$   )r   r-   r+   row)r&   r   r   r2   O   s    
zCmfPerson.deletec                s>   t j  x$t jj| ddD ]}|j|| qW t j||S )NT)r,   Zinclude_deleted)r   r.   r/   r0   r1   restorer$   )r   r*   r+   r3   )r&   r   r   r4   V   s    
zCmfPerson.restorec             C   s   | t j j kp| jS )N)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_person`   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   r6   r   Zcurrent_personr   )r7   ZcreateZ_args_kwargsr   r   r   r   d   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 )N)	r#   r   r   r    newZ	old_loginr   lowerstrip)r   r   r   r   r'   j   s
    
zCmfPerson._calc_loginc             C   s   | j r
d S | j| _ d S )N)Zemailr#   )r   r   r   r   r(   r   s    zCmfPerson._calc_emailc             C   s   | j  d| j d| j S )N/)Z	ui_moduleZui_namecode)r   r   r   r   hrefx   s    zCmfPerson.hrefc             C   s   t |   S )N)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choicesrD   )r7   Ztoken_lengthZ
auth_tokenr   r   r   
_gen_token   s    
zCmfPerson._gen_tokenc             K   s*   |   \}}|| _|r&td| d |S )Nu   Создан API токен uk   , отображается только один раз, скопируйте его и сохраните.)rK   Zapi_token_hashr!   )r   alertr:   rC   
token_hashr   r   r   r	      s
    zCmfPerson.generate_api_tokenc             K   s*   |   \}}|| _|r&td| d |S )Nu    Создан Webhook токен uk   , отображается только один раз, скопируйте его и сохраните.)rK   Zwebhook_token_hashr!   )r   rL   r:   rC   rM   r   r   r   r
      s
    z CmfPerson.generate_webhook_tokenc                s&   |    |   |   t j||S )N)r"   r'   r(   r$   _save_import)r   r*   r+   )r&   r   r   rN      s    zCmfPerson._save_importc             C   s"   t jj}| jr| jjr| jj}|S )N)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*   r+   rP   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 }xZtjj	dd|gddgddgd}d	d
 |D }|sZP x|D ]}d|_
|  q`W t  q&W d S )N)ZdaysZlast_ping_at<r,   zperson.auth_inactive_blockr   d   )filterr9   slicec             S   s   g | ]}|j js|j qS r   )r,   auth_inactive_block)r   pr   r   r   r      s    z7CmfPerson.cron_block_inactive_users.<locals>.<listcomp>T)r   rO   Zauth_inactive_block_daysr   r   Znowr   r   r0   r1   r\   r)   Z
cmf_commit)Zdays_inactivity_limitZend_dtZperson_varsZpersons_to_blockr,   r   r   r   cron_block_inactive_users   s     

z#CmfPerson.cron_block_inactive_users)T)T)rE   )T)T) __name__
__module____qualname__r   r   Zapi_methodsr   r"   r%   r)   r2   r4   propertyr5   classmethodr8   r   r'   r(   r@   staticmethodrD   rK   r	   r
   rN   rQ   r   rV   Zcmf_deferred_jobr^   __classcell__r   r   )r&   r   r   
   s>   '	


r   )r   r   rA   rI   sysZcmf.includeZ
cmf.fieldsr   Zpathlibr   r   r   r   r   r   <module>   s   