Actualizaciones API/IMMEX

This commit is contained in:
fjrodriguez
2024-01-12 10:15:04 -06:00
parent 607790896b
commit 729fa47aae
8 changed files with 346 additions and 120 deletions

View File

@@ -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
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=