pr0nstar

IV

......@@ -13,7 +13,8 @@ from starlette_context.middleware import RawContextMiddleware
from aiocache import caches
from presupuestov1.routers import (
project
project,
entity
)
......@@ -38,6 +39,7 @@ app = FastAPI(
root_path='/api'
)
app.include_router(project.router)
app.include_router(entity.router)
@app.on_event('startup')
......
......@@ -18,6 +18,7 @@ class ActecoEstado(Base):
Index("idx_acteco_estado_gestion", "gestion"),
Index("idx_acteco_estado_acteco", "acteco"),
Index("idx_acteco_estado_acteco_gestion", "acteco", "gestion"),
{"schema": "web"},
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
......@@ -56,6 +57,7 @@ class ActecoEntidad(Base):
Index("idx_acteco_entidad_gestion", "gestion"),
Index("idx_acteco_entidad_acteco", "acteco"),
Index("idx_acteco_entidad_acteco_entidad", "acteco", "entidad"),
{"schema": "web"},
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
......
......@@ -18,6 +18,7 @@ class ClasInstitucional(Base):
__tablename__ = "clas_institucional"
__table_args__ = (
Index("idx_clas_institucional_entidad", "entidad"),
{"schema": "web"},
)
entidad: Mapped[int] = mapped_column(Integer, primary_key=True)
......@@ -48,6 +49,7 @@ class ClasObjetos(Base):
__tablename__ = "clas_objetos"
__table_args__ = (
Index("idx_clas_objetos_entidad", "objeto"),
{"schema": "web"},
)
nivel: Mapped[str | None] = mapped_column(Text)
......@@ -65,6 +67,7 @@ class ClasRubros(Base):
__tablename__ = "clas_rubros"
__table_args__ = (
Index("idx_clas_rubros_entidad", "rubro"),
{"schema": "web"},
)
nivel: Mapped[str | None] = mapped_column(Text)
......@@ -82,6 +85,7 @@ class ClasFinfun(Base):
__tablename__ = "clas_finfun"
__table_args__ = (
Index("idx_clas_finfun_entidad", "finfun"),
{"schema": "web"},
)
nivel: Mapped[str | None] = mapped_column(Text)
......@@ -99,6 +103,7 @@ class ClasActeco(Base):
__tablename__ = "clas_acteco"
__table_args__ = (
Index("idx_clas_acteco_entidad", "acteco"),
{"schema": "web"},
)
nivel: Mapped[str | None] = mapped_column(Text)
......
......@@ -16,6 +16,7 @@ class EntidadesPorFinfun(Base):
__table_args__ = (
Index("idx_entidades_por_finfun_finfun", "finfun"),
Index("idx_entidades_por_finfun_finfun_nivel", "finfun", "nivel"),
{"schema": "web"},
)
finfun: Mapped[str] = mapped_column(Text, primary_key=True)
......@@ -31,6 +32,7 @@ class FinfunEstado(Base):
Index("idx_finfun_estado_gestion", "gestion"),
Index("idx_finfun_estado_finfun", "finfun"),
Index("idx_finfun_estado_finfun_gestion", "finfun", "gestion"),
{"schema": "web"},
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
......@@ -69,6 +71,7 @@ class FinfunEntidad(Base):
Index("idx_finfun_entidad_gestion", "gestion"),
Index("idx_finfun_entidad_finfun", "finfun"),
Index("idx_finfun_entidad_finfun_entidad", "finfun", "entidad"),
{"schema": "web"},
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
......
......@@ -16,6 +16,7 @@ class EntidadesPorObjeto(Base):
__table_args__ = (
Index("idx_entidades_por_objeto_objeto", "objeto"),
Index("idx_entidades_por_objeto_objeto_nivel", "objeto", "nivel"),
{"schema": "web"},
)
entidad: Mapped[int] = mapped_column(Integer, primary_key=True)
......@@ -31,6 +32,7 @@ class ObjetoEstado(Base):
Index("idx_objeto_estado_gestion", "gestion"),
Index("idx_objeto_estado_objeto", "objeto"),
Index("idx_objeto_estado_objeto_gestion", "objeto", "gestion"),
{"schema": "web"},
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
......@@ -70,6 +72,7 @@ class ObjetoEntidad(Base):
Index("idx_objeto_entidad_gestion", "gestion"),
Index("idx_objeto_entidad_objeto", "objeto"),
Index("idx_objeto_entidad_objeto_entidad", "objeto", "entidad"),
{"schema": "web"},
)
id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
......
......@@ -16,6 +16,7 @@ class TreemapObjeto(Base):
__table_args__ = (
Index("idx_treemap_objeto_gestion_entidad", "gestion", "entidad"),
Index("idx_treemap_objeto_nivel", "nivel"),
{"schema": "web"},
)
# PK compuesta inferida para uso ORM
......@@ -36,6 +37,7 @@ class TreemapFinFun(Base):
__table_args__ = (
Index("idx_treemap_finfun_gestion_entidad", "gestion", "entidad"),
Index("idx_treemap_finfun_nivel", "nivel"),
{"schema": "web"},
)
# PK compuesta inferida para uso ORM
......@@ -56,6 +58,7 @@ class TreemapActeco(Base):
__table_args__ = (
Index("idx_treemap_acteco_gestion_entidad", "gestion", "entidad"),
Index("idx_treemap_acteco_nivel", "nivel"),
{"schema": "web"},
)
# PK compuesta inferida para uso ORM
......
......@@ -21,7 +21,7 @@ router = APIRouter(
# GET
###############################################################################
@router.get('/{entity_id}', response_model=schemas.classifier.ClasInstitucional)
@router.get('/{entity_id:int}', response_model=schemas.classifier.ClasInstitucional)
def fetch_entity(
entity_id: int,
db: Session = Depends(model.get_db),
......@@ -39,8 +39,8 @@ def fetch_classifier(
return db.query(models.classifier.ClasInstitucional).all()
@router.get('/{entity_id}/objetos', response_model=List[schemas.treemap.TreemapObjeto])
def fetch_entity(
@router.get('/{entity_id:int}/objetos', response_model=List[schemas.treemap.TreemapObjeto])
def fetch_entity_objetos(
entity_id: int,
db: Session = Depends(model.get_db),
query: schema.QueryParams = Depends(),
......@@ -49,8 +49,8 @@ def fetch_entity(
return get_entity_connections(entity_id, db, query, TreemapObjeto, 'objeto')
router.get('/{entity_id}/finfuns', response_model=List[schemas.treemap.TreemapFinfun])
def fetch_entity(
router.get('/{entity_id:int}/finfuns', response_model=List[schemas.treemap.TreemapFinFun])
def fetch_entity_finfuns(
entity_id: int,
db: Session = Depends(model.get_db),
query: schema.QueryParams = Depends(),
......@@ -59,8 +59,8 @@ def fetch_entity(
return get_entity_connections(entity_id, db, query, TreemapFinFun, 'finfun')
@router.get('/{entity_id}/actecos', response_model=List[schemas.treemap.TreemapActeco])
def fetch_entity(
@router.get('/{entity_id:int}/actecos', response_model=List[schemas.treemap.TreemapActeco])
def fetch_entity_actecos(
entity_id: int,
db: Session = Depends(model.get_db),
query: schema.QueryParams = Depends(),
......@@ -82,6 +82,8 @@ def get_entity_connections(entity_id, db, query, ClassObject, object_id):
ClassObject.gestion == query.gestion,
]
print(query.id is not None)
if query.id is not None:
ids = query.id.split(',')
ids = [int(_.strip()) for _ in ids]
......
......@@ -33,10 +33,10 @@ router = APIRouter(
def fetch_search(
query: schema.SearchQueryParams = Depends(),
):
if query.q is None or len(query.q) < 3:
if query.q is None or len(query.q.strip()) < 3:
return []
return do_search(query.q, query.page)
return do_search(query.q, query.page, query.is_class)
###############################################################################
......@@ -44,5 +44,5 @@ def fetch_search(
###############################################################################
# @cached(ttl=10)
def do_search(query, page):
return search.do_search(query, page)
\ No newline at end of file
def do_search(query, page, is_class):
return search.do_search(query, page, is_class)
\ No newline at end of file
......
......@@ -12,6 +12,7 @@ class OrmBaseModel(BaseModel):
class SearchQueryParams(BaseModel):
page: Optional[int] = Query(default=1)
q: Optional[str] = Query(default=None)
is_class: Optional[bool] = Query(default=None)
class QueryParams(BaseModel):
id: Optional[str] = Query(default=None)
......
......@@ -7,18 +7,23 @@ class ClasInstitucional(OrmBaseModel):
entidad: int
desc_entidad: str | None
sigla_entidad: str | None
sector: str | None
desc_sector: str | None
sigla_sector: str | None
subsector: str | None
desc_subsector: str | None
sigla_subsector: str | None
area: str | None
desc_area: str | None
sigla_area: str | None
subarea: str | None
desc_subarea: str | None
sigla_subarea: str | None
gestiones: str | None
n_gestiones: int | None
......
......@@ -5,13 +5,10 @@ from presupuestov1.schema import BaseModel
class ProjectSearch(BaseModel):
gestion: int
entidad: int
programa: int
proyecto: str
actividad: int
desc_programa: str
desc_actividad_proyecto: str
devengado: float
is_class: bool
texto: str
metadatos: str
class SearchHitHighlight(BaseModel):
......
......@@ -4,8 +4,8 @@ from presupuestov1.schema import OrmBaseModel
class TreemapObjeto(OrmBaseModel):
gestion: int
entidad: int
nivel: str
objeto: int
nivel: str | None
desc_objeto: str | None
parent: int | None
devengado: float | None
......@@ -14,8 +14,8 @@ class TreemapObjeto(OrmBaseModel):
class TreemapFinFun(OrmBaseModel):
gestion: int
entidad: int
nivel: str
finfun: int
nivel: str | None
desc_finfun: str | None
parent: int | None
devengado: float | None
......@@ -24,8 +24,8 @@ class TreemapFinFun(OrmBaseModel):
class TreemapActeco(OrmBaseModel):
gestion: int
entidad: int
nivel: str
acteco: int
nivel: str | None
desc_actividad: str | None
parent: int | None
devengado: float | None
......
......@@ -15,32 +15,38 @@ COLLECTION = 'presup_actpro_fts'
schema = {
'name': COLLECTION,
'fields': [
{'name': 'index', 'type': 'int32'},
{'name': 'gestion', 'type': 'int32', 'facet': True},
{'name': 'entidad', 'type': 'int32',},
{'name': 'programa', 'type': 'int32',},
{'name': 'proyecto', 'type': 'string',},
{'name': 'actividad', 'type': 'int32',},
{'name': 'desc_actividad_proyecto', 'type': 'string'},
{'name': 'devengado', 'type': 'float'},
{'name': 'is_class', 'type': 'bool'},
{'name': 'texto', 'type': 'string'},
{'name': 'metadatos', 'type': 'string'},
],
'default_sorting_field': 'devengado',
}
search_parameters = {
"q": "cuba",
"query_by": "desc_actividad_proyecto,desc_programa",
"facet_by": "gestion",
"query_by": "texto",
# "facet_by": "gestion",
"sort_by": "devengado:desc",
"per_page": 20,
}
def do_search(query, page):
def do_search(query, page, is_class):
search_parameters_ = search_parameters.copy()
search_parameters_['q'] = query
if is_class is not None:
filter_c = ''
if is_class:
filter_c = 'is_class:true'
else:
filter_c = 'is_class:false'
search_parameters_['filter_by'] = filter_c
if (page is not None) and (page > 0):
search_parameters_['page'] = page
......