o
    >:hi                     @   st   d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
mZ ddlZdd	d
dddddZdd Zdd ZdS )u7
  
from decimal import Decimal
import json
import locale
from django.db.models import Count, Sum, Avg, F, ExpressionWrapper, DecimalField
from django.shortcuts import get_object_or_404, render, redirect
from django.http import JsonResponse
from django.views.decorators.http import require_POST
from django.db import transaction
from django.contrib.auth.hashers import make_password
from django.contrib.auth.decorators import login_required
locale.setlocale(locale.LC_ALL, 'es_CO.UTF-8')
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
from django.contrib.auth import logout
from django.contrib import messages
from django import forms
from django.core.exceptions import ValidationError
import re

class CustomUserCreationForm(UserCreationForm):
    email = forms.EmailField(
        required=True,
        widget=forms.EmailInput(attrs={
            'class': 'form-control', 
            'placeholder': 'Correo electrónico'
        })
    )
    
    class Meta:
        model = User
        fields = ("username", "email", "password1", "password2")
    
    def clean_email(self):
        email = self.cleaned_data.get('email')
        if User.objects.filter(email=email).exists():
            raise ValidationError("Este correo electrónico ya está registrado.")
        return email
    
    def clean_password1(self):
        password1 = self.cleaned_data.get('password1')
        
        # Validaciones adicionales de contraseña
        if len(password1) < 8:
            raise ValidationError("La contraseña debe tener al menos 8 caracteres.")
        if not re.search('[A-Z]', password1):
            raise ValidationError("La contraseña debe contener al menos una mayúscula.")
        if not re.search('[a-z]', password1):
            raise ValidationError("La contraseña debe contener al menos una minúscula.")
        if not re.search('[0-9]', password1):
            raise ValidationError("La contraseña debe contener al menos un número.")
        if not re.search('[^A-Za-z0-9]', password1):
            raise ValidationError("La contraseña debe contener al menos un carácter especial.")
            
        return password1

def registro_view(request):
    if request.method == 'POST':
        form = CustomUserCreationForm(request.POST)
        if form.is_valid():
            user = form.save()
            return redirect('login')
    else:
        form = CustomUserCreationForm()
    
    return render(request, 'registration/registro.html', {'form': form})

def custom_logout(request):
    logout(request)
    return redirect('login')

    )messages)HttpResponse)apps)redirect)csrf_exemptcsrf_protectNz!listas_configuracion.UnidadMedidazlistas_configuracion.FormaPagoz"listas_configuracion.EmpaqueCompraz&listas_configuracion.EmpaqueProduccionz*listas_configuracion.ClasificacionProductoz"listas_configuracion.GrupoProductozproveedores.Proveedor)unidad_medida
forma_pagoempaque_compraempaque_produccionclasificacion_productogrupo_producto	proveedorc           
      C   s   t |}|stdddS |d\}}t||}|s"tdddS t }|j}d|_	dd	 |j
jD }|| td
d}	d| d|	d< ||	 |	S )Nu   Modelo no válidoi  )status.zModelo no encontradoi  	Plantillac                 S   s"   g | ]}|j r|jd kr|jqS )id)editablename).0f r   "/var/www/html/public/siip/views.py
<listcomp>i   s   " z-descargar_plantilla_excel.<locals>.<listcomp>zAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet)content_typez attachment; filename="plantilla_z.xlsx"zContent-Disposition)
MODELO_MAPgetr   splitr   	get_modelopenpyxlWorkbookactivetitle_metafieldsappendsave)
requestmodelomodelo_path	app_label
model_namemodelo_clasewbwscamposresponser   r   r   descargar_plantilla_excelZ   s    



r1   c              
   C   sR  | j dkr	tdS | jd}| jd}|r|s#t| d tdS t|}|s4t| d tdS zT|d\}}t	
||}t|}|j}t|jdd	}	|	d
 }
|	dd  }d
}|D ]}tt|
|}|jjdi | |d7 }q`t| d| d| d W tdS  ty } zt| dt|  W Y d }~tdS d }~ww )NPOSTz/admin/r(   archivoz/Debes seleccionar un modelo y subir un archivo.u   Modelo no válido.r   T)values_onlyr      zSe importaron z registros correctamente en zError al importar el archivo: r   )methodr   r2   r   FILESr   errorr   r   r   r   r   load_workbookr!   list	iter_rowsdictzipobjectscreatesuccess	Exceptionstr)r'   
modelo_keyr3   r)   r*   r+   r,   r-   r.   filasencabezados	registroscreadosfiladataer   r   r   importar_plantilla_excelr   s>   



 rK   )__doc__django.contribr   django.httpr   django.appsr   django.shortcutsr   django.views.decorators.csrfr   r   r   r   r1   rK   r   r   r   r   <module>   s"    H
