pr0nstar

XV

...@@ -7,11 +7,14 @@ from aiocache import Cache ...@@ -7,11 +7,14 @@ from aiocache import Cache
7 7
8 8
9 REDIS_CONN = open('./docs/redis').read().strip() 9 REDIS_CONN = open('./docs/redis').read().strip()
10 +REDIS_PASS, REDIS_CONN = REDIS_CONN.split('@')
10 REDIS_CONN = REDIS_CONN.split(':') 11 REDIS_CONN = REDIS_CONN.split(':')
11 cache = Cache( 12 cache = Cache(
12 Cache.REDIS, 13 Cache.REDIS,
13 - endpoint=REDIS_CONN[0], port=REDIS_CONN[1], 14 + endpoint=REDIS_CONN[0],
14 - namespace='httpcache' 15 + port=REDIS_CONN[1],
16 + password=REDIS_PASS.strip(' :'),
17 + namespace='httpcache',
15 ) 18 )
16 # cache = Cache() 19 # cache = Cache()
17 20
......
...@@ -41,3 +41,20 @@ class ProyectoResumenes(Base): ...@@ -41,3 +41,20 @@ class ProyectoResumenes(Base):
41 objeto: Mapped[str] = mapped_column(Text) 41 objeto: Mapped[str] = mapped_column(Text)
42 finfun: Mapped[str] = mapped_column(Text) 42 finfun: Mapped[str] = mapped_column(Text)
43 acteco: Mapped[str] = mapped_column(Text) 43 acteco: Mapped[str] = mapped_column(Text)
44 +
45 +
46 +class ProyectoClasificadores(Base):
47 + __tablename__ = "proyecto_clasificadores"
48 +
49 + gestion: Mapped[int] = mapped_column(Integer)
50 + tipo: Mapped[str] = mapped_column(String(16))
51 + nivel: Mapped[str] = mapped_column(String(24))
52 + programa_proyecto: Mapped[str] = mapped_column(String(32))
53 +
54 + codigo: Mapped[str] = mapped_column(String(32))
55 + codigo_padre: Mapped[str | None] = mapped_column(String(32))
56 +
57 + devengado: Mapped[float] = mapped_column(Numeric(30, 15))
58 +
59 + desc: Mapped[str] = mapped_column(Text)
60 + desc_padre: Mapped[str | None] = mapped_column(Text)
......
...@@ -41,7 +41,7 @@ def fetch_programa_proyecto( ...@@ -41,7 +41,7 @@ def fetch_programa_proyecto(
41 return project_items 41 return project_items
42 42
43 43
44 -@router.get('/{project_id}/proyectos') 44 +@router.get('/{project_id}/proyectos', response_model=List[schemas.project.ProyectoProyectos])
45 @not_found 45 @not_found
46 def fetch_programa_proyecto_proyectos( 46 def fetch_programa_proyecto_proyectos(
47 project_id: str, 47 project_id: str,
...@@ -71,31 +71,55 @@ def fetch_programa_proyecto_proyectos( ...@@ -71,31 +71,55 @@ def fetch_programa_proyecto_proyectos(
71 ).mappings().all() 71 ).mappings().all()
72 72
73 73
74 -@router.get('/{project_id}/objetos') 74 +@router.get('/{project_id}/objetos', response_model=List[schemas.project.ProyectoClasificadores])
75 -@not_found
76 def fetch_programa_proyecto_objetos( 75 def fetch_programa_proyecto_objetos(
77 project_id: int, 76 project_id: int,
78 db: Session = Depends(model.get_db), 77 db: Session = Depends(model.get_db),
79 query: schema.QueryParams = Depends(), 78 query: schema.QueryParams = Depends(),
80 ): 79 ):
81 - return [] 80 + return get_clasificadores(db, 'objeto', project_id, query)
82 81
83 82
84 -@router.get('/{project_id}/finfuns') 83 +@router.get('/{project_id}/finfuns', response_model=List[schemas.project.ProyectoClasificadores])
85 -@not_found
86 def fetch_programa_proyecto_finfuns( 84 def fetch_programa_proyecto_finfuns(
87 project_id: int, 85 project_id: int,
88 db: Session = Depends(model.get_db), 86 db: Session = Depends(model.get_db),
89 query: schema.QueryParams = Depends(), 87 query: schema.QueryParams = Depends(),
90 ): 88 ):
91 - return [] 89 + return get_clasificadores(db, 'finfun', project_id, query)
92 90
93 91
94 -@router.get('/{project_id}/actecos') 92 +@router.get('/{project_id}/actecos', response_model=List[schemas.project.ProyectoClasificadores])
95 -@not_found
96 def fetch_programa_proyecto_actecos( 93 def fetch_programa_proyecto_actecos(
97 project_id: int, 94 project_id: int,
98 db: Session = Depends(model.get_db), 95 db: Session = Depends(model.get_db),
99 query: schema.QueryParams = Depends(), 96 query: schema.QueryParams = Depends(),
100 ): 97 ):
101 - return [] 98 + return get_clasificadores(db, 'acteco', project_id, query)
99 +
100 +
101 +###############################################################################
102 +# private
103 +###############################################################################
104 +
105 +@not_found
106 +def get_clasificadores(db, tipo_codigo, programa_proyecto, query):
107 + page_size = 10
108 + page = query.page or 1
109 +
110 + ProyectoClasificadoresSchema = schemas.project.ProyectoClasificadores
111 + ProyectoClasificadores = models.project.ProyectoClasificadores
112 +
113 + schema_fields = ProyectoClasificadoresSchema.model_fields.keys()
114 + cols = [getattr(ProyectoClasificadores, name) for name in schema_fields]
115 +
116 + filters = [
117 + ProyectoClasificadores.tipo == tipo_codigo,
118 + ProyectoClasificadores.programa_proyecto == programa_proyecto,
119 + ]
120 + if query.gestion is not None:
121 + filters.append(ProyectoClasificadores.gestion == query.gestion)
122 +
123 + return select(*cols).where(*filters).offset(
124 + (page - 1) * page_size
125 + ).limit(page_size).mappings().all()
......
...@@ -26,10 +26,23 @@ class ProyectoResumen(OrmBaseModel): ...@@ -26,10 +26,23 @@ class ProyectoResumen(OrmBaseModel):
26 acteco: str | List[ProyectoResumenObj] 26 acteco: str | List[ProyectoResumenObj]
27 27
28 28
29 +class ProyectoClasificadores(OrmBaseModel):
30 + gestion: int
31 + tipo: str
32 + nivel: str
33 + programa_proyecto: str
34 + codigo: str
35 + codigo_padre: str | None
36 + devengado: float
37 + desc: str
38 + desc_padre: str | None
39 +
40 +
29 class ProyectoProyectos(OrmBaseModel): 41 class ProyectoProyectos(OrmBaseModel):
30 nivel: str 42 nivel: str
31 codigo: str 43 codigo: str
32 desc: str 44 desc: str
45 + devengado: float
33 46
34 47
35 class ProjectSearch(BaseModel): 48 class ProjectSearch(BaseModel):
......