entity.py 4.61 KB
import time

from typing import List, Any, Optional, Union

from fastapi import APIRouter, Depends, Request, HTTPException, Body
from sqlalchemy.orm import Session
from sqlalchemy import and_, or_

from presupuestov1 import model, schema, constant, schemas, models, search


router_entidad = APIRouter(
	prefix='/entidad',
	tags=['entidad'],
)
router_ubigeo = APIRouter(
	prefix='/ubigeo',
	tags=['ubigeo'],
)
router_da = APIRouter(
	prefix='/direccion_administrativa',
	tags=['direccion_administrativa'],
)


###############################################################################
# GET
###############################################################################

# clas

@router_entidad.get('/clasificador', response_model=List[schemas.classifier.ClasInstitucional])
def fetch_classifier(
	db: Session = Depends(model.get_db),
):
	return db.query(models.classifier.ClasInstitucional).all()


@router_ubigeo.get('/clasificador', response_model=List[schemas.classifier.ClasGeografico])
def fetch_classifier(
	db: Session = Depends(model.get_db),
):
	return db.query(models.classifier.ClasGeografico).all()


# base

@router_entidad.get('/{entity_id:str}', response_model=schemas.entity.ClasInstitucionalIngresosGastos)
def fetch_entity(
	entity_id: int,
	db: Session = Depends(model.get_db),
):
	ClasInstitucional = models.classifier.ClasInstitucional
	entidad = db.query(ClasInstitucional).filter(
		ClasInstitucional.entidad == entity_id
	).one()

	gastos_ingresos = get_resumen('entidad', entity_id)
	setattr(entidad, 'gastos_ingresos', gastos_ingresos)

	return entidad


@router_ubigeo.get('/{ubigeo_id:str}', response_model=schemas.entity.ClasGeograficoIngresosGastos)
def fetch_entity(
	ubigeo_id: int,
	db: Session = Depends(model.get_db),
):
	ClasGeografico = models.classifier.ClasGeografico
	ubigeo = db.query(ClasGeografico).filter(
		ClasGeografico.ubigeo == ubigeo_id
	).one()

	gastos_ingresos = get_resumen('municipio_ubigeo', ubigeo_id)
	setattr(ubigeo, 'gastos_ingresos', gastos_ingresos)

	return ubigeo


# objetos

@router_entidad.get('/{entity_id:str}/objetos', response_model=List[schemas.entity.EntidadDistribucion])
def fetch_entity_objetos(
	entity_id: int,
	db: Session = Depends(model.get_db),
	query: schema.QueryParams = Depends(),
):
	return get_distribuciones('entidad', entidad_id, 'objeto', query)


@router_ubigeo.get('/{ubigeo_id:str}/objetos', response_model=List[schemas.entity.EntidadDistribucion])
def fetch_entity_objetos(
	ubigeo_id: int,
	db: Session = Depends(model.get_db),
	query: schema.QueryParams = Depends(),
):
	return get_distribuciones('municipio_ubigeo', ubigeo_id, 'objeto', query)


@router_entidad.get('/{entity_id:str}/finfuns', response_model=List[schemas.entity.EntidadDistribucion])
def fetch_entity_finfuns(
	entity_id: int,
	db: Session = Depends(model.get_db),
	query: schema.QueryParams = Depends(),
):
	return get_distribuciones('entidad', entidad_id, 'finfun', query)


@router_ubigeo.get('/{ubigeo_id:str}/finfuns', response_model=List[schemas.entity.EntidadDistribucion])
def fetch_entity_finfuns(
	ubigeo_id: int,
	db: Session = Depends(model.get_db),
	query: schema.QueryParams = Depends(),
):
	return get_distribuciones('municipio_ubigeo', ubigeo_id, 'finfun', query)


@router_entidad.get('/{entity_id:str}/actecos', response_model=List[schemas.entity.EntidadDistribucion])
def fetch_entity_actecos(
	entity_id: int,
	db: Session = Depends(model.get_db),
	query: schema.QueryParams = Depends(),
):
	return get_distribuciones('entidad', entidad_id, 'acteco', query)


@router_ubigeo.get('/{ubigeo_id:str}/actecos', response_model=List[schemas.entity.EntidadDistribucion])
def fetch_entity_actecos(
	ubigeo_id: int,
	db: Session = Depends(model.get_db),
	query: schema.QueryParams = Depends(),
):
	return get_distribuciones('municipio_ubigeo', ubigeo_id, 'acteco', query)


###############################################################################
# private
###############################################################################

def get_distribuciones(tipo_codigo, entidad_id, dimension, query):
	EntidadDistribuciones = models.entity.EntidadDistribuciones

	filters = []
	if query.gestion is not None:
		filters.append(EntidadDistribuciones.gestion == query.gestion)

	filters.extend(
		EntidadDistribuciones.tipo_codigo == tipo_codigo,
		EntidadDistribuciones.codigo == entity_id,
		EntidadDistribuciones.dimension == dimension,
	)

	return db.query(EntidadDistribuciones).filter(*filters).all()


def get_resumen(tipo_codigo, codigo):
	EntidadResumenes = models.entity.EntidadResumenes
	return db.query(EntidadResumenes).filter(
		EntidadResumenes.tipo_codigo == tipo_codigo,
		EntidadResumenes.codigo == codigo,
	).all()