pr0nstar

first

__pycache__/
*.pyc
File mode changed
import logging
from typing import Any, Union
from fastapi import FastAPI
from fastapi.middleware import Middleware
from starlette.responses import JSONResponse
from starlette.requests import HTTPConnection, Request
from starlette_context import context, plugins
from starlette_context.middleware import RawContextMiddleware
from aiocache import caches
from presupuestov1.routers import (
project
)
logging.basicConfig(
level=logging.INFO,
format='%(asctime)s %(message)s',
filename='log.log',
)
logging.getLogger('api_proy2').setLevel(logging.DEBUG)
app = FastAPI(
title='Jorvi API',
middleware=[
Middleware(
RawContextMiddleware,
plugins=(
plugins.RequestIdPlugin(),
)
)
],
root_path='/api'
)
app.include_router(project.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()
import contextlib
import re
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import relationship as relationship_
SQLALCHEMY_DATABASE_URL = open('./docs/postgres').read().strip()
engine = create_engine(SQLALCHEMY_DATABASE_URL)
SessionLocal = sessionmaker(
autocommit=False,
autoflush=False,
bind=engine,
# pool_size=1,
#max_overflow=5
)
Base = declarative_base()
def get_db():
try:
db = SessionLocal()
yield db
finally:
db.close()
@contextlib.contextmanager
def transaction(session):
if not session.in_transaction():
with session.begin():
yield
else:
yield
session.commit()
def relationship(*args, **kwargs):
if 'passive_deletes' not in kwargs and 'viewonly' not in kwargs:
kwargs['passive_deletes'] = True
return relationship_(*args, **kwargs)
def update_from_schema(model, schema):
for field, field_data in schema.dict().items():
setattr(model, field, field_data)
return model
File mode changed
File mode changed
import time
from typing import List, Any, Optional, Union
from fastapi import APIRouter, Depends, Request, HTTPException, Body
from sqlalchemy.orm import Session
from presupuestov1 import model, schema, constant, schemas, models, search
from aiocache import cached
router = APIRouter(
prefix='/proyecto',
tags=['proyecto'],
)
###############################################################################
# GET
###############################################################################
# @router.get('/{project_id}', response_model=schemas.project.Project)
# def fetch_branch(
# project_id: int,
# db: Session = Depends(model.get_db),
# ):
# return models.project.get_project(db, project_id)
@router.get('/search', response_model=schemas.project.Search)
def fetch_search(
query: schema.QueryParams = Depends(),
):
if query.q is None or len(query.q) < 3:
return []
return do_search(query.q, query.page)
###############################################################################
# GET
###############################################################################
# @cached(ttl=10)
def do_search(query, page):
return search.do_search(query, page)
\ No newline at end of file
import re
from typing import Optional
from pydantic import BaseModel, ConfigDict, Field, root_validator
from fastapi import Query
class OrmBaseModel(BaseModel):
model_config = ConfigDict(from_attributes=True)
class QueryParams(BaseModel):
page: Optional[int] = Query(default=1)
q: Optional[str] = Query(default=None)
from . import (
project
)
from sqlalchemy.orm import Mapped, mapped_column
from presupuestov1.schema import BaseModel
from sqlalchemy import (
Integer,
String,
Text,
Numeric,
Index,
MetaData,
)
class ActecoEstado(BaseModel):
__tablename__ = "finfun_estado"
__table_args__ = (
Index("idx_acteco_estado_acteco", "acteco"),
Index("idx_acteco_estado_acteco_gestion", "acteco", "gestion"),
)
gestion: Mapped[int] = mapped_column(Integer, primary_key=True)
acteco: Mapped[str] = mapped_column(Text, primary_key=True)
total: Mapped[float | None] = mapped_column(Numeric)
poblacion: Mapped[int | None] = mapped_column(Integer)
n_entidades: Mapped[int | None] = mapped_column(Integer)
per_capita: Mapped[float | None] = mapped_column(Numeric)
total_gestion: Mapped[float | None] = mapped_column(Numeric)
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(Integer)
top1_entidad_desc: Mapped[str | None] = mapped_column(Text)
top1_monto: Mapped[float | None] = mapped_column(Numeric)
top1_pct: Mapped[float | None] = mapped_column(Numeric)
top2_entidad: Mapped[int | None] = mapped_column(Integer)
top2_entidad_desc: Mapped[str | None] = mapped_column(Text)
top2_monto: Mapped[float | None] = mapped_column(Numeric)
top2_pct: Mapped[float | None] = mapped_column(Numeric)
top3_entidad: Mapped[int | None] = mapped_column(Integer)
top3_entidad_desc: Mapped[str | None] = mapped_column(Text)
top3_monto: Mapped[float | None] = mapped_column(Numeric)
top3_pct: Mapped[float | None] = mapped_column(Numeric)
class ActecoEntidad(BaseModel):
__tablename__ = "acteco_entidad"
__table_args__ = (
Index("idx_finfun_entidad_acteco", "acteco"),
Index("idx_finfun_entidad_acteco_entidad", "acteco", "entidad"),
)
gestion: Mapped[int] = mapped_column(Integer, primary_key=True)
acteco: Mapped[str] = mapped_column(Text, primary_key=True)
entidad: Mapped[int] = mapped_column(Integer, primary_key=True)
nivel: Mapped[str | None] = mapped_column(Text)
entidad_desc: Mapped[str | None] = mapped_column(Text)
monto: Mapped[float | None] = mapped_column(Numeric)
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
from sqlalchemy.orm import Mapped, mapped_column
from presupuestov1.schema import BaseModel
from sqlalchemy import (
Integer,
String,
Text,
Numeric,
Index,
MetaData,
)
from sqlalchemy.dialects.postgresql import JSONB
class ClasInstitucional(BaseModel):
__tablename__ = "clas_institucional"
entidad: Mapped[int] = mapped_column(Integer, primary_key=True)
desc_entidad: Mapped[str | None] = mapped_column(Text)
sigla_entidad: Mapped[str | None] = mapped_column(String(50))
sector: Mapped[str | None] = mapped_column(String(10))
desc_sector: Mapped[str | None] = mapped_column(Text)
sigla_sector: Mapped[str | None] = mapped_column(String(20))
subsector: Mapped[str | None] = mapped_column(String(10))
desc_subsector: Mapped[str | None] = mapped_column(Text)
sigla_subsector: Mapped[str | None] = mapped_column(String(20))
area: Mapped[str | None] = mapped_column(String(10))
desc_area: Mapped[str | None] = mapped_column(Text)
sigla_area: Mapped[str | None] = mapped_column(String(20))
subarea: Mapped[str | None] = mapped_column(String(10))
desc_subarea: Mapped[str | None] = mapped_column(Text)
sigla_subarea: Mapped[str | None] = mapped_column(String(20))
gestiones: Mapped[str | None] = mapped_column(Text)
n_gestiones: Mapped[int | None] = mapped_column(Integer)
class ClasObjetos(Base):
__tablename__ = "clas_objetos"
nivel: Mapped[str | None] = mapped_column(Text)
objeto: Mapped[str] = mapped_column(Text, primary_key=True)
desc_objeto: Mapped[str | None] = mapped_column(Text)
gestiones: Mapped[str | None] = mapped_column(Text)
n_gestiones: Mapped[int | None] = mapped_column(Integer)
n_variaciones: Mapped[int | None] = mapped_column(Integer)
descripciones: Mapped[list[dict[str, Any]] | None] = mapped_column(JSONB)
class ClasRubros(Base):
__tablename__ = "clas_rubros"
nivel: Mapped[str | None] = mapped_column(Text)
rubro: Mapped[str] = mapped_column(Text, primary_key=True)
desc_rubro: Mapped[str | None] = mapped_column(Text)
gestiones: Mapped[str | None] = mapped_column(Text)
n_gestiones: Mapped[int | None] = mapped_column(Integer)
n_variaciones: Mapped[int | None] = mapped_column(Integer)
descripciones: Mapped[list[dict[str, Any]] | None] = mapped_column(JSONB)
class ClasFinfun(Base):
__tablename__ = "clas_finfun"
nivel: Mapped[str | None] = mapped_column(Text)
finfun: Mapped[str] = mapped_column(Text, primary_key=True)
desc_finfun: Mapped[str | None] = mapped_column(Text)
gestiones: Mapped[str | None] = mapped_column(Text)
n_gestiones: Mapped[int | None] = mapped_column(Integer)
n_variaciones: Mapped[int | None] = mapped_column(Integer)
descripciones: Mapped[list[dict[str, Any]] | None] = mapped_column(JSONB)
from sqlalchemy.orm import Mapped, mapped_column
from presupuestov1.schema import BaseModel
from sqlalchemy import (
Integer,
String,
Text,
Numeric,
Index,
MetaData,
)
class EntidadesPorFinfun(BaseModel):
__tablename__ = "entidades_por_finfun"
__table_args__ = (
Index("idx_entidades_por_finfun_finfun", "finfun"),
Index("idx_entidades_por_finfun_finfun_nivel", "finfun", "nivel"),
)
finfun: Mapped[str] = mapped_column(Text, primary_key=True)
entidad: Mapped[int] = mapped_column(Integer, primary_key=True)
nivel: Mapped[str] = mapped_column(Text, primary_key=True)
entidad_desc: Mapped[str | None] = mapped_column(Text)
class FinfunEstado(BaseModel):
__tablename__ = "finfun_estado"
__table_args__ = (
Index("idx_finfun_estado_finfun", "finfun"),
Index("idx_finfun_estado_finfun_gestion", "finfun", "gestion"),
)
gestion: Mapped[int] = mapped_column(Integer, primary_key=True)
finfun: Mapped[str] = mapped_column(Text, primary_key=True)
total: Mapped[float | None] = mapped_column(Numeric)
poblacion: Mapped[int | None] = mapped_column(Integer)
n_entidades: Mapped[int | None] = mapped_column(Integer)
per_capita: Mapped[float | None] = mapped_column(Numeric)
total_gestion: Mapped[float | None] = mapped_column(Numeric)
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(Integer)
top1_entidad_desc: Mapped[str | None] = mapped_column(Text)
top1_monto: Mapped[float | None] = mapped_column(Numeric)
top1_pct: Mapped[float | None] = mapped_column(Numeric)
top2_entidad: Mapped[int | None] = mapped_column(Integer)
top2_entidad_desc: Mapped[str | None] = mapped_column(Text)
top2_monto: Mapped[float | None] = mapped_column(Numeric)
top2_pct: Mapped[float | None] = mapped_column(Numeric)
top3_entidad: Mapped[int | None] = mapped_column(Integer)
top3_entidad_desc: Mapped[str | None] = mapped_column(Text)
top3_monto: Mapped[float | None] = mapped_column(Numeric)
top3_pct: Mapped[float | None] = mapped_column(Numeric)
class FinfunEntidad(BaseModel):
__tablename__ = "finfun_entidad"
__table_args__ = (
Index("idx_finfun_entidad_finfun", "finfun"),
Index("idx_finfun_entidad_finfun_entidad", "finfun", "entidad"),
)
gestion: Mapped[int] = mapped_column(Integer, primary_key=True)
finfun: Mapped[str] = mapped_column(Text, primary_key=True)
entidad: Mapped[int] = mapped_column(Integer, primary_key=True)
nivel: Mapped[str | None] = mapped_column(Text)
entidad_desc: Mapped[str | None] = mapped_column(Text)
monto: Mapped[float | None] = mapped_column(Numeric)
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
from sqlalchemy.orm import Mapped, mapped_column
from presupuestov1.schema import BaseModel
from sqlalchemy import (
Integer,
String,
Text,
Numeric,
Index,
MetaData,
)
class EntidadesPorObjeto(BaseModel):
__tablename__ = "entidades_por_objeto"
__table_args__ = (
Index("idx_entidades_por_objeto_objeto", "objeto"),
Index("idx_entidades_por_objeto_objeto_nivel", "objeto", "nivel"),
)
entidad: Mapped[int] = mapped_column(Integer, primary_key=True)
objeto: Mapped[int] = mapped_column(Integer, primary_key=True)
nivel: Mapped[str] = mapped_column(String(20), primary_key=True)
entidad_desc: Mapped[str | None] = mapped_column(Text)
class ObjetoEstado(BaseModel):
__tablename__ = "objeto_estado"
__table_args__ = (
Index("idx_objeto_estado_objeto", "objeto"),
Index("idx_objeto_estado_objeto_gestion", "objeto", "gestion"),
)
gestion: Mapped[int] = mapped_column(Integer, primary_key=True)
objeto: Mapped[str] = mapped_column(Text, primary_key=True)
total: Mapped[float | None] = mapped_column(Numeric)
poblacion: Mapped[int | None] = mapped_column(Integer)
n_entidades: Mapped[int | None] = mapped_column(Integer)
per_capita: Mapped[float | None] = mapped_column(Numeric)
total_gestion: Mapped[float | None] = mapped_column(Numeric)
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(Integer)
top1_entidad_desc: Mapped[str | None] = mapped_column(Text)
top1_monto: Mapped[float | None] = mapped_column(Numeric)
top1_pct: Mapped[float | None] = mapped_column(Numeric)
top2_entidad: Mapped[int | None] = mapped_column(Integer)
top2_entidad_desc: Mapped[str | None] = mapped_column(Text)
top2_monto: Mapped[float | None] = mapped_column(Numeric)
top2_pct: Mapped[float | None] = mapped_column(Numeric)
top3_entidad: Mapped[int | None] = mapped_column(Integer)
top3_entidad_desc: Mapped[str | None] = mapped_column(Text)
top3_monto: Mapped[float | None] = mapped_column(Numeric)
top3_pct: Mapped[float | None] = mapped_column(Numeric)
class ObjetoEntidad(BaseModel):
__tablename__ = "objeto_entidad"
__table_args__ = (
Index("idx_finfun_entidad_objeto", "objeto"),
Index("idx_finfun_entidad_objeto_entidad", "objeto", "entidad"),
)
gestion: Mapped[int] = mapped_column(Integer, primary_key=True)
objeto: Mapped[str] = mapped_column(Text, primary_key=True)
entidad: Mapped[int] = mapped_column(Integer, primary_key=True)
nivel: Mapped[str | None] = mapped_column(Text)
entidad_desc: Mapped[str | None] = mapped_column(Text)
monto: Mapped[float | None] = mapped_column(Numeric)
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
from typing import List, Any, Dict
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
class SearchHitHighlight(BaseModel):
field: str
matched_tokens: List[str]
snippet: str
class SearchHits(BaseModel):
document: ProjectSearch
highlights: List[SearchHitHighlight]
class SearchFacet_(BaseModel):
value: str
count: int
class SearchFacet(BaseModel):
counts: List[SearchFacet_]
field_name: str
class Search(BaseModel):
facet_counts: List[SearchFacet]
found: int
out_of: int
page: int
search_time_ms: int
hits: List[SearchHits]
\ No newline at end of file
from sqlalchemy.orm import Mapped, mapped_column
from presupuestov1.schema import BaseModel
from sqlalchemy import (
Integer,
String,
Text,
Numeric,
Index,
MetaData,
)
class TreemapObjeto(BaseModel):
__tablename__ = "treemap_objeto"
__table_args__ = (
Index("idx_treemap_objeto_gestion_entidad", "gestion", "entidad"),
)
# PK compuesta inferida para uso ORM
gestion: Mapped[int] = mapped_column(Integer, primary_key=True)
entidad: Mapped[int] = mapped_column(Integer, primary_key=True)
nivel: Mapped[str] = mapped_column(String(20), primary_key=True)
objeto: Mapped[int] = mapped_column(Integer, primary_key=True)
desc_objeto: Mapped[str | None] = mapped_column(Text)
parent: Mapped[int | None] = mapped_column(Integer)
devengado: Mapped[float | None] = mapped_column(Numeric)
class TreemapFinFun(BaseModel):
__tablename__ = "treemap_finfun"
__table_args__ = (
Index("idx_treemap_finfun_gestion_entidad", "gestion", "entidad"),
)
# PK compuesta inferida para uso ORM
gestion: Mapped[int] = mapped_column(Integer, primary_key=True)
entidad: Mapped[int] = mapped_column(Integer, primary_key=True)
nivel: Mapped[str] = mapped_column(String(20), primary_key=True)
finfun: Mapped[int] = mapped_column(String(9), primary_key=True)
desc_finfun: Mapped[str | None] = mapped_column(Text)
parent: Mapped[int | None] = mapped_column(Integer)
devengado: Mapped[float | None] = mapped_column(Numeric)
class TreemapActeco(BaseModel):
__tablename__ = "treemap_acteco"
__table_args__ = (
Index("idx_treemap_acteco_gestion_entidad", "gestion", "entidad"),
)
# PK compuesta inferida para uso ORM
gestion: Mapped[int] = mapped_column(Integer, primary_key=True)
entidad: Mapped[int] = mapped_column(Integer, primary_key=True)
nivel: Mapped[str] = mapped_column(String(20), primary_key=True)
acteco: Mapped[int] = mapped_column(String(9), primary_key=True)
desc_actividad: Mapped[str | None] = mapped_column(Text)
parent: Mapped[int | None] = mapped_column(Integer)
devengado: Mapped[float | None] = mapped_column(Numeric)
\ No newline at end of file
import typesense
TYPESENSE_API = open('./docs/typesense').read().strip()
client = typesense.Client({
'api_key': TYPESENSE_API,
'nodes': [{
'host': 'localhost',
'port': '8108',
'protocol': 'http'
}],
'connection_timeout_seconds': 2
})
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'},
],
'default_sorting_field': 'devengado',
}
search_parameters = {
"q": "cuba",
"query_by": "desc_actividad_proyecto,desc_programa",
"facet_by": "gestion",
"sort_by": "devengado:desc",
"per_page": 20,
}
def do_search(query, page):
search_parameters_ = search_parameters.copy()
search_parameters_['q'] = query
if (page is not None) and (page > 0):
search_parameters_['page'] = page
return client.collections[COLLECTION].documents.search(
search_parameters_
)
\ No newline at end of file