fincas.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. import typer
  2. from sqlalchemy.orm.session import Session
  3. from client.measures_client import ClimaMeasuresClient
  4. from config.settings import CLIMA_API_URL
  5. from cruds.finca_company import create_finca_company, delete_finca_company
  6. from cruds.fincas import (
  7. create_finca,
  8. get_finca_by_station_code,
  9. get_fincas_filter_company,
  10. update_finca_title,
  11. )
  12. from database.sqlalchemy import SessionLocal
  13. from models.users import User
  14. from schemas.finca_company import FincaCompany as FincaCompanySchema
  15. def update_fincas(company_id: int):
  16. db: Session = SessionLocal()
  17. user = db.query(User).first()
  18. client = ClimaMeasuresClient(
  19. token=user.token,
  20. url=CLIMA_API_URL,
  21. )
  22. fincas_api = client.get_stations(str(company_id))
  23. fincas_local = get_fincas_filter_company(db, company_id)
  24. added = 0
  25. deleted = 0
  26. updated = 0
  27. # Agregar Fincas que esten en clima pero no en este sistema
  28. for finca_api in fincas_api:
  29. if not any(
  30. finca_local.station_code == finca_api.station_code
  31. for finca_local in fincas_local
  32. ):
  33. if not get_finca_by_station_code(db, finca_api.station_code):
  34. finca = create_finca(db=db, finca=finca_api)
  35. else:
  36. finca = get_finca_by_station_code(db, finca_api.station_code)
  37. finca_company = FincaCompanySchema(
  38. finca_station_code=finca.station_code, company_id=company_id
  39. )
  40. create_finca_company(db, finca_company)
  41. added += 1
  42. # Eliminar Relaciones con Fincas que no esten en clima pero si en este sistema
  43. for finca_local in fincas_local:
  44. if not any(
  45. finca_local.station_code == finca_api.station_code
  46. for finca_api in fincas_api
  47. ):
  48. delete_finca_company(
  49. db=db, company_id=company_id, station_code=finca_local.station_code
  50. )
  51. deleted += 1
  52. fincas_local = get_fincas_filter_company(db, company_id)
  53. # Mantener congruencia de titulos
  54. for finca_local in fincas_local:
  55. finca_api = next(
  56. (x for x in fincas_api if x.station_code == finca_local.station_code),
  57. None,
  58. )
  59. if finca_local.title != finca_api.title:
  60. update_finca_title(
  61. db=db, station_code=finca_local.station_code, new_title=finca_api.title
  62. )
  63. updated += 1
  64. response = {
  65. "added_fincas": added,
  66. "deleted_fincas": deleted,
  67. "updated_fincas": updated,
  68. }
  69. return response
  70. def update_fincas_console(
  71. company_id: int = typer.Option("", "--id"),
  72. ):
  73. return update_fincas(company_id)