Merge branch 'develop/Ronald' of gitlab.com:m3f_usm/admin_transporte/backend into merge/francisco

merge/francisco
Francisco Sandoval 2024-02-25 14:36:20 -03:00
commit d5bfedd2a1
6 changed files with 257 additions and 23 deletions

View File

@ -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')
@ -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'

View File

@ -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__'

View File

@ -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)),

View File

@ -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 })

View File

@ -49,7 +49,7 @@ class DispositivoViewSet(viewsets.ModelViewSet):
"errorString": "Dispositivo no identificado"
}
})
@action(detail=False, methods=['post'])
def getInfoDevice(self, request, pk=None):
@ -108,7 +108,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])
save_log_dispositivo(id_dispositivo=getInfoDevice['idDispositivo'], accion_url='getInfoDevice')
@ -119,4 +119,4 @@ class DispositivoViewSet(viewsets.ModelViewSet):
"NroParadero": record.nro_paradero,
"NombreParadero": record.nombre_paradero
}
})
})

View File

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