Ultimo Commit antes del apagon (Respaldo)

This commit is contained in:
fjrodriguez
2023-05-03 11:06:27 -06:00
parent 3b70ad09ca
commit 8b9b17a79d
21 changed files with 515 additions and 17 deletions

0
IMMEX/__init__.py Normal file
View File

5
IMMEX/admin.py Normal file
View File

@@ -0,0 +1,5 @@
from django.contrib import admin
from . models import Sistemas_por_cliente_A24, ClientesA24
admin.site.register(Sistemas_por_cliente_A24)
admin.site.register(ClientesA24)

6
IMMEX/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class ImmexConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'IMMEX'

24
IMMEX/forms.py Normal file
View File

@@ -0,0 +1,24 @@
from django import forms
from .models import ClientesA24
from datetime import datetime
class ClienteForm_IMMEX(forms.ModelForm):
fecha_baja = forms.DateField(
required=False,
initial=datetime.now(),
input_formats=["%Y-%m-%d"],
widget=forms.DateInput(attrs={'type':'date'},format="%Y-%m-%d")
)
class Meta:
model = ClientesA24
fields = ('RFC','Nombre','Activo','fecha_baja', )
def clean(self):
super(ClienteForm_IMMEX,self).clean()
Activo = self.cleaned_data.get("Activo")
fecha_baja = self.cleaned_data.get("fecha_baja")
if Activo and fecha_baja:
self._errors['fecha_baja'] = self.error_class(["El parametro activo no puede estar seleccionado si hay fecha de baja"])
return self.cleaned_data

View File

@@ -0,0 +1,42 @@
# Generated by Django 4.1.3 on 2023-04-26 16:55
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
('Sistemas', '0019_alter_device_options'),
]
operations = [
migrations.CreateModel(
name='ClientesA24',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('RFC', models.CharField(max_length=13, unique=True)),
('Nombre', models.CharField(max_length=100)),
('Activo', models.BooleanField(default=False)),
('fecha_baja', models.DateField(blank=True, null=True)),
],
options={
'ordering': ('-Activo', 'RFC'),
},
),
migrations.CreateModel(
name='Sistemas_por_cliente_A24',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('num_licencias', models.IntegerField(default=1)),
('cliente', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='cliente_spc_IMMEX', to='IMMEX.clientesa24')),
('id_sistema', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sistema_spc_IMMEX', to='Sistemas.sistema')),
],
options={
'ordering': ('-cliente', 'id_sistema'),
'unique_together': {('id_sistema', 'cliente')},
},
),
]

View File

25
IMMEX/models.py Normal file
View File

@@ -0,0 +1,25 @@
from django.db import models
from Sistemas.models import Sistema
class ClientesA24(models.Model):
RFC = models.CharField(max_length=13, unique=True)
Nombre = models.CharField(max_length=100)
Activo = models.BooleanField(default=False)
fecha_baja = models.DateField(blank=True,null=True)
class Meta:
ordering = ('-Activo','RFC',)
def __str__(self):
return self.Nombre
class Sistemas_por_cliente_A24(models.Model):
id_sistema= models.ForeignKey(Sistema, related_name='sistema_spc_IMMEX', on_delete=models.CASCADE)
cliente = models.ForeignKey(ClientesA24, related_name='cliente_spc_IMMEX', on_delete=models.CASCADE)
num_licencias= models.IntegerField(default=1)
def __str__(self):
return f'{self.cliente.Nombre}'
class Meta:
ordering= ('-cliente','id_sistema')
unique_together = ('id_sistema', 'cliente')

7
IMMEX/serializers.py Normal file
View File

@@ -0,0 +1,7 @@
from rest_framework import serializers
from .models import ClientesA24
class ClientesA24Serailizer(serializers.ModelSerializer):
class Meta:
model =ClientesA24
fields = ('RFC', 'Nombre','Activo','fecha_baja',)

3
IMMEX/tests.py Normal file
View File

@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

10
IMMEX/urls.py Normal file
View File

@@ -0,0 +1,10 @@
from django.urls import path
from . import views
urlpatterns = [
path('', views.Sistemas_xCliente_IMMEX_ListView.as_view(), name='sistemasXcli_IMMEX'),
path('create_sistema/',views.Sistemas_xCliente_IMMEX_CreateView.as_view(), name='create_sistemaIMMEX'),
path('create_Cliente/', views.ClientesIMMEX_CreateView.as_view(), name='ClientesIMMEX_Create'),
path('checkRfcA24/', views.Check_IMMEX_RFC.as_view(), name='checkRfcA24' ),
]

91
IMMEX/views.py Normal file
View File

@@ -0,0 +1,91 @@
from django.shortcuts import render
from django.http import JsonResponse
from django.urls import reverse_lazy
from Sistemas.models import Sistema
from .models import Sistemas_por_cliente_A24, ClientesA24
from django.views.generic.edit import CreateView
from django.views.generic.list import ListView
from django.contrib import messages
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from .forms import ClienteForm_IMMEX
from .serializers import ClientesA24Serailizer
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from Sistemas.permissions import ItsAdminToken
import urllib.parse
import traceback
class Sistemas_xCliente_IMMEX_ListView(UserPassesTestMixin,LoginRequiredMixin, ListView):
model = Sistemas_por_cliente_A24
paginate_by = 100
template_name = 'IMMEX/xclientes/lista.html'
def test_func(self):
res = self.request.user.groups.filter(name= 'admin_soft')
if not res:
messages.error(self.request, 'Lo sentimos. La página que buscas no está disponible o no cuentas con los permisos.')
return res
class Sistemas_xCliente_IMMEX_CreateView(UserPassesTestMixin,LoginRequiredMixin,CreateView):
model = Sistemas_por_cliente_A24
fields = ['id_sistema', 'cliente', 'num_licencias']
template_name = 'IMMEX/xclientes/sistema_create_IMMEX.html'
success_url = reverse_lazy('sistemasXcli_IMMEX')
def test_func(self):
res = self.request.user.groups.filter(name= 'admin_soft')
if not res:
messages.error(self.request, 'Lo sentimos. La página que buscas no está disponible o no cuentas con los permisos.')
return res
class ClientesIMMEX_CreateView(CreateView):
model = ClientesA24
form_class = ClienteForm_IMMEX
success_url = '/IMMEX/'
template_name = 'IMMEX/xclientes/edit_cliente.html'
def form_valid(self, form):
response = super().form_valid(form)
if self.request.headers.get('X-Requested-With') == 'XMLHttpRequest':
data={
'id':self.object.id,
'RFC':self.object.RFC,
'Nombre':self.object.Nombre,
'Activo':self.object.Activo,
}
return JsonResponse(data)
else:
return response
def form_invalid(self,form):
response = super().form_invalid(form)
if self.request.headers.get('X-Requested-With') == 'XMLHttpRequest':
errors = form.errors.as_text()
return JsonResponse({'errors':f'{errors}'},status=200,content_type='application/json')
else:
return response
"""---------API VIEWS---------"""
class Check_IMMEX_RFC(APIView):
"""Verifica que el cliente pueda Timbrar"""
permission_classes = (IsAuthenticated,ItsAdminToken,)
def post(self,request,*args, **kwargs):
rfc= request.data.get('RFC')
try:
clienteA24 , created = ClientesA24.objects.get_or_create(RFC=rfc)
serializer = ClientesA24Serailizer(clienteA24)
if created:
clienteA24.Activo =True
clienteA24.Nombre = rfc
clienteA24.save()
if not serializer.is_valid:
return Response({'Error':f'{serializer.errors}','isError':True},status=200)
return Response(serializer.data)
except Exception as E:
return Response({'Error':f'check_RFC:{E} RFC:{rfc}','isError':True})