From 729fa47aae471784e08da8313543c94cdf1deb80 Mon Sep 17 00:00:00 2001 From: fjrodriguez Date: Fri, 12 Jan 2024 10:15:04 -0600 Subject: [PATCH] Actualizaciones API/IMMEX --- Clientes/views.py | 2 +- IMMEX/models.py | 3 +- IMMEX/permissions.py | 114 +++++++++++------- IMMEX/serializers.py | 67 ++++++++++- IMMEX/urls.py | 1 + IMMEX/views.py | 267 ++++++++++++++++++++++++++++++----------- IMMEX/viewsPermisos.py | 2 +- Templates/sidebar.html | 10 +- 8 files changed, 346 insertions(+), 120 deletions(-) diff --git a/Clientes/views.py b/Clientes/views.py index a6bba56..fe2c71c 100644 --- a/Clientes/views.py +++ b/Clientes/views.py @@ -437,7 +437,7 @@ class CancelaTimbre(APIView): except Exception as ex: msn = f'UUID:{UUID} \nCliente:{rfcc} \n {str(ex)}' BitacoraErrores.objects.create(level=2, message=msn, traceback=traceback.format_exc(), view='Sistemas.CancelaTimbre') - return Response({'Error':f'{ex}','isError':True}) + return Response({'Error':f'{ex}','isError':True}, status=status.HTTP_200_OK) def get(self,request,*args, **kwargs): uuid=request.query_params.get('uuid',None) diff --git a/IMMEX/models.py b/IMMEX/models.py index 95a2a64..d6fe999 100644 --- a/IMMEX/models.py +++ b/IMMEX/models.py @@ -74,7 +74,8 @@ class ActiveTokenSession(models.Model): has_expired = models.BooleanField(default=False) def is_expired(self, expiration_minutes): - expiration_time = self.start_time + timezone.timedelta(minutes=expiration_minutes) + expiration_time = self.start_time + timezone.timedelta(minutes=expiration_minutes) + return expiration_time < timezone.now() diff --git a/IMMEX/permissions.py b/IMMEX/permissions.py index 887196a..7667be1 100644 --- a/IMMEX/permissions.py +++ b/IMMEX/permissions.py @@ -6,7 +6,7 @@ from django.utils import timezone class TokenCheckSession(BasePermission): message = 'NO' def has_permission(self,request, view): - print('FROM TokenCheckSession : ') + sistema = request.META.get('HTTP_SISTEMA','') mac = request.META.get('HTTP_MAC','') RFC = request.META.get('HTTP_RFC','') @@ -15,6 +15,7 @@ class TokenCheckSession(BasePermission): permiso= request.META.get('HTTP_PERMISO','') active_session, created = ActiveTokenSession.objects.get_or_create(token=request.user.auth_token) + sistema_cliente = Sistemas_por_cliente_A24.objects.filter(id_sistema__nombre_sistema=sistema,cliente__RFC=RFC).first() if sistema_cliente is None: self.message +=f';El sistema:{sistema}, no se encuentra dado de alta para el RFC:{RFC}' @@ -29,30 +30,36 @@ class TokenCheckSession(BasePermission): if modulo.suspendido: self.message +=f';El modulo:{modulo} se encuentra suspendido para el RFC:{RFC}' return False - if modulo.suspensionpermiso_set.filter(permiso__nombre=permiso).first() is None: - self.message += f';El permiso:{permiso} en el modulo:{modulo} no esta dado de alta para el RFC:{RFC}' - return False + if modulo.modulo.suspensionpermiso_set.filter(permiso__nombre=permiso).first() is None : + self.message+=f";El Permiso:{permiso} no se encuentra en el modulo" + return False + #Validacion para revisar los datos del device que envian con otro Token + #en este caso revisa el nombre del sistemma. se pueden agregar mas filtros + if active_session.token.devicea24_set.filter(sistema__nombre_sistema=sistema).first() is None: + self.message+=";El Dispositivo no coicide con los datos enviados" + return False inner_sistema = active_session.token.devicea24_set.first().sistema.nombre_sistema == sistema inner_mac = active_session.token.devicea24_set.first().MAC == mac - - expiro = active_session.is_expired(1) + #se cambia el tiempo en minutos para verificar si ya expiro + #aumentar si se desea dar mas tiempo + expiro = active_session.is_expired(50) if not (inner_sistema and inner_mac): self.message+=";no se agregó código de máquina y/o sistema correctamente" if expiro: - self.message+=";la session expiro" + self.message+=";la session expiro;logeese nuevamente" if active_session.token.devicea24_set.first() is None: self.message +=';Device not Found' return False - #print(expiro , inner_sistema , inner_mac) - + if not (inner_sistema and inner_mac): self.message+=";no se agregó código de máquina y/o sistema correctamente" return False + #actualizas y salvas si la session expiro active_session.last_time=timezone.now() active_session.has_expired =True if expiro else False active_session.save() @@ -60,52 +67,75 @@ class TokenCheckSession(BasePermission): return False if expiro else True -class ActiveTokenSessionPerm(BasePermission): +class ActiveTokenSessionPerm(BasePermission): message = 'NO' def has_permission(self,request, view): authorization = request.META.get('HTTP_AUTHORIZATION','') sistema = request.META.get('HTTP_SISTEMA','') mac = request.META.get('HTTP_MAC','') - if 'Token' in authorization: - - active_session, created = ActiveTokenSession.objects.get_or_create(token=request.user.auth_token) - #print(active_session.is_expired(1)) - #verifica que este el DeviceA24 dado de alta - if active_session.token.devicea24_set.first() is None: - self.message +=';Device not Found' + + #Solo se checa para el methodo GET para aplicaciones clarion para que no envie el body + # + if request.method=='GET': + if not mac: + self.message +=';No se proporciono MAC o codigo maquina en headers' return False + if not sistema: + self.message +=';No se proporciono sistema en headers' + return False + if 'Token' in authorization : + + active_session, created = ActiveTokenSession.objects.get_or_create(token=request.user.auth_token) + + user=active_session.token.user #valida el usuario antes que todo para no crear sessiones innecesarias con superadmins + if user.is_superuser or user.is_staff or user.groups.filter(name='admin').exists(): + return True + #verifica que este el DeviceA24 dado de alta + if active_session.token.devicea24_set.first() is None: + self.message +=';Device not Found' + return False + + #print(active_session.token.devicea24_set.first().sistema.nombre_sistema) + inner_mac = active_session.token.devicea24_set.first().MAC + if mac != inner_mac: + self.message +=f';El Codigo de maquina `{mac}` proporcionado para esta licencia no es igual al registrado para este equipo `{inner_mac}`' + return False + - #print(active_session.token.devicea24_set.first().sistema.nombre_sistema) - inner_mac = active_session.token.devicea24_set.first().MAC - if mac != inner_mac: - self.message +=f';El Codigo de maquina `{mac}` proporcionado para esta licencia no es igual al registrado para este equipo `{inner_mac}`' - return False - - - inner_sistema= active_session.token.devicea24_set.first().sistema.nombre_sistema - if sistema != inner_sistema: - self.message +=f';El Sistema `{sistema}` proporcionado para esta licencia no es igual al registrado para este equipo `{inner_sistema}`' - return False + inner_sistema= active_session.token.devicea24_set.first().sistema.nombre_sistema + if sistema != inner_sistema: + self.message +=f';El Sistema `{sistema}` proporcionado para esta licencia no es igual al registrado para este equipo `{inner_sistema}`' + return False - if created: #si el registro es recien creado la session es valida + if created: #si el registro es recien creado la session es valida + return True + + #si la session esta expidara la renueva + + if active_session.has_expired:#is_expired(50): + active_session.start_time = timezone.now() + active_session.last_time=timezone.now() + active_session.has_expired =False + active_session.save() + return True - - #si la session esta expidara la renueva - print('expirooo',active_session.is_expired(1)) - if active_session.is_expired(1): + # if active_session.has_expired: + # self.message += ';La Session ha expidado' + # return False + # else: + # active_session.last_time=timezone.now() + # active_session.save() + # return True + # si no encuentra el Header[Authorization] con Token no deja entrar + #se espera que se envie el body con user y password + else: + active_session, created = ActiveTokenSession.objects.get_or_create(token=request.user.auth_token) + if active_session.has_expired:#is_expired(50): active_session.start_time = timezone.now() active_session.last_time=timezone.now() active_session.has_expired =False active_session.save() - return True - # if active_session.has_expired: - # self.message += ';La Session ha expidado' - # return False - # else: - # active_session.last_time=timezone.now() - # active_session.save() - # return True - # si no encuentra el Header[Authorization] con Token no deja entrar + return False \ No newline at end of file diff --git a/IMMEX/serializers.py b/IMMEX/serializers.py index 25c469f..d6bccc6 100644 --- a/IMMEX/serializers.py +++ b/IMMEX/serializers.py @@ -1,16 +1,22 @@ from rest_framework import serializers +from rest_framework.validators import ValidationError from django.contrib.auth import get_user_model from allauth.account.models import EmailAddress -from django.contrib.auth.models import Permission +from django.contrib.auth.models import Permission, User from Sistemas.models import Sistema -from .models import ClientesA24, Sistemas_por_cliente_A24, DeviceA24,Modulo +from .models import ClientesA24, Sistemas_por_cliente_A24, DeviceA24,Modulo, Permisos_A24 class CustomPermissionSerializer(serializers.ModelSerializer): activo = serializers.BooleanField(read_only=True) + # user_id = serializers.SerializerMethodField() class Meta: model = Permission fields = '__all__' + def get_user_id(self, obj): + # Obtenemos el ID del usuario asociado al permiso si existe + user = User.objects.filter(user_permissions=obj).first() + return user.id if user else None class ModulosSerializer(serializers.ModelSerializer): class Meta: @@ -18,6 +24,57 @@ class ModulosSerializer(serializers.ModelSerializer): fields = '__all__' depth =1 + def create(self, validated_data): + """Se recive el json completo para poder tomar los permisos """ + try: + permisos_data= self.context.get('request').data.get('permisos', []) + modulo = super(ModulosSerializer,self).create(validated_data) + + for permiso_id in permisos_data: + permiso, created= Permisos_A24.objects.get_or_create(pk=permiso_id,\ + defaults={'nombre': f'{modulo.nombre}_{permiso_id}'}) + modulo.permisos.add(permiso) + return modulo + except Exception as e: + raise ValidationError({'error':str(e)}) + +class Permisos_A24_Serializer(serializers.ModelSerializer): + modulo = serializers.CharField(write_only=True, required=False) + modulos = serializers.SerializerMethodField() + class Meta: + model = Permisos_A24 + fields = ['id','nombre', + 'modulo', + 'modulos'] + + def create(self,validated_data): + """""" + try: + + modulo_nombre = validated_data.pop('modulo',None) + permiso = super(Permisos_A24_Serializer, self).create(validated_data) + if modulo_nombre: + modulo, created = Modulo.objects.get_or_create(nombre=modulo_nombre, \ + defaults={'nombre':modulo_nombre}) + modulo.permisos.add(permiso) + permiso.modulo = modulo.nombre + return permiso + except Exception as e: + raise ValidationError({'error':str(e)}) + + def to_representation(self, instance): + representation = super(Permisos_A24_Serializer, self).to_representation(instance) + + # Agregar el atributo 'modulo' al JSON de respuesta si está presente + if hasattr(instance, 'modulo') and instance.modulo: + representation['modulo'] = instance.modulo + + return representation + + def get_modulos(self, obj): + # Obtener la lista de nombres de los módulos a los que está asignado el permiso + return list(obj.modulo_set.values_list('nombre', flat=True)) + class Sistema_A24_PKRF(serializers.PrimaryKeyRelatedField): def to_internal_value(self,data): try: @@ -54,6 +111,11 @@ class ClientesA24Serailizer(serializers.ModelSerializer): class DeviceA24_admin_Serialiazer(serializers.ModelSerializer): clienteA24 = serializers.SerializerMethodField() sistema = serializers.SerializerMethodField() + deviceName = serializers.CharField(required=True) + deviceOS= serializers.CharField(required=False) + deviceIP = serializers.CharField(required=False) + username = serializers.CharField(required=False) + dataBase = serializers.CharField(required=True) class Meta: model = DeviceA24 @@ -63,6 +125,7 @@ class DeviceA24_admin_Serialiazer(serializers.ModelSerializer): return obj.clienteA24.RFC if obj.clienteA24.RFC else "" def get_sistema(self,obj): return obj.sistema.nombre_sistema if obj.sistema.nombre_sistema else "" + class SerialiazerA24(serializers.ModelSerializer): diff --git a/IMMEX/urls.py b/IMMEX/urls.py index a7153b9..25e4138 100644 --- a/IMMEX/urls.py +++ b/IMMEX/urls.py @@ -6,6 +6,7 @@ from rest_framework import routers router = routers.DefaultRouter() router.register(r'permisos', views.PermissionListCreateAPIView) router.register(r'modulos',views.ModulosListCreateAPIView) +router.register(r'permisosA24',views.Permisos_A24_ModelViewSet) urlpatterns = [ path('', views.Sistemas_xCliente_IMMEX_ListView.as_view(), name='sistemasXcli_IMMEX'), diff --git a/IMMEX/views.py b/IMMEX/views.py index fe8d8c3..476c540 100644 --- a/IMMEX/views.py +++ b/IMMEX/views.py @@ -6,7 +6,7 @@ from django.core.mail import send_mail from django.views.generic.edit import CreateView from django.views.generic.list import ListView from django.contrib import messages -from django.db.models import Case, When, Value, BooleanField +from django.db.models import Case, When, Value, BooleanField,Q from django.contrib.auth.models import Permission, User from django.contrib.contenttypes.models import ContentType @@ -34,14 +34,14 @@ from allauth.account.forms import SignupForm # Imports de tus modelos y serializadores from .permissions import ActiveTokenSessionPerm, TokenCheckSession -from .models import Sistemas_por_cliente_A24, ClientesA24, DeviceA24, ActiveTokenSession, Modulo +from .models import Sistemas_por_cliente_A24, ClientesA24, DeviceA24, ActiveTokenSession, Modulo, Permisos_A24 from Sistemas.models import Sistema, BitacoraErrores from Sistemas.permissions import ItsAdminToken, HasAuthorizationHeader, CheckPermiso from .forms import ClienteForm_IMMEX from .serializers import (ClientesA24Serailizer, SerialiazerA24, SignupSerializer, Sistema_Serializer, Sistema_Por_Cliente_Serializer, DeviceA24_admin_Serialiazer, CustomPermissionSerializer, - ModulosSerializer + ModulosSerializer, Permisos_A24_Serializer ) @@ -109,7 +109,7 @@ class ChecarPermisos(APIView): permission_classes = [IsAuthenticated, HasAuthorizationHeader, TokenCheckSession] def get(self,request): if 'Response-Type' not in request.headers: - Response({"ACCESO":"OK"}) + return Response({"ACCESO":"OK"}) else: ct= request.headers['Response-Type'] response = Response("ACCESS:OK", content_type=ct) @@ -158,6 +158,7 @@ class LoginIMMEX(APIView): class RegistroUsuarios(APIView): + """Este API point se usa para los registos de utileriaas""" authentication_classes = (BasicAuthentication, TokenAuthentication, ) permission_classes=[IsAuthenticated,ItsAdminToken] @@ -314,7 +315,13 @@ class Sistemas_IMMEX_List_APIView(APIView): permission_classes=[IsAuthenticated] def get(self, request): - sistemas = Sistema.objects.all() + nombre_sistema = request.query_params.get('nombre_sistema',None) + if nombre_sistema: + sistemas = Sistema.objects.filter(nombre_sistema=nombre_sistema) + else: + sistemas = Sistema.objects.all() + + serializer = Sistema_Serializer(sistemas,many=True) return Response(serializer.data, status=status.HTTP_200_OK) @@ -347,8 +354,7 @@ class Sistema_por_cliente_APIView(APIView): del item['id_sistema'] del item['cliente'] return Response(serializer.data, status=status.HTTP_200_OK) - - + def post(self, request): try: context = { @@ -370,9 +376,9 @@ class Sistema_por_cliente_APIView(APIView): view='IMMEX.Sistema_por_cliente_APIView') return Response({'Error':f'{ex}','isError':True}, status=status.HTTP_200_OK) -#CRUD Clientes IMMEX +#CRUD Clientes IMMEX (APP de WINDEV 27) class MyPage(PageNumberPagination): - page_size =1 + page_size =100 page_size_query_param = 'page_size' max_page_size = 1 @@ -380,8 +386,6 @@ class MyPage(PageNumberPagination): class ClientesA24List(generics.ListCreateAPIView): authentication_classes = (BasicAuthentication, TokenAuthentication, ) permission_classes=[ItsAdminToken] - - queryset = ClientesA24.objects.all() serializer_class = ClientesA24Serailizer @@ -419,29 +423,55 @@ class ClientesA24Detail(APIView): # Obtener un cliente por ID (GET) def get(self, request, pk): - print(request.headers) - cliente = self.get_object(pk) - serializer = ClientesA24Serailizer(cliente) - return Response(serializer.data) + try: + cliente = self.get_object(pk) + serializer = ClientesA24Serailizer(cliente) + return Response(serializer.data) + except Exception as ex: + error_message ={'Error':str(ex), 'isError':True} + data_json = json.dumps(error_message) + BitacoraErrores.objects.create(level=2, message=ex,\ + traceback=traceback.format_exc(),\ + view='IMMEX.ClientesA24Detail.get') + return Response(data_json,status=status.HTTP_200_OK) + # Actualizar un cliente por ID (PUT) def put(self, request, pk): - cliente = self.get_object(pk) - print(cliente) - serializer = ClientesA24Serailizer(cliente, data=request.data) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data,status=status.HTTP_200_OK) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + try: + cliente = self.get_object(pk) + + serializer = ClientesA24Serailizer(cliente, data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data,status=status.HTTP_200_OK) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + except Exception as ex: + error_message ={'Error':str(ex), 'isError':True} + data_json = json.dumps(error_message) + BitacoraErrores.objects.create(level=2, message=ex,\ + traceback=traceback.format_exc(),\ + view='IMMEX.ClientesA24Detail.put') + return Response(data_json,status=status.HTTP_200_OK) + # Eliminar un cliente por ID (DELETE) def delete(self, request, pk): - cliente = self.get_object(pk) - cliente.delete() - return Response({"pk":pk},status=status.HTTP_200_OK) - + try: + cliente = self.get_object(pk) + cliente.delete() + return Response({"pk":pk},status=status.HTTP_200_OK) + except Exception as ex: + error_message ={'Error':str(ex), 'isError':True} + data_json = json.dumps(error_message) + BitacoraErrores.objects.create(level=2, message=ex,\ + traceback=traceback.format_exc(),\ + view='IMMEX.ClientesA24Detail.delete') + return Response(data_json,status=status.HTTP_200_OK) + + #-----ADMIN AREA -class DeviceA24List(generics.ListCreateAPIView): +class DeviceA24List(generics.ListAPIView): #queryset = DeviceA24.objects.all() serializer_class = DeviceA24_admin_Serialiazer pagination_class = MyPage @@ -449,22 +479,29 @@ class DeviceA24List(generics.ListCreateAPIView): authentication_classes = (BasicAuthentication, TokenAuthentication, ) permission_classes=[ ItsAdminToken] def get_queryset(self): - queryset = DeviceA24.objects.all() - # Filtrar por clienteA24 si se proporciona como parámetro de consulta - clienteA24 = self.request.query_params.get('clienteA24') - + try: + queryset = DeviceA24.objects.all() + # Filtrar por clienteA24 si se proporciona como parámetro de consulta + clienteA24 = self.request.query_params.get('clienteA24') + if clienteA24: + queryset = queryset.filter(clienteA24__RFC__icontains=clienteA24) + + # # Aplicar ordenación si se proporciona como parámetro de consulta + # ordering = self.request.query_params.get('ordering') + + # if ordering: + # queryset = queryset.order_by(ordering) - if clienteA24: - queryset = queryset.filter(clienteA24__RFC__icontains=clienteA24) + return queryset + except Exception as ex: + error_message ={'Error':str(ex), 'isError':True} + data_json = json.dumps(error_message) + BitacoraErrores.objects.create(level=2, message=ex,\ + traceback=traceback.format_exc(),\ + view='IMMEX.DeviceA24List') + return Response(data_json,status=status.HTTP_200_OK) - # # Aplicar ordenación si se proporciona como parámetro de consulta - # ordering = self.request.query_params.get('ordering') - - # if ordering: - # queryset = queryset.order_by(ordering) - - return queryset class DeviceA24Detail(generics.RetrieveUpdateDestroyAPIView): queryset = DeviceA24.objects.all() @@ -474,67 +511,107 @@ class DeviceA24Detail(generics.RetrieveUpdateDestroyAPIView): # Método para recuperar un registro def retrieve(self, request, *args, **kwargs): - instance = self.get_object() - serializer = self.get_serializer(instance) - return Response(serializer.data) + try: + instance = self.get_object() + serializer = self.get_serializer(instance) + return Response(serializer.data) + except Exception as ex: + error_message ={'Error':str(ex), 'isError':True} + data_json = json.dumps(error_message) + BitacoraErrores.objects.create(level=2, message=ex,\ + traceback=traceback.format_exc(),\ + view='IMMEX.DeviceA24Detail.retrieve') + return Response(data_json,status=status.HTTP_200_OK) + + # Método para actualizar un registro def update(self, request, *args, **kwargs): - instance = self.get_object() - serializer = self.get_serializer(instance, data=request.data) - serializer.is_valid(raise_exception=True) - serializer.save() - return Response(serializer.data) + try: + instance = self.get_object() + data=request.data + #si se desea agregar o quitar campos excluded se tiene que cambiar el required=False de su campo serializer + excluded_fields = ['id','clienteA24','sistema','username','timestamp','token'] + for field in excluded_fields: + if field in data: + data.pop(field) + + serializer = self.get_serializer(instance, data=data) + serializer.is_valid(raise_exception=True) + serializer.save() + return Response(serializer.data) + except Exception as ex: + error_message ={'Error':str(ex), 'isError':True} + data_json = json.dumps(error_message) + BitacoraErrores.objects.create(level=2, message=ex,\ + traceback=traceback.format_exc(),\ + view='IMMEX.DeviceA24Detail.update') + return Response(data_json,status=status.HTTP_200_OK) + # Método para eliminar un registro def destroy(self, request, *args, **kwargs): - instance = self.get_object() - instance.delete() - return Response(status=204) + #solo se elimina la instancia de deviceA24. + # #se puede agregar un query parameter para eliminar todo el User (pendiente) + try: + instance = self.get_object() + instance.delete() + return Response(status=204) + except Exception as ex: + error_message ={'Error':str(ex), 'isError':True} + data_json = json.dumps(error_message) + BitacoraErrores.objects.create(level=2, message=ex,\ + traceback=traceback.format_exc(),\ + view='IMMEX.DeviceA24Detail.destroy') + return Response(data_json,status=status.HTTP_200_OK) # Método para listar registros (opcional, dependiendo de tus necesidades) def list(self, request, *args, **kwargs): queryset = self.get_queryset() serializer = self.get_serializer(queryset, many=True) return Response(serializer.data) + class PermissionListCreateAPIView(viewsets.ModelViewSet): queryset = Permission.objects.all() # Asegúrate de tener un serializer adecuado serializer_class = CustomPermissionSerializer - + authentication_classes = (BasicAuthentication, TokenAuthentication, ) permission_classes=[ ItsAdminToken] - def get_queryset(self): app_label = self.request.query_params.get('app_label') user_id = self.request.query_params.get('user_id') - + queryset = Permission.objects.all() - + print('TODOS',queryset.count()) if app_label: content_types = ContentType.objects.filter(app_label=app_label) queryset = queryset.filter(content_type__in=content_types) - + print('app',queryset.count()) if user_id: param_user = User.objects.get(id=user_id) + # Anotamos los permisos con True si el usuario los tiene, False en caso contrario - queryset = queryset.annotate( - activo=Case( - When(user=param_user, then=Value(True)), - default=Value(False), - output_field=BooleanField() - ) - ) - + # queryset = queryset.annotate( + # activo=Case( + # When(user=param_user, then=Value(True)), + # default=Value(False), + # output_field=BooleanField() + # ) + # ) + user_permissions = param_user.user_permissions.all() + queryset = queryset.filter(Q(pk__in=user_permissions)) + print('user',queryset.count()) return queryset - - - def list(self, request, *args, **kwargs): - - # Obtén la lista de permisos + + def list(self, request, *args, **kwargs): + """Obtén la lista de permisos""" queryset = self.get_queryset() + if not self.request.query_params.get('user_id'): + data={"error":"favor de proporcionar el 'user_id' en los query params, en este caso solo para el GET"} + return Response(data,status=status.HTTP_200_OK) serializer = self.get_serializer(queryset, many=True) # Agrega datos personalizados a la respuesta @@ -547,7 +624,9 @@ class PermissionListCreateAPIView(viewsets.ModelViewSet): return Response(data, status=status.HTTP_200_OK) def create(self, request, *args, **kwargs): - # Obtén el ID del usuario del JSON de la solicitud + """ Obtén el ID del usuario del JSON de la solicitud GET + en esste metodo se tiene que agregar el user_id required + """ user_id = request.data.get('user_id') try: @@ -556,7 +635,7 @@ class PermissionListCreateAPIView(viewsets.ModelViewSet): # Obtén la lista de permisos del JSON de la solicitud permissions_data = request.data.get('permissions', []) - + print('permissions_data',permissions_data) for perm_data in permissions_data: # Recupera el ID del permiso de cada objeto en la lista permission_id = perm_data.get('id') @@ -575,10 +654,54 @@ class PermissionListCreateAPIView(viewsets.ModelViewSet): return Response({"error": "El usuario no existe"}, status=status.HTTP_400_BAD_REQUEST) class ModulosListCreateAPIView(viewsets.ModelViewSet): + """""" queryset = Modulo.objects.all() pagination_class = MyPage serializer_class = ModulosSerializer + authentication_classes = (BasicAuthentication, TokenAuthentication, ) + permission_classes=[ ItsAdminToken] + def get_queryset(self): + """""" queryset = Modulo.objects.all() - return queryset \ No newline at end of file + return queryset + + def create(self, request, *args, **kwargs): + """se define el create para poder enviar el request.data + ya que de forma default en la clase viewset no se envia el request.data""" + serializer = self.get_serializer(data=request.data) + serializer.is_valid(raise_exception=True) + self.perform_create(serializer) + headers = self.get_success_headers(serializer.data) + return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers) + +class Permisos_A24_ModelViewSet(viewsets.ModelViewSet): + """""" + queryset = Permisos_A24.objects.all() + pagination_class = MyPage + serializer_class = Permisos_A24_Serializer + + authentication_classes = (BasicAuthentication, TokenAuthentication, ) + permission_classes=[ ItsAdminToken] + + def get_queryset(self): + """""" + permiso = self.request.query_params.get('permiso') + queryset = super(Permisos_A24_ModelViewSet, self).get_queryset() + if permiso: + queryset = queryset.filter(nombre=permiso) + return queryset + + def create(self, request, *args, **kwargs): + """se agrego explicitamente el create para poder manejar el serializador + si es que se necesita enviar el modulo y asginar lo """ + serializer = self.get_serializer(data=request.data.get('permisos', []), many=True) + serializer.is_valid(raise_exception=True) + self.perform_create(serializer) + headers = self.get_success_headers(serializer.data) + return Response(serializer.data,status=status.HTTP_201_CREATED, headers=headers) + + + # def update(self,request,*args,**kwargs): + # pk= \ No newline at end of file diff --git a/IMMEX/viewsPermisos.py b/IMMEX/viewsPermisos.py index 54a435a..e50f1fc 100644 --- a/IMMEX/viewsPermisos.py +++ b/IMMEX/viewsPermisos.py @@ -10,7 +10,7 @@ from .forms import SuspensionModulosPermisosClienteForm, SuspensionPermisoFormSe import time class SuspensionPermisosClienteListView(LoginRequiredMixin,UserPassesTestMixin, ListView): - model= Suspension_Modulos_Permisos_Cliente + model= Suspension_Modulos_Permisos_Cliente template_name='IMMEX/modulos/modulos_clientes.html' def test_func(self): diff --git a/Templates/sidebar.html b/Templates/sidebar.html index 2833abf..4a553cd 100644 --- a/Templates/sidebar.html +++ b/Templates/sidebar.html @@ -47,10 +47,18 @@ - + + {% for group in request.user.groups.all %} + {% if group.name == 'admin_soft' %} + + {% endif %} + {% endfor %} {% if request.user.is_superuser %}