cfdi-admin/source/main/forms.py

95 lines
3.1 KiB
Python

#!/usr/bin/env python3
from django import forms
from . import models
from .util import util
class AdminFormClients(forms.ModelForm):
file_key = forms.FileField(label='Fiel Key', required=False)
file_cer = forms.FileField(label='Fiel Cer', required=False)
contra = forms.CharField(label='Contraseña', required=False)
class Meta:
model = models.Clients
fields = ('rfc', 'name')
widgets = {
'contra': forms.PasswordInput,
}
def __init__(self, *args, **kwargs):
self.cert = None
super().__init__(*args,**kwargs)
def clean(self):
super().clean()
rfc = self.cleaned_data.get('rfc')
file_key = self.cleaned_data.get('file_key')
file_cer = self.cleaned_data.get('file_cer')
contra = self.cleaned_data.get('contra')
if (bool(file_key) + bool(file_cer) + bool(contra)) > 0:
msg_error = ''
if not file_key:
msg_error = 'Falta el archivo KEY'
self.add_error('file_key', msg_error)
if not file_cer:
msg_error = 'Falta el archivo CER'
self.add_error('file_cer', msg_error)
if not contra:
msg_error = 'Captura la contraseña'
self.add_error('contra', msg_error)
if not msg_error:
self.cert = util.SATCertificate(file_cer.read(), file_key.read(), contra)
if not self.cert.is_valid:
raise forms.ValidationError(self.cert.error)
elif not self.cert.is_fiel:
raise forms.ValidationError('No es FIEL')
elif rfc.upper() != self.cert.rfc:
msg_error = 'El certificado no corresponde al RFC'
raise forms.ValidationError(msg_error)
return self.cleaned_data
class AdminFormCfdi(forms.ModelForm):
file_xml = forms.FileField(label='Archivo XML', required=False)
class Meta:
model = models.Cfdi
fields = ('uuid',)
def __init__(self, *args, **kwargs):
self.file_xml = None
self._data = {}
super().__init__(*args,**kwargs)
def clean(self):
super().clean()
self.file_xml = self.cleaned_data.get('file_xml')
if not self.file_xml.content_type in ('text/xml', 'application/xml'):
msg = 'El archivo no es XML'
raise forms.ValidationError(msg)
self.data = util.get_data_from_cfdi(self.file_xml.read())
if models.Cfdi.objects.filter(uuid=self.data['uuid']).exists():
msg = f"'CFDI con UUID: {self.data['uuid']} importado previamente"
raise forms.ValidationError(msg)
return self.cleaned_data
class AdminUploadXmlForm(forms.Form):
_selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
file_xml = forms.FileField(label='Archivo XML', required=False)
class AdminUploadZipForm(forms.Form):
_selected_action = forms.CharField(widget=forms.MultipleHiddenInput)
file_zip = forms.FileField(label='Archivo ZIP', required=False)