1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556 |
- from __future__ import annotations
- from collections.abc import Sequence
- from sqlalchemy import select
- from flask import current_app
- from flexmeasures.data import db
- from flexmeasures.data.models.data_sources import DataSource
- def parse_source_arg(
- source: (
- DataSource
- | int
- | str
- | Sequence[DataSource]
- | Sequence[int]
- | Sequence[str]
- | None
- ),
- ) -> list[DataSource] | None:
- """Parse the "source" argument by looking up DataSources corresponding to any given ids or names.
- Passes None as is (i.e. no source argument is given).
- Accepts ids and names as list or tuples, always converting them to a list.
- """
- if source is None:
- return source
- if isinstance(source, (DataSource, str, int)):
- sources = [source]
- else:
- sources = source
- parsed_sources: list[DataSource] = []
- for source in sources:
- if isinstance(source, int):
- parsed_source = db.session.get(DataSource, source)
- if parsed_source is None:
- current_app.logger.warning(
- f"Beliefs searched for unknown source {source}"
- )
- else:
- parsed_sources.append(parsed_source)
- elif isinstance(source, str):
- _parsed_sources = db.session.scalars(
- select(DataSource).filter_by(name=source)
- ).all()
- if _parsed_sources is []:
- current_app.logger.warning(
- f"Beliefs searched for unknown source {source}"
- )
- else:
- parsed_sources.extend(_parsed_sources)
- else:
- parsed_sources.append(source)
- return parsed_sources
|