Actualizaciones API/IMMEX
This commit is contained in:
@@ -437,7 +437,7 @@ class CancelaTimbre(APIView):
|
|||||||
except Exception as ex:
|
except Exception as ex:
|
||||||
msn = f'UUID:{UUID} \nCliente:{rfcc} \n {str(ex)}'
|
msn = f'UUID:{UUID} \nCliente:{rfcc} \n {str(ex)}'
|
||||||
BitacoraErrores.objects.create(level=2, message=msn, traceback=traceback.format_exc(), view='Sistemas.CancelaTimbre')
|
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):
|
def get(self,request,*args, **kwargs):
|
||||||
uuid=request.query_params.get('uuid',None)
|
uuid=request.query_params.get('uuid',None)
|
||||||
|
|||||||
@@ -75,6 +75,7 @@ class ActiveTokenSession(models.Model):
|
|||||||
|
|
||||||
def is_expired(self, expiration_minutes):
|
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()
|
return expiration_time < timezone.now()
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from django.utils import timezone
|
|||||||
class TokenCheckSession(BasePermission):
|
class TokenCheckSession(BasePermission):
|
||||||
message = 'NO'
|
message = 'NO'
|
||||||
def has_permission(self,request, view):
|
def has_permission(self,request, view):
|
||||||
print('FROM TokenCheckSession : ')
|
|
||||||
sistema = request.META.get('HTTP_SISTEMA','')
|
sistema = request.META.get('HTTP_SISTEMA','')
|
||||||
mac = request.META.get('HTTP_MAC','')
|
mac = request.META.get('HTTP_MAC','')
|
||||||
RFC = request.META.get('HTTP_RFC','')
|
RFC = request.META.get('HTTP_RFC','')
|
||||||
@@ -15,6 +15,7 @@ class TokenCheckSession(BasePermission):
|
|||||||
permiso= request.META.get('HTTP_PERMISO','')
|
permiso= request.META.get('HTTP_PERMISO','')
|
||||||
|
|
||||||
active_session, created = ActiveTokenSession.objects.get_or_create(token=request.user.auth_token)
|
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()
|
sistema_cliente = Sistemas_por_cliente_A24.objects.filter(id_sistema__nombre_sistema=sistema,cliente__RFC=RFC).first()
|
||||||
if sistema_cliente is None:
|
if sistema_cliente is None:
|
||||||
self.message +=f';El sistema:{sistema}, no se encuentra dado de alta para el RFC:{RFC}'
|
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:
|
if modulo.suspendido:
|
||||||
self.message +=f';El modulo:{modulo} se encuentra suspendido para el RFC:{RFC}'
|
self.message +=f';El modulo:{modulo} se encuentra suspendido para el RFC:{RFC}'
|
||||||
return False
|
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}'
|
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
|
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_sistema = active_session.token.devicea24_set.first().sistema.nombre_sistema == sistema
|
||||||
inner_mac = active_session.token.devicea24_set.first().MAC == mac
|
inner_mac = active_session.token.devicea24_set.first().MAC == mac
|
||||||
|
#se cambia el tiempo en minutos para verificar si ya expiro
|
||||||
expiro = active_session.is_expired(1)
|
#aumentar si se desea dar mas tiempo
|
||||||
|
expiro = active_session.is_expired(50)
|
||||||
|
|
||||||
if not (inner_sistema and inner_mac):
|
if not (inner_sistema and inner_mac):
|
||||||
self.message+=";no se agregó código de máquina y/o sistema correctamente"
|
self.message+=";no se agregó código de máquina y/o sistema correctamente"
|
||||||
if expiro:
|
if expiro:
|
||||||
self.message+=";la session expiro"
|
self.message+=";la session expiro;logeese nuevamente"
|
||||||
|
|
||||||
if active_session.token.devicea24_set.first() is None:
|
if active_session.token.devicea24_set.first() is None:
|
||||||
self.message +=';Device not Found'
|
self.message +=';Device not Found'
|
||||||
return False
|
return False
|
||||||
#print(expiro , inner_sistema , inner_mac)
|
|
||||||
|
|
||||||
if not (inner_sistema and inner_mac):
|
if not (inner_sistema and inner_mac):
|
||||||
self.message+=";no se agregó código de máquina y/o sistema correctamente"
|
self.message+=";no se agregó código de máquina y/o sistema correctamente"
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
#actualizas y salvas si la session expiro
|
||||||
active_session.last_time=timezone.now()
|
active_session.last_time=timezone.now()
|
||||||
active_session.has_expired =True if expiro else False
|
active_session.has_expired =True if expiro else False
|
||||||
active_session.save()
|
active_session.save()
|
||||||
@@ -66,10 +73,23 @@ class ActiveTokenSessionPerm(BasePermission):
|
|||||||
authorization = request.META.get('HTTP_AUTHORIZATION','')
|
authorization = request.META.get('HTTP_AUTHORIZATION','')
|
||||||
sistema = request.META.get('HTTP_SISTEMA','')
|
sistema = request.META.get('HTTP_SISTEMA','')
|
||||||
mac = request.META.get('HTTP_MAC','')
|
mac = request.META.get('HTTP_MAC','')
|
||||||
|
|
||||||
|
#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 :
|
if 'Token' in authorization :
|
||||||
|
|
||||||
active_session, created = ActiveTokenSession.objects.get_or_create(token=request.user.auth_token)
|
active_session, created = ActiveTokenSession.objects.get_or_create(token=request.user.auth_token)
|
||||||
#print(active_session.is_expired(1))
|
|
||||||
|
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
|
#verifica que este el DeviceA24 dado de alta
|
||||||
if active_session.token.devicea24_set.first() is None:
|
if active_session.token.devicea24_set.first() is None:
|
||||||
self.message +=';Device not Found'
|
self.message +=';Device not Found'
|
||||||
@@ -92,8 +112,8 @@ class ActiveTokenSessionPerm(BasePermission):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
#si la session esta expidara la renueva
|
#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:#is_expired(50):
|
||||||
active_session.start_time = timezone.now()
|
active_session.start_time = timezone.now()
|
||||||
active_session.last_time=timezone.now()
|
active_session.last_time=timezone.now()
|
||||||
active_session.has_expired =False
|
active_session.has_expired =False
|
||||||
@@ -108,4 +128,14 @@ class ActiveTokenSessionPerm(BasePermission):
|
|||||||
# active_session.save()
|
# active_session.save()
|
||||||
# return True
|
# return True
|
||||||
# si no encuentra el Header[Authorization] con Token no deja entrar
|
# 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
|
||||||
|
|
||||||
return False
|
return False
|
||||||
@@ -1,16 +1,22 @@
|
|||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
from rest_framework.validators import ValidationError
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from allauth.account.models import EmailAddress
|
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 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):
|
class CustomPermissionSerializer(serializers.ModelSerializer):
|
||||||
activo = serializers.BooleanField(read_only=True)
|
activo = serializers.BooleanField(read_only=True)
|
||||||
|
# user_id = serializers.SerializerMethodField()
|
||||||
class Meta:
|
class Meta:
|
||||||
model = Permission
|
model = Permission
|
||||||
fields = '__all__'
|
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 ModulosSerializer(serializers.ModelSerializer):
|
||||||
class Meta:
|
class Meta:
|
||||||
@@ -18,6 +24,57 @@ class ModulosSerializer(serializers.ModelSerializer):
|
|||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
depth =1
|
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):
|
class Sistema_A24_PKRF(serializers.PrimaryKeyRelatedField):
|
||||||
def to_internal_value(self,data):
|
def to_internal_value(self,data):
|
||||||
try:
|
try:
|
||||||
@@ -54,6 +111,11 @@ class ClientesA24Serailizer(serializers.ModelSerializer):
|
|||||||
class DeviceA24_admin_Serialiazer(serializers.ModelSerializer):
|
class DeviceA24_admin_Serialiazer(serializers.ModelSerializer):
|
||||||
clienteA24 = serializers.SerializerMethodField()
|
clienteA24 = serializers.SerializerMethodField()
|
||||||
sistema = 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:
|
class Meta:
|
||||||
model = DeviceA24
|
model = DeviceA24
|
||||||
@@ -65,6 +127,7 @@ class DeviceA24_admin_Serialiazer(serializers.ModelSerializer):
|
|||||||
return obj.sistema.nombre_sistema if obj.sistema.nombre_sistema else ""
|
return obj.sistema.nombre_sistema if obj.sistema.nombre_sistema else ""
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SerialiazerA24(serializers.ModelSerializer):
|
class SerialiazerA24(serializers.ModelSerializer):
|
||||||
clienteA24 = ClientA24_PKRF(queryset=ClientesA24.objects.all())
|
clienteA24 = ClientA24_PKRF(queryset=ClientesA24.objects.all())
|
||||||
sistema = Sistema_A24_PKRF(queryset=Sistema.objects.all())
|
sistema = Sistema_A24_PKRF(queryset=Sistema.objects.all())
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ from rest_framework import routers
|
|||||||
router = routers.DefaultRouter()
|
router = routers.DefaultRouter()
|
||||||
router.register(r'permisos', views.PermissionListCreateAPIView)
|
router.register(r'permisos', views.PermissionListCreateAPIView)
|
||||||
router.register(r'modulos',views.ModulosListCreateAPIView)
|
router.register(r'modulos',views.ModulosListCreateAPIView)
|
||||||
|
router.register(r'permisosA24',views.Permisos_A24_ModelViewSet)
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', views.Sistemas_xCliente_IMMEX_ListView.as_view(), name='sistemasXcli_IMMEX'),
|
path('', views.Sistemas_xCliente_IMMEX_ListView.as_view(), name='sistemasXcli_IMMEX'),
|
||||||
|
|||||||
185
IMMEX/views.py
185
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.edit import CreateView
|
||||||
from django.views.generic.list import ListView
|
from django.views.generic.list import ListView
|
||||||
from django.contrib import messages
|
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.auth.models import Permission, User
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
@@ -34,14 +34,14 @@ from allauth.account.forms import SignupForm
|
|||||||
|
|
||||||
# Imports de tus modelos y serializadores
|
# Imports de tus modelos y serializadores
|
||||||
from .permissions import ActiveTokenSessionPerm, TokenCheckSession
|
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.models import Sistema, BitacoraErrores
|
||||||
from Sistemas.permissions import ItsAdminToken, HasAuthorizationHeader, CheckPermiso
|
from Sistemas.permissions import ItsAdminToken, HasAuthorizationHeader, CheckPermiso
|
||||||
from .forms import ClienteForm_IMMEX
|
from .forms import ClienteForm_IMMEX
|
||||||
from .serializers import (ClientesA24Serailizer, SerialiazerA24, SignupSerializer,
|
from .serializers import (ClientesA24Serailizer, SerialiazerA24, SignupSerializer,
|
||||||
Sistema_Serializer, Sistema_Por_Cliente_Serializer,
|
Sistema_Serializer, Sistema_Por_Cliente_Serializer,
|
||||||
DeviceA24_admin_Serialiazer, CustomPermissionSerializer,
|
DeviceA24_admin_Serialiazer, CustomPermissionSerializer,
|
||||||
ModulosSerializer
|
ModulosSerializer, Permisos_A24_Serializer
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -109,7 +109,7 @@ class ChecarPermisos(APIView):
|
|||||||
permission_classes = [IsAuthenticated, HasAuthorizationHeader, TokenCheckSession]
|
permission_classes = [IsAuthenticated, HasAuthorizationHeader, TokenCheckSession]
|
||||||
def get(self,request):
|
def get(self,request):
|
||||||
if 'Response-Type' not in request.headers:
|
if 'Response-Type' not in request.headers:
|
||||||
Response({"ACCESO":"OK"})
|
return Response({"ACCESO":"OK"})
|
||||||
else:
|
else:
|
||||||
ct= request.headers['Response-Type']
|
ct= request.headers['Response-Type']
|
||||||
response = Response("ACCESS:OK", content_type=ct)
|
response = Response("ACCESS:OK", content_type=ct)
|
||||||
@@ -158,6 +158,7 @@ class LoginIMMEX(APIView):
|
|||||||
|
|
||||||
|
|
||||||
class RegistroUsuarios(APIView):
|
class RegistroUsuarios(APIView):
|
||||||
|
"""Este API point se usa para los registos de utileriaas"""
|
||||||
authentication_classes = (BasicAuthentication, TokenAuthentication, )
|
authentication_classes = (BasicAuthentication, TokenAuthentication, )
|
||||||
permission_classes=[IsAuthenticated,ItsAdminToken]
|
permission_classes=[IsAuthenticated,ItsAdminToken]
|
||||||
|
|
||||||
@@ -314,7 +315,13 @@ class Sistemas_IMMEX_List_APIView(APIView):
|
|||||||
permission_classes=[IsAuthenticated]
|
permission_classes=[IsAuthenticated]
|
||||||
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
|
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()
|
sistemas = Sistema.objects.all()
|
||||||
|
|
||||||
|
|
||||||
serializer = Sistema_Serializer(sistemas,many=True)
|
serializer = Sistema_Serializer(sistemas,many=True)
|
||||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
@@ -348,7 +355,6 @@ class Sistema_por_cliente_APIView(APIView):
|
|||||||
del item['cliente']
|
del item['cliente']
|
||||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
return Response(serializer.data, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
try:
|
try:
|
||||||
context = {
|
context = {
|
||||||
@@ -370,9 +376,9 @@ class Sistema_por_cliente_APIView(APIView):
|
|||||||
view='IMMEX.Sistema_por_cliente_APIView')
|
view='IMMEX.Sistema_por_cliente_APIView')
|
||||||
return Response({'Error':f'{ex}','isError':True}, status=status.HTTP_200_OK)
|
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):
|
class MyPage(PageNumberPagination):
|
||||||
page_size =1
|
page_size =100
|
||||||
page_size_query_param = 'page_size'
|
page_size_query_param = 'page_size'
|
||||||
max_page_size = 1
|
max_page_size = 1
|
||||||
|
|
||||||
@@ -381,8 +387,6 @@ class ClientesA24List(generics.ListCreateAPIView):
|
|||||||
authentication_classes = (BasicAuthentication, TokenAuthentication, )
|
authentication_classes = (BasicAuthentication, TokenAuthentication, )
|
||||||
permission_classes=[ItsAdminToken]
|
permission_classes=[ItsAdminToken]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
queryset = ClientesA24.objects.all()
|
queryset = ClientesA24.objects.all()
|
||||||
serializer_class = ClientesA24Serailizer
|
serializer_class = ClientesA24Serailizer
|
||||||
pagination_class = MyPage
|
pagination_class = MyPage
|
||||||
@@ -419,29 +423,55 @@ class ClientesA24Detail(APIView):
|
|||||||
|
|
||||||
# Obtener un cliente por ID (GET)
|
# Obtener un cliente por ID (GET)
|
||||||
def get(self, request, pk):
|
def get(self, request, pk):
|
||||||
print(request.headers)
|
try:
|
||||||
cliente = self.get_object(pk)
|
cliente = self.get_object(pk)
|
||||||
serializer = ClientesA24Serailizer(cliente)
|
serializer = ClientesA24Serailizer(cliente)
|
||||||
return Response(serializer.data)
|
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)
|
# Actualizar un cliente por ID (PUT)
|
||||||
def put(self, request, pk):
|
def put(self, request, pk):
|
||||||
|
try:
|
||||||
cliente = self.get_object(pk)
|
cliente = self.get_object(pk)
|
||||||
print(cliente)
|
|
||||||
serializer = ClientesA24Serailizer(cliente, data=request.data)
|
serializer = ClientesA24Serailizer(cliente, data=request.data)
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
serializer.save()
|
serializer.save()
|
||||||
return Response(serializer.data,status=status.HTTP_200_OK)
|
return Response(serializer.data,status=status.HTTP_200_OK)
|
||||||
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|
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)
|
# Eliminar un cliente por ID (DELETE)
|
||||||
def delete(self, request, pk):
|
def delete(self, request, pk):
|
||||||
|
try:
|
||||||
cliente = self.get_object(pk)
|
cliente = self.get_object(pk)
|
||||||
cliente.delete()
|
cliente.delete()
|
||||||
return Response({"pk":pk},status=status.HTTP_200_OK)
|
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
|
#-----ADMIN AREA
|
||||||
class DeviceA24List(generics.ListCreateAPIView):
|
class DeviceA24List(generics.ListAPIView):
|
||||||
#queryset = DeviceA24.objects.all()
|
#queryset = DeviceA24.objects.all()
|
||||||
serializer_class = DeviceA24_admin_Serialiazer
|
serializer_class = DeviceA24_admin_Serialiazer
|
||||||
pagination_class = MyPage
|
pagination_class = MyPage
|
||||||
@@ -449,12 +479,11 @@ class DeviceA24List(generics.ListCreateAPIView):
|
|||||||
authentication_classes = (BasicAuthentication, TokenAuthentication, )
|
authentication_classes = (BasicAuthentication, TokenAuthentication, )
|
||||||
permission_classes=[ ItsAdminToken]
|
permission_classes=[ ItsAdminToken]
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
|
try:
|
||||||
queryset = DeviceA24.objects.all()
|
queryset = DeviceA24.objects.all()
|
||||||
# Filtrar por clienteA24 si se proporciona como parámetro de consulta
|
# Filtrar por clienteA24 si se proporciona como parámetro de consulta
|
||||||
clienteA24 = self.request.query_params.get('clienteA24')
|
clienteA24 = self.request.query_params.get('clienteA24')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if clienteA24:
|
if clienteA24:
|
||||||
queryset = queryset.filter(clienteA24__RFC__icontains=clienteA24)
|
queryset = queryset.filter(clienteA24__RFC__icontains=clienteA24)
|
||||||
|
|
||||||
@@ -465,6 +494,14 @@ class DeviceA24List(generics.ListCreateAPIView):
|
|||||||
# queryset = queryset.order_by(ordering)
|
# queryset = queryset.order_by(ordering)
|
||||||
|
|
||||||
return queryset
|
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)
|
||||||
|
|
||||||
|
|
||||||
class DeviceA24Detail(generics.RetrieveUpdateDestroyAPIView):
|
class DeviceA24Detail(generics.RetrieveUpdateDestroyAPIView):
|
||||||
queryset = DeviceA24.objects.all()
|
queryset = DeviceA24.objects.all()
|
||||||
@@ -474,23 +511,59 @@ class DeviceA24Detail(generics.RetrieveUpdateDestroyAPIView):
|
|||||||
|
|
||||||
# Método para recuperar un registro
|
# Método para recuperar un registro
|
||||||
def retrieve(self, request, *args, **kwargs):
|
def retrieve(self, request, *args, **kwargs):
|
||||||
|
try:
|
||||||
instance = self.get_object()
|
instance = self.get_object()
|
||||||
serializer = self.get_serializer(instance)
|
serializer = self.get_serializer(instance)
|
||||||
return Response(serializer.data)
|
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
|
# Método para actualizar un registro
|
||||||
def update(self, request, *args, **kwargs):
|
def update(self, request, *args, **kwargs):
|
||||||
|
try:
|
||||||
instance = self.get_object()
|
instance = self.get_object()
|
||||||
serializer = self.get_serializer(instance, data=request.data)
|
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.is_valid(raise_exception=True)
|
||||||
serializer.save()
|
serializer.save()
|
||||||
return Response(serializer.data)
|
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
|
# Método para eliminar un registro
|
||||||
def destroy(self, request, *args, **kwargs):
|
def destroy(self, request, *args, **kwargs):
|
||||||
|
#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 = self.get_object()
|
||||||
instance.delete()
|
instance.delete()
|
||||||
return Response(status=204)
|
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)
|
# Método para listar registros (opcional, dependiendo de tus necesidades)
|
||||||
def list(self, request, *args, **kwargs):
|
def list(self, request, *args, **kwargs):
|
||||||
@@ -498,6 +571,7 @@ class DeviceA24Detail(generics.RetrieveUpdateDestroyAPIView):
|
|||||||
serializer = self.get_serializer(queryset, many=True)
|
serializer = self.get_serializer(queryset, many=True)
|
||||||
return Response(serializer.data)
|
return Response(serializer.data)
|
||||||
|
|
||||||
|
|
||||||
class PermissionListCreateAPIView(viewsets.ModelViewSet):
|
class PermissionListCreateAPIView(viewsets.ModelViewSet):
|
||||||
queryset = Permission.objects.all()
|
queryset = Permission.objects.all()
|
||||||
# Asegúrate de tener un serializer adecuado
|
# Asegúrate de tener un serializer adecuado
|
||||||
@@ -506,35 +580,38 @@ class PermissionListCreateAPIView(viewsets.ModelViewSet):
|
|||||||
authentication_classes = (BasicAuthentication, TokenAuthentication, )
|
authentication_classes = (BasicAuthentication, TokenAuthentication, )
|
||||||
permission_classes=[ ItsAdminToken]
|
permission_classes=[ ItsAdminToken]
|
||||||
|
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
app_label = self.request.query_params.get('app_label')
|
app_label = self.request.query_params.get('app_label')
|
||||||
user_id = self.request.query_params.get('user_id')
|
user_id = self.request.query_params.get('user_id')
|
||||||
|
|
||||||
queryset = Permission.objects.all()
|
queryset = Permission.objects.all()
|
||||||
|
print('TODOS',queryset.count())
|
||||||
if app_label:
|
if app_label:
|
||||||
content_types = ContentType.objects.filter(app_label=app_label)
|
content_types = ContentType.objects.filter(app_label=app_label)
|
||||||
queryset = queryset.filter(content_type__in=content_types)
|
queryset = queryset.filter(content_type__in=content_types)
|
||||||
|
print('app',queryset.count())
|
||||||
if user_id:
|
if user_id:
|
||||||
param_user = User.objects.get(id=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()
|
|
||||||
)
|
|
||||||
)
|
|
||||||
|
|
||||||
|
# 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()
|
||||||
|
# )
|
||||||
|
# )
|
||||||
|
user_permissions = param_user.user_permissions.all()
|
||||||
|
queryset = queryset.filter(Q(pk__in=user_permissions))
|
||||||
|
print('user',queryset.count())
|
||||||
return queryset
|
return queryset
|
||||||
|
|
||||||
|
|
||||||
def list(self, request, *args, **kwargs):
|
def list(self, request, *args, **kwargs):
|
||||||
|
"""Obtén la lista de permisos"""
|
||||||
# Obtén la lista de permisos
|
|
||||||
queryset = self.get_queryset()
|
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)
|
serializer = self.get_serializer(queryset, many=True)
|
||||||
|
|
||||||
# Agrega datos personalizados a la respuesta
|
# Agrega datos personalizados a la respuesta
|
||||||
@@ -547,7 +624,9 @@ class PermissionListCreateAPIView(viewsets.ModelViewSet):
|
|||||||
return Response(data, status=status.HTTP_200_OK)
|
return Response(data, status=status.HTTP_200_OK)
|
||||||
|
|
||||||
def create(self, request, *args, **kwargs):
|
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')
|
user_id = request.data.get('user_id')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
@@ -556,7 +635,7 @@ class PermissionListCreateAPIView(viewsets.ModelViewSet):
|
|||||||
|
|
||||||
# Obtén la lista de permisos del JSON de la solicitud
|
# Obtén la lista de permisos del JSON de la solicitud
|
||||||
permissions_data = request.data.get('permissions', [])
|
permissions_data = request.data.get('permissions', [])
|
||||||
|
print('permissions_data',permissions_data)
|
||||||
for perm_data in permissions_data:
|
for perm_data in permissions_data:
|
||||||
# Recupera el ID del permiso de cada objeto en la lista
|
# Recupera el ID del permiso de cada objeto en la lista
|
||||||
permission_id = perm_data.get('id')
|
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)
|
return Response({"error": "El usuario no existe"}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
class ModulosListCreateAPIView(viewsets.ModelViewSet):
|
class ModulosListCreateAPIView(viewsets.ModelViewSet):
|
||||||
|
""""""
|
||||||
queryset = Modulo.objects.all()
|
queryset = Modulo.objects.all()
|
||||||
pagination_class = MyPage
|
pagination_class = MyPage
|
||||||
serializer_class = ModulosSerializer
|
serializer_class = ModulosSerializer
|
||||||
|
|
||||||
|
authentication_classes = (BasicAuthentication, TokenAuthentication, )
|
||||||
|
permission_classes=[ ItsAdminToken]
|
||||||
|
|
||||||
def get_queryset(self):
|
def get_queryset(self):
|
||||||
|
""""""
|
||||||
queryset = Modulo.objects.all()
|
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=
|
||||||
@@ -47,10 +47,18 @@
|
|||||||
<li class="nav-item {% if 'sistemas' in request_path %}active border{% endif %}">
|
<li class="nav-item {% if 'sistemas' in request_path %}active border{% endif %}">
|
||||||
<a class="nav-link" href="/sistemas" >Sistemas CFDI</a>
|
<a class="nav-link" href="/sistemas" >Sistemas CFDI</a>
|
||||||
</li>
|
</li>
|
||||||
<li class="nav-item {% if 'IMMEX' in request_path %}active border{% endif %}">
|
<li class="nav-item {% if 'IMMEX/' in request_path %}active border{% endif %}">
|
||||||
<a class="nav-link" href="{% url 'sistemasXcli_IMMEX' %}" >Sistemas IMMEX</a>
|
<a class="nav-link" href="{% url 'sistemasXcli_IMMEX' %}" >Sistemas IMMEX</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
{% for group in request.user.groups.all %}
|
||||||
|
{% if group.name == 'admin_soft' %}
|
||||||
|
<li class="nav-item {% if 'IMMEX/permisos-clientes' in request_path %}active border{% endif %}">
|
||||||
|
<a class="nav-link" href="{% url 'permisos-clientesModulos' %}" >Modulos-Permisos</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
{% if request.user.is_superuser %}
|
{% if request.user.is_superuser %}
|
||||||
<li class="nav-item">
|
<li class="nav-item">
|
||||||
<a class="nav-link" href="/admin" target="_blank">Admin site</a>
|
<a class="nav-link" href="/admin" target="_blank">Admin site</a>
|
||||||
|
|||||||
Reference in New Issue
Block a user