pr0nstar

IX

# cache_patch.py
import hashlib
from datetime import datetime
from starlette_caches.utils import cache as scache
from aiocache import Cache
REDIS_CONN = open('./docs/postgres').read().strip()
REDIS_CONN = REDIS_CONN.split(':')
# cache = Cache(
# Cache.REDIS,
# endpoint=REDIS_CONN[0], port=REDIS_CONN[1],
# namespace="httpcache"
# )
cache = Cache()
def patched_generate_cache_key(url, method, headers, varying_headers, cache):
assert method in scache.CACHABLE_METHODS
# vary_ctx = hashlib.md5(usedforsecurity=False)
# for header in varying_headers:
# value = headers.get(header)
# if value is not None:
# vary_ctx.update(value.encode())
#
# vary_hash = vary_ctx.hexdigest()
url_hash = hashlib.md5(
str(url).encode("ascii"), usedforsecurity=False
).hexdigest()
now = datetime.now()
dataset_version = now.strftime('%Y%m%d')
return f"cache_presupuestov1.{dataset_version}.{method}.{url_hash}"
scache.generate_cache_key = patched_generate_cache_key
import re
import logging
from typing import Any, Union
......@@ -10,12 +11,16 @@ from starlette.requests import HTTPConnection, Request
from starlette_context import context, plugins
from starlette_context.middleware import RawContextMiddleware
from aiocache import caches
from starlette.middleware import Middleware
from starlette_caches.middleware import CacheMiddleware
from starlette_caches.rules import Rule
from presupuestov1 import cache
from presupuestov1.routers import (
project,
entity,
classifier,
classifier_income,
daily,
)
......@@ -36,7 +41,15 @@ app = FastAPI(
plugins=(
plugins.RequestIdPlugin(),
)
)
),
Middleware(
CacheMiddleware,
cache=cache.cache,
rules=[
Rule(match=re.compile(r"^/api/proyecto/.*"), ttl=0),
Rule(match=re.compile(r'^/api/.+'), ttl=86400, status=200),
],
),
],
root_path='/api'
)
......@@ -47,23 +60,25 @@ app.include_router(entity.router_da)
app.include_router(classifier.router_objeto)
app.include_router(classifier.router_acteco)
app.include_router(classifier.router_finfun)
app.include_router(classifier_income.router_rubro)
app.include_router(classifier_income.router_organismo)
app.include_router(daily.router)
@app.on_event('startup')
async def startup_event():
caches.set_config({
'default': {
'cache': 'aiocache.SimpleMemoryCache',
'serializer': {
'class': 'aiocache.serializers.StringSerializer' # Cache raw text
}
}
})
@app.on_event('shutdown')
async def shutdown_event():
default_cache = caches.get('default')
if hasattr(default_cache, 'close'):
await default_cache.close()
# @app.on_event('startup')
# async def startup_event():
# caches.set_config({
# 'default': {
# 'cache': 'aiocache.SimpleMemoryCache',
# 'serializer': {
# 'class': 'aiocache.serializers.StringSerializer' # Cache raw text
# }
# }
# })
#
# @app.on_event('shutdown')
# async def shutdown_event():
# default_cache = caches.get('default')
# if hasattr(default_cache, 'close'):
# await default_cache.close()
......
......@@ -5,5 +5,7 @@ from . import (
objeto,
treemap,
entity,
rubro,
organismo,
daily,
)
......
......@@ -72,4 +72,29 @@ class ActecoEntidad(Base):
per_capita: Mapped[float | None] = mapped_column(Numeric)
ranking: Mapped[int | None] = mapped_column(Integer)
prop: Mapped[float | None] = mapped_column(Numeric)
n_entidades: Mapped[int | None] = mapped_column(Integer)
\ No newline at end of file
n_entidades: Mapped[int | None] = mapped_column(Integer)
class ActecoUbigeo(Base):
__tablename__ = "acteco_ubigeo"
__table_args__ = (
Index("idx_acteco_ubigeo_gestion", "gestion"),
Index("idx_acteco_ubigeo_acteco", "acteco"),
Index("idx_acteco_ubigeo_acteco_entidad", "acteco", "ubigeo"),
{"schema": "web"},
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
gestion: Mapped[int] = mapped_column(Integer)
acteco: Mapped[str] = mapped_column(String(9))
ubigeo: Mapped[int] = mapped_column(String(9))
nivel: Mapped[str | None] = mapped_column(Text)
desc_ubigeo: Mapped[str | None] = mapped_column(Text)
desc_departamento: Mapped[str | None] = mapped_column(Text)
monto: Mapped[float | None] = mapped_column(Numeric(30, 15))
per_capita: Mapped[float | None] = mapped_column(Numeric)
ranking: Mapped[int | None] = mapped_column(Integer)
prop: Mapped[float | None] = mapped_column(Numeric)
n_entidades: Mapped[int | None] = mapped_column(Integer)
......
......@@ -75,7 +75,7 @@ class FinfunEntidad(Base):
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
gestion: Mapped[int] = mapped_column(Integer)
finfun: Mapped[str] = mapped_column(Text)
entidad: Mapped[int] = mapped_column(Integer)
......@@ -86,4 +86,29 @@ class FinfunEntidad(Base):
per_capita: Mapped[float | None] = mapped_column(Numeric)
ranking: Mapped[int | None] = mapped_column(Integer)
prop: Mapped[float | None] = mapped_column(Numeric)
n_entidades: Mapped[int | None] = mapped_column(Integer)
\ No newline at end of file
n_entidades: Mapped[int | None] = mapped_column(Integer)
class FinfunUbigeo(Base):
__tablename__ = "finfun_ubigeo"
__table_args__ = (
Index("idx_finfun_ubigeo_gestion", "gestion"),
Index("idx_finfun_ubigeo_finfun", "finfun"),
Index("idx_finfun_ubigeo_finfun_entidad", "finfun", "ubigeo"),
{"schema": "web"},
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
gestion: Mapped[int] = mapped_column(Integer)
finfun: Mapped[str] = mapped_column(String(11))
ubigeo: Mapped[int] = mapped_column(String(9))
nivel: Mapped[str | None] = mapped_column(Text)
desc_ubigeo: Mapped[str | None] = mapped_column(Text)
desc_departamento: Mapped[str | None] = mapped_column(Text)
monto: Mapped[float | None] = mapped_column(Numeric(30, 15))
per_capita: Mapped[float | None] = mapped_column(Numeric)
ranking: Mapped[int | None] = mapped_column(Integer)
prop: Mapped[float | None] = mapped_column(Numeric)
n_entidades: Mapped[int | None] = mapped_column(Integer)
......
......@@ -87,4 +87,29 @@ class ObjetoEntidad(Base):
per_capita: Mapped[float | None] = mapped_column(Numeric)
ranking: Mapped[int | None] = mapped_column(Integer)
prop: Mapped[float | None] = mapped_column(Numeric)
n_entidades: Mapped[int | None] = mapped_column(Integer)
\ No newline at end of file
n_entidades: Mapped[int | None] = mapped_column(Integer)
class ObjetoUbigeo(Base):
__tablename__ = "objeto_ubigeo"
__table_args__ = (
Index("idx_objeto_ubigeo_gestion", "gestion"),
Index("idx_objeto_ubigeo_objeto", "objeto"),
Index("idx_objeto_ubigeo_objeto_entidad", "objeto", "ubigeo"),
{"schema": "web"},
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
gestion: Mapped[int] = mapped_column(Integer)
objeto: Mapped[str] = mapped_column(String(9))
ubigeo: Mapped[int] = mapped_column(String(9))
nivel: Mapped[str | None] = mapped_column(Text)
desc_ubigeo: Mapped[str | None] = mapped_column(Text)
desc_departamento: Mapped[str | None] = mapped_column(Text)
monto: Mapped[float | None] = mapped_column(Numeric(30, 15))
per_capita: Mapped[float | None] = mapped_column(Numeric)
ranking: Mapped[int | None] = mapped_column(Integer)
prop: Mapped[float | None] = mapped_column(Numeric)
n_entidades: Mapped[int | None] = mapped_column(Integer)
......
from sqlalchemy.orm import Mapped, mapped_column
from presupuestov1.model import Base
from sqlalchemy import (
Integer,
String,
Text,
Numeric,
Index,
MetaData,
)
class OrganismoEstado(Base):
__tablename__ = "organismo_estado"
__table_args__ = (
Index("idx_organismo_estado_gestion", "gestion"),
Index("idx_organismo_estado_organismo", "organismo"),
Index("idx_organismo_estado_organismo_gestion", "organismo", "gestion"),
{"schema": "web"},
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
gestion: Mapped[int] = mapped_column(Integer)
organismo: Mapped[str] = mapped_column(Text)
nivel: Mapped[str | None] = mapped_column(Text)
total: Mapped[float | None] = mapped_column(Numeric(30, 15))
poblacion: Mapped[int | None] = mapped_column(Numeric)
n_entidades: Mapped[int | None] = mapped_column(Integer)
per_capita: Mapped[float | None] = mapped_column(Numeric)
total_gestion: Mapped[float | None] = mapped_column(Numeric(30, 15))
prop: Mapped[float | None] = mapped_column(Numeric)
ranking: Mapped[int | None] = mapped_column(Integer)
n_pares: Mapped[int | None] = mapped_column(Integer)
top1_entidad: Mapped[int | None] = mapped_column(Numeric)
top1_entidad_desc: Mapped[str | None] = mapped_column(Text)
top1_monto: Mapped[float | None] = mapped_column(Numeric(30, 15))
top1_pct: Mapped[float | None] = mapped_column(Numeric)
top2_entidad: Mapped[int | None] = mapped_column(Numeric)
top2_entidad_desc: Mapped[str | None] = mapped_column(Text)
top2_monto: Mapped[float | None] = mapped_column(Numeric(30, 15))
top2_pct: Mapped[float | None] = mapped_column(Numeric)
top3_entidad: Mapped[int | None] = mapped_column(Numeric)
top3_entidad_desc: Mapped[str | None] = mapped_column(Text)
top3_monto: Mapped[float | None] = mapped_column(Numeric(30, 15))
top3_pct: Mapped[float | None] = mapped_column(Numeric)
class OrganismoEntidad(Base):
__tablename__ = "organismo_entidad"
__table_args__ = (
Index("idx_organismo_entidad_gestion", "gestion"),
Index("idx_organismo_entidad_objeto", "organismo"),
Index("idx_organismo_entidad_rubro_entidad", "organismo", "entidad"),
{"schema": "web"},
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
gestion: Mapped[int] = mapped_column(Integer)
organismo: Mapped[str] = mapped_column(Text)
entidad: Mapped[int] = mapped_column(Integer)
nivel: Mapped[str | None] = mapped_column(Text)
entidad_desc: Mapped[str | None] = mapped_column(Text)
monto: Mapped[float | None] = mapped_column(Numeric(30, 15))
per_capita: Mapped[float | None] = mapped_column(Numeric)
ranking: Mapped[int | None] = mapped_column(Integer)
prop: Mapped[float | None] = mapped_column(Numeric)
n_entidades: Mapped[int | None] = mapped_column(Integer)
from sqlalchemy.orm import Mapped, mapped_column
from presupuestov1.model import Base
from sqlalchemy import (
Integer,
String,
Text,
Numeric,
Index,
MetaData,
)
class RubroEstado(Base):
__tablename__ = "rubro_estado"
__table_args__ = (
Index("idx_rubro_estado_gestion", "gestion"),
Index("idx_rubro_estado_rubro", "rubro"),
Index("idx_rubro_estado_rubro_gestion", "rubro", "gestion"),
{"schema": "web"},
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
gestion: Mapped[int] = mapped_column(Integer)
rubro: Mapped[str] = mapped_column(Text)
nivel: Mapped[str | None] = mapped_column(Text)
total: Mapped[float | None] = mapped_column(Numeric(30, 15))
poblacion: Mapped[int | None] = mapped_column(Numeric)
n_entidades: Mapped[int | None] = mapped_column(Integer)
per_capita: Mapped[float | None] = mapped_column(Numeric)
total_gestion: Mapped[float | None] = mapped_column(Numeric(30, 15))
prop: Mapped[float | None] = mapped_column(Numeric)
ranking: Mapped[int | None] = mapped_column(Integer)
n_pares: Mapped[int | None] = mapped_column(Integer)
top1_entidad: Mapped[int | None] = mapped_column(Numeric)
top1_entidad_desc: Mapped[str | None] = mapped_column(Text)
top1_monto: Mapped[float | None] = mapped_column(Numeric(30, 15))
top1_pct: Mapped[float | None] = mapped_column(Numeric)
top2_entidad: Mapped[int | None] = mapped_column(Numeric)
top2_entidad_desc: Mapped[str | None] = mapped_column(Text)
top2_monto: Mapped[float | None] = mapped_column(Numeric(30, 15))
top2_pct: Mapped[float | None] = mapped_column(Numeric)
top3_entidad: Mapped[int | None] = mapped_column(Numeric)
top3_entidad_desc: Mapped[str | None] = mapped_column(Text)
top3_monto: Mapped[float | None] = mapped_column(Numeric(30, 15))
top3_pct: Mapped[float | None] = mapped_column(Numeric)
class RubroEntidad(Base):
__tablename__ = "rubro_entidad"
__table_args__ = (
Index("idx_rubro_entidad_gestion", "gestion"),
Index("idx_rubro_entidad_objeto", "rubro"),
Index("idx_rubro_entidad_rubro_entidad", "rubro", "entidad"),
{"schema": "web"},
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
gestion: Mapped[int] = mapped_column(Integer)
rubro: Mapped[str] = mapped_column(Text)
entidad: Mapped[int] = mapped_column(Integer)
nivel: Mapped[str | None] = mapped_column(Text)
entidad_desc: Mapped[str | None] = mapped_column(Text)
monto: Mapped[float | None] = mapped_column(Numeric(30, 15))
per_capita: Mapped[float | None] = mapped_column(Numeric)
ranking: Mapped[int | None] = mapped_column(Integer)
prop: Mapped[float | None] = mapped_column(Numeric)
n_entidades: Mapped[int | None] = mapped_column(Integer)
......@@ -84,6 +84,30 @@ class TreemapActeco(Base):
desc_acteco: Mapped[str | None] = mapped_column(Text)
class TreemapRubro(Base):
__tablename__ = "treemap_rubro"
__table_args__ = (
Index("idx_treemap_rubro_gestion_entidad", "gestion", "entidad"),
Index("idx_treemap_rubro_nivel", "nivel"),
{"schema": "web"},
)
# PK compuesta inferida para uso ORM
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
gestion: Mapped[int] = mapped_column(Integer)
entidad_area: Mapped[str | None] = mapped_column(String(9))
entidad: Mapped[int] = mapped_column(Integer)
rubro: Mapped[str] = mapped_column(String(9))
nivel: Mapped[str | None] = mapped_column(String(20))
parent: Mapped[str | None] = mapped_column(String(9))
devengado: Mapped[float | None] = mapped_column(Numeric(30, 15))
desc_entidad: Mapped[str | None] = mapped_column(Text)
desc_rubro: Mapped[str | None] = mapped_column(Text)
###############################################################################
# fns
###############################################################################
......
......@@ -8,8 +8,6 @@ from sqlalchemy import and_, or_, select
from presupuestov1 import model, schema, constant, schemas, models, search
from aiocache import cached
router_objeto = APIRouter(
prefix='/objeto',
......@@ -83,6 +81,21 @@ def fetch_objeto_entidad(
).mappings().all()
@router_objeto.get('/{object_id}/ubigeos', response_model=List[schemas.objeto.ObjetoUbigeo])
def fetch_objeto_ubigeo(
object_id: str,
db: Session = Depends(model.get_db),
query: schema.QueryParams = Depends(),
):
gestion = query.gestion or 0
ClasObjetos = models.objeto.ObjetoUbigeo
return db.query(ClasObjetos).filter(
ClasObjetos.objeto == object_id,
ClasObjetos.gestion == gestion
).all()
@router_objeto.get('/{object_id}/entidades/map', response_model=List[schemas.treemap.TreemapObjetoSingle])
def fetch_objeto_treemap(
object_id: str,
......@@ -111,6 +124,21 @@ def fetch_objeto_entidad_single(
).all()
@router_objeto.get('/{object_id}/ubigeos/{ubigeo_id}', response_model=List[schemas.objeto.ObjetoUbigeo])
def fetch_objeto_ubigeo_single(
object_id: str,
ubigeo_id: str,
db: Session = Depends(model.get_db),
query: schema.QueryParams = Depends(),
):
ClasObjetos = models.objeto.ObjetoUbigeo
return db.query(ClasObjetos).filter(
ClasObjetos.objeto == object_id,
ClasObjetos.ubigeo == ubigeo_id
).all()
@router_acteco.get('/{acteco_id}', response_model=schemas.acteco.ClasActecoEstados)
def fetch_acteco_estado(
acteco_id: str,
......@@ -147,6 +175,21 @@ def fetch_acteco_entidad(
).mappings().all()
@router_acteco.get('/{acteco_id}/ubigeos', response_model=List[schemas.acteco.ActecoUbigeo])
def fetch_acteco_ubigeo(
acteco_id: str,
db: Session = Depends(model.get_db),
query: schema.QueryParams = Depends(),
):
gestion = query.gestion or 0
ClasObjetos = models.objeto.ActecoUbigeo
return db.query(ClasObjetos).filter(
ClasObjetos.acteco == acteco_id,
ClasObjetos.gestion == gestion
).all()
@router_acteco.get('/{acteco_id}/entidades/map', response_model=List[schemas.treemap.TreemapActecoSingle])
def fetch_acteco_treemap(
acteco_id: str,
......@@ -176,6 +219,21 @@ def fetch_acteco_entidad_single(
).all()
@router_acteco.get('/{acteco_id}/ubigeos/{ubigeo_id}', response_model=List[schemas.acteco.ActecoUbigeo])
def fetch_acteco_ubigeo_single(
acteco_id: str,
ubigeo_id: str,
db: Session = Depends(model.get_db),
query: schema.QueryParams = Depends(),
):
ClasObjetos = models.acteco.ActecoUbigeo
return db.query(ClasObjetos).filter(
ClasObjetos.actecp == acteco_id,
ClasObjetos.ubigeo == ubigeo_id
).all()
@router_finfun.get('/{finfun_id}', response_model=schemas.finfun.ClasFinfunEstados)
def fetch_finfun_estado(
finfun_id: str,
......@@ -212,6 +270,21 @@ def fetch_finfun_entidad(
).mappings().all()
@router_finfun.get('/{finfun_id}/ubigeos', response_model=List[schemas.finfun.FinfunUbigeo])
def fetch_finfun_ubigeo(
finfun_id: str,
db: Session = Depends(model.get_db),
query: schema.QueryParams = Depends(),
):
gestion = query.gestion or 0
ClasObjetos = models.finfun.FinfunUbigeo
return db.query(ClasObjetos).filter(
ClasObjetos.finfun == finfun_id,
ClasObjetos.gestion == gestion
).all()
@router_finfun.get('/{finfun_id}/entidades/map', response_model=List[schemas.treemap.TreemapFinFunSingle])
def fetch_finfun_treemap(
finfun_id: str,
......@@ -241,6 +314,21 @@ def fetch_finfun_entidad_single(
).all()
@router_finfun.get('/{finfun_id}/ubigeos/{ubigeo_id}', response_model=List[schemas.finfun.FinfunUbigeo])
def fetch_finfun_ubigeo_single(
finfun_id: str,
ubigeo_id: str,
db: Session = Depends(model.get_db),
query: schema.QueryParams = Depends(),
):
ClasObjetos = models.finfun.FinfunUbigeo
return db.query(ClasObjetos).filter(
ClasObjetos.finfun == finfun_id,
ClasObjetos.ubigeo == ubigeo_id
).all()
###############################################################################
# priv
###############################################################################
......
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
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])
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])
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)
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])
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])
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])
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)
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])
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])
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()
......@@ -134,6 +134,24 @@ def fetch_entity_actecos(
return get_distribuciones(db, 'municipio_ubigeo', ubigeo_id, 'acteco', query)
@router_entidad.get('/{entity_id:str}/rubros', response_model=List[schemas.entity.EntidadDistribucion])
def fetch_entity_rubros(
entity_id: str,
db: Session = Depends(model.get_db),
query: schema.QueryParams = Depends(),
):
return get_distribuciones(db, 'entidad', entity_id, 'rubro', query)
@router_entidad.get('/{entity_id:str}/organismos', response_model=List[schemas.entity.EntidadDistribucion])
def fetch_entity_organismos(
entity_id: str,
db: Session = Depends(model.get_db),
query: schema.QueryParams = Depends(),
):
return get_distribuciones(db, 'entidad', entity_id, 'organismo', query)
###############################################################################
# private
###############################################################################
......
......@@ -3,6 +3,8 @@ from . import (
acteco,
finfun,
objeto,
organismo,
rubro,
treemap,
project,
entity,
......
......@@ -41,5 +41,19 @@ class ActecoEntidad(OrmBaseModel):
n_entidades: int | None
class ActecoUbigeo(OrmBaseModel):
gestion: int
acteco: str
ubigeo: str
nivel: str | None
desc_ubigeo: str | None
desc_departamento: str | None
monto: float | None
per_capita: float | None
ranking: int | None
prop: float | None
n_entidades: int | None
class ClasActecoEstados(schemas.classifier.ClasActeco):
estados: List[ActecoEstado]
......
......@@ -48,5 +48,19 @@ class FinfunEntidad(OrmBaseModel):
n_entidades: int | None
class FinfunUbigeo(OrmBaseModel):
gestion: int
finfun: str
ubigeo: str
nivel: str | None
desc_ubigeo: str | None
desc_departamento: str | None
monto: float | None
per_capita: float | None
ranking: int | None
prop: float | None
n_entidades: int | None
class ClasFinfunEstados(schemas.classifier.ClasFinfun):
estados: List[FinfunEstado]
......
......@@ -48,5 +48,19 @@ class ObjetoEntidad(OrmBaseModel):
n_entidades: int | None
class ObjetoUbigeo(OrmBaseModel):
gestion: int
objeto: str
ubigeo: str
nivel: str | None
desc_ubigeo: str | None
desc_departamento: str | None
monto: float | None
per_capita: float | None
ranking: int | None
prop: float | None
n_entidades: int | None
class ClasObjetosEstados(schemas.classifier.ClasObjetos):
estados: List[ObjetoEstado]
......
from typing import List
from presupuestov1.schema import OrmBaseModel
from presupuestov1 import schemas
class OrganismoEstado(OrmBaseModel):
gestion: int
organismo: str
nivel: str | None
total: float | None
poblacion: float | None
n_entidades: int | None
per_capita: float | None
total_gestion: float | None
prop: float | None
ranking: int | None
n_pares: int | None
top1_entidad: int | None
top1_entidad_desc: str | None
top1_monto: float | None
top1_pct: float | None
top2_entidad: int | None | float
top2_entidad_desc: str | None
top2_monto: float | None
top2_pct: float | None
top3_entidad: int | None | float
top3_entidad_desc: str | None
top3_monto: float | None
top3_pct: float | None
class OrganismoEntidad(OrmBaseModel):
gestion: int
organismo: str
entidad: int
nivel: str | None
entidad_desc: str | None
monto: float | None
per_capita: float | None
ranking: int | None
prop: float | None
n_entidades: int | None
class ClasOrganismosEstados(schemas.classifier.ClasOrganismos):
estados: List[OrganismoEstado]
from typing import List
from presupuestov1.schema import OrmBaseModel
from presupuestov1 import schemas
class RubroEstado(OrmBaseModel):
gestion: int
rubro: str
nivel: str | None
total: float | None
poblacion: float | None
n_entidades: int | None
per_capita: float | None
total_gestion: float | None
prop: float | None
ranking: int | None
n_pares: int | None
top1_entidad: int | None
top1_entidad_desc: str | None
top1_monto: float | None
top1_pct: float | None
top2_entidad: int | None | float
top2_entidad_desc: str | None
top2_monto: float | None
top2_pct: float | None
top3_entidad: int | None | float
top3_entidad_desc: str | None
top3_monto: float | None
top3_pct: float | None
class RubroEntidad(OrmBaseModel):
gestion: int
rubro: str
entidad: int
nivel: str | None
entidad_desc: str | None
monto: float | None
per_capita: float | None
ranking: int | None
prop: float | None
n_entidades: int | None
class ClasRubrosEstados(schemas.classifier.ClasRubros):
estados: List[RubroEstado]
......@@ -53,3 +53,16 @@ class TreemapActecoSingle(Treemap):
acteco: str
parent: str | None
desc_entidad: str | None
class TreemapRubro(Treemap):
rubro: str
parent: str | None
desc_rubro: str | None
desc_entidad: str | None
class TreemapRubroSingle(Treemap):
rubro: str
parent: str | None
desc_entidad: str | None
......