pr0nstar

XIV

...@@ -8,12 +8,12 @@ from aiocache import Cache ...@@ -8,12 +8,12 @@ from aiocache import Cache
8 8
9 REDIS_CONN = open('./docs/redis').read().strip() 9 REDIS_CONN = open('./docs/redis').read().strip()
10 REDIS_CONN = REDIS_CONN.split(':') 10 REDIS_CONN = REDIS_CONN.split(':')
11 -# cache = Cache( 11 +cache = Cache(
12 -# Cache.REDIS, 12 + Cache.REDIS,
13 -# endpoint=REDIS_CONN[0], port=REDIS_CONN[1], 13 + endpoint=REDIS_CONN[0], port=REDIS_CONN[1],
14 -# namespace="httpcache" 14 + namespace='httpcache'
15 -# ) 15 +)
16 -cache = Cache() 16 +# cache = Cache()
17 17
18 18
19 def patched_generate_cache_key(url, method, headers, varying_headers, cache): 19 def patched_generate_cache_key(url, method, headers, varying_headers, cache):
......
...@@ -63,7 +63,7 @@ app.include_router(daily.router) ...@@ -63,7 +63,7 @@ app.include_router(daily.router)
63 app.include_router(search.router) 63 app.include_router(search.router)
64 app.include_router(private_metrics.router) 64 app.include_router(private_metrics.router)
65 65
66 -# metrics.install(app) 66 +metrics.install(app)
67 67
68 68
69 # @app.on_event('startup') 69 # @app.on_event('startup')
......
...@@ -385,14 +385,14 @@ def get_header_value(headers, key): ...@@ -385,14 +385,14 @@ def get_header_value(headers, key):
385 385
386 386
387 def get_client_ip(headers): 387 def get_client_ip(headers):
388 - forwarded_for = get_header_value(headers, b"x-forwarded-for")
389 - if forwarded_for:
390 - return forwarded_for.split(",", 1)[0].strip()
391 -
392 real_ip = get_header_value(headers, b"x-real-ip") 388 real_ip = get_header_value(headers, b"x-real-ip")
393 if real_ip: 389 if real_ip:
394 return real_ip.strip() 390 return real_ip.strip()
395 391
392 + forwarded_for = get_header_value(headers, b"x-forwarded-for")
393 + if forwarded_for:
394 + return forwarded_for.split(",", 1)[0].strip()
395 +
396 return None 396 return None
397 397
398 398
......
...@@ -143,15 +143,15 @@ class ClasOrganismos(Base): ...@@ -143,15 +143,15 @@ class ClasOrganismos(Base):
143 {"schema": "web"}, 143 {"schema": "web"},
144 ) 144 )
145 145
146 - organismo: Mapped[int] = mapped_column(Integer, primary_key=True) 146 + organismo: Mapped[str] = mapped_column(String(16), primary_key=True)
147 desc_organismo: Mapped[str] = mapped_column(Text) 147 desc_organismo: Mapped[str] = mapped_column(Text)
148 sigla_organismo: Mapped[str] = mapped_column(String(20)) 148 sigla_organismo: Mapped[str] = mapped_column(String(20))
149 149
150 - organismo_grupo: Mapped[int] = mapped_column(Integer) 150 + organismo_grupo: Mapped[str] = mapped_column(String(8))
151 desc_organismo_grupo: Mapped[str] = mapped_column(Text) 151 desc_organismo_grupo: Mapped[str] = mapped_column(Text)
152 sigla_organismo_grupo: Mapped[str] = mapped_column(String(20)) 152 sigla_organismo_grupo: Mapped[str] = mapped_column(String(20))
153 153
154 - organismo_subgrupo: Mapped[int] = mapped_column(Integer) 154 + organismo_subgrupo: Mapped[str] = mapped_column(String(4))
155 desc_organismo_subgrupo: Mapped[str] = mapped_column(Text) 155 desc_organismo_subgrupo: Mapped[str] = mapped_column(Text)
156 sigla_organismo_subgrupo: Mapped[str] = mapped_column(String(20)) 156 sigla_organismo_subgrupo: Mapped[str] = mapped_column(String(20))
157 157
......
...@@ -27,6 +27,7 @@ class TreemapObjeto(Base): ...@@ -27,6 +27,7 @@ class TreemapObjeto(Base):
27 27
28 gestion: Mapped[int] = mapped_column(Integer) 28 gestion: Mapped[int] = mapped_column(Integer)
29 entidad_area: Mapped[str | None] = mapped_column(String(9)) 29 entidad_area: Mapped[str | None] = mapped_column(String(9))
30 + desc_entidad_area: Mapped[str | None] = mapped_column(Text)
30 entidad: Mapped[int] = mapped_column(Integer) 31 entidad: Mapped[int] = mapped_column(Integer)
31 objeto: Mapped[int] = mapped_column(Integer) 32 objeto: Mapped[int] = mapped_column(Integer)
32 nivel: Mapped[str | None] = mapped_column(String(20)) 33 nivel: Mapped[str | None] = mapped_column(String(20))
...@@ -53,6 +54,7 @@ class TreemapFinFun(Base): ...@@ -53,6 +54,7 @@ class TreemapFinFun(Base):
53 54
54 gestion: Mapped[int] = mapped_column(Integer) 55 gestion: Mapped[int] = mapped_column(Integer)
55 entidad_area: Mapped[str | None] = mapped_column(String(9)) 56 entidad_area: Mapped[str | None] = mapped_column(String(9))
57 + desc_entidad_area: Mapped[str | None] = mapped_column(Text)
56 entidad: Mapped[int] = mapped_column(Integer) 58 entidad: Mapped[int] = mapped_column(Integer)
57 finfun: Mapped[str] = mapped_column(String(9)) 59 finfun: Mapped[str] = mapped_column(String(9))
58 nivel: Mapped[str | None] = mapped_column(String(20)) 60 nivel: Mapped[str | None] = mapped_column(String(20))
...@@ -79,6 +81,7 @@ class TreemapActeco(Base): ...@@ -79,6 +81,7 @@ class TreemapActeco(Base):
79 81
80 gestion: Mapped[int] = mapped_column(Integer) 82 gestion: Mapped[int] = mapped_column(Integer)
81 entidad_area: Mapped[str | None] = mapped_column(String(9)) 83 entidad_area: Mapped[str | None] = mapped_column(String(9))
84 + desc_entidad_area: Mapped[str | None] = mapped_column(Text)
82 entidad: Mapped[int] = mapped_column(Integer) 85 entidad: Mapped[int] = mapped_column(Integer)
83 acteco: Mapped[str] = mapped_column(String(9)) 86 acteco: Mapped[str] = mapped_column(String(9))
84 nivel: Mapped[str | None] = mapped_column(String(20)) 87 nivel: Mapped[str | None] = mapped_column(String(20))
...@@ -105,6 +108,7 @@ class TreemapRubro(Base): ...@@ -105,6 +108,7 @@ class TreemapRubro(Base):
105 108
106 gestion: Mapped[int] = mapped_column(Integer) 109 gestion: Mapped[int] = mapped_column(Integer)
107 entidad_area: Mapped[str | None] = mapped_column(String(9)) 110 entidad_area: Mapped[str | None] = mapped_column(String(9))
111 + desc_entidad_area: Mapped[str | None] = mapped_column(Text)
108 entidad: Mapped[int] = mapped_column(Integer) 112 entidad: Mapped[int] = mapped_column(Integer)
109 rubro: Mapped[str] = mapped_column(String(9)) 113 rubro: Mapped[str] = mapped_column(String(9))
110 nivel: Mapped[str | None] = mapped_column(String(20)) 114 nivel: Mapped[str | None] = mapped_column(String(20))
...@@ -116,6 +120,33 @@ class TreemapRubro(Base): ...@@ -116,6 +120,33 @@ class TreemapRubro(Base):
116 desc_rubro: Mapped[str | None] = mapped_column(Text) 120 desc_rubro: Mapped[str | None] = mapped_column(Text)
117 121
118 122
123 +class TreemapOrganismo(Base):
124 + __tablename__ = "treemap_organismo"
125 + __table_args__ = (
126 + Index("idx_treemap_rubro_organismo", "organismo"),
127 + Index("idx_treemap_organismo_organismo_gestion", "organismo", "gestion"),
128 + Index("idx_treemap_organismo_gestion_entidad", "gestion", "entidad"),
129 + Index("idx_treemap_organismo_nivel", "nivel"),
130 + {"schema": "web"},
131 + )
132 +
133 + # PK compuesta inferida para uso ORM
134 + id: Mapped[int] = mapped_column(Integer, primary_key=True, autoincrement=True)
135 +
136 + gestion: Mapped[int] = mapped_column(Integer)
137 + entidad_area: Mapped[str | None] = mapped_column(String(9))
138 + desc_entidad_area: Mapped[str | None] = mapped_column(Text)
139 + entidad: Mapped[int] = mapped_column(Integer)
140 + organismo: Mapped[str] = mapped_column(String(9))
141 + nivel: Mapped[str | None] = mapped_column(String(20))
142 +
143 + parent: Mapped[str | None] = mapped_column(String(9))
144 + devengado: Mapped[float | None] = mapped_column(Numeric(30, 15))
145 +
146 + desc_entidad: Mapped[str | None] = mapped_column(Text)
147 + desc_organismo: Mapped[str | None] = mapped_column(Text)
148 +
149 +
119 ############################################################################### 150 ###############################################################################
120 # fns 151 # fns
121 ############################################################################### 152 ###############################################################################
......
...@@ -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_, select 7 +from sqlalchemy import and_, or_, select, text
8 8
9 from presupuestov1 import model, schema, constant, schemas, models, search 9 from presupuestov1 import model, schema, constant, schemas, models, search
10 from presupuestov1.routers._decorators import not_found 10 from presupuestov1.routers._decorators import not_found
......
...@@ -2,7 +2,7 @@ from typing import List ...@@ -2,7 +2,7 @@ from typing import List
2 2
3 from fastapi import APIRouter, Depends 3 from fastapi import APIRouter, Depends
4 from sqlalchemy.orm import Session, aliased 4 from sqlalchemy.orm import Session, aliased
5 -from sqlalchemy import func 5 +from sqlalchemy import func, select
6 6
7 from presupuestov1 import model, schema, schemas, models 7 from presupuestov1 import model, schema, schemas, models
8 from presupuestov1.routers._decorators import not_found 8 from presupuestov1.routers._decorators import not_found
......
...@@ -76,15 +76,15 @@ class ClasGeografico(ClasBase): ...@@ -76,15 +76,15 @@ class ClasGeografico(ClasBase):
76 # Ingresos 76 # Ingresos
77 77
78 class ClasOrganismos(OrmBaseModel): 78 class ClasOrganismos(OrmBaseModel):
79 - organismo: int 79 + organismo: str
80 desc_organismo: str | None 80 desc_organismo: str | None
81 sigla_organismo: str | None 81 sigla_organismo: str | None
82 82
83 - organismo_grupo: int | None 83 + organismo_grupo: str | None
84 desc_organismo_grupo: str | None 84 desc_organismo_grupo: str | None
85 sigla_organismo_grupo: str | None 85 sigla_organismo_grupo: str | None
86 86
87 - organismo_subgrupo: int | None 87 + organismo_subgrupo: str | None
88 desc_organismo_subgrupo: str | None 88 desc_organismo_subgrupo: str | None
89 sigla_organismo_subgrupo: str | None 89 sigla_organismo_subgrupo: str | None
90 90
......
...@@ -26,11 +26,11 @@ class ObjetoEstado(OrmBaseModel): ...@@ -26,11 +26,11 @@ class ObjetoEstado(OrmBaseModel):
26 top1_entidad_desc: str | None 26 top1_entidad_desc: str | None
27 top1_monto: float | None 27 top1_monto: float | None
28 top1_pct: float | None 28 top1_pct: float | None
29 - top2_entidad: int | None | str 29 + top2_entidad: int | float | None | str
30 top2_entidad_desc: str | None 30 top2_entidad_desc: str | None
31 top2_monto: float | None | str 31 top2_monto: float | None | str
32 top2_pct: float | None | str 32 top2_pct: float | None | str
33 - top3_entidad: int | None | str 33 + top3_entidad: int | float | None | str
34 top3_entidad_desc: str | None 34 top3_entidad_desc: str | None
35 top3_monto: float | None | str 35 top3_monto: float | None | str
36 top3_pct: float | None | str 36 top3_pct: float | None | str
......
...@@ -6,6 +6,7 @@ import typesense ...@@ -6,6 +6,7 @@ import typesense
6 from typesense import exceptions as typesense_exceptions 6 from typesense import exceptions as typesense_exceptions
7 7
8 TYPESENSE_API = open('./docs/typesense').read().strip() 8 TYPESENSE_API = open('./docs/typesense').read().strip()
9 +TYPESENSE_API, TYPESENSE_HOST = TYPESENSE_API.split(':')
9 client = typesense.Client({ 10 client = typesense.Client({
10 'api_key': TYPESENSE_API, 11 'api_key': TYPESENSE_API,
11 'nodes': [{ 12 'nodes': [{
...@@ -13,7 +14,7 @@ client = typesense.Client({ ...@@ -13,7 +14,7 @@ client = typesense.Client({
13 'port': '8108', 14 'port': '8108',
14 'protocol': 'http' 15 'protocol': 'http'
15 }], 16 }],
16 - 'connection_timeout_seconds': 0.5 17 + 'connection_timeout_seconds': 1.
17 }) 18 })
18 19
19 COLLECTION = 'presup_actpro_fts' 20 COLLECTION = 'presup_actpro_fts'
......