
    ch#                     t    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ej
                  Z
dS )    )datetime	timedeltaN)*)
cmf_person)Pathc                   t    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dS t          j                                        }| j         r,|| j        j        vr| j                            |           dS dS || j        j        v r	d| _         dS dS )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 	F-;;==? 	#D$5$;;;!((77777 <;d/555"DOOO 65    c                 d   | j         j        s!| j        j        s| j        s| j         j        sdS t
          j                                        }| j        j        rS| j                                         || j        v rd| _         n'|| j        j	        v rt          dd           nd| _         dS | j         j        r|| j        v | _         dS | j         j        rY| j         rT| j                                         |j        j        d | j        D             vr | j                            |           dS dS dS dS )u\   
        Вычисляем локальный ли это пользователь
        NTu   Удаление из группы "Пользователи" временно недоступно. Для отключения пользователя можете воспользоваться удалением или увольнением.)abortFc                 &    g | ]}|j         j        S  )idr   ).0gs     r   
<listcomp>z.CmfPerson._calc_user_local.<locals>.<listcomp>C   s    *Q*Q*Q!14:*Q*Q*Qr   )
user_localis_nullr   r   is_newr   r   
user_grouploadold	cmf_alertr   r   r   )r   r&   s     r   _calc_user_localzCmfPerson._calc_user_local   s   
 '	$/	 ;	 ?-		 F*5577
 ' 	""$$$T..."&t0444  p $& & & & & #(F ?" 	(D,==DOF ?% 	5$/ 	5""$$$}"*Q*Qt?P*Q*Q*QQQ!((44444	5 	5 	5 	5QQr   c                 N    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%    ww**,,/d/d/dddr   c                     |                                   |                                  |                                  |                                   t	          t
          |           j        |i |S N)r*   r   _calc_login_calc_emailr-   r	   saver   argskwargsr/   s      r   r4   zCmfPerson.saveI   sm    *uY%%*D;F;;;r   Tc                     t           j                                         t           j                            |           D ]} |j        dd|i|  t                      j        dd|i|S )N)person	recursiver   )r   CmfAccessListcheck_admin_modeCmfPersonVarlistdeleter-   )r   r:   r7   rowr/   s       r   r?   zCmfPerson.deleteP   s|    --///&++4+88 	6 	6CCJ555f5555uww~<<	<V<<<r   c                     t           j                                         t           j                            | d          D ]} |j        |i |  t                      j        |i |S )NT)r9   include_deleted)r   r;   r<   r=   r>   restorer-   )r   r6   r7   r@   r/   s       r   rC   zCmfPerson.restoreW   sr    --///&++4+NN 	) 	)CCK(((((uww////r   c                 ~    | t           j                                        j                                        v p| j        S r1   )r   r   admin_group
rg_members
all_nestedr   r   s    r   	_is_adminzCmfPerson._is_admin]   s4    v,88::EPPRRReVZVeer   c                 .    |                      d          S )Nz.CmfPerson:00000000-0000-0000-0000-000000000001)r   )get)clss    r   system_personzCmfPerson.system_persona   s    wwJwKKKr   c                 f    t           j                            t          j        j        g d          S )N)r   online_statuson_vacationr   is_admin)r   fields)r   r	   rK   r!   current_personr   )rL   create_args_kwargss       r   r
   zCmfPerson.get_current_usere   s9     ##"+l+l+l $ n n 	nr   c                     | j         j        rd S | j         j        r+| j         j        | j         j        k    r| j         j        | _        | j         j                                                                        | _         d S r1   )	r,   r$   r   r(   new	old_loginr   lowerstriprH   s    r   r2   zCmfPerson._calc_logink   sf    : 	F:  	,TZ^tz~%E%E!Z^DNZ%++--3355


r   c                 0    | j         rd S | j        | _         d S r1   )emailr,   rH   s    r   r3   zCmfPerson._calc_emails   s    : 	FZ


r   c                 4    | j          d| j         d| j         S )N/)	ui_moduleui_namecoderH   s    r   hrefzCmfPerson.hrefy   s$    .==4<==$)===r   c                 r    t          j        |                                                                           S r1   )hashlibsha1encode	hexdigest)tokens    r   
hash_tokenzCmfPerson.hash_token}   s&    |ELLNN++55777r      c                     d                     t          j        d|                    }||                     |          fS )N >qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890)k)joinrandomchoicesrj   )rL   token_length
auth_tokens      r   
_gen_tokenzCmfPerson._gen_token   sM     WWV^ 	    

 3>>*5555r   c                 l    |                                  \  }}|| _        |rt          d| d           |S )Nu   Создан API токен k   , отображается только один раз, скопируйте его и сохраните.)ru   api_token_hashr)   r   alertrV   ri   
token_hashs        r   r   zCmfPerson.generate_api_token   s[     OO--z( 	i  hU  h  h  h  i  i  ir   c                     	 t           j                            | j        j                   n:# t
          t          f$ r&}t          t          |                     Y d}~nd}~ww xY w|rt          d           dS dS )u"  Отправляет ссылку для смены пароля на почту пользователя

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

        Returns:
            _type_: _description_
        NuQ   На почту отправили ссылку для сброса пароля.)	r   CmfAuthsend_pass_linkr,   r   CmfErrorCmfAuthErrorr)   str)r   rz   rV   es       r   r   zCmfPerson.reset_password   s    	N))$**:;;;;,' 	 	 	c!ff	  	ljkkkkk	l 	ls   ), A#AA#c                 l    |                                  \  }}|| _        |rt          d| d           |S )Nu    Создан Webhook токен rw   )ru   webhook_token_hashr)   ry   s        r   r   z CmfPerson.generate_webhook_token   s[     OO--z", 	m  l  l  l  l  m  m  mr   c                     |                                   |                                  |                                   t                      j        |i |S r1   )r*   r2   r3   r-   _save_importr5   s      r   r   zCmfPerson._save_import   sU    #uww#T4V444r   c                 f    t           j        j        }| j        r| j        j        r| j        j        }|S r1   )r!   global_settingstwo_factor_opt
two_factor)r   ress     r   get_two_factor_optzCmfPerson.get_two_factor_opt   s2    .? 	1t= 	1/0C
r   returnc                     |                      dg           t          t          j        d| j        j        d          }|                    dd           |S )u   
        Возвращает путь до директории для хранения личных временных файлов
        r,   UserstmpT)exist_okparents)load_fieldsr   config
UPLOAD_DIRr,   r   mkdir)r   r6   r7   r   s       r   tmp_dirzCmfPerson.tmp_dir   sP    
 	'###6$gtz/?GG		4	...
r   uD   Блокировка неактивных пользователейz@daily)	only_oncedescription
system_jobschedulec                  P   t           j        j        j        } | sd S t	          j                    t          |           z
  }	 t          j        	                    dd|gddgddg	          }d
 |D             }|sd S |D ]}d|_
        |                                 t                       h)N)daysTlast_ping_at<r9   zperson.auth_inactive_blockr   d   )filterrR   slicec                 4    g | ]}|j         j        |j         S r   )r9   auth_inactive_block)r    ps     r   r"   z7CmfPerson.cron_block_inactive_users.<locals>.<listcomp>   s$    bbbQQXEabbbbr   )r!   r   auth_inactive_block_daysr   r   nowr   r   r=   r>   r   r4   
cmf_commit)days_inactivity_limitend_dtperson_varspersons_to_blockr9   s        r   cron_block_inactive_usersz#CmfPerson.cron_block_inactive_users   s     !" 1 J P$ 	F)1F"G"G"GG	 -22&V4 ">?#h 3  K  cb+bbb# *  -1*LLL!	r   )T)rk   )!__name__
__module____qualname__r   r	   api_methodsr   r*   r.   r4   r?   rC   propertyrI   classmethodrM   r
   r2   r3   rc   staticmethodrj   ru   r   r   r   r   r   r   r   cmf_deferred_jobr   __classcell__)r/   s   @r   r	   r	   
   sh       &2 6
 6
 6
 
K# # #%5 %5 %5Ne e e e e< < < < <= = = = = =0 0 0 0 0 f f Xf L L [L n n n [n
6 6 6      > > X> 8 8 \8 6 6 6 [6   l l l l"   5 5 5 5 5  $     Z	     \    r   r	   )r   r   re   rq   syscmf.include
cmf.fieldsr   pathlibr   r	   r   r   r   <module>r      s    ( ( ( ( ( ( ( (   



     ! ! ! ! ! !      V V V V V
$ V V V V Vr   