measures_client.py 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import logging
  2. from datetime import datetime
  3. from os import path
  4. from typing import List, Optional
  5. import requests
  6. from fastapi.encoders import jsonable_encoder
  7. from requests.models import Response
  8. from database.mongo import mongo_measures
  9. from schemas.fincas import Finca
  10. from schemas.measures import Measure
  11. # Logging
  12. # Quiza deberiamos centralizar todos los loggers en su propio modulo
  13. filename = path.abspath("./measures_client.log")
  14. logger = logging.getLogger("measures_client")
  15. # handler = logging.FileHandler(filename)
  16. # logger.addHandler(handler)
  17. class ClimaMeasuresClient:
  18. token: str
  19. url: str
  20. def __init__(self, token: str, url: str) -> None:
  21. self.token = token
  22. self.url = url
  23. def _get_raw_station_measures(
  24. self, station_code: str, datetime_from: datetime, datetime_to: Optional[datetime] = None, limit: Optional[int] = None
  25. ):
  26. parameters: dict[str, str | int] = {
  27. "token": self.token,
  28. "date_from": datetime_from.isoformat(),
  29. }
  30. if(datetime_to):
  31. parameters["date_to"] = datetime_to.isoformat()
  32. if(limit):
  33. parameters["limit"] = limit
  34. url = self.url + f"import/{station_code}"
  35. response = requests.get(url, parameters)
  36. if response.ok:
  37. return response.json()
  38. elif response.status_code == 400:
  39. logger.error(f"Bad Request al consultar measures: Station {station_code}")
  40. elif response.status_code == 403:
  41. logger.error(
  42. f"Acceso denegado: Station {station_code}, Token: {self.token}"
  43. )
  44. elif response.status_code == 404:
  45. logger.error(
  46. f"Estacion no encontrada al consultar sus datos: Station {station_code}"
  47. )
  48. else:
  49. logger.error(f"Error {response.status_code}: Station {station_code}")
  50. raise Exception(f"Response status({response.text}) no ok al consultar muestras")
  51. def get_station_measures(
  52. self, station_code: str, datetime_from: datetime, datetime_to: Optional[datetime] = None, limit: Optional[int] = None
  53. ) -> List[Measure]:
  54. if(limit is None and datetime_to is None):
  55. raise ValueError("Los parámetros datetime_to y max_count no pueden ser ambos None, incluir al menos uno")
  56. data = self._get_raw_station_measures(station_code, datetime_from, datetime_to, limit)
  57. return list(map(lambda x: Measure(**x), data))
  58. def _get_raw_stations(
  59. self,
  60. company_code: str,
  61. ) -> Response:
  62. parameters = {
  63. "token": self.token,
  64. }
  65. url = self.url + f"get-company-stations/{company_code}"
  66. response = requests.get(url, parameters)
  67. if response.status_code == 200:
  68. return response.json()
  69. raise PermissionError()
  70. def get_stations(self, company_code: str) -> List[Finca]:
  71. data = self._get_raw_stations(company_code)
  72. return list(map(lambda x: Finca(**x), data))