diff --git a/.gitignore b/.gitignore index 56a04c3..1cb2e0b 100644 --- a/.gitignore +++ b/.gitignore @@ -134,4 +134,8 @@ GitHub.sublime-settings !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json -.history \ No newline at end of file +.history + + +# systems ignore +downloadSystems/ \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e69de29 diff --git a/Clientes/views.py b/Clientes/views.py index f88b836..1c632e9 100644 --- a/Clientes/views.py +++ b/Clientes/views.py @@ -391,7 +391,7 @@ def PACS_Retrive_RFCS(request): #-------------------------------------------- class check_RFC(APIView): - permission_classes = (ItsAdminToken,IsAuthenticated,) + permission_classes = (IsAuthenticated,ItsAdminToken,) def get(self,request): rfc = request.GET.get('RFC', None) try: @@ -411,7 +411,7 @@ class check_RFC(APIView): return Response({'Error':f'check_RFC:{E} RFC:{rfc}','isError':True}) class add_timbre2(APIView): - permission_classes = (IsAuthenticated,) + permission_classes = (IsAuthenticated,ItsAdminToken,) def get(self,request): uuid= request.GET.get('uuid', None) rfcc= request.GET.get('rfcc', None) @@ -438,7 +438,7 @@ class add_timbre2(APIView): return Response({'Error':f'{e}'}) class saldo_funct2(APIView): - permission_classes =(IsAuthenticated,) + permission_classes =(IsAuthenticated,ItsAdminToken,) def get(self, request): timbres = request.GET.get('num',None) try: @@ -452,7 +452,7 @@ class saldo_funct2(APIView): return Response(content) class check_host(APIView): - permission_classes = (IsAuthenticated,) + permission_classes = (IsAuthenticated,ItsAdminToken,) def post(self,request, format=None): data = request.data diff --git a/Sistemas/migrations/0009_sistema_version.py b/Sistemas/migrations/0009_sistema_version.py new file mode 100644 index 0000000..03d57b7 --- /dev/null +++ b/Sistemas/migrations/0009_sistema_version.py @@ -0,0 +1,19 @@ +# Generated by Django 4.1.3 on 2023-02-08 21:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('Sistemas', '0008_device_macaddress'), + ] + + operations = [ + migrations.AddField( + model_name='sistema', + name='version', + field=models.CharField(default='23.13.0.0', max_length=10), + preserve_default=False, + ), + ] diff --git a/Sistemas/migrations/0010_alter_sistema_version.py b/Sistemas/migrations/0010_alter_sistema_version.py new file mode 100644 index 0000000..7164a95 --- /dev/null +++ b/Sistemas/migrations/0010_alter_sistema_version.py @@ -0,0 +1,18 @@ +# Generated by Django 4.1.3 on 2023-02-08 21:45 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('Sistemas', '0009_sistema_version'), + ] + + operations = [ + migrations.AlterField( + model_name='sistema', + name='version', + field=models.CharField(max_length=25), + ), + ] diff --git a/Sistemas/migrations/0011_bitacoraerrores.py b/Sistemas/migrations/0011_bitacoraerrores.py new file mode 100644 index 0000000..0dcf657 --- /dev/null +++ b/Sistemas/migrations/0011_bitacoraerrores.py @@ -0,0 +1,23 @@ +# Generated by Django 4.1.3 on 2023-02-09 15:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('Sistemas', '0010_alter_sistema_version'), + ] + + operations = [ + migrations.CreateModel( + name='BitacoraErrores', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('level', models.PositiveBigIntegerField(choices=[(1, 'Critical'), (2, 'Error'), (3, 'Warning'), (4, 'Info'), (5, 'Debug')])), + ('message', models.TextField()), + ('timestamp', models.DateTimeField(auto_now_add=True)), + ('traceback', models.TextField(blank=True, null=True)), + ], + ), + ] diff --git a/Sistemas/models.py b/Sistemas/models.py index aeba84d..723cc5e 100644 --- a/Sistemas/models.py +++ b/Sistemas/models.py @@ -7,12 +7,30 @@ from django.contrib.auth.models import BaseUserManager import re + +class BitacoraErrores(models.Model): + LEVEL_CHOICES = [ + (1,'Critical'), + (2,'Error'), + (3,'Warning'), + (4,'Info'), + (5,'Debug'), + ] + level = models.PositiveBigIntegerField(choices=LEVEL_CHOICES) + message = models.TextField() + timestamp = models.DateTimeField(auto_now_add=True) + traceback = models.TextField(null=True,blank=True) + def __str__(self): + return f"{self.get_level_display()}: {self.message}" + class Sistema(models.Model): nombre_sistema= models.CharField(max_length=100, blank=False,null=False,unique=True) + version = models.CharField(max_length=25) # class Meta: # abstract=True def __str__(self): - return self.nombre_sistema + return f'{self.nombre_sistema}, Version{self.version}' + class sistemas_por_cliente(models.Model): id_sistema= models.ForeignKey(Sistema, related_name='sistema_spc', on_delete=models.CASCADE) diff --git a/Sistemas/urls.py b/Sistemas/urls.py index 5bb14d5..86f891c 100644 --- a/Sistemas/urls.py +++ b/Sistemas/urls.py @@ -7,10 +7,17 @@ from .views import ( SistemasXCliente_DetailView, UsersConnectedList, + + #DRF APIViews RegisterDeviceView, AuthenticateDeviceView, LogoutView, + CheckVersionView, + + #function + download_version_FromServer, + ) urlpatterns = [ path('',SistemasXCliente_ListView.as_view(),name='lista_sistmas'), @@ -19,4 +26,6 @@ urlpatterns = [ path('authenticatePC/',AuthenticateDeviceView.as_view(), name="authenticateDevice"), path('logout/', LogoutView.as_view(), name='logout_sistemas'), path('usuariosConectados/', UsersConnectedList.as_view(), name='lista_usuarios'), + path('checkVersion/', CheckVersionView.as_view(), name='checkVersion'), + path('download_version_FromServer/',download_version_FromServer, name='downloadVersionFromServer'), ] \ No newline at end of file diff --git a/Sistemas/views.py b/Sistemas/views.py index 1b2fa6d..e999ef9 100644 --- a/Sistemas/views.py +++ b/Sistemas/views.py @@ -1,4 +1,4 @@ -from django.shortcuts import render +from django.shortcuts import render,redirect from django.contrib.auth import logout from django.views.generic.list import ListView from django.views.generic.detail import DetailView @@ -13,6 +13,7 @@ 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 from django.utils import timezone import re @@ -22,6 +23,26 @@ from datetime import timedelta from django.contrib.sessions.models import Session +from django.http.response import HttpResponse +import os +import mimetypes + + +def download_version_FromServer(request): + BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + print('BASE_DIR',BASE_DIR) + filename = 'CFDI.zip' + filepath = f'{BASE_DIR }/downloadSystems/{filename}' + #path = open(filepath, 'r') + with open(filepath, 'rb') as path: + + mime_type, _ = mimetypes.guess_type(filepath) + print(mime_type) + response = HttpResponse(path.read(),content_type=mime_type) + response['Content-Disposition']= f'attachment; filename={filename}' + + return response#redirect('index') + def get_logged_in_users(): sessions = Session.objects.filter(expire_date__gte=timezone.now()) @@ -89,9 +110,9 @@ class RegisterDeviceView(APIView): return Response(serializer.data, status=status.HTTP_200_OK) else: return Response({'Error':f'{serializer.errors}','isError':True}, status=status.HTTP_200_OK) - except Exception as e: + except Exception as ex: return Response( - {'Error':f'{e}','isError':True} + {'Error':f'{ex}','isError':True} , status=status.HTTP_200_OK) @@ -115,9 +136,9 @@ class AuthenticateDeviceView(APIView): return Response( {'Error':f'{device_data.serializer.errors}','isError':True} , status=status.HTTP_200_OK) - except Exception as e: + except Exception as ex: return Response( - {'Error':f'{e}','isError':True} + {'Error':f'{ex}','isError':True} , status=status.HTTP_200_OK) @@ -127,4 +148,37 @@ class LogoutView(APIView): def post(self, request): logout(request) - return Response({'OK':'Dispositivo desautenticado'},status=200) \ No newline at end of file + return Response({'OK':'Dispositivo desautenticado'},status=200) + + +class CheckVersionView(APIView): + authentication_classes = (TokenAuthentication,) + permission_classes = (IsAuthenticated,HasAuthorizationHeader,) + def post(self, request,*args, **kwargs): + try: + 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(".")] + except Exception as e: + + return Response({'success':True, 'actualizar':False}) + + + print('server_version', server_version) + result=False + #for i in range(len(client_version)): + for cont, ele in enumerate(client_version): + if client_version[cont] < server_version[cont]: + print('server verion is grater') + result = True + break + else: + result= False + print('equal') + return Response({'success':True, 'actualizar':result}) + except Exception as ex: + return Response({'Error':f'{ex}','isError':True})