Showing
15 changed files
with
127 additions
and
88 deletions
| ... | @@ -41,7 +41,9 @@ app = FastAPI( | ... | @@ -41,7 +41,9 @@ app = FastAPI( |
| 41 | root_path='/api' | 41 | root_path='/api' |
| 42 | ) | 42 | ) |
| 43 | app.include_router(project.router) | 43 | app.include_router(project.router) |
| 44 | -app.include_router(entity.router) | 44 | +app.include_router(entity.router_entidad) |
| 45 | +app.include_router(entity.router_ubigeo) | ||
| 46 | +app.include_router(entity.router_da) | ||
| 45 | app.include_router(classifier.router_objeto) | 47 | app.include_router(classifier.router_objeto) |
| 46 | app.include_router(classifier.router_acteco) | 48 | app.include_router(classifier.router_acteco) |
| 47 | app.include_router(classifier.router_finfun) | 49 | app.include_router(classifier.router_finfun) | ... | ... |
| ... | @@ -8,13 +8,16 @@ from sqlalchemy.orm import relationship as relationship_ | ... | @@ -8,13 +8,16 @@ from sqlalchemy.orm import relationship as relationship_ |
| 8 | 8 | ||
| 9 | SQLALCHEMY_DATABASE_URL = open('./docs/postgres').read().strip() | 9 | SQLALCHEMY_DATABASE_URL = open('./docs/postgres').read().strip() |
| 10 | 10 | ||
| 11 | -engine = create_engine(SQLALCHEMY_DATABASE_URL) | 11 | +engine = create_engine( |
| 12 | + SQLALCHEMY_DATABASE_URL, | ||
| 13 | + pool_size=10, | ||
| 14 | + max_overflow=5, | ||
| 15 | +) | ||
| 12 | SessionLocal = sessionmaker( | 16 | SessionLocal = sessionmaker( |
| 13 | autocommit=False, | 17 | autocommit=False, |
| 14 | autoflush=False, | 18 | autoflush=False, |
| 15 | bind=engine, | 19 | bind=engine, |
| 16 | # pool_size=1, | 20 | # pool_size=1, |
| 17 | - #max_overflow=5 | ||
| 18 | ) | 21 | ) |
| 19 | 22 | ||
| 20 | Base = declarative_base() | 23 | Base = declarative_base() |
| ... | @@ -49,3 +52,7 @@ def update_from_schema(model, schema): | ... | @@ -49,3 +52,7 @@ def update_from_schema(model, schema): |
| 49 | for field, field_data in schema.dict().items(): | 52 | for field, field_data in schema.dict().items(): |
| 50 | setattr(model, field, field_data) | 53 | setattr(model, field, field_data) |
| 51 | return model | 54 | return model |
| 55 | + | ||
| 56 | + | ||
| 57 | +def model_columns(model): | ||
| 58 | + return [col.label(col.key) for col in model.__table__.c] | ... | ... |
| ... | @@ -101,7 +101,7 @@ class ClasGeografico(ClasBase, Base): | ... | @@ -101,7 +101,7 @@ class ClasGeografico(ClasBase, Base): |
| 101 | 101 | ||
| 102 | ubigeo: Mapped[str] = mapped_column(Text, primary_key=True) | 102 | ubigeo: Mapped[str] = mapped_column(Text, primary_key=True) |
| 103 | 103 | ||
| 104 | - desc_departamento: Mapped[str] = mapped_column(String(12)) | 104 | + desc_departamento: Mapped[str] = mapped_column(String(18)) |
| 105 | desc_ubigeo: Mapped[str | None] = mapped_column(Text) | 105 | desc_ubigeo: Mapped[str | None] = mapped_column(Text) |
| 106 | 106 | ||
| 107 | municipio_ubigeo: Mapped[int | None] = mapped_column(Integer) | 107 | municipio_ubigeo: Mapped[int | None] = mapped_column(Integer) | ... | ... |
| ... | @@ -44,7 +44,7 @@ class EjecucionClasificadores(Base): | ... | @@ -44,7 +44,7 @@ class EjecucionClasificadores(Base): |
| 44 | devengado: Mapped[float] = mapped_column(Numeric(30, 15)) | 44 | devengado: Mapped[float] = mapped_column(Numeric(30, 15)) |
| 45 | 45 | ||
| 46 | padre: Mapped[str] = mapped_column(Text) | 46 | padre: Mapped[str] = mapped_column(Text) |
| 47 | - hijo: Mapped[str] = mapped_column(Text) | 47 | + hijo: Mapped[str | None] = mapped_column(Text) |
| 48 | 48 | ||
| 49 | 49 | ||
| 50 | class EjecucionEntidades(Base): | 50 | class EjecucionEntidades(Base): |
| ... | @@ -90,7 +90,9 @@ class Timeline(Base): | ... | @@ -90,7 +90,9 @@ class Timeline(Base): |
| 90 | 90 | ||
| 91 | class TimeSeries(Base): | 91 | class TimeSeries(Base): |
| 92 | __tablename__ = "diario_timeseries" | 92 | __tablename__ = "diario_timeseries" |
| 93 | - | 93 | + __table_args__ = ( |
| 94 | + {"schema": "web"}, | ||
| 95 | + ) | ||
| 94 | id: Mapped[int] = mapped_column(Integer, primary_key=True) | 96 | id: Mapped[int] = mapped_column(Integer, primary_key=True) |
| 95 | 97 | ||
| 96 | fecha: Mapped[date] = mapped_column(Date) | 98 | fecha: Mapped[date] = mapped_column(Date) | ... | ... |
| 1 | from sqlalchemy.orm import Mapped, mapped_column | 1 | from sqlalchemy.orm import Mapped, mapped_column |
| 2 | -from presupuestov1.model import Base | 2 | +from presupuestov1.model import Base, model_columns |
| 3 | 3 | ||
| 4 | from sqlalchemy import ( | 4 | from sqlalchemy import ( |
| 5 | Integer, | 5 | Integer, |
| ... | @@ -9,7 +9,7 @@ from sqlalchemy import ( | ... | @@ -9,7 +9,7 @@ from sqlalchemy import ( |
| 9 | Index, | 9 | Index, |
| 10 | MetaData, | 10 | MetaData, |
| 11 | ) | 11 | ) |
| 12 | -from sqlalchemy import and_, or_ | 12 | +from sqlalchemy import and_, or_, select |
| 13 | 13 | ||
| 14 | 14 | ||
| 15 | class TreemapObjeto(Base): | 15 | class TreemapObjeto(Base): |
| ... | @@ -115,4 +115,6 @@ def get_clas_entities(query_filters, db, query, ClassObject, object_id): | ... | @@ -115,4 +115,6 @@ def get_clas_entities(query_filters, db, query, ClassObject, object_id): |
| 115 | ids = or_([getattr(ClassObject, object_id) == _ for _ in ids]) | 115 | ids = or_([getattr(ClassObject, object_id) == _ for _ in ids]) |
| 116 | query_filters.append(ids) | 116 | query_filters.append(ids) |
| 117 | 117 | ||
| 118 | - return db.query(ClassObject).filter(and_(*query_filters)).all() | 118 | + return db.execute( |
| 119 | + select(*model_columns(ClassObject)).where(and_(*query_filters)) | ||
| 120 | + ).mappings().all() | ... | ... |
| ... | @@ -4,7 +4,7 @@ from typing import List, Any, Optional, Union | ... | @@ -4,7 +4,7 @@ from typing import List, Any, Optional, Union |
| 4 | 4 | ||
| 5 | from fastapi import APIRouter, Depends, Request, HTTPException, Body | 5 | from fastapi import APIRouter, Depends, Request, HTTPException, Body |
| 6 | from sqlalchemy.orm import Session | 6 | from sqlalchemy.orm import Session |
| 7 | -from sqlalchemy import and_, or_ | 7 | +from sqlalchemy import and_, or_, select |
| 8 | 8 | ||
| 9 | from presupuestov1 import model, schema, constant, schemas, models, search | 9 | from presupuestov1 import model, schema, constant, schemas, models, search |
| 10 | 10 | ||
| ... | @@ -26,10 +26,6 @@ router_finfun = APIRouter( | ... | @@ -26,10 +26,6 @@ router_finfun = APIRouter( |
| 26 | tags=['finfun'], | 26 | tags=['finfun'], |
| 27 | ) | 27 | ) |
| 28 | 28 | ||
| 29 | -router_ubigeo = APIRouter( | ||
| 30 | - prefix='/ubigeo', | ||
| 31 | - tags=['ubigeo'], | ||
| 32 | -) | ||
| 33 | 29 | ||
| 34 | 30 | ||
| 35 | ############################################################################### | 31 | ############################################################################### |
| ... | @@ -51,11 +47,6 @@ def fetch_object_classifier(db: Session = Depends(model.get_db)): | ... | @@ -51,11 +47,6 @@ def fetch_object_classifier(db: Session = Depends(model.get_db)): |
| 51 | return _fetch_classifier('finfun', db) | 47 | return _fetch_classifier('finfun', db) |
| 52 | 48 | ||
| 53 | 49 | ||
| 54 | -@router_ubigeo.get('/clasificador', response_model=List[schemas.classifier.ClasGeografico]) | ||
| 55 | -def fetch_object_classifier(db: Session = Depends(model.get_db)): | ||
| 56 | - return _fetch_classifier('ubigeo', db) | ||
| 57 | - | ||
| 58 | - | ||
| 59 | @router_objeto.get('/{object_id}', response_model=schemas.objeto.ClasObjetosEstados) | 50 | @router_objeto.get('/{object_id}', response_model=schemas.objeto.ClasObjetosEstados) |
| 60 | def fetch_objeto_estado( | 51 | def fetch_objeto_estado( |
| 61 | object_id: str, | 52 | object_id: str, |
| ... | @@ -84,13 +75,15 @@ def fetch_objeto_entidad( | ... | @@ -84,13 +75,15 @@ def fetch_objeto_entidad( |
| 84 | gestion = query.gestion or 0 | 75 | gestion = query.gestion or 0 |
| 85 | ClasObjetos = models.objeto.ObjetoEntidad | 76 | ClasObjetos = models.objeto.ObjetoEntidad |
| 86 | 77 | ||
| 87 | - return db.query(ClasObjetos).filter( | 78 | + return db.execute( |
| 88 | - ClasObjetos.objeto == object_id, | 79 | + select(*model.model_columns(ClasObjetos)).where( |
| 89 | - ClasObjetos.gestion == gestion | 80 | + ClasObjetos.objeto == object_id, |
| 90 | - ).all() | 81 | + ClasObjetos.gestion == gestion |
| 82 | + ) | ||
| 83 | + ).mappings().all() | ||
| 91 | 84 | ||
| 92 | 85 | ||
| 93 | -@router_objeto.get('/{object_id}/entidades/map', response_model=List[schemas.treemap.TreemapObjeto]) | 86 | +@router_objeto.get('/{object_id}/entidades/map', response_model=List[schemas.treemap.TreemapObjetoSingle]) |
| 94 | def fetch_objeto_treemap( | 87 | def fetch_objeto_treemap( |
| 95 | object_id: str, | 88 | object_id: str, |
| 96 | db: Session = Depends(model.get_db), | 89 | db: Session = Depends(model.get_db), |
| ... | @@ -119,11 +112,11 @@ def fetch_objeto_entidad_single( | ... | @@ -119,11 +112,11 @@ def fetch_objeto_entidad_single( |
| 119 | 112 | ||
| 120 | 113 | ||
| 121 | @router_acteco.get('/{acteco_id}', response_model=schemas.acteco.ClasActecoEstados) | 114 | @router_acteco.get('/{acteco_id}', response_model=schemas.acteco.ClasActecoEstados) |
| 122 | -def fetch_objeto_estado( | 115 | +def fetch_acteco_estado( |
| 123 | acteco_id: str, | 116 | acteco_id: str, |
| 124 | db: Session = Depends(model.get_db), | 117 | db: Session = Depends(model.get_db), |
| 125 | ): | 118 | ): |
| 126 | - ClasEstado = models.objeto.ActecoEstado | 119 | + ClasEstado = models.acteco.ActecoEstado |
| 127 | estados = db.query(ClasEstado).filter( | 120 | estados = db.query(ClasEstado).filter( |
| 128 | ClasEstado.acteco == acteco_id, | 121 | ClasEstado.acteco == acteco_id, |
| 129 | ).all() | 122 | ).all() |
| ... | @@ -146,13 +139,15 @@ def fetch_acteco_entidad( | ... | @@ -146,13 +139,15 @@ def fetch_acteco_entidad( |
| 146 | gestion = query.gestion or 0 | 139 | gestion = query.gestion or 0 |
| 147 | ClasObjetos = models.acteco.ActecoEntidad | 140 | ClasObjetos = models.acteco.ActecoEntidad |
| 148 | 141 | ||
| 149 | - return db.query(ClasObjetos).filter( | 142 | + return db.execute( |
| 150 | - ClasObjetos.acteco == acteco_id, | 143 | + select(*model.model_columns(ClasObjetos)).where( |
| 151 | - ClasObjetos.gestion == gestion | 144 | + ClasObjetos.acteco == acteco_id, |
| 152 | - ).all() | 145 | + ClasObjetos.gestion == gestion |
| 146 | + ) | ||
| 147 | + ).mappings().all() | ||
| 153 | 148 | ||
| 154 | 149 | ||
| 155 | -@router_acteco.get('/{acteco_id}/entidades/map', response_model=List[schemas.treemap.TreemapActeco]) | 150 | +@router_acteco.get('/{acteco_id}/entidades/map', response_model=List[schemas.treemap.TreemapActecoSingle]) |
| 156 | def fetch_acteco_treemap( | 151 | def fetch_acteco_treemap( |
| 157 | acteco_id: str, | 152 | acteco_id: str, |
| 158 | db: Session = Depends(model.get_db), | 153 | db: Session = Depends(model.get_db), |
| ... | @@ -209,13 +204,15 @@ def fetch_finfun_entidad( | ... | @@ -209,13 +204,15 @@ def fetch_finfun_entidad( |
| 209 | gestion = query.gestion or 0 | 204 | gestion = query.gestion or 0 |
| 210 | ClasObjetos = models.finfun.FinfunEntidad | 205 | ClasObjetos = models.finfun.FinfunEntidad |
| 211 | 206 | ||
| 212 | - return db.query(ClasObjetos).filter( | 207 | + return db.execute( |
| 213 | - ClasObjetos.finfun == finfun_id, | 208 | + select(*model.model_columns(ClasObjetos)).where( |
| 214 | - ClasObjetos.gestion == gestion | 209 | + ClasObjetos.finfun == finfun_id, |
| 215 | - ).all() | 210 | + ClasObjetos.gestion == gestion |
| 211 | + ) | ||
| 212 | + ).mappings().all() | ||
| 216 | 213 | ||
| 217 | 214 | ||
| 218 | -@router_finfun.get('/{finfun_id}/entidades/map', response_model=List[schemas.treemap.TreemapFinFun]) | 215 | +@router_finfun.get('/{finfun_id}/entidades/map', response_model=List[schemas.treemap.TreemapFinFunSingle]) |
| 219 | def fetch_finfun_treemap( | 216 | def fetch_finfun_treemap( |
| 220 | finfun_id: str, | 217 | finfun_id: str, |
| 221 | db: Session = Depends(model.get_db), | 218 | db: Session = Depends(model.get_db), |
| ... | @@ -228,6 +225,7 @@ def fetch_finfun_treemap( | ... | @@ -228,6 +225,7 @@ def fetch_finfun_treemap( |
| 228 | ], db, query, Treemap, 'entidad' | 225 | ], db, query, Treemap, 'entidad' |
| 229 | ) | 226 | ) |
| 230 | 227 | ||
| 228 | + | ||
| 231 | @router_finfun.get('/{finfun_id}/entidades/{entidad_id}', response_model=List[schemas.finfun.FinfunEntidad]) | 229 | @router_finfun.get('/{finfun_id}/entidades/{entidad_id}', response_model=List[schemas.finfun.FinfunEntidad]) |
| 232 | def fetch_finfun_entidad_single( | 230 | def fetch_finfun_entidad_single( |
| 233 | finfun_id: str, | 231 | finfun_id: str, |
| ... | @@ -242,15 +240,16 @@ def fetch_finfun_entidad_single( | ... | @@ -242,15 +240,16 @@ def fetch_finfun_entidad_single( |
| 242 | ClasObjetos.entidad == entidad_id | 240 | ClasObjetos.entidad == entidad_id |
| 243 | ).all() | 241 | ).all() |
| 244 | 242 | ||
| 243 | + | ||
| 245 | ############################################################################### | 244 | ############################################################################### |
| 246 | # priv | 245 | # priv |
| 247 | ############################################################################### | 246 | ############################################################################### |
| 248 | 247 | ||
| 249 | def _fetch_classifier(clas, db): | 248 | def _fetch_classifier(clas, db): |
| 250 | - ClassObject = { | 249 | + ClasObject = { |
| 251 | 'objeto': models.classifier.ClasObjetos, | 250 | 'objeto': models.classifier.ClasObjetos, |
| 252 | 'acteco': models.classifier.ClasActeco, | 251 | 'acteco': models.classifier.ClasActeco, |
| 253 | 'finfun': models.classifier.ClasFinfun, | 252 | 'finfun': models.classifier.ClasFinfun, |
| 254 | 'ubigeo': models.classifier.ClasGeografico, | 253 | 'ubigeo': models.classifier.ClasGeografico, |
| 255 | }[clas] | 254 | }[clas] |
| 256 | - return db.query(ClassObject).all() | 255 | + return db.query(ClasObject).all() | ... | ... |
| ... | @@ -40,7 +40,7 @@ def fetch_clasificadores( | ... | @@ -40,7 +40,7 @@ def fetch_clasificadores( |
| 40 | if query.dias is not None: | 40 | if query.dias is not None: |
| 41 | filters.append(Daily.dias == query.dias) | 41 | filters.append(Daily.dias == query.dias) |
| 42 | 42 | ||
| 43 | - return db.query(Daily).filter(*filters).all() | 43 | + return db.query(Daily).filter(*filters).order_by(Daily.devengado.desc()).all() |
| 44 | 44 | ||
| 45 | 45 | ||
| 46 | @router.get('/entidades', response_model=List[schemas.daily.EjecucionEntidades]) | 46 | @router.get('/entidades', response_model=List[schemas.daily.EjecucionEntidades]) |
| ... | @@ -61,7 +61,7 @@ def fetch_entidades( | ... | @@ -61,7 +61,7 @@ def fetch_entidades( |
| 61 | if query.entidad is not None: | 61 | if query.entidad is not None: |
| 62 | filters.append(Daily.entidad == query.entidad) | 62 | filters.append(Daily.entidad == query.entidad) |
| 63 | 63 | ||
| 64 | - return db.query(Daily).filter(*filters).offset( | 64 | + return db.query(Daily).filter(*filters).order_by(Daily.devengado.desc()).offset( |
| 65 | (page - 1) * page_size | 65 | (page - 1) * page_size |
| 66 | ).limit(page_size).all() | 66 | ).limit(page_size).all() |
| 67 | 67 | ... | ... |
| ... | @@ -2,9 +2,9 @@ import time | ... | @@ -2,9 +2,9 @@ import time |
| 2 | 2 | ||
| 3 | from typing import List, Any, Optional, Union | 3 | from typing import List, Any, Optional, Union |
| 4 | 4 | ||
| 5 | -from fastapi import APIRouter, Depends, Request, HTTPException, Body | 5 | +from fastapi import APIRouter, Depends, Request, HTTPException, Body, Response |
| 6 | from sqlalchemy.orm import Session | 6 | from sqlalchemy.orm import Session |
| 7 | -from sqlalchemy import and_, or_ | 7 | +from sqlalchemy import and_, or_, select |
| 8 | 8 | ||
| 9 | from presupuestov1 import model, schema, constant, schemas, models, search | 9 | from presupuestov1 import model, schema, constant, schemas, models, search |
| 10 | 10 | ||
| ... | @@ -43,11 +43,12 @@ def fetch_classifier( | ... | @@ -43,11 +43,12 @@ def fetch_classifier( |
| 43 | return db.query(models.classifier.ClasGeografico).all() | 43 | return db.query(models.classifier.ClasGeografico).all() |
| 44 | 44 | ||
| 45 | 45 | ||
| 46 | + | ||
| 46 | # base | 47 | # base |
| 47 | 48 | ||
| 48 | @router_entidad.get('/{entity_id:str}', response_model=schemas.entity.ClasInstitucionalIngresosGastos) | 49 | @router_entidad.get('/{entity_id:str}', response_model=schemas.entity.ClasInstitucionalIngresosGastos) |
| 49 | def fetch_entity( | 50 | def fetch_entity( |
| 50 | - entity_id: int, | 51 | + entity_id: str, |
| 51 | db: Session = Depends(model.get_db), | 52 | db: Session = Depends(model.get_db), |
| 52 | ): | 53 | ): |
| 53 | ClasInstitucional = models.classifier.ClasInstitucional | 54 | ClasInstitucional = models.classifier.ClasInstitucional |
| ... | @@ -55,7 +56,7 @@ def fetch_entity( | ... | @@ -55,7 +56,7 @@ def fetch_entity( |
| 55 | ClasInstitucional.entidad == entity_id | 56 | ClasInstitucional.entidad == entity_id |
| 56 | ).one() | 57 | ).one() |
| 57 | 58 | ||
| 58 | - gastos_ingresos = get_resumen('entidad', entity_id) | 59 | + gastos_ingresos = get_resumen(db, 'entidad', entity_id) |
| 59 | setattr(entidad, 'gastos_ingresos', gastos_ingresos) | 60 | setattr(entidad, 'gastos_ingresos', gastos_ingresos) |
| 60 | 61 | ||
| 61 | return entidad | 62 | return entidad |
| ... | @@ -63,7 +64,7 @@ def fetch_entity( | ... | @@ -63,7 +64,7 @@ def fetch_entity( |
| 63 | 64 | ||
| 64 | @router_ubigeo.get('/{ubigeo_id:str}', response_model=schemas.entity.ClasGeograficoIngresosGastos) | 65 | @router_ubigeo.get('/{ubigeo_id:str}', response_model=schemas.entity.ClasGeograficoIngresosGastos) |
| 65 | def fetch_entity( | 66 | def fetch_entity( |
| 66 | - ubigeo_id: int, | 67 | + ubigeo_id: str, |
| 67 | db: Session = Depends(model.get_db), | 68 | db: Session = Depends(model.get_db), |
| 68 | ): | 69 | ): |
| 69 | ClasGeografico = models.classifier.ClasGeografico | 70 | ClasGeografico = models.classifier.ClasGeografico |
| ... | @@ -71,7 +72,7 @@ def fetch_entity( | ... | @@ -71,7 +72,7 @@ def fetch_entity( |
| 71 | ClasGeografico.ubigeo == ubigeo_id | 72 | ClasGeografico.ubigeo == ubigeo_id |
| 72 | ).one() | 73 | ).one() |
| 73 | 74 | ||
| 74 | - gastos_ingresos = get_resumen('municipio_ubigeo', ubigeo_id) | 75 | + gastos_ingresos = get_resumen(db, 'municipio_ubigeo', ubigeo_id) |
| 75 | setattr(ubigeo, 'gastos_ingresos', gastos_ingresos) | 76 | setattr(ubigeo, 'gastos_ingresos', gastos_ingresos) |
| 76 | 77 | ||
| 77 | return ubigeo | 78 | return ubigeo |
| ... | @@ -81,81 +82,94 @@ def fetch_entity( | ... | @@ -81,81 +82,94 @@ def fetch_entity( |
| 81 | 82 | ||
| 82 | @router_entidad.get('/{entity_id:str}/objetos', response_model=List[schemas.entity.EntidadDistribucion]) | 83 | @router_entidad.get('/{entity_id:str}/objetos', response_model=List[schemas.entity.EntidadDistribucion]) |
| 83 | def fetch_entity_objetos( | 84 | def fetch_entity_objetos( |
| 84 | - entity_id: int, | 85 | + entity_id: str, |
| 85 | db: Session = Depends(model.get_db), | 86 | db: Session = Depends(model.get_db), |
| 86 | query: schema.QueryParams = Depends(), | 87 | query: schema.QueryParams = Depends(), |
| 87 | ): | 88 | ): |
| 88 | - return get_distribuciones('entidad', entidad_id, 'objeto', query) | 89 | + return get_distribuciones(db, 'entidad', entity_id, 'objeto', query) |
| 89 | 90 | ||
| 90 | 91 | ||
| 91 | @router_ubigeo.get('/{ubigeo_id:str}/objetos', response_model=List[schemas.entity.EntidadDistribucion]) | 92 | @router_ubigeo.get('/{ubigeo_id:str}/objetos', response_model=List[schemas.entity.EntidadDistribucion]) |
| 92 | def fetch_entity_objetos( | 93 | def fetch_entity_objetos( |
| 93 | - ubigeo_id: int, | 94 | + ubigeo_id: str, |
| 94 | db: Session = Depends(model.get_db), | 95 | db: Session = Depends(model.get_db), |
| 95 | query: schema.QueryParams = Depends(), | 96 | query: schema.QueryParams = Depends(), |
| 96 | ): | 97 | ): |
| 97 | - return get_distribuciones('municipio_ubigeo', ubigeo_id, 'objeto', query) | 98 | + return get_distribuciones(db, 'municipio_ubigeo', ubigeo_id, 'objeto', query) |
| 98 | 99 | ||
| 99 | 100 | ||
| 100 | @router_entidad.get('/{entity_id:str}/finfuns', response_model=List[schemas.entity.EntidadDistribucion]) | 101 | @router_entidad.get('/{entity_id:str}/finfuns', response_model=List[schemas.entity.EntidadDistribucion]) |
| 101 | def fetch_entity_finfuns( | 102 | def fetch_entity_finfuns( |
| 102 | - entity_id: int, | 103 | + entity_id: str, |
| 103 | db: Session = Depends(model.get_db), | 104 | db: Session = Depends(model.get_db), |
| 104 | query: schema.QueryParams = Depends(), | 105 | query: schema.QueryParams = Depends(), |
| 105 | ): | 106 | ): |
| 106 | - return get_distribuciones('entidad', entidad_id, 'finfun', query) | 107 | + return get_distribuciones(db, 'entidad', entity_id, 'finfun', query) |
| 107 | 108 | ||
| 108 | 109 | ||
| 109 | @router_ubigeo.get('/{ubigeo_id:str}/finfuns', response_model=List[schemas.entity.EntidadDistribucion]) | 110 | @router_ubigeo.get('/{ubigeo_id:str}/finfuns', response_model=List[schemas.entity.EntidadDistribucion]) |
| 110 | def fetch_entity_finfuns( | 111 | def fetch_entity_finfuns( |
| 111 | - ubigeo_id: int, | 112 | + ubigeo_id: str, |
| 112 | db: Session = Depends(model.get_db), | 113 | db: Session = Depends(model.get_db), |
| 113 | query: schema.QueryParams = Depends(), | 114 | query: schema.QueryParams = Depends(), |
| 114 | ): | 115 | ): |
| 115 | - return get_distribuciones('municipio_ubigeo', ubigeo_id, 'finfun', query) | 116 | + return get_distribuciones(db, 'municipio_ubigeo', ubigeo_id, 'finfun', query) |
| 116 | 117 | ||
| 117 | 118 | ||
| 118 | @router_entidad.get('/{entity_id:str}/actecos', response_model=List[schemas.entity.EntidadDistribucion]) | 119 | @router_entidad.get('/{entity_id:str}/actecos', response_model=List[schemas.entity.EntidadDistribucion]) |
| 119 | def fetch_entity_actecos( | 120 | def fetch_entity_actecos( |
| 120 | - entity_id: int, | 121 | + entity_id: str, |
| 121 | db: Session = Depends(model.get_db), | 122 | db: Session = Depends(model.get_db), |
| 122 | query: schema.QueryParams = Depends(), | 123 | query: schema.QueryParams = Depends(), |
| 123 | ): | 124 | ): |
| 124 | - return get_distribuciones('entidad', entidad_id, 'acteco', query) | 125 | + return get_distribuciones(db, 'entidad', entity_id, 'acteco', query) |
| 125 | 126 | ||
| 126 | 127 | ||
| 127 | @router_ubigeo.get('/{ubigeo_id:str}/actecos', response_model=List[schemas.entity.EntidadDistribucion]) | 128 | @router_ubigeo.get('/{ubigeo_id:str}/actecos', response_model=List[schemas.entity.EntidadDistribucion]) |
| 128 | def fetch_entity_actecos( | 129 | def fetch_entity_actecos( |
| 129 | - ubigeo_id: int, | 130 | + ubigeo_id: str, |
| 130 | db: Session = Depends(model.get_db), | 131 | db: Session = Depends(model.get_db), |
| 131 | query: schema.QueryParams = Depends(), | 132 | query: schema.QueryParams = Depends(), |
| 132 | ): | 133 | ): |
| 133 | - return get_distribuciones('municipio_ubigeo', ubigeo_id, 'acteco', query) | 134 | + return get_distribuciones(db, 'municipio_ubigeo', ubigeo_id, 'acteco', query) |
| 134 | 135 | ||
| 135 | 136 | ||
| 136 | ############################################################################### | 137 | ############################################################################### |
| 137 | # private | 138 | # private |
| 138 | ############################################################################### | 139 | ############################################################################### |
| 139 | 140 | ||
| 140 | -def get_distribuciones(tipo_codigo, entidad_id, dimension, query): | 141 | +def get_distribuciones(db, tipo_codigo, entity_id, dimension, query): |
| 142 | + EntidadDistribucionesSchema = schemas.entity.EntidadDistribucion | ||
| 141 | EntidadDistribuciones = models.entity.EntidadDistribuciones | 143 | EntidadDistribuciones = models.entity.EntidadDistribuciones |
| 142 | 144 | ||
| 145 | + schema_fields = EntidadDistribucionesSchema.model_fields.keys() | ||
| 146 | + cols = [getattr(EntidadDistribuciones, name) for name in schema_fields] | ||
| 147 | + | ||
| 143 | filters = [] | 148 | filters = [] |
| 144 | if query.gestion is not None: | 149 | if query.gestion is not None: |
| 145 | filters.append(EntidadDistribuciones.gestion == query.gestion) | 150 | filters.append(EntidadDistribuciones.gestion == query.gestion) |
| 146 | 151 | ||
| 147 | - filters.extend( | 152 | + filters.extend([ |
| 148 | EntidadDistribuciones.tipo_codigo == tipo_codigo, | 153 | EntidadDistribuciones.tipo_codigo == tipo_codigo, |
| 149 | EntidadDistribuciones.codigo == entity_id, | 154 | EntidadDistribuciones.codigo == entity_id, |
| 150 | EntidadDistribuciones.dimension == dimension, | 155 | EntidadDistribuciones.dimension == dimension, |
| 151 | - ) | 156 | + ]) |
| 152 | 157 | ||
| 153 | - return db.query(EntidadDistribuciones).filter(*filters).all() | 158 | + return db.execute( |
| 159 | + select(*cols).where(*filters) | ||
| 160 | + ).mappings().all() | ||
| 154 | 161 | ||
| 155 | 162 | ||
| 156 | -def get_resumen(tipo_codigo, codigo): | 163 | +def get_resumen(db, tipo_codigo, codigo): |
| 157 | EntidadResumenes = models.entity.EntidadResumenes | 164 | EntidadResumenes = models.entity.EntidadResumenes |
| 158 | - return db.query(EntidadResumenes).filter( | 165 | + EntidadResumenSchema = schemas.entity.EntidadResumen |
| 159 | - EntidadResumenes.tipo_codigo == tipo_codigo, | 166 | + |
| 160 | - EntidadResumenes.codigo == codigo, | 167 | + schema_fields = EntidadResumenSchema.model_fields.keys() |
| 168 | + cols = [getattr(EntidadResumenes, name) for name in schema_fields] | ||
| 169 | + | ||
| 170 | + return db.execute( | ||
| 171 | + select(*cols).where( | ||
| 172 | + EntidadResumenes.tipo_codigo == tipo_codigo, | ||
| 173 | + EntidadResumenes.codigo == codigo, | ||
| 174 | + ) | ||
| 161 | ).all() | 175 | ).all() | ... | ... |
| ... | @@ -17,7 +17,8 @@ class SearchQueryParams(BaseModel): | ... | @@ -17,7 +17,8 @@ class SearchQueryParams(BaseModel): |
| 17 | 17 | ||
| 18 | class QueryParams(BaseModel): | 18 | class QueryParams(BaseModel): |
| 19 | id: Optional[str] = Query(default=None) | 19 | id: Optional[str] = Query(default=None) |
| 20 | - gestion: Optional[int] = Query(default=0) | 20 | + gestion: Optional[int] = Query(default=None) |
| 21 | + nivel: Optional[str] = Query(default=None) | ||
| 21 | 22 | ||
| 22 | class DailyParams(BaseModel): | 23 | class DailyParams(BaseModel): |
| 23 | transferencias: Optional[bool] = Query(default=False) | 24 | transferencias: Optional[bool] = Query(default=False) | ... | ... |
| ... | @@ -34,7 +34,6 @@ class ActecoEntidad(OrmBaseModel): | ... | @@ -34,7 +34,6 @@ class ActecoEntidad(OrmBaseModel): |
| 34 | acteco: str | 34 | acteco: str |
| 35 | entidad: int | 35 | entidad: int |
| 36 | nivel: str | None | 36 | nivel: str | None |
| 37 | - entidad_desc: str | None | ||
| 38 | monto: float | None | 37 | monto: float | None |
| 39 | per_capita: float | None | 38 | per_capita: float | None |
| 40 | ranking: int | None | 39 | ranking: int | None | ... | ... |
| ... | @@ -29,11 +29,16 @@ class ClasInstitucional(OrmBaseModel): | ... | @@ -29,11 +29,16 @@ class ClasInstitucional(OrmBaseModel): |
| 29 | n_gestiones: int | None | 29 | n_gestiones: int | None |
| 30 | 30 | ||
| 31 | 31 | ||
| 32 | -def get_clasdesc(name): | 32 | +# def get_clasdesc(name): |
| 33 | - return create_model( | 33 | +# return create_model( |
| 34 | - '_ClasDesc{}'.format(name), | 34 | +# '_ClasDesc{}'.format(name), |
| 35 | - **{'gestion': str, 'desc_{}'.format(name): str}, | 35 | +# **{'gestion': str, 'desc_{}'.format(name): str}, |
| 36 | - ) | 36 | +# ) |
| 37 | + | ||
| 38 | + | ||
| 39 | +class _ClasDesc(OrmBaseModel): | ||
| 40 | + gestion: str | ||
| 41 | + descripcion: str | None | ||
| 37 | 42 | ||
| 38 | class ClasBase(OrmBaseModel): | 43 | class ClasBase(OrmBaseModel): |
| 39 | nivel: str | None | 44 | nivel: str | None |
| ... | @@ -45,19 +50,19 @@ class ClasBase(OrmBaseModel): | ... | @@ -45,19 +50,19 @@ class ClasBase(OrmBaseModel): |
| 45 | class ClasObjetos(ClasBase): | 50 | class ClasObjetos(ClasBase): |
| 46 | objeto: str | 51 | objeto: str |
| 47 | desc_objeto: str | None | 52 | desc_objeto: str | None |
| 48 | - descripciones: list[get_clasdesc('objeto')] | None | 53 | + descripciones: list[_ClasDesc] | None |
| 49 | 54 | ||
| 50 | 55 | ||
| 51 | class ClasFinfun(ClasBase): | 56 | class ClasFinfun(ClasBase): |
| 52 | finfun: str | 57 | finfun: str |
| 53 | desc_finfun: str | None | 58 | desc_finfun: str | None |
| 54 | - descripciones: list[get_clasdesc('finfun')] | None | 59 | + descripciones: list[_ClasDesc] | None |
| 55 | 60 | ||
| 56 | 61 | ||
| 57 | class ClasActeco(ClasBase): | 62 | class ClasActeco(ClasBase): |
| 58 | acteco: str | 63 | acteco: str |
| 59 | desc_acteco: str | None | 64 | desc_acteco: str | None |
| 60 | - descripciones: list[get_clasdesc('acteco')] | None | 65 | + descripciones: list[_ClasDesc] | None |
| 61 | 66 | ||
| 62 | 67 | ||
| 63 | class ClasGeografico(ClasBase): | 68 | class ClasGeografico(ClasBase): |
| ... | @@ -65,7 +70,7 @@ class ClasGeografico(ClasBase): | ... | @@ -65,7 +70,7 @@ class ClasGeografico(ClasBase): |
| 65 | desc_ubigeo: str | None | 70 | desc_ubigeo: str | None |
| 66 | desc_departamento: str | None | 71 | desc_departamento: str | None |
| 67 | municipio_ubigeo: int | None | 72 | municipio_ubigeo: int | None |
| 68 | - descripciones: list[get_clasdesc('ubigeo')] | None | 73 | + descripciones: list[_ClasDesc] | None |
| 69 | 74 | ||
| 70 | 75 | ||
| 71 | # Ingresos | 76 | # Ingresos |
| ... | @@ -90,7 +95,7 @@ class ClasOrganismos(OrmBaseModel): | ... | @@ -90,7 +95,7 @@ class ClasOrganismos(OrmBaseModel): |
| 90 | class ClasRubros(ClasBase): | 95 | class ClasRubros(ClasBase): |
| 91 | rubro: str | 96 | rubro: str |
| 92 | desc_rubro: str | None | 97 | desc_rubro: str | None |
| 93 | - descripciones: list[get_clasdesc('rubro')] | None | 98 | + descripciones: list[_ClasDesc] | None |
| 94 | 99 | ||
| 95 | 100 | ||
| 96 | class ClasFuentes(ClasBase): | 101 | class ClasFuentes(ClasBase): |
| ... | @@ -98,4 +103,4 @@ class ClasFuentes(ClasBase): | ... | @@ -98,4 +103,4 @@ class ClasFuentes(ClasBase): |
| 98 | desc_fuente: str | None | 103 | desc_fuente: str | None |
| 99 | grupo_fuente: str | 104 | grupo_fuente: str |
| 100 | desc_grupo_fuente: str | None | 105 | desc_grupo_fuente: str | None |
| 101 | - descripciones: list[get_clasdesc('fuente')] | None | 106 | + descripciones: list[_ClasDesc] | None | ... | ... |
| ... | @@ -6,9 +6,6 @@ from presupuestov1 import schemas | ... | @@ -6,9 +6,6 @@ from presupuestov1 import schemas |
| 6 | 6 | ||
| 7 | class EntidadDistribucion(OrmBaseModel): | 7 | class EntidadDistribucion(OrmBaseModel): |
| 8 | tipo: str | 8 | tipo: str |
| 9 | - tipo_codigo: str | ||
| 10 | - codigo: str | ||
| 11 | - dimension: str | ||
| 12 | gestion: int | 9 | gestion: int |
| 13 | padre: str | 10 | padre: str |
| 14 | hijo: str | 11 | hijo: str |
| ... | @@ -19,13 +16,9 @@ class EntidadDistribucion(OrmBaseModel): | ... | @@ -19,13 +16,9 @@ class EntidadDistribucion(OrmBaseModel): |
| 19 | 16 | ||
| 20 | class EntidadResumen(OrmBaseModel): | 17 | class EntidadResumen(OrmBaseModel): |
| 21 | tipo: str | 18 | tipo: str |
| 22 | - tipo_codigo: str | ||
| 23 | - codigo: str | ||
| 24 | gestion: int | 19 | gestion: int |
| 25 | devengado: float | 20 | devengado: float |
| 26 | ranking: int | None | 21 | ranking: int | None |
| 27 | - desc: str | None | ||
| 28 | - desc_padre: str | None | ||
| 29 | 22 | ||
| 30 | 23 | ||
| 31 | class ClasInstitucionalIngresosGastos(schemas.classifier.ClasInstitucional): | 24 | class ClasInstitucionalIngresosGastos(schemas.classifier.ClasInstitucional): | ... | ... |
| ... | @@ -41,7 +41,6 @@ class FinfunEntidad(OrmBaseModel): | ... | @@ -41,7 +41,6 @@ class FinfunEntidad(OrmBaseModel): |
| 41 | finfun: str | 41 | finfun: str |
| 42 | entidad: int | 42 | entidad: int |
| 43 | nivel: str | None | 43 | nivel: str | None |
| 44 | - entidad_desc: str | None | ||
| 45 | monto: float | None | 44 | monto: float | None |
| 46 | per_capita: float | None | 45 | per_capita: float | None |
| 47 | ranking: int | None | 46 | ranking: int | None | ... | ... |
| ... | @@ -41,7 +41,6 @@ class ObjetoEntidad(OrmBaseModel): | ... | @@ -41,7 +41,6 @@ class ObjetoEntidad(OrmBaseModel): |
| 41 | objeto: str | 41 | objeto: str |
| 42 | entidad: int | 42 | entidad: int |
| 43 | nivel: str | None | 43 | nivel: str | None |
| 44 | - entidad_desc: str | None | ||
| 45 | monto: float | None | 44 | monto: float | None |
| 46 | per_capita: float | None | 45 | per_capita: float | None |
| 47 | ranking: int | None | 46 | ranking: int | None | ... | ... |
| ... | @@ -23,6 +23,11 @@ class TreemapObjeto(Treemap): | ... | @@ -23,6 +23,11 @@ class TreemapObjeto(Treemap): |
| 23 | desc_objeto: str | None | 23 | desc_objeto: str | None |
| 24 | desc_entidad: str | None | 24 | desc_entidad: str | None |
| 25 | 25 | ||
| 26 | +class TreemapObjetoSingle(Treemap): | ||
| 27 | + objeto: int | ||
| 28 | + parent: int | None | ||
| 29 | + desc_entidad: str | None | ||
| 30 | + | ||
| 26 | 31 | ||
| 27 | class TreemapFinFun(Treemap): | 32 | class TreemapFinFun(Treemap): |
| 28 | finfun: str | 33 | finfun: str |
| ... | @@ -31,8 +36,20 @@ class TreemapFinFun(Treemap): | ... | @@ -31,8 +36,20 @@ class TreemapFinFun(Treemap): |
| 31 | desc_entidad: str | None | 36 | desc_entidad: str | None |
| 32 | 37 | ||
| 33 | 38 | ||
| 39 | +class TreemapFinFunSingle(Treemap): | ||
| 40 | + finfun: str | ||
| 41 | + parent: str | None | ||
| 42 | + desc_entidad: str | None | ||
| 43 | + | ||
| 44 | + | ||
| 34 | class TreemapActeco(Treemap): | 45 | class TreemapActeco(Treemap): |
| 35 | acteco: str | 46 | acteco: str |
| 36 | parent: str | None | 47 | parent: str | None |
| 37 | desc_acteco: str | None | 48 | desc_acteco: str | None |
| 38 | desc_entidad: str | None | 49 | desc_entidad: str | None |
| 50 | + | ||
| 51 | + | ||
| 52 | +class TreemapActecoSingle(Treemap): | ||
| 53 | + acteco: str | ||
| 54 | + parent: str | None | ||
| 55 | + desc_entidad: str | None | ... | ... |
-
Please register or login to post a comment