From de06b3ab8b0888494c5c63aef8c55fcb035cbf0a Mon Sep 17 00:00:00 2001 From: fjrodriguez Date: Mon, 19 Dec 2022 10:23:52 -0600 Subject: [PATCH 01/21] first of segunda --- Admin/settings.py | 19 +-- Clientes/custom_decorators.py | 43 ++++++- Clientes/forms.py | 2 +- Clientes/models.py | 19 ++- Clientes/serailizers.py | 2 +- Clientes/urls.py | 5 +- Clientes/views.py | 161 +++++++++++++++--------- Templates/Clientes/index.html | 120 ++++++++++++++++-- Templates/Clientes/timbres_cliente.html | 145 ++++++++++++++++++--- Templates/partials/search_form.html | 23 ++-- 10 files changed, 408 insertions(+), 131 deletions(-) diff --git a/Admin/settings.py b/Admin/settings.py index 57601c5..e04958b 100644 --- a/Admin/settings.py +++ b/Admin/settings.py @@ -9,21 +9,14 @@ import pytz # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent - - # Quick-start development settings - unsuitable for production # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ - # SECURITY WARNING: keep the secret key used in production secret! -SECRET_KEY = 'django-insecure-5*mm&uf5zq@t6nrs_5z8-_qtyapm^3&yz^wqqkc_a!v(!ulj-^' - +SECRET_KEY = os.getenv("adminAS_KEY") # SECURITY WARNING: don't run with debug turned on in production! DEBUG = False - ALLOWED_HOSTS = ['*'] - # Application definition - INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', @@ -31,7 +24,7 @@ INSTALLED_APPS = [ 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', - + 'rest_framework', 'rest_framework.authtoken', @@ -57,9 +50,7 @@ MIDDLEWARE = [ 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ] - ROOT_URLCONF = 'Admin.urls' - TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', @@ -118,15 +109,13 @@ EMAIL_USE_SSL=True # Database # https://docs.djangoproject.com/en/4.1/ref/settings/#databases - - if DEBUG: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'cfdi_as', 'USER': 'root', - 'PASSWORD': 'Soluciones28@', + 'PASSWORD':os.getenv("BD_PASS"), 'HOST': '127.0.0.1', 'PORT': '', 'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"}, @@ -138,7 +127,7 @@ else: 'ENGINE': 'django.db.backends.mysql', 'NAME': 'fjrodriguez$cfdi_as', 'USER': 'fjrodriguez', - 'PASSWORD': 'Soluciones28@', + 'PASSWORD':os.getenv("BD_PASS"), 'HOST': 'fjrodriguez.mysql.pythonanywhere-services.com', 'PORT': '3306', 'OPTIONS': {'init_command': "SET sql_mode='STRICT_TRANS_TABLES'"}, diff --git a/Clientes/custom_decorators.py b/Clientes/custom_decorators.py index c635a1a..3387c19 100644 --- a/Clientes/custom_decorators.py +++ b/Clientes/custom_decorators.py @@ -1,9 +1,12 @@ from functools import wraps from django.contrib import messages from django.shortcuts import redirect -from django.http import HttpResponse - - +from django.http import HttpResponse, JsonResponse +from django.contrib.auth import authenticate, login +from rest_framework.authtoken.models import Token +from django.contrib.auth.models import User +import base64 +from django.shortcuts import get_object_or_404 def Custom_is_staff_function(user): if user.is_staff: return True @@ -19,4 +22,38 @@ def is_staff_access(view_to_return="index"): return redirect(view_to_return) return view(request, *args, **kwargs) return _wrapped_view + return decorator + +#--------------------Auth basica +def auth_basic(request,*args, **kwargs): + if request.META['CONTENT_TYPE'] == 'application/json' and 'HTTP_AUTHORIZATION' in request.META.keys(): + authmeth, auth = request.META['HTTP_AUTHORIZATION'].split(' ', 1) + if authmeth.lower() == 'token': + tokenA,user = auth.split(':', 1) + user = base64.b64decode(user) + user = user.decode('utf-8') + token = get_object_or_404(Token, key=tokenA) + if token and str(token.user)==user: + return True + #user= authenticate(username=token.user, password=pwd) + # print('user.is_authenticated',user.is_authenticated) + #if user.is_authenticated: + # return True + else: + return False + return False + elif request.META['CONTENT_TYPE'] == 'application/json' and 'HTTP_AUTHORIZATION' not in request.META.keys(): + return request.user.is_authenticated + else: + return False + + +def http_basic_auth(): + def decorator(view): + @wraps(view) + def _wrapped_view(request,*args, **kwargs): + if not auth_basic(request,*args, **kwargs): + return JsonResponse({'Error':'las credenciales Token:user(base64) son incorrectas.'},status=401) + return view(request, *args, **kwargs) + return _wrapped_view return decorator \ No newline at end of file diff --git a/Clientes/forms.py b/Clientes/forms.py index 22714ab..c95ff05 100644 --- a/Clientes/forms.py +++ b/Clientes/forms.py @@ -10,7 +10,7 @@ class EmailForm(forms.Form): subject = forms.CharField(max_length=100, required=False) adjunto = forms.FileField(widget=forms.ClearableFileInput( attrs={ - 'multiple': True, + 'multiple': True, 'accept':'application/pdf,application/vnd.ms-excel', diff --git a/Clientes/models.py b/Clientes/models.py index a98ba6f..8dcbf9c 100644 --- a/Clientes/models.py +++ b/Clientes/models.py @@ -41,32 +41,27 @@ class Clientes(models.Model): email = models.EmailField(max_length=254, blank=True) conteo_mes = models.IntegerField(blank=True,null=True,default=0) def timbres_X_MES(self, mes): - - today = datetime.date.today() - year = today.year - + today = datetime.date.today() + year = today.year if mes==None: mes = today.month - dat = datetime.datetime(int(year),int(mes),1) - if dat.month in (1,3,5,7,8,10,12):#31 + dat = datetime.datetime(int(year),int(mes),1) + if dat.month in (1,3,5,7,8,10,12):#31 findate = dat + datetime.timedelta(days=30) #findate += datetime.timedelta(days=0) elif dat.month in (4,6,9,11):#30 - findate = dat + datetime.timedelta(days=29) #findate += datetime.timedelta(days=0) - else:#28 or 29 + else:#28 or 29 findate = dat + datetime.timedelta(days=28) - findate += datetime.timedelta(days=1) + findate += datetime.timedelta(days=1) #print(f'dat {(dat)} fdate={findate}') cou = Timbres.objects.filter(rfcc=self.RFC, created_at__range=[dat,findate]).count() - self.conteo_mes =cou self.save() return cou @property - def timbres_mes_count(self): - + def timbres_mes_count(self): today = datetime.date.today() month = today.month year = today.year diff --git a/Clientes/serailizers.py b/Clientes/serailizers.py index 1e62dd8..9e7cab0 100644 --- a/Clientes/serailizers.py +++ b/Clientes/serailizers.py @@ -4,4 +4,4 @@ from .models import Clientes class ClienteSerializer(serializers.ModelSerializer): class Meta: model = Clientes - fields = ('RFC', 'Nombre', 'Activo', 'fecha_baja',) \ No newline at end of file + fields = ('RFC', 'Nombre', 'Activo', 'fecha_baja',) diff --git a/Clientes/urls.py b/Clientes/urls.py index 4f92fe0..76c78ae 100644 --- a/Clientes/urls.py +++ b/Clientes/urls.py @@ -6,6 +6,8 @@ from .views import ( ClientesCreateView, export_Excel, send_timbres_Email, + Retrive_Cliente_Email, + PACS_Retrive_RFCS, #API DRF saldo_funct2, @@ -25,5 +27,6 @@ urlpatterns = [ path('getActivoRFC/', check_RFC.as_view(), name='check_active_RFC'), path('get_saldo2/', saldo_funct2.as_view(), name='saldo_funct2'), path('check_host/',check_host.as_view(),name='check_host'), - + path('emails_cliente/',Retrive_Cliente_Email, name='Retrive_Cliente_Email'), + path('pacs/list/',PACS_Retrive_RFCS,name='PACS_Retrive_RFCS'), ] \ No newline at end of file diff --git a/Clientes/views.py b/Clientes/views.py index 16746c2..82a9261 100644 --- a/Clientes/views.py +++ b/Clientes/views.py @@ -1,26 +1,29 @@ +import os +import re +import datetime +import functools + +from asgiref.sync import sync_to_async +from django.conf import settings +from django.core.files.storage import FileSystemStorage from django.shortcuts import render,redirect from django.contrib import messages -from django.http import HttpResponse -from django.http import JsonResponse +from django.http import HttpResponse,JsonResponse from django.contrib.auth.decorators import login_required -from .custom_decorators import is_staff_access +from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger +from django.db.models import Q +from django.views.generic.edit import CreateView,UpdateView +from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin +from .custom_decorators import is_staff_access, http_basic_auth from .models import Clientes,Timbres,saldoModel,ErroresTimbres +from .serailizers import ClienteSerializer +from .forms import ClienteForm,EmailForm from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated -from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger -from django.db.models import Q -import datetime -from django.views.generic.edit import CreateView,UpdateView -from .forms import ClienteForm,EmailForm -from django.contrib.auth.mixins import LoginRequiredMixin -from django.contrib.auth.mixins import UserPassesTestMixin -from asgiref.sync import sync_to_async -from django.shortcuts import get_object_or_404 -from .serailizers import ClienteSerializer #EXCEL from openpyxl import Workbook from openpyxl.styles import Alignment, Border, Font, PatternFill, Side @@ -29,12 +32,6 @@ from openpyxl.styles import Alignment, Border, Font, PatternFill, Side from django.core.mail import EmailMessage from django.conf import settings from io import BytesIO -import functools - -from django.core.files.storage import FileSystemStorage -import os -from django.conf import settings -import re def read_env_file(): try: @@ -62,6 +59,7 @@ def read_env_file(): @sync_to_async(thread_sensitive=False) @login_required +@is_staff_access() def send_timbres_Email(request): req = request.method @@ -71,6 +69,7 @@ def send_timbres_Email(request): messages.add_message(request, messages.ERROR, f'{form.errors}') return redirect('index') today = datetime.date.today() + year = today.year RFC = request.GET.get('RFC', None) if req=='GET' else form.cleaned_data["RFC"] @@ -98,9 +97,9 @@ def send_timbres_Email(request): else: findate = dat+datetime.timedelta(days=28) findate +=datetime.timedelta(days=1) - print(f'dat{dat} findate:{findate}') + #print(f'dat{dat} findate:{findate}') if mes is not None and RFC is not None: - objeto_a_trabajar = Timbres.objects.filter(rfcc=RFC, created_at__range=[dat,findate]) + objeto_a_trabajar = Timbres.objects.filter(rfcc=RFC, created_at__range=[dat,findate]) else: objeto_a_trabajar = Clientes.objects.all() for i,ii in enumerate(objeto_a_trabajar): @@ -163,6 +162,9 @@ def index(request): #read_env_file() clientes_list = Clientes.objects.all() mes = request.GET.get('mes', None) + today = datetime.date.today() + if mes is None or mes =='None': + mes = today.month page = request.GET.get('page', 1) search = request.GET.get('search',None) rfcc = request.GET.get('rfcc', None) @@ -170,20 +172,19 @@ def index(request): filters.pop('page', '') filters.pop('datepicker','') filters.pop('datepickerFin','') + filters.pop('mes','') print('filters------',filters) if rfcc: clientes_list = Clientes.objects.filter(Q(RFC__icontains=search)) for i,ii in enumerate(clientes_list): ii.timbres_X_MES(mes=mes) clientes_list =pageFunc(page,clientes_list,20) - - filters.pop('mes','') + context = { 'lista':clientes_list, 'mes':mes, 'filters':filters, 'emailForm':EmailForm(), - } return render(request,'Clientes/index.html',context) @@ -202,47 +203,83 @@ def pageFunc(page,qs,per_page): @login_required @is_staff_access() def timbres_cliente(request, RFC): + + if request.user.is_staff: lista = Timbres.objects.filter(rfcc=RFC) else: lista = Timbres.objects.filter(rfcc=RFC,modo='Normal') - + + mes = request.GET.get('mes', None) + today= datetime.date.today() + year =today.year + if mes is None or mes =='None': + mes='00' #Todos + PAC= request.GET.get('PAC',None) - if PAC=='01': - lista = lista.filter(rfcp='EME000602QR9') - if PAC=='02': - lista = lista.exclude(rfcp='EME000602QR9') + # if PAC !="00" or PAC !="None": + # lista = lista.filter(rfcp=str(PAC)) + # else: + # lista = Timbres.objects.filter(rfcc=str(RFC)) + + #print(f'{PAC} filter pro pac',lista.count(), lista) + if PAC is not None and PAC !='00': + lista = lista.filter(rfcp=PAC) + + + + + search = request.GET.get('search',None) page = request.GET.get('page', 1) datepicker = request.GET.get('datepicker', None) datepickerFin = request.GET.get('datepickerFin', None) tipo = request.GET.get('tipo',None) - + + filters = {key:value[0] for (key,value) in dict(request.GET).items() if value !=[""]} + filters.pop('page', '') - filters.pop('PAC', '') - - - if tipo: - lista = lista.filter(Q(tipo__icontains=search)) - - if datepicker and datepickerFin: - inicio = [int(i) for i in datepicker.split("/")] - fin = [int(i) for i in datepickerFin.split("/")] - #print('inicio',inicio,' fin',fin) + if 'PAC' not in filters: + filters['PAC']='00' + if 'mes' not in filters: + filters['mes']='00' + + if tipo and search is not None: + lista = lista.filter(Q(tipo__icontains=search)) + + if datepicker and datepickerFin: + # inicio = [int(i) for i in datepicker.split("/")] + # fin = [int(i) for i in datepickerFin.split("/")] + inicio = [int(i) for i in datepicker.split("-")] + fin = [int(i) for i in datepickerFin.split("-")] + #print('inicio',inicio,' fin',fin) + #start = datetime.datetime(inicio[2],inicio[0],inicio[1]) + start = datetime.datetime(inicio[0],inicio[1],inicio[2]) - start = datetime.datetime(inicio[2],inicio[0],inicio[1]) start += datetime.timedelta(days=0) - end = datetime.datetime(fin[2],fin[0],fin[1]) + # end = datetime.datetime(fin[2],fin[0],fin[1]) + end = datetime.datetime(fin[0],fin[1],fin[2]) + end += datetime.timedelta(days=1) - #datetime.date.today() - #print('FECHA',datetime.datetime.today(), 'HORA') - print('start',start, 'end',end) + + #print('start',start, 'end',end) lista = lista.filter(created_at__range=[start, end]) + + if mes != '00': + dat = datetime.datetime(int(year), int(mes),1) + if dat.month in(1,3,5,7,8,10,12): + findate = dat +datetime.timedelta(days=30) + elif dat.month in (4,6,9,11): + findate = dat+datetime.timedelta(days=29) + else: + findate = dat+datetime.timedelta(days=28) + findate +=datetime.timedelta(days=1) + lista = lista.filter(created_at__range=[dat,findate]) conteo = lista.count() - + print('conteo',conteo) lista =pageFunc(page,lista,50) context ={ @@ -256,6 +293,7 @@ def timbres_cliente(request, RFC): @sync_to_async(thread_sensitive=False) @login_required +@is_staff_access() def export_Excel(request): RFC = request.GET.get('RFC', None) @@ -284,8 +322,6 @@ def export_Excel(request): objeto_a_trabajar = Clientes.objects.all() for i,ii in enumerate(objeto_a_trabajar): ii.timbres_X_MES(mes=mes ) - - wb = Workbook() ws = wb.active @@ -311,11 +347,23 @@ def export_Excel(request): response = HttpResponse(content_type="application/ms-excel") contenido = "attachment; filename = {0}".format(nombre_archivo) response["Content-Disposition"] = contenido - wb.save( response) - + wb.save( response) return response +@http_basic_auth() +def Retrive_Cliente_Email(request): + if request.method == 'GET': + clientes = list(Clientes.objects.values('email').filter(RFC=request.GET.get('RFC',None))) + return JsonResponse({'data':clientes}) + +def PACS_Retrive_RFCS(request): + status = 302 + timbres = {} + if request.method == 'GET': + timbres =list(Timbres.objects.values('rfcp').filter(rfcp__isnull=False)) + return JsonResponse({'PACS':timbres},status=status) + #-----------------------------------API VIEWS #-------------------------------------------- class check_RFC(APIView): @@ -325,8 +373,7 @@ class check_RFC(APIView): cliente, created = Clientes.objects.get_or_create(RFC=rfc) if created: cliente.Activo=True - cliente.save() - #cliente = get_object_or_404(Clientes, RFC=rfc) + cliente.save() serializer = ClienteSerializer(cliente) return Response(serializer.data) @@ -341,8 +388,7 @@ class add_timbre2(APIView): serie=request.GET.get('serie', None) tipo=request.GET.get('tipo', None) rfcp=request.GET.get('rfcp', None) - modo=request.GET.get('modo', None) - + modo=request.GET.get('modo', None) obj={ 'uuid':uuid, 'rfcc':rfcc, @@ -381,8 +427,7 @@ class saldo_funct2(APIView): return Response(content) class check_host(APIView): - permission_classes = (IsAuthenticated,) - + permission_classes = (IsAuthenticated,) def post(self,request, format=None): data = request.data print(data) @@ -396,13 +441,11 @@ class ClientesUpdateView(UserPassesTestMixin,LoginRequiredMixin,UpdateView): success_url='/' template_name='Clientes/edit_cliente.html' - def test_func(self): - + def test_func(self): res = self.request.user.groups.filter(name= 'admin_soft') if not res: messages.error(self.request, f'Lo sentimos. La página que buscas no está disponible, no cuentas con los permisos.') return res - class ClientesCreateView(UserPassesTestMixin,LoginRequiredMixin,CreateView): model = Clientes diff --git a/Templates/Clientes/index.html b/Templates/Clientes/index.html index 195919b..dd511b6 100644 --- a/Templates/Clientes/index.html +++ b/Templates/Clientes/index.html @@ -119,7 +119,7 @@ Timbres disponibles Comercio Digital: {{saldo}} - + +
@@ -161,13 +174,13 @@ Timbres disponibles Comercio Digital: {{saldo}}
- + {{emailForm.adjunto}}
- - + +
+ + + {% endblock content %} {% block scripts %} diff --git a/Templates/Clientes/timbres_cliente.html b/Templates/Clientes/timbres_cliente.html index cd5bbc0..3823952 100644 --- a/Templates/Clientes/timbres_cliente.html +++ b/Templates/Clientes/timbres_cliente.html @@ -25,20 +25,35 @@ PAC - - - + - + Tipo CFDI Serie/Folio - + Fecha + @@ -56,29 +71,125 @@ - + {% endblock content %} {% block scripts %} - + + From e1588c797d786de104e4ed93ed216eb4141f5f7c Mon Sep 17 00:00:00 2001 From: fjrodriguez Date: Mon, 19 Dec 2022 15:35:42 -0600 Subject: [PATCH 02/21] second branch and commit --- Clientes/views.py | 54 ++++++++------------ Templates/Clientes/timbres_cliente.html | 68 +++++++++++-------------- 2 files changed, 52 insertions(+), 70 deletions(-) diff --git a/Clientes/views.py b/Clientes/views.py index 82a9261..6970a91 100644 --- a/Clientes/views.py +++ b/Clientes/views.py @@ -203,8 +203,6 @@ def pageFunc(page,qs,per_page): @login_required @is_staff_access() def timbres_cliente(request, RFC): - - if request.user.is_staff: lista = Timbres.objects.filter(rfcc=RFC) else: @@ -213,42 +211,29 @@ def timbres_cliente(request, RFC): mes = request.GET.get('mes', None) today= datetime.date.today() year =today.year - if mes is None or mes =='None': - mes='00' #Todos - - PAC= request.GET.get('PAC',None) - # if PAC !="00" or PAC !="None": - # lista = lista.filter(rfcp=str(PAC)) - # else: - # lista = Timbres.objects.filter(rfcc=str(RFC)) - - #print(f'{PAC} filter pro pac',lista.count(), lista) - if PAC is not None and PAC !='00': - lista = lista.filter(rfcp=PAC) - - - - - search = request.GET.get('search',None) page = request.GET.get('page', 1) datepicker = request.GET.get('datepicker', None) datepickerFin = request.GET.get('datepickerFin', None) - tipo = request.GET.get('tipo',None) + tipo = request.GET.get('tipo',None) + PAC= request.GET.get('PAC',None) + + if PAC is not None and PAC !='00': + lista = lista.filter(rfcp=PAC) + + - - filters = {key:value[0] for (key,value) in dict(request.GET).items() if value !=[""]} - + filters.pop('page', '') if 'PAC' not in filters: filters['PAC']='00' if 'mes' not in filters: filters['mes']='00' - + if tipo and search is not None: lista = lista.filter(Q(tipo__icontains=search)) - + if datepicker and datepickerFin: # inicio = [int(i) for i in datepicker.split("/")] # fin = [int(i) for i in datepickerFin.split("/")] @@ -267,6 +252,9 @@ def timbres_cliente(request, RFC): #print('start',start, 'end',end) lista = lista.filter(created_at__range=[start, end]) + if mes is None or mes =='None' or mes=='': + mes='00' #Todos + if mes != '00': dat = datetime.datetime(int(year), int(mes),1) if dat.month in(1,3,5,7,8,10,12): @@ -279,7 +267,7 @@ def timbres_cliente(request, RFC): lista = lista.filter(created_at__range=[dat,findate]) conteo = lista.count() - print('conteo',conteo) + lista =pageFunc(page,lista,50) context ={ @@ -303,7 +291,7 @@ def export_Excel(request): month = today.month year = today.year - if mes is None or mes =='None': + if mes is None or mes =='None' or mes=='': mes = month dat =datetime.datetime(int(year), int(mes),1) @@ -350,18 +338,21 @@ def export_Excel(request): wb.save( response) return response - @http_basic_auth() def Retrive_Cliente_Email(request): if request.method == 'GET': clientes = list(Clientes.objects.values('email').filter(RFC=request.GET.get('RFC',None))) return JsonResponse({'data':clientes}) -def PACS_Retrive_RFCS(request): - status = 302 +@login_required +@is_staff_access() +def PACS_Retrive_RFCS(request): timbres = {} if request.method == 'GET': + status = 200 timbres =list(Timbres.objects.values('rfcp').filter(rfcp__isnull=False)) + else: + status=403 return JsonResponse({'PACS':timbres},status=status) #-----------------------------------API VIEWS @@ -379,8 +370,7 @@ class check_RFC(APIView): class add_timbre2(APIView): permission_classes = (IsAuthenticated,) - def get(self,request): - + def get(self,request): uuid= request.GET.get('uuid', None) rfcc= request.GET.get('rfcc', None) fecha=request.GET.get('fecha', None) diff --git a/Templates/Clientes/timbres_cliente.html b/Templates/Clientes/timbres_cliente.html index 3823952..2d566b0 100644 --- a/Templates/Clientes/timbres_cliente.html +++ b/Templates/Clientes/timbres_cliente.html @@ -1,34 +1,30 @@ - {% extends 'base.html' %} - - {% block content %}

Timbres {{RFC}}

Timbres totales: {{conteo}}

- -{% if filters.datepicker%} - De fecha: "{{filters.datepicker}}" -{% endif %} -{% if filters.datepickerFin %} - A fecha: "{{filters.datepickerFin}}" -{% endif %} - + + {% if filters.datepicker%} + De fecha: "{{filters.datepicker}}" + {% endif %} + + {% if filters.datepickerFin %} + A fecha: "{{filters.datepickerFin}}" + {% endif %} +

- - + - + {% endfor %} @@ -92,26 +88,26 @@ return res.json() }) .then(data=>{ - let arr = data['PACS'] - let pacs = [...new Set(arr.map((arr)=> arr.rfcp) )] - - pacs.forEach((val,index)=>{ - let option = document.createElement('option') - option.value=val - option.text=val - table_select_PAC.add(option) - PAC.filter(val=>val.includes('PAC')) - .forEach((val,index)=>{ - table_select_PAC.value = val.split('=')[1] - }) + + let pacs = [...new Set( data['PACS'].map((arr)=> arr.rfcp) )] + pacs.forEach((val,index)=>{ + let option = document.createElement('option') + option.value=val + option.text=val + table_select_PAC.add(option) + PAC.filter(val=>val.includes('PAC')) + .forEach((val,index)=>{ + table_select_PAC.value = val.split('=')[1] }) + }) }) } + - + \ No newline at end of file From 64555bc92aea5eba7fa48c0f9a202cf345d9cbf9 Mon Sep 17 00:00:00 2001 From: fjrodriguez Date: Thu, 22 Dec 2022 14:09:49 -0600 Subject: [PATCH 08/21] minimal changes --- Admin/settings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Admin/settings.py b/Admin/settings.py index a49b867..9d2b192 100644 --- a/Admin/settings.py +++ b/Admin/settings.py @@ -15,7 +15,7 @@ BASE_DIR = Path(__file__).resolve().parent.parent SECRET_KEY = os.getenv("adminAS_KEY") # SECURITY WARNING: don't run with debug turned on in production! -DEBUG = True +DEBUG = False ALLOWED_HOSTS = ['*'] # Application definition From f4372328616c66f7c226e5d9dbc731f8339c79cc Mon Sep 17 00:00:00 2001 From: fjrodriguez Date: Thu, 5 Jan 2023 16:09:22 -0600 Subject: [PATCH 09/21] year added to index view --- Admin/settings.py | 6 +- Admin/urls.py | 20 ++++++- Clientes/models.py | 6 +- Clientes/urls.py | 3 + Clientes/views.py | 29 ++++++---- Templates/404.html | 1 + Templates/Clientes/index.html | 88 +++++++++++++++++++---------- Templates/partials/search_form.html | 10 ---- 8 files changed, 106 insertions(+), 57 deletions(-) create mode 100644 Templates/404.html diff --git a/Admin/settings.py b/Admin/settings.py index 9d2b192..2ecba9a 100644 --- a/Admin/settings.py +++ b/Admin/settings.py @@ -34,7 +34,7 @@ INSTALLED_APPS = [ 'allauth.account', 'allauth.socialaccount', 'widget_tweaks', - + 'Clientes', ] REST_FRAMEWORK = { @@ -102,7 +102,7 @@ ACCOUNT_LOGOUT_ON_PASSWORD_CHANGE = True EMAIL_TIMEOUT = 10 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_SUBJECT_PREFIX = 'AS Timbres' -if DEBUG: +if DEBUG : EMAIL_USE_TLS = True EMAIL_HOST = 'smtp.gmail.com' EMAIL_PORT = 587 @@ -121,6 +121,8 @@ else: # Database # https://docs.djangoproject.com/en/4.1/ref/settings/#databases + + if DEBUG: DATABASES = { 'default': { diff --git a/Admin/urls.py b/Admin/urls.py index 3da3cf4..66bda04 100644 --- a/Admin/urls.py +++ b/Admin/urls.py @@ -9,21 +9,36 @@ from django.http import HttpResponse from django.test import SimpleTestCase, override_settings from rest_framework.authtoken.views import obtain_auth_token + + def response_error_handler(request, exception=None): context={} + return render(request, '403.html',context,status=403) +def response_error_handler_404(request,exception=None): + + return render(request,'404.html',status=404) + def permission_denied_view(request): + raise PermissionDenied + + urlpatterns = [ path('admin/', admin.site.urls), path('accounts/', include('allauth.urls')), path('DRF_Token/', obtain_auth_token, name='DRF_Token'), path('', include('Clientes.urls')), path('403/', permission_denied_view), + + + + ] handler403 = response_error_handler +handler404 = response_error_handler_404 if settings.DEBUG: #DEV only urlpatterns += static(settings.STATIC_URL, document_root= settings.STATIC_ROOT) @@ -32,8 +47,9 @@ if settings.DEBUG: #DEV only # ROOT_URLCONF must specify the module that contains handler403 = ... @override_settings(ROOT_URLCONF=__name__) class CustomErrorHandlerTests(SimpleTestCase): - def test_handler_renders_template_response(self): response = self.client.get('/403/') + # Make assertions on the response here. For example: - self.assertContains(response, 'Error handler content', status_code=403) \ No newline at end of file + self.assertContains(response, 'Error handler content', status_code=403) + diff --git a/Clientes/models.py b/Clientes/models.py index e06079f..2355e91 100644 --- a/Clientes/models.py +++ b/Clientes/models.py @@ -40,11 +40,13 @@ class Clientes(models.Model): fecha_baja = models.DateField(blank=True,null=True) email = models.EmailField(max_length=254, blank=True) conteo_mes = models.IntegerField(blank=True,null=True,default=0) - def timbres_X_MES(self, mes=None): + def timbres_X_MES(self, mes=None, year=None): today = datetime.date.today() - year = today.year + if year is None: + year = today.year if mes==None: mes = today.month + dat = datetime.datetime(int(year),int(mes),1) if dat.month in (1,3,5,7,8,10,12):#31 findate = dat + datetime.timedelta(days=30) diff --git a/Clientes/urls.py b/Clientes/urls.py index 80c20f8..552324e 100644 --- a/Clientes/urls.py +++ b/Clientes/urls.py @@ -9,6 +9,7 @@ from .views import ( send_timbres_Email, Retrive_Cliente_Email, PACS_Retrive_RFCS, + #API DRF saldo_funct2, @@ -31,4 +32,6 @@ urlpatterns = [ path('check_host/',check_host.as_view(),name='check_host'), path('emails_cliente/',Retrive_Cliente_Email, name='Retrive_Cliente_Email'), path('pacs/list/',PACS_Retrive_RFCS,name='PACS_Retrive_RFCS'), + + ] \ No newline at end of file diff --git a/Clientes/views.py b/Clientes/views.py index e5f07fa..d3abcc4 100644 --- a/Clientes/views.py +++ b/Clientes/views.py @@ -84,7 +84,7 @@ def send_timbres_Email(request): if req=='POST': email = form.cleaned_data["email"] if 'email' in form.cleaned_data.keys() else '' emails = [Cli.email] if req=='GET' else [ Cli.email, email ] - + if len(emails) ==0 : messages.add_message(request, messages.ERROR, f'La lista de correos esta vacia, favor de agregar un correo.') return redirect('index') @@ -132,9 +132,9 @@ def send_timbres_Email(request): contenido = "attachment; filename = {0}".format(nombre_archivo) response["Content-Disposition"] = contenido wb.save(response) - + files = BytesIO(response.content) - + try: mail = EmailMessage(subject,message,settings.EMAIL_HOST_USER,emails) mail.attach(filename='Timbres.xls',content=files.getbuffer(),mimetype='application/vnd.ms-excel') @@ -164,7 +164,11 @@ def index(request): clientes_list = Clientes.objects.all() mes = request.GET.get('mes', None) today = datetime.date.today() - if mes is None or mes =='None': + + year = request.GET.get('year',None) + if year is None or year =='None': + year= today.year + if mes is None or mes =='None': mes = today.month page = request.GET.get('page', 1) search = request.GET.get('search',None) @@ -174,6 +178,7 @@ def index(request): filters.pop('datepicker','') filters.pop('datepickerFin','') filters.pop('mes','') + filters.pop('year','') print('filters------',filters) if rfcc and search: clientes_list = Clientes.objects.filter(Q(RFC__icontains=search)) @@ -184,7 +189,7 @@ def index(request): while met: try: c = next(met) - c.timbres_X_MES(mes=mes) + c.timbres_X_MES(mes=mes,year=year) except StopIteration: break @@ -193,6 +198,7 @@ def index(request): context = { 'lista':clientes_list, 'mes':mes, + 'year':year, 'filters':filters, 'emailForm':EmailForm(), } @@ -231,8 +237,6 @@ def timbres_cliente(request, RFC): if PAC is not None and PAC !='00': lista = lista.filter(rfcp=PAC) - - filters = {key:value[0] for (key,value) in dict(request.GET).items() if value !=[""]} filters.pop('page', '') @@ -257,11 +261,10 @@ def timbres_cliente(request, RFC): # end = datetime.datetime(fin[2],fin[0],fin[1]) end = datetime.datetime(fin[0],fin[1],fin[2]) - end += datetime.timedelta(days=1) - + end += datetime.timedelta(days=1) #print('start',start, 'end',end) lista = lista.filter(created_at__range=[start, end]) - + if mes is None or mes =='None' or mes=='': mes='00' #Todos @@ -358,9 +361,10 @@ def Retrive_Cliente_Email(request): #@is_staff_access() def PACS_Retrive_RFCS(request): timbres = {} + status = 200 if request.method == 'GET': RFC= request.GET.get('RFC','') - status = 200 + if RFC !='': timbres =list(Timbres.objects.values('rfcp').filter(rfcc__in=[RFC])) else: @@ -369,6 +373,8 @@ def PACS_Retrive_RFCS(request): status=403 return JsonResponse({'PACS':timbres},status=status) + + #-----------------------------------API VIEWS #-------------------------------------------- from rest_framework import status @@ -449,7 +455,6 @@ class ErroresTimbresListView(LoginRequiredMixin,ListView): model = ErroresTimbres paginate_by = 100 template_name = 'Clientes/Errores_Timbres_list.html' - class ClientesUpdateView(UserPassesTestMixin,LoginRequiredMixin,UpdateView): model= Clientes diff --git a/Templates/404.html b/Templates/404.html new file mode 100644 index 0000000..f4fae37 --- /dev/null +++ b/Templates/404.html @@ -0,0 +1 @@ +no hay diff --git a/Templates/Clientes/index.html b/Templates/Clientes/index.html index 54dea59..85306fa 100644 --- a/Templates/Clientes/index.html +++ b/Templates/Clientes/index.html @@ -18,11 +18,13 @@ Timbres disponibles Comercio Digital: {{saldo}}
UUID UUID PAC @@ -65,7 +61,7 @@ {{obj.rfcp}} {{obj.tipo}} {{obj.serie}}/{{obj.folio}}{{obj.created_at|date:"d M Y"}}{{obj.created_at|date:"d M Y"}}
Nombre -
- Totales Mes - +
+ Total x mes +
- +
- +
{% for i,v in filters.items %}&{{i}}={{v}}{% endfor%}
@@ -167,7 +169,6 @@ Timbres disponibles Comercio Digital: {{saldo}} -
@@ -245,7 +246,7 @@ Timbres disponibles Comercio Digital: {{saldo}} method: 'GET', headers: { 'Content-Type': 'application/json', - 'X-Requested-With':'XMLHttpRequest', + 'X-Requested-With':'XMLHttpRequest', }, credentials:"same-origin" }) @@ -262,7 +263,7 @@ Timbres disponibles Comercio Digital: {{saldo}} } const re = Object.values(data['data']) re.forEach((val,index)=>{ - console.log('val',val.email, index) + const row = document.createElement("tr") row.setAttribute("class","table_row") const cell = document.createElement("td") @@ -281,16 +282,16 @@ Timbres disponibles Comercio Digital: {{saldo}} email_add.value=event.target.textContent close_emails_list.click() }) - }) })//.then(data) - - - } let filters = document.getElementById('id_filters').textContent + let mes ='{{mes}}' + let year = parseInt('{{year}}') + + function aclick(event,RFC ,cuantos){ if( parseInt(cuantos)===0){ @@ -302,31 +303,65 @@ Timbres disponibles Comercio Digital: {{saldo}} } table_rfcc.addEventListener('click',(event)=>{ - document.getElementById('rfcc').checked= table_rfcc.checked? true:false; - + document.getElementById('rfcc').checked= table_rfcc.checked? true:false; }) - - window.addEventListener("load", (event)=>{ - let mes ='{{mes}}' - +// let mes ='{{mes}}' + + mes.length == 1 ? mes="0"+mes: mes if(mes !="None"){ - document.getElementById('table_select').value='{{mes}}' - mes_id.value='{{mes}}' + document.getElementById('table_select').value=mes + mes_id.value=mes }else{ document.getElementById('table_select').value='{{fecha|date:"m"}}' mes_id.value='{{fecha|date:"m"}}' } + + + /*Add years to select anio tag*/ + + let anio = parseInt('{{fecha|date:"Y"}}') + + let fin = anio-5 + for(var i = anio; i >= fin ;i--){ + let option = document.createElement('option') + option.value=i + option.text=i + table_select_anio.add(option) + } + /*despues de agregar los anios al control agrega el value del contexto*/ + table_select_anio.value=year + }) document.getElementById('table_select').addEventListener('change',(event)=>{ spinner_id.setAttribute('style','display:inline;') + let anc = document.getElementById('home_id') anc.href='' - let url = `?mes=${event.target.value}${filters}` - anc.href=url - anc.click() + + let url = `?mes=${event.target.value}&year=${year}${filters}` + + setTimeout(()=>{ + anc.href=url + anc.click() + },1000) + + }) + + table_select_anio.addEventListener('change',(event)=>{ + spinner_id.setAttribute('style','display:inline;') + + let anc = document.getElementById('home_id') + anc.href='' + + let url = `?mes=${mes}&year=${event.target.value}${filters}` + + setTimeout(()=>{ + anc.href=url + anc.click() + },1000) }) enviar_btn.addEventListener('click',(e)=>{ @@ -334,12 +369,7 @@ Timbres disponibles Comercio Digital: {{saldo}} if(id_form.checkValidity()){ // spinner_enviar.removeAttribute('style'); - /* - id_form.getElementsByTagName('*'); - for (var node of childNodes) { - node.disabled = true; - } - */ + } }) diff --git a/Templates/partials/search_form.html b/Templates/partials/search_form.html index 717ccfa..774d88b 100644 --- a/Templates/partials/search_form.html +++ b/Templates/partials/search_form.html @@ -18,16 +18,6 @@ \ No newline at end of file From 2f6478c37a91789b682fd410178f9d090e18f90c Mon Sep 17 00:00:00 2001 From: fjrodriguez Date: Fri, 6 Jan 2023 10:16:29 -0600 Subject: [PATCH 10/21] filter in clientes timbres by year --- Clientes/models.py | 16 +++++----- Clientes/saldo_context_proc.py | 1 - Clientes/views.py | 34 ++++++++++++--------- Templates/Clientes/timbres_cliente.html | 39 +++++++++++++++++++++++-- 4 files changed, 64 insertions(+), 26 deletions(-) diff --git a/Clientes/models.py b/Clientes/models.py index 2355e91..2cdc6ed 100644 --- a/Clientes/models.py +++ b/Clientes/models.py @@ -46,27 +46,26 @@ class Clientes(models.Model): year = today.year if mes==None: mes = today.month - + dat = datetime.datetime(int(year),int(mes),1) if dat.month in (1,3,5,7,8,10,12):#31 findate = dat + datetime.timedelta(days=30) - + elif dat.month in (4,6,9,11):#30 findate = dat + datetime.timedelta(days=29) - + else:#28 or 29 findate = dat + datetime.timedelta(days=28) - findate += datetime.timedelta(days=1) - #print(f'dat {(dat)} fdate={findate}') + findate += datetime.timedelta(days=1) cou = Timbres.objects.filter(rfcc=self.RFC, created_at__range=[dat,findate]).count() self.conteo_mes =cou self.save() - #return cou + @property def timbres_mes_count(self): today = datetime.date.today() month = today.month - year = today.year + year = today.year return Timbres.objects.filter(rfcc=self.RFC, created_at__year=str(year),created_at__month=str(month)).count() class Meta: ordering = ('-Activo','-conteo_mes','RFC') @@ -81,5 +80,4 @@ class Maquinas_Conectadas(models.Model): public_ip= models.CharField(max_length=55) RFC = models.CharField(max_length=13) class Meta: - abstract =True - + abstract =True \ No newline at end of file diff --git a/Clientes/saldo_context_proc.py b/Clientes/saldo_context_proc.py index 355bf95..36cf467 100644 --- a/Clientes/saldo_context_proc.py +++ b/Clientes/saldo_context_proc.py @@ -1,5 +1,4 @@ import requests -from asgiref.sync import sync_to_async from .models import saldoModel import datetime diff --git a/Clientes/views.py b/Clientes/views.py index d3abcc4..82fc3d5 100644 --- a/Clientes/views.py +++ b/Clientes/views.py @@ -39,20 +39,20 @@ def read_env_file(): #env_file = os.listdir(settings.BASE_DIR) storage = FileSystemStorage(location=settings.BASE_DIR) env_file= os.path.join(settings.BASE_DIR,'.env') - print('EEEEE: ', env_file) + lista =['asds', 'asdasd','sss','com' ,'pol.com'] if storage.exists(env_file): with open(env_file, 'r') as file: data = file.read() data =re.findall('"([^"]*)"',data) - print('data',data) + for x in lista: data.append(x) res= ' '.join(data) final = '"'+res+'"' - print('final',final) + with open(env_file, 'w') as newFile: newFile.write("export hosts="+final) except: @@ -98,7 +98,7 @@ def send_timbres_Email(request): else: findate = dat+datetime.timedelta(days=28) findate +=datetime.timedelta(days=1) - #print(f'dat{dat} findate:{findate}') + if mes is not None and RFC is not None: objeto_a_trabajar = Timbres.objects.filter(rfcc=RFC, created_at__range=[dat,findate]) else: @@ -179,7 +179,7 @@ def index(request): filters.pop('datepickerFin','') filters.pop('mes','') filters.pop('year','') - print('filters------',filters) + if rfcc and search: clientes_list = Clientes.objects.filter(Q(RFC__icontains=search)) @@ -224,9 +224,14 @@ def timbres_cliente(request, RFC): else: lista = Timbres.objects.filter(rfcc=RFC,modo='Normal') - mes = request.GET.get('mes', None) - today= datetime.date.today() - year =today.year + mes = request.GET.get('mes', None) + year = request.GET.get('year',None) + + if year is None or year=='': + + today= datetime.date.today() + year =today.year + search = request.GET.get('search',None) page = request.GET.get('page', 1) datepicker = request.GET.get('datepicker', None) @@ -253,7 +258,7 @@ def timbres_cliente(request, RFC): # fin = [int(i) for i in datepickerFin.split("/")] inicio = [int(i) for i in datepicker.split("-")] fin = [int(i) for i in datepickerFin.split("-")] - #print('inicio',inicio,' fin',fin) + #start = datetime.datetime(inicio[2],inicio[0],inicio[1]) start = datetime.datetime(inicio[0],inicio[1],inicio[2]) @@ -262,22 +267,25 @@ def timbres_cliente(request, RFC): end = datetime.datetime(fin[0],fin[1],fin[2]) end += datetime.timedelta(days=1) - #print('start',start, 'end',end) + lista = lista.filter(created_at__range=[start, end]) if mes is None or mes =='None' or mes=='': mes='00' #Todos if mes != '00': + dat = datetime.datetime(int(year), int(mes),1) if dat.month in(1,3,5,7,8,10,12): - findate = dat +datetime.timedelta(days=30) + findate = dat+datetime.timedelta(days=30) elif dat.month in (4,6,9,11): findate = dat+datetime.timedelta(days=29) else: findate = dat+datetime.timedelta(days=28) findate +=datetime.timedelta(days=1) lista = lista.filter(created_at__range=[dat,findate]) + else: + lista = lista.filter(created_at__year=int(year)) conteo = lista.count() @@ -316,7 +324,7 @@ def export_Excel(request): else: findate = dat+datetime.timedelta(days=28) findate +=datetime.timedelta(days=1) - print(f'dat{dat} findate:{findate}') + if mes is not None and RFC is not None: objeto_a_trabajar = Timbres.objects.filter(rfcc=RFC, created_at__range=[dat,findate]) else: @@ -446,7 +454,7 @@ class check_host(APIView): permission_classes = (IsAuthenticated,) def post(self,request, format=None): data = request.data - print(data) + return Response(data) #---------------------------CLASS BASED VIEWS diff --git a/Templates/Clientes/timbres_cliente.html b/Templates/Clientes/timbres_cliente.html index 4ca07f8..575fb51 100644 --- a/Templates/Clientes/timbres_cliente.html +++ b/Templates/Clientes/timbres_cliente.html @@ -35,6 +35,10 @@ Fecha + + - - - - +
+
+ + + + + + + +
+
Estado @@ -139,7 +157,7 @@ Timbres disponibles Comercio Digital: {{saldo}}
-
{% for i,v in filters.items %}&{{i}}={{v}}{% endfor%}
+ @@ -289,8 +307,47 @@ Timbres disponibles Comercio Digital: {{saldo}} let filters = document.getElementById('id_filters').textContent let mes ='{{mes}}' let year = parseInt('{{year}}') + let anc = document.getElementById('home_id') + let PAC = Object.values(filters.split('&')) + PAC.filter(val=>{ + lbl_pac.innerHTML="Todos" + if(val.length >0){ + lbl_pac.innerHTML= val.split('=')[1]=="" ? "Todos" :val.split('=')[1] + } + }) + + /*-------------------------Carga los pacs*/ + fetch("{% url 'PACS_Retrive_RFCS' %}",{ + method:'GET', + headers:{ + 'Content-Type':'application/json', + 'X-Requested-With':'XMLHttpRequest', + }, + credentials:"same-origin" + }) + .then(res=>{ + return res.json() + }) + .then(data=>{ + let pacs = [...new Set(data['PACS'].map((arr)=>arr.rfcp) )] + + pacs.forEach((val,index)=>{ + let option = document.createElement('option') + option.value=val + option.text=val + table_select_PAC.add(option) + PAC.filter(val=>val.includes('PAC')) + .forEach((val,index)=>{ + table_select_PAC.value = val.split('=')[1] + }) + }) + }) + .catch(error=>{ + console.log(error) + }) + /*----------------------fin carga pacs*/ function aclick(event,RFC ,cuantos){ @@ -338,7 +395,7 @@ Timbres disponibles Comercio Digital: {{saldo}} document.getElementById('table_select').addEventListener('change',(event)=>{ spinner_id.setAttribute('style','display:inline;') - let anc = document.getElementById('home_id') + anc.href='' let url = `?mes=${event.target.value}&year=${year}${filters}` @@ -353,7 +410,7 @@ Timbres disponibles Comercio Digital: {{saldo}} table_select_anio.addEventListener('change',(event)=>{ spinner_id.setAttribute('style','display:inline;') - let anc = document.getElementById('home_id') + anc.href='' let url = `?mes=${mes}&year=${event.target.value}${filters}` @@ -364,6 +421,17 @@ Timbres disponibles Comercio Digital: {{saldo}} },1000) }) + table_select_PAC.addEventListener('change',(event)=>{ + spinner_id.setAttribute('style','display:inline;'); + anc.href=''; + let url =`?mes=${mes}&year=${year}&PAC=${event.target.value}` + setTimeout(()=>{ + anc.href=url + anc.click() + },1000) + + }) + enviar_btn.addEventListener('click',(e)=>{ if(id_form.checkValidity()){ From f123fe83bba212f552fbf59a51bcf813a4dcbd3a Mon Sep 17 00:00:00 2001 From: fjrodriguez Date: Thu, 19 Jan 2023 09:38:12 -0600 Subject: [PATCH 12/21] minor changes in validate RFC view --- Clientes/custom_decorators.py | 2 - Clientes/views.py | 29 +++--- Templates/Clientes/index.html | 178 +++++++++++++++++----------------- 3 files changed, 102 insertions(+), 107 deletions(-) diff --git a/Clientes/custom_decorators.py b/Clientes/custom_decorators.py index 3387c19..b37afe6 100644 --- a/Clientes/custom_decorators.py +++ b/Clientes/custom_decorators.py @@ -11,8 +11,6 @@ def Custom_is_staff_function(user): if user.is_staff: return True return False - - def is_staff_access(view_to_return="index"): def decorator(view): @wraps(view) diff --git a/Clientes/views.py b/Clientes/views.py index bbe0565..87bbb65 100644 --- a/Clientes/views.py +++ b/Clientes/views.py @@ -24,6 +24,7 @@ from .forms import ClienteForm,EmailForm from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated +from rest_framework import status #EXCEL from openpyxl import Workbook @@ -318,7 +319,7 @@ def export_Excel(request): mes = month dat =datetime.datetime(int(year), int(mes),1) - + if dat.month in(1,3,5,7,8,10,12): findate = dat +datetime.timedelta(days=30) elif dat.month in (4,6,9,11): @@ -326,7 +327,7 @@ def export_Excel(request): else: findate = dat+datetime.timedelta(days=28) findate +=datetime.timedelta(days=1) - + if mes is not None and RFC is not None: objeto_a_trabajar = Timbres.objects.filter(rfcc=RFC, created_at__range=[dat,findate]) else: @@ -336,7 +337,7 @@ def export_Excel(request): wb = Workbook() ws = wb.active - + if RFC is not None: #Encabezado ws['A1']='RFC_EXPEDIDO' @@ -387,7 +388,7 @@ def PACS_Retrive_RFCS(request): #-----------------------------------API VIEWS #-------------------------------------------- -from rest_framework import status + class check_RFC(APIView): permission_classes = (IsAuthenticated,) def get(self,request): @@ -395,11 +396,14 @@ class check_RFC(APIView): try: cliente, created = Clientes.objects.get_or_create(RFC=rfc) serializer = ClienteSerializer(cliente) + + if created: + cliente.Activo=True + cliente.save() + if not serializer.is_valid: return Response(serializer.errors,status=400) - if created: - cliente.Activo=True - cliente.save() + return Response(serializer.data) except Exception as E: return Response({'Error':f'check_RFC:{E} RFC:{rfc}','isError':True}) @@ -415,15 +419,8 @@ class add_timbre2(APIView): tipo=request.GET.get('tipo', None) rfcp=request.GET.get('rfcp', None) modo=request.GET.get('modo', None) - obj={ - 'uuid':uuid, - 'rfcc':rfcc, - 'fecha':fecha, - 'folio':folio, - 'serie':serie, - 'tipo':tipo, - 'rfcp':rfcp, - 'modo':modo + obj={'uuid':uuid,'rfcc':rfcc,'fecha':fecha,'folio':folio, + 'serie':serie,'tipo':tipo,'rfcp':rfcp,'modo':modo } try: obj = Timbres.objects.create(**obj) diff --git a/Templates/Clientes/index.html b/Templates/Clientes/index.html index 11dc739..c6d4e40 100644 --- a/Templates/Clientes/index.html +++ b/Templates/Clientes/index.html @@ -23,9 +23,13 @@ Timbres disponibles Comercio Digital: {{saldo}} - - Filtrado: Mes:{{mes}}, Año:{{year}}, PAC: - + + + + Filtrado: Mes:{{mes}}, Año:{{year}}, PAC: + + + @@ -39,8 +43,7 @@ Timbres disponibles Comercio Digital: {{saldo}} - + -
- -
- - -
- - -
-
- - - {{emailForm.adjunto}} -
-
- - -
- - - - - - - - - - - -