From 94a8805f0e93113da81a0d6db41ad2337eb80588 Mon Sep 17 00:00:00 2001 From: Francisco Sandoval Date: Mon, 19 Feb 2024 18:27:14 -0300 Subject: [PATCH 1/2] fix model dispositivo --- project/api/models.py | 2 +- project/api/views/dispositivo.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/project/api/models.py b/project/api/models.py index 9437430..78b1db5 100755 --- a/project/api/models.py +++ b/project/api/models.py @@ -42,7 +42,7 @@ class Conductor(models.Model): class Dispositivo(models.Model): id_dispositivo = models.CharField(primary_key=True, max_length=100) - id_paradero = models.ForeignKey('Paradero', models.DO_NOTHING, db_column='id_paradero', blank=True, null=True) + id_paradero = models.ForeignKey('Paradero', models.DO_NOTHING, db_column='id_paradero', blank=False, null=False) vigente = models.BooleanField(blank=True, null=True) ultima_conexion = models.DateField(blank=True, null=True) id_tipo_dispositivo = models.ForeignKey('TipoDispositivo', models.DO_NOTHING, db_column='id_tipo_dispositivo') diff --git a/project/api/views/dispositivo.py b/project/api/views/dispositivo.py index de96b0d..1082742 100755 --- a/project/api/views/dispositivo.py +++ b/project/api/views/dispositivo.py @@ -44,7 +44,7 @@ class DispositivoViewSet(viewsets.ModelViewSet): "errorString": "Dispositivo no identificado" } }) - + @action(detail=False, methods=['post']) def getInfoDevice(self, request, pk=None): @@ -104,7 +104,7 @@ class DispositivoViewSet(viewsets.ModelViewSet): detalle_lineas = [] for pk_linea in lineas_agrupadas: - detalle_lineas.append(lineas_agrupadas[pk_linea]) + detalle_lineas.append(lineas_agrupadas[pk_linea]) return JsonResponse({ @@ -112,4 +112,4 @@ class DispositivoViewSet(viewsets.ModelViewSet): "DetalleLineas": detalle_lineas, "MensajeParadero": "No considerar, uso futuro" } - }) \ No newline at end of file + }) From b8d3e8a5261ffd1737c67d270be0dad38d92b37c Mon Sep 17 00:00:00 2001 From: Ronald Morales Date: Fri, 23 Feb 2024 07:13:42 -0300 Subject: [PATCH 2/2] Crea rol basado en Operador y App Tipo Cargo --- project/api/models.py | 64 +++++++++---- project/api/serializers.py | 20 ++++ project/api/urls.py | 3 +- project/api/views/contrato.py | 165 ++++++++++++++++++++++++++++++++ project/api/views/tipo_cargo.py | 20 ++++ 5 files changed, 253 insertions(+), 19 deletions(-) create mode 100755 project/api/views/contrato.py create mode 100755 project/api/views/tipo_cargo.py diff --git a/project/api/models.py b/project/api/models.py index 78b1db5..9a35e36 100755 --- a/project/api/models.py +++ b/project/api/models.py @@ -52,17 +52,6 @@ class Dispositivo(models.Model): db_table = 'dispositivo' -class Funcionario(models.Model): - rut = models.OneToOneField('Persona', models.DO_NOTHING, db_column='rut', primary_key=True) - id_operador = models.ForeignKey('Operador', models.DO_NOTHING, db_column='id_operador', blank=True, null=True) - desde = models.DateField(blank=True, null=True) - hasta = models.DateField(blank=True, null=True) - - class Meta: - managed = False - db_table = 'funcionario' - - class GtfsFrequencie(models.Model): id_trip = models.ForeignKey('GtfsTrips', models.DO_NOTHING, db_column='id_trip', blank=True, null=True) start_time = models.TimeField(blank=True, null=True) @@ -199,6 +188,15 @@ class LineaParadero(models.Model): db_table = 'linea_paradero' +class Rol(models.Model): + id_rol = models.IntegerField(primary_key=True) + nombre_rol = models.CharField(max_length=100) + + class Meta: + managed = False + db_table = 'rol' + + class Operador(models.Model): id_operador = models.CharField(primary_key=True, max_length=150) id_region = models.ForeignKey('Region', models.DO_NOTHING, db_column='id_region', blank=True, null=True) @@ -209,6 +207,7 @@ class Operador(models.Model): agency_lang = models.CharField(max_length=50, blank=True, null=True) agency_phone = models.CharField(max_length=50, blank=True, null=True) agency_fare_url = models.CharField(max_length=50, blank=True, null=True) + id_rol = models.ForeignKey(Rol, models.DO_NOTHING, db_column='id_rol', blank=False, null=True) class Meta: managed = False @@ -284,13 +283,6 @@ class Region(models.Model): db_table = 'region' -class Rol(models.Model): - id_rol = models.IntegerField(primary_key=True) - nombre_rol = models.CharField(max_length=100) - - class Meta: - managed = False - db_table = 'rol' class RolAplicacion(models.Model): @@ -352,6 +344,14 @@ class TipoTransporte(models.Model): managed = False db_table = 'tipo_transporte' +class TipoCargo(models.Model): + id_cargo = models.IntegerField(primary_key=True) + descripcion = models.CharField(max_length=100, blank=True, null=True) + + class Meta: + managed = False + db_table = 'tipo_cargo' + db_table_comment = 'Registro de los cargos que se pueden asociar a un contrato' class TipoTratamientoPersona(models.Model): id_tipo_tratamiento = models.IntegerField(primary_key=True) @@ -433,3 +433,31 @@ class GtfsArchivo(models.Model): managed = False db_table = 'gtfs_archivo' db_table_comment = 'Registro de los archivos GTFS que se cargan en el sistema' + + +class VistaFuncionario(models.Model): + rut = models.ForeignKey('Persona', models.DO_NOTHING, db_column='rut', blank=True, null=True) + id_operador = models.ForeignKey('Operador', models.DO_NOTHING, db_column='id_operador', blank=True, null=True) + #patente = models.OneToOneField('Vehiculo', models.DO_NOTHING, db_column='patente', primary_key=True) + class Meta: + managed = False + db_table = 'vw_funcionario' + +class Contrato(models.Model): + rut = models.OneToOneField('Persona', models.DO_NOTHING, db_column='rut', primary_key=True) + id_operador = models.ForeignKey('Operador', models.DO_NOTHING, db_column='id_operador', blank=True, null=True) + desde = models.DateField(blank=True, null=True) + hasta = models.DateField(blank=True, null=True) + id_cargo = models.ForeignKey('TipoCargo', models.DO_NOTHING, db_column='id_cargo') + class Meta: + managed = False + db_table = 'contrato' + +class PersonaDatosLaborales(models.Model): + rut = models.OneToOneField('Persona', models.DO_NOTHING, db_column='rut', primary_key=True) + vigencia_clase_licencia = models.DateField(blank=True, null=True) + clase_licencia_conducir = models.CharField(max_length=50, blank=True, null=True) + profesion = models.CharField(max_length=100, blank=True, null=True) + class Meta: + managed = False + db_table = 'persona_datos_laborales' \ No newline at end of file diff --git a/project/api/serializers.py b/project/api/serializers.py index 98c50fa..1b4f301 100755 --- a/project/api/serializers.py +++ b/project/api/serializers.py @@ -148,4 +148,24 @@ class RedTransporteSerializer(serializers.ModelSerializer): class GtfsArchivoSerializer(serializers.ModelSerializer): class Meta: model = models.GtfsArchivo + fields = '__all__' + +class TipoCargoSerializer(serializers.ModelSerializer): + class Meta: + model = models.TipoCargo + fields = '__all__' + +class VistaFuncionarioSerializer(serializers.ModelSerializer): + class Meta: + model = models.VistaFuncionario + fields = '__all__' + +class ContratoSerializer(serializers.ModelSerializer): + class Meta: + model = models.Contrato + fields = '__all__' + +class PersonaDatosLaboralesSerializer(serializers.ModelSerializer): + class Meta: + model = models.PersonaDatosLaborales fields = '__all__' \ No newline at end of file diff --git a/project/api/urls.py b/project/api/urls.py index 39c8d16..7f25e5a 100755 --- a/project/api/urls.py +++ b/project/api/urls.py @@ -3,7 +3,7 @@ from rest_framework import routers # from api import views from api.views import usuario, auth, aplicacion, tipo, persona, comuna, region, rol, rolaplicacion from api.views import mapa, linea, letrero_lur, operador,red_transporte,gtfs_archivo -from api.views import paradero, paradero_imagen, linea_paradero +from api.views import paradero, paradero_imagen, linea_paradero, tipo_cargo from api.views import dispositivo from api.views import rol_operador from api.views import upload @@ -31,6 +31,7 @@ router.register('gtfs-archivo', gtfs_archivo.GtfsArchivoViewSet) router.register('roles', rol.RolViewSet) router.register('rolyaplicacion', rolaplicacion.RolAplicacionViewSet, basename='rol_aplicacion') router.register('roles-operadores', rol_operador.RolOperadorViewSet, basename='rol_operador') +router.register('tipo-cargo', tipo_cargo.TipoCargoViewSet) urlpatterns = [ path('', include(router.urls)), diff --git a/project/api/views/contrato.py b/project/api/views/contrato.py new file mode 100755 index 0000000..577932b --- /dev/null +++ b/project/api/views/contrato.py @@ -0,0 +1,165 @@ + +from django.db import transaction +from django.http import HttpResponse, JsonResponse +from django.contrib.auth.hashers import make_password +from rest_framework import viewsets +from rest_framework.response import Response +from rest_framework.decorators import action + +from .. import models, schemas, serializers +import json +import datetime +import logging + +class ContratoViewSet(viewsets.ModelViewSet): + queryset = models.Contrato.objects.all() + serializer_class = serializers.ContratoSerializer + schema = schemas.ContratoSchema() + + def retrieve(self, request, pk=None): + data = super().retrieve(request, pk) + return data + + def create(self, request): + try: + with transaction.atomic(): + input = json.loads(request.body) + + persona = models.Persona.objects.filter(rut = input['rut']).first() + id_tipo_tratamiento = input.get('id_tipo_tratamiento',None) + if not id_tipo_tratamiento: + id_tipo_tratamiento = None + + if not persona: + persona = models.Persona( + rut = input['rut'], + dv = input['dv'], + nombres = input['nombres'], + apellido_a = input.get('apellido_a',None), + apellido_b = input.get('apellido_b',None), + email = input.get('email',None), + id_tipo_tratamiento = id_tipo_tratamiento + ) + persona.save() + else: + persona.nombres = input['nombres'] + persona.apellido_a = input.get('apellido_a',None) + persona.apellido_b = input.get('apellido_b',None) + persona.email = input.get('email',None) + persona.id_tipo_tratamiento = id_tipo_tratamiento + persona.save() + cargo = models.TipoCargo.objects.filter(id_cargo=input.get('id_cargo',None)).first() + operador=models.Operador.objects.filter(id_operador=input.get('id_operador',None)).first() + if cargo == None: + raise ValueError('Cargo no encontrado') + + Contrato = models.Contrato( + rut = persona, + id_operador = operador, + desde = input['desde'], + hasta = input['hasta'] + ) + Contrato.save() + + if input['clave']: + logging.error('Modificar clave de Contrato') + Contrato.clave = make_password(input['clave']) + Contrato.save() + + return Response({ + 'rut': persona.rut, + 'dv': persona.dv, + 'nombres': persona.nombres, + 'apellido_a': persona.apellido_a, + 'apellido_b': persona.apellido_b, + 'email': persona.email, + 'login': Contrato.login, + 'vigente': Contrato.vigente, + }) + + except ValueError as e: + transaction.rollback() + return HttpResponse(str(e), status = 400) + + except Exception as e: + transaction.rollback() + print(e) + return HttpResponse(str(e), status = 500) + + def update(self, request, *args, **kwargs): + input = json.loads(request.body) + try: + pk = input['rut'] + with transaction.atomic(): + + # 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() + + Contrato = models.Contrato.objects.filter(rut = pk).first() + Contrato.vigente = input.get('vigente', False) + Contrato.superuser = input.get('superuser', False) + Contrato.id_rol = rol + Contrato.save() + + if 'clave' in input: + logging.error('Modificar clave de Contrato') + Contrato.clave = make_password(input['clave']) + Contrato.save() + + return Response({ + 'rut': persona.rut, + 'dv': persona.dv, + 'nombres': persona.nombres, + 'apellido_a': persona.apellido_a, + 'apellido_b': persona.apellido_b, + 'email': persona.email, + 'login': Contrato.login, + 'vigente': Contrato.vigente, + }) + + except ValueError as e: + transaction.rollback() + return HttpResponse(str(e), status = 400) + + except Exception as e: + transaction.rollback() + logging.error(e) + return HttpResponse(str(e), status = 500) + + @action(detail=False, methods=['post']) + def permisos(self, request): + input = {} + if request.body > b'': + input = json.loads(request.body) + + login = request.jwt_info['login'] + Contrato = models.Contrato.objects.filter(login=login).first() + escritura = Contrato.superuser == True + + if 'path' in input: + path = input.get('path') + aplicacion = models.Aplicacion.objects.filter(path_app=path).first() + + if escritura == False: + rol_aplicacion = models.RolAplicacion.objects.filter(id_rol=Contrato.id_rol, id_aplicacion=aplicacion.id_aplicacion).first() + escritura = rol_aplicacion.solo_visualizar == False + + return JsonResponse({ + 'path_app': path, + 'nombre_app': aplicacion.nombre_app, + 'escritura': escritura + }) + else: + registros = models.RolAplicacion.objects.filter(id_rol=Contrato.id_rol) + aplicaciones = [] + for registro in registros: + if registro.id_aplicacion.vigente: + rol_app = models.RolAplicacion.objects.filter(id_rol=registro.id_rol, id_aplicacion=registro.id_aplicacion).first() + + aplicaciones.append({ + 'path_app': registro.id_aplicacion.path_app, + 'nombre_app': registro.id_aplicacion.nombre_app, + }) + + return JsonResponse({ "aplicaciones": aplicaciones }) diff --git a/project/api/views/tipo_cargo.py b/project/api/views/tipo_cargo.py new file mode 100755 index 0000000..c840ee7 --- /dev/null +++ b/project/api/views/tipo_cargo.py @@ -0,0 +1,20 @@ +from rest_framework import viewsets +from rest_framework.response import Response +from rest_framework.decorators import action +from django_filters.rest_framework import DjangoFilterBackend +from rest_framework import status +from .. import models , serializers +from django.db import models as dj_models + +class TipoCargoViewSet(viewsets.ModelViewSet): + queryset = models.TipoCargo.objects.all() + serializer_class = serializers.TipoCargoSerializer + + 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_cargo', None): + max_id = models.TipoCargo.objects.aggregate(dj_models.Max('id_cargo'))['id_cargo__max'] + new_id = max_id + 1 if max_id is not None else 1 + request.data['id_cargo'] = new_id + + return super().create(request, *args, **kwargs) \ No newline at end of file