U
    ԒFj5                  
   @  s@  d Z ddlmZ ddlZddlZddlmZ ddlm	Z	 ddl
mZ edZG dd	 d	eZd
d
dddZd
d
dddZddd
dd
dddZdd
dddZd5d
d
dd
dddddd Zddd!d"d#d$Zd6dd%dd&d'd(Zdd)d*d+d,Zd7dd
d
d
dd-d.d/d0Zdddddd1dddd%dddd-d2d3d4ZdS )8uE   CRUD de usuários da loja (tabela usuarios, filtrado por id_cliente).    )annotationsN)conectar)normalize_funcao)hash_passwordz^[a-zA-Z0-9_.-]{3,50}$c                      s&   e Zd Zdddd fddZ  ZS )UsuariosLojaError  strint)messagestatusc                   s   t  | || _|| _d S N)super__init__r
   r   )selfr
   r   	__class__ 2/var/www/html/LojaOnline/services/usuarios_loja.pyr      s    zUsuariosLojaError.__init__)r   )__name__
__module____qualname__r   __classcell__r   r   r   r   r      s   r   r   )usuarioreturnc                 C  s   t | pd  S )N )r   striplower)r   r   r   r   _normalize_login   s    r   c                 C  s*   t | }|stdt|s&td|S )Nu   Login é obrigatório.uV   Login inválido. Use 3–50 caracteres: letras, números, ponto, hífen ou sublinhado.)r   r   	_LOGIN_REmatch)r   loginr   r   r   _validate_login   s    
r!   Trequiredbool)senhar#   r   c                C  s8   t | pd}|s |rtddS t|dk r4td|S )Nr   u   Senha é obrigatória.   u'   Senha deve ter no mínimo 4 caracteres.)r   r   len)r%   r#   sr   r   r   _validate_senha%   s    r)   z
str | None)whatsappr   c                 C  s   d dd t| pdD S )Nr   c                 s  s   | ]}|  r|V  qd S r   )isdigit).0chr   r   r   	<genexpr>1   s      z&_normalize_whatsapp.<locals>.<genexpr>)joinr   )r*   r   r   r   _normalize_whatsapp0   s    r0   gerente   r	   None)r   
senha_hash
id_clientefuncaoativor*   r   c           	      C  s   t |}t| pd}z | d||||t||f W n tjjk
r } zt|dddkrz| d||||t|f W n\ tjjk
r   z| d||||f W n* tjjk
r   | d|||f Y nX Y nX n,t|dddkrt	d	| d
dd|n W 5 d}~X Y nX dS )uP   INSERT em usuarios com fallback se colunas funcao/ativo/whatsapp não existirem.Nz
            INSERT INTO usuarios (usuario, senha, id_cliente, funcao, ativo, whatsapp)
            VALUES (%s, %s, %s, %s, %s, %s)
            errno  z
                    INSERT INTO usuarios (usuario, senha, id_cliente, funcao, ativo)
                    VALUES (%s, %s, %s, %s, %s)
                    z
                        INSERT INTO usuarios (usuario, senha, id_cliente, funcao)
                        VALUES (%s, %s, %s, %s)
                        zEINSERT INTO usuarios (usuario, senha, id_cliente) VALUES (%s, %s, %s)&  Login '   ' já está em uso.  r   )
r   r0   r   executer	   mysql	connectorErrorgetattrr   )	curr   r4   r5   r6   r7   r*   waer   r   r   insert_usuario_row4   s8    

rG   zdict | None)r5   chaver   c              
   C  s   z|  d||f W nH tjjk
r\ } z&t|dd dkr< |  d||f W 5 d }~X Y nX |  }|snd S t|tr|dd |dd |d	d  |S |d
 |d t	|dkr|d ndt	|dkr|d nd|d dS )Nz
            SELECT chave, usuario, funcao, ativo, whatsapp, data_criacao
            FROM usuarios
            WHERE chave = %s AND id_cliente = %s
            LIMIT 1
            r8   r9   z
            SELECT chave, usuario, data_criacao
            FROM usuarios
            WHERE chave = %s AND id_cliente = %s
            LIMIT 1
            r6   r1   r7   r2   r*   r   r&         )rH   r   r6   r7   data_criacao)
r?   r@   rA   rB   rC   fetchone
isinstancedict
setdefaultr'   )rD   r5   rH   rF   rowr   r   r   _fetch_usuariof   s4    		
rR   z
int | None)r5   exclude_chaver   c              
   C  s   z,|d k	r|  d||f n|  d|f W n` tjjk
r } z>t|dd dkrT |d k	rn|  d||f n|  d|f W 5 d }~X Y nX |  pi }t|trt|	dpdS t|r|d ndS )	Nz
                SELECT COUNT(*) AS n
                FROM usuarios
                WHERE id_cliente = %s AND funcao = 'gerente' AND ativo = 1 AND chave <> %s
                z
                SELECT COUNT(*) AS n
                FROM usuarios
                WHERE id_cliente = %s AND funcao = 'gerente' AND ativo = 1
                r8   r9   zz
                SELECT COUNT(*) AS n FROM usuarios
                WHERE id_cliente = %s AND chave <> %s
                z8SELECT COUNT(*) AS n FROM usuarios WHERE id_cliente = %snr   )
r?   r@   rA   rB   rC   rM   rN   rO   r	   get)rD   r5   rS   rF   rQ   r   r   r   _count_gerentes_ativos   s4    	
rV   z
list[dict])r5   r   c                 C  s4  d }d }zt }|jdd}z|d| f W nF tjjk
rv } z$t|dd dkrX |d| f W 5 d }~X Y nX | pg }g }|D ]|}|	|
d|
dt|
d	t|
d
d k	r|
d
nd|
dpdt|
ddr|
d n|
dd q|W S |r |   |r.|   X d S )NT
dictionaryz
                SELECT chave, usuario, funcao, ativo, whatsapp, data_criacao
                FROM usuarios
                WHERE id_cliente = %s
                ORDER BY usuario
                r8   r9   z
                SELECT chave, usuario, data_criacao
                FROM usuarios
                WHERE id_cliente = %s
                ORDER BY usuario
                rH   r   r6   r7   r2   r*   r   rL   	isoformat)rH   r   r6   r7   r*   rL   )closer   cursorr?   r@   rA   rB   rC   fetchallappendrU   r   r	   hasattrrY   )r5   connrD   rF   rowsoutrr   r   r   list_usuarios   sH    		rc   rO   )r5   r   r%   r6   r*   r   c              
   C  sh  t |}t|dd}t|}d }d }	zzt }|jdd}	|	d|f |	 rftd| dddt	|}
t
|	||
| |d	| |  |	j}|||d	t| pd
dW W S  tk
r   |r|   Y np tjjk
r@ } zL|r|  t|dd dkrtd| ddd|td| dd|W 5 d }~X Y nX W 5 |	rT|	  |rb|  X d S )NTr"   rW   z1SELECT 1 FROM usuarios WHERE usuario = %s LIMIT 1r;   r<   r=   r>   r2   r   rH   r   r6   r7   r*   r8   r:   Erro no banco de dados:   )r!   r)   r   rZ   r   r[   r?   rM   r   r   rG   commit	lastrowidr0   r   rollbackr@   rA   rB   rC   )r5   r   r%   r6   r*   r    Zsenha_plainZfuncao_normr_   rD   r4   rH   rF   r   r   r   create_usuario   sF    *rj   )r6   r7   r%   r*   usuario_logado)r5   rH   r6   r7   r%   r*   rk   r   c             
   C  s  d }d }zڐzdt }|jdd}t|| |}	|	s>tdddt|	dpLd}
t|	d}t|	d	d k	rx|	d	nd
}|d k	rt|n|}|d k	rt|n|}|dkrtd|r|
t|	 kr|dkrtd|dkr|dkrtd|dkrV|dks|dkrVt
|| |d}|d
k r:|dkr:td|d
k rV|dkrVtdd }|d k	rt|	 rtt|dd}g }g }|d k	r|d || |d k	r|d || |r|d || |d k	r|d |t|	 pd  |std||| g z"|dd| dt| W n tjjk
r } z|t|dd dkrg }g }|r|d || |stdd d|||| g |dd| dt| n W 5 d }~X Y nX |jdkrtddd|  t|| |p|	}|d!|dt|dt|d	d k	rV|d	nd
|d"phdd#W W tS  tk
r   |r|   Y nJ tjjk
r } z&|r|  td$| d d|W 5 d }~X Y nX W 5 |r|   |r|   X d S )%NTrW   u$   Usuário não encontrado nesta loja.i  r>   r   r   r6   r7   r2   )r   r2   u   Status ativo inválido.r   u2   Você não pode desativar o seu próprio usuário.r1   u7   Você não pode remover seu próprio perfil de gerente.)rS   z.A loja precisa de pelo menos um gerente ativo.u<   Não é possível desativar o último gerente ativo da loja.r"   zfuncao = %sz
ativo = %sz
senha = %szwhatsapp = %su   Nenhuma alteração informada.zUPDATE usuarios SET z, z% WHERE chave = %s AND id_cliente = %sr8   r9   zMBanco sem colunas funcao/ativo. Execute adicionar_coluna_funcao_usuarios.sql.rf   rH   r*   rd   re   )rZ   r   r[   rR   r   r   rU   r   r	   r   rV   r   r)   r]   r0   extendr?   r/   tupler@   rA   rB   rC   rowcountrg   ri   )r5   rH   r6   r7   r%   r*   rk   r_   rD   rQ   Z
login_alvoZfuncao_atualZativo_atualZfuncao_novaZ
ativo_novoZ	restantesr4   setsparamsrF   Zsets_fallbackZparams_fallbackupdatedr   r   r   update_usuario  s    
 











 *rr   )r1   r2   N)N)N)__doc__
__future__r   remysql.connectorr@   databaser   modelsr   services.passwordsr   compiler   	Exceptionr   r   r!   r)   r0   rG   rR   rV   rc   rj   rr   r   r   r   r   <module>   s4   
	   2(*5.