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): class Dispositivo(models.Model):
id_dispositivo = models.CharField(primary_key=True, max_length=100) 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) vigente = models.BooleanField(blank=True, null=True)
ultima_conexion = models.DateField(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') 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' 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): class GtfsFrequencie(models.Model):
id_trip = models.ForeignKey('GtfsTrips', models.DO_NOTHING, db_column='id_trip', blank=True, null=True) id_trip = models.ForeignKey('GtfsTrips', models.DO_NOTHING, db_column='id_trip', blank=True, null=True)
start_time = models.TimeField(blank=True, null=True) start_time = models.TimeField(blank=True, null=True)
@ -199,6 +188,15 @@ class LineaParadero(models.Model):
db_table = 'linea_paradero' 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): class Operador(models.Model):
id_operador = models.CharField(primary_key=True, max_length=150) 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) 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_lang = models.CharField(max_length=50, blank=True, null=True)
agency_phone = 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) 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: class Meta:
managed = False managed = False
@ -284,13 +283,6 @@ class Region(models.Model):
db_table = 'region' 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): class RolAplicacion(models.Model):
@ -352,6 +344,14 @@ class TipoTransporte(models.Model):
managed = False managed = False
db_table = 'tipo_transporte' 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): class TipoTratamientoPersona(models.Model):
id_tipo_tratamiento = models.IntegerField(primary_key=True) id_tipo_tratamiento = models.IntegerField(primary_key=True)
@ -433,3 +433,31 @@ class GtfsArchivo(models.Model):
managed = False managed = False
db_table = 'gtfs_archivo' db_table = 'gtfs_archivo'
db_table_comment = 'Registro de los archivos GTFS que se cargan en el sistema' 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

@ -149,3 +149,23 @@ class GtfsArchivoSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = models.GtfsArchivo model = models.GtfsArchivo
fields = '__all__' 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 import views
from api.views import usuario, auth, aplicacion, tipo, persona, comuna, region, rol, rolaplicacion 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 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 dispositivo
from api.views import rol_operador from api.views import rol_operador
from api.views import upload from api.views import upload
@ -31,6 +31,7 @@ router.register('gtfs-archivo', gtfs_archivo.GtfsArchivoViewSet)
router.register('roles', rol.RolViewSet) router.register('roles', rol.RolViewSet)
router.register('rolyaplicacion', rolaplicacion.RolAplicacionViewSet, basename='rol_aplicacion') router.register('rolyaplicacion', rolaplicacion.RolAplicacionViewSet, basename='rol_aplicacion')
router.register('roles-operadores', rol_operador.RolOperadorViewSet, basename='rol_operador') router.register('roles-operadores', rol_operador.RolOperadorViewSet, basename='rol_operador')
router.register('tipo-cargo', tipo_cargo.TipoCargoViewSet)
urlpatterns = [ urlpatterns = [
path('', include(router.urls)), 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

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