From 3331a4df7f1213f69ff7590772d8a44013d25c39 Mon Sep 17 00:00:00 2001 From: Francisco Sandoval Date: Sat, 6 Jan 2024 12:25:12 -0300 Subject: [PATCH] avance manejo de roles --- project/api/models.py | 34 +++++++++++----------- project/api/serializers.py | 4 +++ project/api/urls.py | 1 - project/api/views/aplicacion.py | 12 +++++++- project/api/views/proto.py | 46 ------------------------------ project/api/views/rolaplicacion.py | 2 -- project/api/views/usuario.py | 32 ++++++++++++++++----- 7 files changed, 58 insertions(+), 73 deletions(-) delete mode 100644 project/api/views/proto.py diff --git a/project/api/models.py b/project/api/models.py index baa7c15..dcbbe10 100755 --- a/project/api/models.py +++ b/project/api/models.py @@ -11,11 +11,12 @@ from .validaciones import rut_valido class Aplicacion(models.Model): id_aplicacion = models.IntegerField(primary_key=True) - nombre_app = models.CharField(max_length=100, blank=True, null=True) + nombre_app = models.CharField(max_length=100, blank=False, null=False) + path_app = models.CharField(max_length=200, blank=False, null=False) vigente = models.BooleanField(blank=True, null=True) class Meta: - managed = False + managed = True db_table = 'aplicacion' @@ -293,13 +294,13 @@ class Rol(models.Model): class RolAplicacion(models.Model): - id_aplicacion = models.ForeignKey(Aplicacion, models.DO_NOTHING, db_column='id_aplicacion') - id_rol = models.ForeignKey(Rol, models.DO_NOTHING, db_column='id_rol') - solo_visualizar = models.BooleanField(blank=True, null=True) id_rol_app = models.AutoField(primary_key=True) + id_aplicacion = models.ForeignKey(Aplicacion, models.DO_NOTHING, db_column='id_aplicacion', blank=False, null=False) + id_rol = models.ForeignKey(Rol, models.DO_NOTHING, db_column='id_rol', blank=False, null=False) + solo_visualizar = models.BooleanField(blank=True, null=True) class Meta: - managed = False + managed = True db_table = 'rol_aplicacion' unique_together = (('id_aplicacion', 'id_rol'),) @@ -367,6 +368,7 @@ class Usuario(models.Model): rut = models.ForeignKey(Persona, models.DO_NOTHING, db_column='rut', blank=True, null=True) vigente = models.BooleanField(blank=True, null=True) superuser = models.BooleanField(blank=True, null=True) + id_rol = models.ForeignKey(Rol, models.DO_NOTHING, db_column='id_rol', blank=False, null=False) class Meta: managed = False @@ -385,16 +387,6 @@ class UsuarioClave(models.Model): db_table = 'usuario_clave' -class UsuarioRol(models.Model): - login = models.ForeignKey(Usuario, models.DO_NOTHING, db_column='login', blank=True, null=True) - id_rol = models.ForeignKey(Rol, models.DO_NOTHING, db_column='id_rol', blank=True, null=True) - vigente = models.BooleanField(blank=True, null=True) - - class Meta: - managed = False - db_table = 'usuario_rol' - - class Vehiculo(models.Model): ppu = models.CharField(primary_key=True, max_length=10) id_tipo_vehiculo = models.ForeignKey(TipoVehiculo, models.DO_NOTHING, db_column='id_tipo_vehiculo', blank=True, null=True) @@ -414,3 +406,13 @@ class VehiculoLinea(models.Model): managed = False db_table = 'vehiculo_linea' unique_together = (('patente', 'id_linea'),) + +class RolLinea(models.Model): + id_rol_linea = models.AutoField(primary_key=True) + id_rol = models.ForeignKey(Rol, models.DO_NOTHING, db_column='id_rol') + id_linea = models.ForeignKey(Linea, models.DO_NOTHING, db_column='id_linea') + + class Meta: + managed = True + db_table = 'rol_linea' + unique_together = (('id_rol', 'id_linea'),) diff --git a/project/api/serializers.py b/project/api/serializers.py index bc02731..e913924 100755 --- a/project/api/serializers.py +++ b/project/api/serializers.py @@ -94,6 +94,7 @@ class LineaParaderoSerializer(serializers.ModelSerializer): class UsuarioSerializer(serializers.ModelSerializer): # muestro informacion de persona en un objeto aparte persona = serializers.SerializerMethodField() + rol = serializers.SerializerMethodField() class Meta: model = models.Usuario @@ -102,6 +103,9 @@ class UsuarioSerializer(serializers.ModelSerializer): def get_persona(self, row): return model_to_dict(row.rut) + + def get_rol(self, row): + return model_to_dict(row.id_rol) def to_representation(self, instance): representation = super().to_representation(instance) diff --git a/project/api/urls.py b/project/api/urls.py index 9e2897a..51709f9 100755 --- a/project/api/urls.py +++ b/project/api/urls.py @@ -34,5 +34,4 @@ urlpatterns = [ path('mapas/paraderos/', mapa.paraderos, name='mapa-paraderos'), path('mapas/rutas/', mapa.rutas, name='mapa-rutas'), path('paraderos/info-public//', paradero.info_public, name='paradero-infopublic'), - # path('proto/status/', proto.status, name='proto_status'), ] diff --git a/project/api/views/aplicacion.py b/project/api/views/aplicacion.py index f07bd9d..3bca5e5 100755 --- a/project/api/views/aplicacion.py +++ b/project/api/views/aplicacion.py @@ -1,7 +1,17 @@ from rest_framework import viewsets from .. import models, serializers +from django.db import models as dj_models class AplicacionViewSet(viewsets.ModelViewSet): queryset = models.Aplicacion.objects.all() serializer_class = serializers.AplicacionSerializer - ordering_fields = '__all__' \ No newline at end of file + ordering_fields = '__all__' + + def create(self, request, *args, **kwargs): + # se indica que si no se indico el id, entonces sea el maximo + 1 + if not request.data.get('id_aplicacion', None): + max_id = models.Aplicacion.objects.aggregate(dj_models.Max('id_aplicacion'))['id_aplicacion__max'] + new_id = max_id + 1 if max_id is not None else 1 + request.data['id_aplicacion'] = new_id + + return super().create(request, *args, **kwargs) \ No newline at end of file diff --git a/project/api/views/proto.py b/project/api/views/proto.py deleted file mode 100644 index c8985b9..0000000 --- a/project/api/views/proto.py +++ /dev/null @@ -1,46 +0,0 @@ - -from django.views.decorators.csrf import csrf_exempt -from rest_framework.decorators import action, api_view -from api.utils import gtfs_realtime_pb2 -from project.settings import BASE_DIR -from django.http import JsonResponse -import logging - -def status(request): - nombre_archivo_proto = f'{BASE_DIR}/api/utils/demo.proto' - with open(nombre_archivo_proto, 'rb') as proto_file: - feed = gtfs_realtime_pb2.FeedMessage() - feed.ParseFromString(proto_file.read()) - - data = {} #get_object(feed) - # logging.error(dir(feed)) - # logging.error(feed.header) - # logging.error(dir(feed.entity)) - logging.error(feed.entity[0]) - # logging.error(dir(feed.entity[0].trip_update)) - - return JsonResponse(data, safe=False) - - -def get_object(obj1, obj2 = {}, level = 1): - attributes = dir(obj1) - for attr in attributes: - if attr[0:1] != '_': - try: - for elem in obj1[attr]: - logging.error(elem) - except: - logging.error(attr) - pass - return obj2 - - -def is_subscriptable(obj): - return hasattr(obj, '__getitem__') - -def is_iterable(obj): - try: - iter(obj) - return True - except TypeError: - return False diff --git a/project/api/views/rolaplicacion.py b/project/api/views/rolaplicacion.py index be4225e..3f9adb4 100755 --- a/project/api/views/rolaplicacion.py +++ b/project/api/views/rolaplicacion.py @@ -4,8 +4,6 @@ import logging class RolAplicacionViewSet(viewsets.ModelViewSet): serializer_class = serializers.RolAplicacionSerializer - - def get_queryset(self): id_rol = self.request.query_params.get('id_rol') # Obtener el valor del parĂ¡metro id_rol desde la solicitud diff --git a/project/api/views/usuario.py b/project/api/views/usuario.py index 84b5953..1f75894 100755 --- a/project/api/views/usuario.py +++ b/project/api/views/usuario.py @@ -1,9 +1,9 @@ from django.db import transaction -from django.http import HttpResponse - +from django.http import HttpResponse, JsonResponse from rest_framework import viewsets from rest_framework.response import Response +from rest_framework.decorators import action from .. import models, schemas, serializers import json @@ -24,8 +24,6 @@ class UsuarioViewSet(viewsets.ModelViewSet): with transaction.atomic(): input = json.loads(request.body) - # validaciones se realiza a nivel del model - persona = models.Persona.objects.filter(rut = input['rut']).first() id_tipo_tratamiento = input.get('id_tipo_tratamiento',None) if not id_tipo_tratamiento: @@ -106,14 +104,18 @@ class UsuarioViewSet(viewsets.ModelViewSet): # validaciones se realiza a nivel del model persona = models.Persona.objects.filter(rut = pk).first() + rol = models.Rol.objects.filter(id_rol = input.get('id_rol')).first() usuario = models.Usuario.objects.filter(rut = pk).first() usuario.vigente = input.get('vigente', False) + usuario.superuser = input.get('superuser', False) + usuario.id_rol = rol usuario.save() - logging.error(f'clave = {input["clave"]}') - if input['clave']: + if 'clave' in input: logging.error('Modificar clave de usuario') + logging.error(f'clave = {input["clave"]}') + clave = models.UsuarioClave.objects.filter(login = usuario.login).first() if clave: logging.error('Clave Usuario ya existe') @@ -147,5 +149,21 @@ class UsuarioViewSet(viewsets.ModelViewSet): except Exception as e: transaction.rollback() - print(e) + logging.error(e) return HttpResponse(str(e), status = 500) + + @action(detail=False, methods=['post']) + def permiso(self, request): + input = json.loads(request.body) + + logging.error(request.jwt_info) + usuario = models.Usuario.objects.filter(login=input['login']) + + + return JsonResponse({ + "path": input['path'], + "permisos": { + "": 1, + "MensajeParadero": "No considerar, uso futuro" + } + }) \ No newline at end of file