
    >:hi                     r    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 Z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                    t                               |          }|st          dd          S |                    d          \  }}t	          j        ||          }|st          dd          S t          j                    }|j        }d|_	        d |j
        j        D             }|                    |           t          d	
          }	d| d|	d<   |                    |	           |	S )Nu   Modelo no válidoi  )status.zModelo no encontradoi  	Plantillac                 @    g | ]}|j         	|j        d k    |j        S )id)editablename).0fs     3C:\Users\a_gir\Desktop\Interacto\siip\siip\views.py
<listcomp>z-descargar_plantilla_excel.<locals>.<listcomp>i   s)    YYY1:Y!&TX..af...    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responses
             r   descargar_plantilla_excelr4   Z   s    ..((K =/<<<<'--c22Iz>)Z88L @23???? 
			B	BBHYYl07YYYFIIf)lmmmH&W&W&W&WH"#GGHOr   c                    | j         dk    rt          d          S | j                            d          }| j                            d          }|r|s$t          j        | d           t          d          S t                              |          }|s$t          j        | d           t          d          S 	 |                    d          \  }}t          j
        ||          }t          j        |          }|j        }t          |                    d	                    }	|	d
         }
|	dd          }d
}|D ]6}t!          t#          |
|                    } |j        j        di | |dz  }7t          j        | d| d| d           n<# t*          $ r/}t          j        | dt-          |                      Y d }~nd }~ww xY wt          d          S )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:  )methodr   r6   r   FILESr   errorr   r    r   r!   r"   load_workbookr$   list	iter_rowsdictzipobjectscreatesuccess	Exceptionstr)r*   
modelo_keyr7   r,   r-   r.   r/   r0   r1   filasencabezados	registroscreadosfiladataes                   r   importar_plantilla_excelrP   r   s   ~	"""!!(++Jm	**G #W #w QRRR	"""..,,K #w 4555	"""K + 1 1# 6 6	:~i<<#G,,YR\\d\3344Ah!""I	 	 	DK..//D'L '//$///qLGG"e7"e"eXb"e"e"effff K K Kw IQ I IJJJJJJJJK Is   8CF 
G%GG)__doc__django.contribr   django.httpr   django.appsr   django.shortcutsr   django.views.decorators.csrfr   r   r"   r   r4   rP   r:   r   r   <module>rW      s   G GP $ # # # # # $ $ $ $ $ $       % % % % % % B B B B B B B B  92:BJ:( 
  0$ $ $ $ $r   