From 0de2d8a735d4262a9a6168ffe386adfb3ba22027 Mon Sep 17 00:00:00 2001 From: fjrodriguez Date: Thu, 16 Feb 2023 10:38:28 -0600 Subject: [PATCH] Dar de alta sistmeas en ajax popup --- Clientes/views.py | 13 +++ Sistemas/forms.py | 28 ++++- Sistemas/serializers.py | 2 +- Sistemas/urls.py | 11 +- Sistemas/views.py | 106 +++++++++++------ Templates/Clientes/edit_cliente.html | 48 +++++++- .../Sistemas/Xclientes/sistema_create.html | 110 ++++++++++++++++++ .../Xclientes/sistema_create_form.html | 60 ++++++++++ .../Sistemas/manageSystem/uploadZip.html | 91 +++++++++++---- 9 files changed, 401 insertions(+), 68 deletions(-) create mode 100644 Templates/Sistemas/Xclientes/sistema_create.html create mode 100644 Templates/Sistemas/Xclientes/sistema_create_form.html diff --git a/Clientes/views.py b/Clientes/views.py index 389820d..e890937 100644 --- a/Clientes/views.py +++ b/Clientes/views.py @@ -480,3 +480,16 @@ class ClientesCreateView(UserPassesTestMixin,LoginRequiredMixin,CreateView): def test_func(self): #self.request.user.groups.all() return self.request.user.groups.filter(name= 'admin_soft') + + 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 \ No newline at end of file diff --git a/Sistemas/forms.py b/Sistemas/forms.py index 2a2f4b2..11b684b 100644 --- a/Sistemas/forms.py +++ b/Sistemas/forms.py @@ -1,6 +1,30 @@ from django import forms -from .models import Sistema +from .models import Sistema,sistemas_por_cliente class SistemaForm(forms.ModelForm): class Meta: model = Sistema - fields = ['nombre_sistema','version'] \ No newline at end of file + fields = ['nombre_sistema','version'] + + +class sistemas_por_clienteForm(forms.ModelForm): + nombre_sistema = forms.CharField(max_length=100) + version = forms.CharField(max_length=25) + + class Meta: + model = sistemas_por_cliente + fields = ['cliente', 'num_licencias'] + + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.fields['cliente'].empty_label = None + + def save(self, commit=True): + sistema = Sistema.objects.create( + nombre_sistema=self.cleaned_data['nombre_sistema'], + version=self.cleaned_data['version'], + ) + sistema_por_cliente = super().save(commit=False) + sistema_por_cliente.id_sistema = sistema + if commit: + sistema_por_cliente.save() + return sistema_por_cliente \ No newline at end of file diff --git a/Sistemas/serializers.py b/Sistemas/serializers.py index 9558c4d..59ec2aa 100644 --- a/Sistemas/serializers.py +++ b/Sistemas/serializers.py @@ -43,7 +43,7 @@ class DeviceSerializer(serializers.ModelSerializer): try: sistemaxCli = sistemas_por_cliente.objects.get(id_sistema=sistema,cliente=client) except sistemas_por_cliente.DoesNotExist: - raise serializers.ValidationError('No existe licencia para este sistmea y/o cliente') + raise serializers.ValidationError('No existe licencia para este sistema y/o cliente') if sistemaxCli.num_licencias <= Device.objects.filter(sistema=sistemaxCli.id_sistema).count(): raise serializers.ValidationError(f"No hay licencias disponibles para este sistema:{sistema} y cliente:{client}") return data \ No newline at end of file diff --git a/Sistemas/urls.py b/Sistemas/urls.py index 402ae96..bff8bb8 100644 --- a/Sistemas/urls.py +++ b/Sistemas/urls.py @@ -6,8 +6,7 @@ from .views import ( SistemasXCliente_ListView, SistemasXCliente_DetailView, UsersConnectedList, - - + SistemasxCliente_CreateView, #DRF APIViews RegisterDeviceView, @@ -15,14 +14,18 @@ from .views import ( LogoutView, CheckVersionView, UploadZipVersionView, + Sistema_CreateView, #function download_version_FromServer, - uploadZipViewHTML + uploadZipViewHTML, + ) urlpatterns = [ path('',SistemasXCliente_ListView.as_view(),name='lista_sistmas'), - path('detail//',SistemasXCliente_DetailView.as_view(),name='detail_sistemas'), + path('detail//',SistemasXCliente_DetailView.as_view(),name='detail_sistemas'), + path('create_sistemas_form/',Sistema_CreateView.as_view(), name='create_sistemas_form'), + path('crearSistema/',SistemasxCliente_CreateView.as_view(), name='create_sistemas'), path('registerPC/',RegisterDeviceView.as_view(),name='register_PC'), path('authenticatePC/',AuthenticateDeviceView.as_view(), name="authenticateDevice"), path('logout/', LogoutView.as_view(), name='logout_sistemas'), diff --git a/Sistemas/views.py b/Sistemas/views.py index 219f4e5..a70877a 100644 --- a/Sistemas/views.py +++ b/Sistemas/views.py @@ -1,19 +1,28 @@ from django.shortcuts import render,redirect +from django.http import JsonResponse +from django.urls import reverse_lazy from django.contrib.auth import logout from django.views.generic.list import ListView from django.views.generic.detail import DetailView +from django.views.generic.edit import CreateView from rest_framework.authentication import TokenAuthentication +from rest_framework.decorators import authentication_classes,api_view,permission_classes +from rest_framework.exceptions import AuthenticationFailed +from rest_framework.permissions import IsAuthenticated + from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.permissions import IsAuthenticated from rest_framework import status, permissions from django.contrib.auth.models import User + from django.contrib import messages from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin from .models import sistemas_por_cliente, DeviceHistory,Device from .serializers import DeviceSerializer from .permissions import HasAuthorizationHeader from .models import Sistema, BitacoraErrores +from .forms import SistemaForm,sistemas_por_clienteForm from django.utils import timezone import re @@ -28,10 +37,9 @@ import os import mimetypes import traceback -from django.core.files.storage import default_storage from django.core.files.base import ContentFile from .customStorage import CustomStorage -from .forms import SistemaForm + from django.contrib.auth.decorators import login_required @login_required @@ -54,20 +62,25 @@ def uploadZipViewHTML(request): class UploadZipVersionView(APIView): """API CLASS for upload the CFDI Version into the server""" + authentication_classes = (TokenAuthentication,) #this is by default in settings.py permissions_classes=[IsAuthenticated,] - #authentication_classes = (TokenAuthentication,) #this is by default in settings.py - def post(self,request,format=None): try: zip_file=request.FILES['zip_file'] + if zip_file: + fileN, file_ext = os.path.splitext(zip_file.name) + if file_ext !=".zip": + messages.error(self.request, f'El archivo {fileN} no es .zip') + return redirect('uploadZipViewHTML') version = request.POST.get('version') sistema = request.POST.get('sistema') - #print(request.POST) + print('version',version, ' sistema',sistema) except KeyError: return Response({'error':'Zip file is required'},status=status.HTTP_400_BAD_REQUEST) try: versionSistema = Sistema.objects.get(id=sistema) versionSistema.version=version + print('versionSistema: ',versionSistema.version) versionSistema.save() BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -75,13 +88,19 @@ class UploadZipVersionView(APIView): custom_storage = CustomStorage(location=download_system_dir) #print('path exist? ',os.path.exists(download_system_dir)) fileName = custom_storage.save(zip_file.name, ContentFile(zip_file.read())) - + messages.success(request, 'The files has been upload successfully') except Exception as ex: BitacoraErrores.objects.create(level=2, message=str(ex), traceback=traceback.format_exc(), view='Sistemas.UploadZipVersionView') + messages.error(request, f'was an error trying upload the zip file: {ex}') return Response({'error':str(ex)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) return Response({'message':'File uploaded successfully'}, status=status.HTTP_201_CREATED) +#need to add it to C# header request or webclient in CFDI and Actualizador +@api_view(['GET']) +@authentication_classes([TokenAuthentication]) +@permission_classes([IsAuthenticated]) def download_version_FromServer(request): + """""" try: BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) print('BASE_DIR',BASE_DIR) @@ -89,38 +108,20 @@ def download_version_FromServer(request): filepath = f'{BASE_DIR }/downloadSystems/{filename}' #path = open(filepath, 'r') with open(filepath, 'rb') as path: - mime_type, _ = mimetypes.guess_type(filepath) + mime_type, _ = mimetypes.guess_type(filepath) response = HttpResponse(path.read(),content_type=mime_type) - response['Content-Disposition']= f'attachment; filename={filename}' + response['Content-Disposition']= f'attachment; filename={filename}' return response except Exception as ex: - BitacoraErrores.objects.create(level=2, message=str(ex), traceback=traceback.format_exc(), view='Sistemas.download_version_FromServer') return HttpResponse(status=204) -def get_logged_in_users(): - sessions = Session.objects.filter(expire_date__gte=timezone.now()) - - # Get all non-expired tokens - #tokens = Token.objects.filter(created__gte=timezone.now() - timedelta(hours=1)) - tokens = Token.objects.all() - - # Get a list of logged-in user ids - uid_list = [token.user_id for token in tokens] - - # Get the logged-in users - users = User.objects.filter(id__in=uid_list) - for user,session in zip(users,sessions): - user.session_data = session.get_decoded() - user.session_expire = session.expire_date - return users - class UsersConnectedList(UserPassesTestMixin,LoginRequiredMixin,ListView): model = User template_name= 'Sistemas/Usuarios/lista.html' def get_queryset(self): - return get_logged_in_users() + return self.get_logged_in_users() def test_func(self): res = self.request.user.groups.filter(name= 'admin_soft') @@ -128,6 +129,24 @@ class UsersConnectedList(UserPassesTestMixin,LoginRequiredMixin,ListView): messages.error(self.request, f'Lo sentimos. La página que buscas no está disponible, no cuentas con los permisos.') return res + def get_logged_in_users(self): + """""" + sessions = Session.objects.filter(expire_date__gte=timezone.now()) + + # Get all non-expired tokens + #tokens = Token.objects.filter(created__gte=timezone.now() - timedelta(hours=1)) + tokens = Token.objects.all() + + # Get a list of logged-in user ids + uid_list = [token.user_id for token in tokens] + + # Get the logged-in users + users = User.objects.filter(id__in=uid_list) + for user,session in zip(users,sessions): + user.session_data = session.get_decoded() + user.session_expire = session.expire_date + return users + class SistemasXCliente_ListView(UserPassesTestMixin,LoginRequiredMixin, ListView): model = sistemas_por_cliente paginate_by = 5 @@ -148,7 +167,25 @@ class SistemasXCliente_DetailView(UserPassesTestMixin,LoginRequiredMixin, Detail return res +class SistemasxCliente_CreateView(CreateView): + model = sistemas_por_cliente + fields = ['id_sistema', 'cliente', 'num_licencias'] + template_name = 'Sistemas/Xclientes/sistema_create.html' + success_url = reverse_lazy('lista_sistmas') +class Sistema_CreateView(CreateView): + model = Sistema + fields = ['nombre_sistema', 'version', 'id'] + template_name = 'Sistemas/Xclientes/sistema_create_form.html' + success_url = '/sistemas/' + def form_valid(self, form): + response = super().form_valid(form) + data = { + 'id': self.object.id, + 'nombre_sistema': self.object.nombre_sistema, + 'version': self.object.version, + } + return JsonResponse(data) ''' ========================= API Views @@ -217,7 +254,7 @@ class CheckVersionView(APIView): version = request.data.get('version') client_version = [int(x) for x in version.split(".")] - #print('client_version: ',client_version) + try: ver = Sistema.objects.get(nombre_sistema="CFDI") server_version = [int(x) for x in ver.version.split(".")] @@ -225,18 +262,17 @@ class CheckVersionView(APIView): BitacoraErrores.objects.create(level=2, message=str(ex), traceback=traceback.format_exc(), view='Sistemas.CheckVersionView') return Response({'Error':f'{ex}','isError':True}) - + print('client_version: ',client_version) print('server_version', server_version) - result=False - #for i in range(len(client_version)): + result=False for cont, ele in enumerate(client_version): - if client_version[cont] < server_version[cont]: - print('server verion is grater') + if client_version[cont] != server_version[cont]: + print('client version does not match server version') result = True break else: - result= False - print('equal') + result = False + print('client version matches server version') return Response({'success':True, 'actualizar':result}) except Exception as ex: BitacoraErrores.objects.create(level=2, message=str(ex), traceback=traceback.format_exc(), view='Sistemas.CheckVersionView') diff --git a/Templates/Clientes/edit_cliente.html b/Templates/Clientes/edit_cliente.html index fedbf3d..c9087a9 100644 --- a/Templates/Clientes/edit_cliente.html +++ b/Templates/Clientes/edit_cliente.html @@ -6,7 +6,7 @@ {% block content %} -
+ {% csrf_token %}
@@ -34,7 +34,51 @@ {% block scripts %} +{% endblock scripts %} \ No newline at end of file diff --git a/Templates/Sistemas/Xclientes/sistema_create_form.html b/Templates/Sistemas/Xclientes/sistema_create_form.html new file mode 100644 index 0000000..5f5645a --- /dev/null +++ b/Templates/Sistemas/Xclientes/sistema_create_form.html @@ -0,0 +1,60 @@ + + + +{% block content %} +

Create a new Sistema

+ + {% csrf_token %} + {{ form.as_p }} + + +{% endblock %} + +{% block scripts %} + + + +{% endblock scripts %} diff --git a/Templates/Sistemas/manageSystem/uploadZip.html b/Templates/Sistemas/manageSystem/uploadZip.html index f854018..5aaa5c7 100644 --- a/Templates/Sistemas/manageSystem/uploadZip.html +++ b/Templates/Sistemas/manageSystem/uploadZip.html @@ -6,38 +6,58 @@ {% block content %} -
- -
- -

- -

- - - - - - - - -

- - + +
+ +
+
+
+ + +
+ +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+
+
+ + +
+
{% endblock content %} {% block scripts %}