parsing_utils.py 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from __future__ import annotations
  2. from collections.abc import Sequence
  3. from sqlalchemy import select
  4. from flask import current_app
  5. from flexmeasures.data import db
  6. from flexmeasures.data.models.data_sources import DataSource
  7. def parse_source_arg(
  8. source: (
  9. DataSource
  10. | int
  11. | str
  12. | Sequence[DataSource]
  13. | Sequence[int]
  14. | Sequence[str]
  15. | None
  16. ),
  17. ) -> list[DataSource] | None:
  18. """Parse the "source" argument by looking up DataSources corresponding to any given ids or names.
  19. Passes None as is (i.e. no source argument is given).
  20. Accepts ids and names as list or tuples, always converting them to a list.
  21. """
  22. if source is None:
  23. return source
  24. if isinstance(source, (DataSource, str, int)):
  25. sources = [source]
  26. else:
  27. sources = source
  28. parsed_sources: list[DataSource] = []
  29. for source in sources:
  30. if isinstance(source, int):
  31. parsed_source = db.session.get(DataSource, source)
  32. if parsed_source is None:
  33. current_app.logger.warning(
  34. f"Beliefs searched for unknown source {source}"
  35. )
  36. else:
  37. parsed_sources.append(parsed_source)
  38. elif isinstance(source, str):
  39. _parsed_sources = db.session.scalars(
  40. select(DataSource).filter_by(name=source)
  41. ).all()
  42. if _parsed_sources is []:
  43. current_app.logger.warning(
  44. f"Beliefs searched for unknown source {source}"
  45. )
  46. else:
  47. parsed_sources.extend(_parsed_sources)
  48. else:
  49. parsed_sources.append(source)
  50. return parsed_sources