From b9f7fb2efa705f27819bc60bba107bc477ea729c Mon Sep 17 00:00:00 2001 From: Guillermo Valdes Date: Tue, 4 Feb 2025 15:44:13 -0600 Subject: [PATCH 1/2] Varias mejoras --- .../fastapi_pagination_custom_page.py | 8 ++--- .../dependencies/hashids.py | 35 +++++++++++++++++++ .../dependencies/schemas_base.py | 2 +- pjecz_hercules_api_oauth2/main.py | 4 +-- .../routers/distritos.py | 9 ++++- pjecz_hercules_api_oauth2/schemas/usuarios.py | 6 ++-- pyproject.toml | 2 +- 7 files changed, 55 insertions(+), 11 deletions(-) create mode 100644 pjecz_hercules_api_oauth2/dependencies/hashids.py diff --git a/pjecz_hercules_api_oauth2/dependencies/fastapi_pagination_custom_page.py b/pjecz_hercules_api_oauth2/dependencies/fastapi_pagination_custom_page.py index edc2ab3..482225a 100644 --- a/pjecz_hercules_api_oauth2/dependencies/fastapi_pagination_custom_page.py +++ b/pjecz_hercules_api_oauth2/dependencies/fastapi_pagination_custom_page.py @@ -31,11 +31,11 @@ class CustomPage(AbstractPage[T], Generic[T], ABC): success: bool message: str - data: Sequence[T] = None + data: Sequence[T] - total: Optional[GreaterEqualZero] = None - limit: Optional[GreaterEqualOne] = None - offset: Optional[GreaterEqualZero] = None + total: Optional[GreaterEqualZero] + limit: Optional[GreaterEqualOne] + offset: Optional[GreaterEqualZero] __params_type__ = CustomPageParams diff --git a/pjecz_hercules_api_oauth2/dependencies/hashids.py b/pjecz_hercules_api_oauth2/dependencies/hashids.py new file mode 100644 index 0000000..93db23f --- /dev/null +++ b/pjecz_hercules_api_oauth2/dependencies/hashids.py @@ -0,0 +1,35 @@ +""" +Cifrado y descrifado de ID por medio de Hashids +""" + +import re +from typing import Any + +from fastapi import Depends +from hashids import Hashids + +from ..settings import Settings, get_settings + +HASHID_REGEXP = re.compile("[0-9a-zA-Z]{8,16}") + + +def cifrar_id( + un_id: int, + settings: Settings = Depends(get_settings), +) -> str: + """Cifrar ID""" + hashids = Hashids(settings.salt, min_length=8) + return hashids.encode(un_id) + + +def descifrar_id( + un_id_hasheado: str, + settings: Settings = Depends(get_settings), +) -> Any: + """Descifrar ID""" + hashids = Hashids(settings.salt, min_length=8) + if HASHID_REGEXP.match(un_id_hasheado): + pag_pago_id = hashids.decode(un_id_hasheado) + if len(pag_pago_id) == 1: + return pag_pago_id[0] + return None diff --git a/pjecz_hercules_api_oauth2/dependencies/schemas_base.py b/pjecz_hercules_api_oauth2/dependencies/schemas_base.py index f9aa6d5..b0691af 100644 --- a/pjecz_hercules_api_oauth2/dependencies/schemas_base.py +++ b/pjecz_hercules_api_oauth2/dependencies/schemas_base.py @@ -14,4 +14,4 @@ class OneBaseOut(BaseModel): success: bool message: str - data: list[T] = None + data: list[T] | None = None diff --git a/pjecz_hercules_api_oauth2/main.py b/pjecz_hercules_api_oauth2/main.py index 5f27bab..56a0206 100644 --- a/pjecz_hercules_api_oauth2/main.py +++ b/pjecz_hercules_api_oauth2/main.py @@ -30,8 +30,8 @@ # FastAPI app = FastAPI( - title="Hércules API OAuth2 del Poder Judicial del Estado de Coahuila de Zaragoza", - description="Trabajar con la base de datos 'Plataforma Web'. Uso interno solamente.", + title="PJECZ API OAuth2 de Plataforma Web", + description="Esta API es usada por los sistemas y aplicaciones. No es para cuentas personales.", docs_url="/docs", redoc_url=None, ) diff --git a/pjecz_hercules_api_oauth2/routers/distritos.py b/pjecz_hercules_api_oauth2/routers/distritos.py index faa30d2..0c8c5e4 100644 --- a/pjecz_hercules_api_oauth2/routers/distritos.py +++ b/pjecz_hercules_api_oauth2/routers/distritos.py @@ -46,8 +46,15 @@ async def detalle( async def paginado( current_user: Annotated[UsuarioInDB, Depends(get_current_active_user)], database: Annotated[Session, Depends(get_db)], + es_distrito: bool = None, + es_jurisdiccional: bool = None, ): """Paginado de distritos""" if current_user.permissions.get("DISTRITOS", 0) < Permiso.VER: raise HTTPException(status_code=status.HTTP_403_FORBIDDEN, detail="Forbidden") - return paginate(database.query(Distrito).filter_by(estatus="A").order_by(Distrito.clave)) + consulta = database.query(Distrito) + if es_distrito is not None: + consulta = consulta.filter_by(es_distrito=es_distrito) + if es_jurisdiccional is not None: + consulta = consulta.filter_by(es_jurisdiccional=es_jurisdiccional) + return paginate(consulta.filter_by(estatus="A").order_by(Distrito.clave)) diff --git a/pjecz_hercules_api_oauth2/schemas/usuarios.py b/pjecz_hercules_api_oauth2/schemas/usuarios.py index 602907c..944adc8 100644 --- a/pjecz_hercules_api_oauth2/schemas/usuarios.py +++ b/pjecz_hercules_api_oauth2/schemas/usuarios.py @@ -19,14 +19,16 @@ class Token(BaseModel): class UsuarioOut(BaseModel): """Esquema para entregar usuarios""" + email: str | None = None + nombres: str | None = None apellido_paterno: str | None = None apellido_materno: str | None = None autoridad_clave: str | None = None + autoridad_descripcion: str | None = None autoridad_descripcion_corta: str | None = None distrito_clave: str | None = None + distrito_nombre: str | None = None distrito_nombre_corto: str | None = None - email: str | None = None - nombres: str | None = None puesto: str | None = None model_config = ConfigDict(from_attributes=True) diff --git a/pyproject.toml b/pyproject.toml index 9674b79..e6bb6fe 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "pjecz-hercules-api-oauth2" version = "0.1.0" -description = "" +description = "PJECZ API OAuth2 de Plataforma Web" authors = [ {name = "Guillermo Valdes",email = "guillermo@movimientolibre.com"} ] From c0e1e6b9977323cf336df78e42c7f3bc022c7199 Mon Sep 17 00:00:00 2001 From: Guillermo Valdes Date: Thu, 6 Feb 2025 19:29:51 -0600 Subject: [PATCH 2/2] Mejor README.md --- README.md | 150 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 149 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 7d564f9..a61884a 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,151 @@ # pjecz-hercules-api-oauth2 -Hércules API OAuth2 del Poder Judicial del Estado de Coahuila de Zaragoza. +Esta API es usada por los sistemas y aplicaciones. No es para cuentas personales. + +## Requerimientos + +Los requerimientos son + +- Python 3.11 +- PostgreSQL 15 + +## Instalación + +Crear el entorno virtual + +```bash +python3.11 -m venv .venv +``` + +Ingresar al entorno virtual + +```bash +source venv/bin/activate +``` + +Actualizar el gestor de paquetes **pip** + +```bash +pip install --upgrade pip setuptools +``` + +Instalar el paquete **wheel** para compilar las dependencias + +```bash +pip install wheel +``` + +Instalar **poetry 2** en el entorno virtual si no lo tiene desde el sistema operativo + +```bash +pip install poetry +``` + +Configurar **poetry** para que use el entorno virtual dentro del directorio del proyecto + +```bash +poetry config virtualenvs.in-project true +``` + +Instalar las dependencias por medio de **poetry** + +```bash +poetry install +``` + +## Configuración + +Crear un archivo `.env` en la raíz del proyecto con las variables de entorno + +```ini +# Base de datos +DB_HOST=127.0.0.1 +DB_PORT=5432 +DB_NAME=pjecz_plataforma_web +DB_USER=XXXXXXXXXXXX +DB_PASS=XXXXXXXXXXXX + +# Origins +ORIGINS=http://127.0.0.1:3000 + +# Salt sirve para cifrar el ID con HashID, debe ser igual en la API +SALT=XXXXXXXXXXXX + +# Clave secreta para generar los tokens +SECRET_KEY=XXXXXXXXXXXX +``` + +Crear un archivo `.bashrc` que cargue las variables de entorno y el entorno virtual + +```bash +if [ -f ~/.bashrc ] +then + . ~/.bashrc +fi + +if command -v figlet &> /dev/null +then + figlet Hercules API OAuth2 +else + echo "== Hercules API OAuth2" +fi +echo + +if [ -f .env ] +then + echo "-- Variables de entorno" + export $(grep -v '^#' .env | xargs) + # source .env && export $(sed '/^#/d' .env | cut -d= -f1) + echo " DB_HOST: ${DB_HOST}" + echo " DB_PORT: ${DB_PORT}" + echo " DB_NAME: ${DB_NAME}" + echo " DB_USER: ${DB_USER}" + echo " DB_PASS: ${DB_PASS}" + echo " ORIGINS: ${ORIGINS}" + echo " SALT: ${SALT}" + echo + export PGHOST=$DB_HOST + export PGPORT=$DB_PORT + export PGDATABASE=$DB_NAME + export PGUSER=$DB_USER + export PGPASSWORD=$DB_PASS +fi + +if [ -d .venv ] +then + echo "-- Python Virtual Environment" + source .venv/bin/activate + echo " $(python3 --version)" + export PYTHONPATH=$(pwd) + echo " PYTHONPATH: ${PYTHONPATH}" + echo + echo "-- Poetry" + export PYTHON_KEYRING_BACKEND=keyring.backends.null.Keyring + echo " $(poetry --version)" + echo + echo "-- FastAPI 127.0.0.1:8000" + alias arrancar="uvicorn --host=127.0.0.1 --port 8000 --reload pjecz_hercules_api_oauth2.main:app" + echo " arrancar" + echo + if [ -d tests ] + then + echo "-- Pruebas unitarias" + echo " python3 -m unittest discover" + echo + fi +fi +``` + +## Arrancar + +Cargar las variables de entorno y el entorno virtual + +```bash +source .bashrc +``` + +Lanzar **FastAPI** por medio del _alias_ que se cargó en el `source .bashrc` + +```bash +arrancar +```