Skip to content

Commit

Permalink
Include new modules: "RegistroCambio", "Notas" and "Material" (#20)
Browse files Browse the repository at this point in the history
## Added
- New module "RegistroCambios".
- New module "Notas".
- New module "Material".

## Changed
- Improve the field validations with pydantic built-in methods.
- Request handler allow returning a `list`.

## Fixed
- Data object ""RegistroCambios" field name and potential values.
- Remove unnecessary imports.
  • Loading branch information
fqlenos authored Jul 9, 2024
2 parents b8e3ad0 + f59e420 commit e26af28
Show file tree
Hide file tree
Showing 21 changed files with 236 additions and 31 deletions.
21 changes: 21 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,12 @@ If you want to filter by more than one value, simply concatenate all the desired
```python
from aempsconn.aemps import AempsConn
from aempsconn.filter import (
MaterialFilter,
MedicamentoFilter,
MedicamentosFilter,
NotaFilter,
PresentacionesFilter,
RegistroCambiosFilter,
VmppFilter,
)

Expand All @@ -44,6 +47,11 @@ for med in aemps.medicamentos.get(
):
print(med.nombre)

for med in aemps.medicamentos.get(
filter=MedicamentosFilter().nombre.startswith(value="")
):
print(med.nombre)

for med in aemps.presentaciones.get(
filter=PresentacionesFilter().vmp.equals("270671000140106")
):
Expand All @@ -52,6 +60,19 @@ for med in aemps.presentaciones.get(
for desc_cli in aemps.vmpp.get(filter=VmppFilter().nombre.contains("metotrexato")):
print(desc_cli.vmpDesc)

for change in aemps.registro_cambios.get(
filter=RegistroCambiosFilter().fecha.equals(value="20/12/2023")
):
print(change)

for note in aemps.notas.get(filter=NotaFilter().nregistro.equals("69223")):
print(note)

for material in aemps.materiales.get(
filter=MaterialFilter().nregistro.equals("78632")
):
print(material)

```

## Contributing
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "aempsconn"
version = "1.0.1"
version = "1.0.2"
description = "Library designed for interacting with the CIMA API (AEMPS)"
license = "MIT"
authors = ["fqlenos <fqlenos@protonmail.com>"]
Expand Down
22 changes: 21 additions & 1 deletion src/aempsconn/aemps.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,15 @@

from pydantic import HttpUrl

from .modules import Medicamento, Medicamentos, Presentaciones, Vmpp
from .modules import (
Material,
Medicamento,
Medicamentos,
Notas,
Presentaciones,
RegistroCambios,
Vmpp,
)
from .utils.request_handler import ReqHandler


Expand Down Expand Up @@ -46,3 +54,15 @@ def presentaciones(self) -> Presentaciones:
@property
def vmpp(self) -> Vmpp:
return Vmpp(req_handler=self.__req_handler)

@property
def registro_cambios(self) -> RegistroCambios:
return RegistroCambios(req_handler=self.__req_handler)

@property
def notas(self) -> Notas:
return Notas(req_handler=self.__req_handler)

@property
def materiales(self) -> Material:
return Material(req_handler=self.__req_handler)
3 changes: 3 additions & 0 deletions src/aempsconn/filter/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
"""Package: Filters for different modules."""

from .maestras import MaestrasFilter
from .material import MaterialFilter
from .medicamento import MedicamentoFilter
from .medicamentos import MedicamentosFilter
from .nota import NotaFilter
from .presentaciones import PresentacionesFilter
from .registro_cambios import RegistroCambiosFilter
from .vmpp import VmppFilter
19 changes: 19 additions & 0 deletions src/aempsconn/filter/material.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
"""Module for filtering the 'Materiales'."""

from ..utils.filter import Filterable, Text


class NumRegistro(Text["MaterialFilter"]):
def __init__(self, instance: "MaterialFilter") -> None:
key: str = "nregistro"
super().__init__(key=key, instance=instance)


class MaterialFilter(Filterable):

def __init__(self) -> None:
super().__init__()

@property
def nregistro(self) -> "NumRegistro":
return NumRegistro(instance=self)
19 changes: 19 additions & 0 deletions src/aempsconn/filter/nota.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
"""Module for filtering the 'Notas'."""

from ..utils.filter import Filterable, Text


class NumRegistro(Text["NotaFilter"]):
def __init__(self, instance: "NotaFilter") -> None:
key: str = "nregistro"
super().__init__(key=key, instance=instance)


class NotaFilter(Filterable):

def __init__(self) -> None:
super().__init__()

@property
def nregistro(self) -> "NumRegistro":
return NumRegistro(instance=self)
39 changes: 39 additions & 0 deletions src/aempsconn/filter/registro_cambios.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
"""Module for filtering the 'Registro Cambios'."""

from ..utils.filter import Date, Filterable, Integer, Text


class Fecha(Date["RegistroCambiosFilter"]):
def __init__(self, instance: "RegistroCambiosFilter") -> None:
key: str = "fecha"
super().__init__(key=key, instance=instance)


class NumRegistro(Text["RegistroCambiosFilter"]):
def __init__(self, instance: "RegistroCambiosFilter") -> None:
key: str = "nregistro"
super().__init__(key=key, instance=instance)


class Pagina(Integer["RegistroCambiosFilter"]):
def __init__(self, instance: "RegistroCambiosFilter") -> None:
key: str = "pagina"
super().__init__(key=key, instance=instance)


class RegistroCambiosFilter(Filterable):

def __init__(self) -> None:
super().__init__()

@property
def fecha(self) -> "Fecha":
return Fecha(instance=self)

@property
def nregistro(self) -> "NumRegistro":
return NumRegistro(instance=self)

@property
def pagina(self) -> "Pagina":
return Pagina(instance=self)
3 changes: 3 additions & 0 deletions src/aempsconn/modules/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
"""Package: CIMA-related modules."""

from .material import Material
from .medicamento import Medicamento
from .medicamentos import Medicamentos
from .notas import Notas
from .presentaciones import Presentaciones
from .registro_cambios import RegistroCambios
from .vmpp import Vmpp
21 changes: 21 additions & 0 deletions src/aempsconn/modules/material.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"""Module for retrieving information from 'Materiales' endpoint."""

from typing import Any

from ..filter.material import MaterialFilter
from ..objects.material import MaterialModel
from ..utils.module import BaseModule
from ..utils.request_handler import ReqHandler


class Material(BaseModule[MaterialFilter, MaterialModel]):

def __init__(self, req_handler: ReqHandler) -> None:
super().__init__(req_handler)

@property
def endpoint(self) -> str:
return "materiales"

def parse_result(self, data: dict[str, Any]) -> MaterialModel:
return MaterialModel(**data)
21 changes: 21 additions & 0 deletions src/aempsconn/modules/notas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"""Module for retrieving information from 'Notas' endpoint."""

from typing import Any

from ..filter.nota import NotaFilter
from ..objects.nota import NotaModel
from ..utils.module import BaseModule
from ..utils.request_handler import ReqHandler


class Notas(BaseModule[NotaFilter, NotaModel]):

def __init__(self, req_handler: ReqHandler) -> None:
super().__init__(req_handler)

@property
def endpoint(self) -> str:
return "notas"

def parse_result(self, data: list[dict[str, Any]]) -> list[NotaModel]:
return [NotaModel(**d) for d in data]
23 changes: 23 additions & 0 deletions src/aempsconn/modules/registro_cambios.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
"""Module for retrieving information from 'Registro Cambios' endpoint."""

from typing import Any

from ..filter.registro_cambios import RegistroCambiosFilter
from ..objects.registro_cambios import RegistroCambiosModel
from ..utils.module import BaseModule
from ..utils.request_handler import ReqHandler


class RegistroCambios(BaseModule[RegistroCambiosFilter, RegistroCambiosModel]):

def __init__(self, req_handler: ReqHandler) -> None:
super().__init__(req_handler)

@property
def endpoint(self) -> str:
return "registroCambios"

def parse_result(self, data: dict[str, Any]) -> RegistroCambiosModel:
if "Es necesario indicar la fecha" in data.values():
raise KeyError("You must filter, at least, by `fecha`")
return RegistroCambiosModel(**data)
12 changes: 2 additions & 10 deletions src/aempsconn/objects/documento.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,14 @@

from datetime import datetime

from pydantic import HttpUrl, field_validator
from pydantic import Field, HttpUrl
from pydantic.dataclasses import dataclass


@dataclass
class DocumentoModel:
tipo: int
secc: bool
tipo: int = Field(ge=1, le=4)
url: HttpUrl | None = None
urlHtml: HttpUrl | None = None
fecha: datetime | None = None

@field_validator("tipo")
@classmethod
def check_tipo_range(cls, tipo: int) -> int:
if tipo not in range(1, 5):
raise ValueError("'Tipo' field must be between 1-4 (both included)")

return tipo
10 changes: 5 additions & 5 deletions src/aempsconn/objects/material.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
"""Module for the 'Material' object."""

from pydantic import HttpUrl
from pydantic.dataclasses import dataclass

from .documento_material import DocumentoMaterialModel
from .videos import VideoModel


@dataclass
class MaterialModel:
titulo: str
listaDocsPaciente: list[DocumentoMaterialModel]
listaDocsProfesional: list[DocumentoMaterialModel]
video: HttpUrl
titulo: str | None = None
listaDocsPaciente: list[DocumentoMaterialModel] | None = None
listaDocsProfesional: list[DocumentoMaterialModel] | None = None
videos: list[VideoModel] | None = None
2 changes: 1 addition & 1 deletion src/aempsconn/objects/nota.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
class NotaModel:
tipo: int
num: str
ref: str
referencia: str
asunto: str
fecha: datetime
url: HttpUrl
Expand Down
15 changes: 4 additions & 11 deletions src/aempsconn/objects/registro_cambios.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,15 @@
from datetime import datetime
from typing import Literal

from pydantic import field_validator
from pydantic import Field
from pydantic.dataclasses import dataclass


@dataclass
class RegistroCambiosModel:
nregistro: str
fecha: datetime
tipoCambio: int
cambios: list[
cambio: list[
Literal[
"estado",
"comerc",
Expand All @@ -22,13 +21,7 @@ class RegistroCambiosModel:
"notasSeguridad",
"matinf",
"otros",
"fotos",
]
]

@field_validator("tipoCambio")
@classmethod
def check_tipo_cambio_range(cls, tipo_cambio: int) -> int:
if tipo_cambio not in range(1, 4):
raise ValueError("'TipoCambio' field must be between 1-4 (both included)")

return tipo_cambio
tipoCambio: int = Field(ge=1, le=4)
14 changes: 14 additions & 0 deletions src/aempsconn/objects/videos.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
"""Module for the 'Videos' object."""

from datetime import datetime

from pydantic import HttpUrl
from pydantic.dataclasses import dataclass


@dataclass
class VideoModel:
titulo: str
url: HttpUrl
video: HttpUrl
fecha: datetime
1 change: 0 additions & 1 deletion src/aempsconn/utils/__init__.py

This file was deleted.

2 changes: 1 addition & 1 deletion src/aempsconn/utils/filter/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""Package: Utils of the filtering methods for AEMPSconn."""

from .filter import Filterable
from .operator import Bool, Integer, Text
from .operator import Bool, Date, Integer, Text
5 changes: 5 additions & 0 deletions src/aempsconn/utils/filter/base_operator.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
"""Module for the base operators of the filtering."""

from datetime import datetime
from typing import Generic, TypeVar

from .filter import Filter, Filterable
Expand All @@ -21,6 +22,10 @@ def __init__(

class Equals(BaseOperator[T, R], Generic[T, R]):
def equals(self, value: T) -> R:
if self.key == "fecha":
# checks datetime format and raises a value error if needed
datetime.strptime(str(value), "%d/%m/%Y").strftime("%d/%m/%Y")

self.instance.query.append(Filter(key=self.key, value=value))
return self.instance

Expand Down
7 changes: 7 additions & 0 deletions src/aempsconn/utils/filter/operator.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,3 +26,10 @@ class Integer(
Generic[R],
):
pass


class Date(
Equals[str, R],
Generic[R],
):
pass
Loading

0 comments on commit e26af28

Please sign in to comment.