classifier_income.py 4.5 KB
from typing import List

from fastapi import APIRouter, Depends
from sqlalchemy.orm import Session
from sqlalchemy import select

from presupuestov1 import model, schema, schemas, models
from presupuestov1.routers._decorators import not_found


router_rubro = APIRouter(
	prefix='/rubro',
	tags=['rubro'],
)

router_organismo = APIRouter(
	prefix='/organismo',
	tags=['organismo'],
)


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

@router_rubro.get('/clasificador', response_model=List[schemas.classifier.ClasRubros])
@not_found
def fetch_rubro_classifier(db: Session = Depends(model.get_db)):
	return _fetch_classifier('rubro', db)


@router_organismo.get('/clasificador', response_model=List[schemas.classifier.ClasOrganismos])
@not_found
def fetch_organismo_classifier(db: Session = Depends(model.get_db)):
	return _fetch_classifier('organismo', db)


@router_rubro.get('/{rubro_id}', response_model=schemas.rubro.ClasRubrosEstados)
@not_found
def fetch_rubro_estado(
	rubro_id: str,
	db: Session = Depends(model.get_db),
):
	ClasEstado = models.rubro.RubroEstado
	estados = db.query(ClasEstado).filter(
		ClasEstado.rubro == rubro_id,
	).all()

	ClasRubros = models.classifier.ClasRubros
	rubro = db.query(ClasRubros).filter(
		ClasRubros.rubro == rubro_id
	).one()

	setattr(rubro, 'estados', estados)
	return rubro


@router_rubro.get('/{rubro_id}/entidades', response_model=List[schemas.rubro.RubroEntidad])
@not_found
def fetch_rubro_entidad(
	rubro_id: str,
	db: Session = Depends(model.get_db),
	query: schema.QueryParams = Depends(),
):
	gestion = query.gestion or 0
	ClasRubros = models.rubro.RubroEntidad

	return db.execute(
		select(*model.model_columns(ClasRubros)).where(
			ClasRubros.rubro == rubro_id,
			ClasRubros.gestion == gestion
		)
	).mappings().all()


@router_rubro.get('/{rubro_id}/entidades/map', response_model=List[schemas.treemap.TreemapRubroSingle])
@not_found
def fetch_rubro_treemap(
	rubro_id: str,
	db: Session = Depends(model.get_db),
	query: schema.QueryParams = Depends(),
):
	Treemap = models.treemap.TreemapRubro
	return models.treemap.get_clas_entities(
		[
	        Treemap.rubro == rubro_id
		], db, query, Treemap, 'entidad'
	)



@router_rubro.get('/{rubro_id}/entidades/{entidad_id}', response_model=List[schemas.rubro.RubroEntidad])
@not_found
def fetch_rubro_entidad_single(
	rubro_id: str,
	entidad_id: int,
	db: Session = Depends(model.get_db),
	query: schema.QueryParams = Depends(),
):
	ClasRubros = models.rubro.RubroEntidad

	return db.query(ClasRubros).filter(
		ClasRubros.rubro == rubro_id,
		ClasRubros.entidad == entidad_id
	).all()


@router_organismo.get('/{organismo_id}', response_model=schemas.organismo.ClasOrganismosEstados)
@not_found
def fetch_organismo_estado(
	organismo_id: str,
	db: Session = Depends(model.get_db),
):
	ClasEstado = models.organismo.OrganismoEstado
	estados = db.query(ClasEstado).filter(
		ClasEstado.organismo == organismo_id
	).all()

	ClasOrganismos = models.classifier.ClasOrganismos
	organismo = db.query(ClasOrganismos).filter(
		ClasOrganismos.organismo == organismo_id
	).one()

	setattr(organismo, 'estados', estados)
	return organismo


@router_organismo.get('/{organismo_id}/entidades', response_model=List[schemas.organismo.OrganismoEntidad])
@not_found
def fetch_organismo_entidad(
	organismo_id: str,
	db: Session = Depends(model.get_db),
	query: schema.QueryParams = Depends(),
):
	gestion = query.gestion or 0
	ClasOrganismos = models.organismo.OrganismoEntidad

	return db.execute(
		select(*model.model_columns(ClasOrganismos)).where(
			ClasOrganismos.organismo == organismo_id,
			ClasOrganismos.gestion == gestion
		)
	).mappings().all()


@router_organismo.get('/{organismo_id}/entidades/{entidad_id}', response_model=List[schemas.organismo.OrganismoEntidad])
@not_found
def fetch_organismo_entidad_single(
	organismo_id: str,
	entidad_id: int,
	db: Session = Depends(model.get_db),
	query: schema.QueryParams = Depends(),
):
	ClasOrganismos = models.organismo.OrganismoEntidad

	return db.query(ClasOrganismos).filter(
		ClasOrganismos.organismo == organismo_id,
		ClasOrganismos.entidad == entidad_id
	).all()


###############################################################################
# priv
###############################################################################

def _fetch_classifier(clas, db):
	ClasObject = {
		'rubro': models.classifier.ClasRubros,
		'organismo': models.classifier.ClasOrganismos,
	}[clas]
	return db.query(ClasObject).all()