from delphi_api.errors import Codes, InvalidInputError from delphi_api.v3.data_models.postgres_db import Chart, db from delphi_api.v3.data_models.schemas.models import ( ChartSchema, ChartSimpleSchema, ) from delphi_api.v3.enums import ChartName from delphi_api.v3.view_models.params import Params from delphi_api.v3.view_models.query_builder import QueryBuilder class ChartsViewModel: """Akin to the PlaylistsViewModel""" @staticmethod def valid_chart_name(name: str) -> bool: return name in [val.value for val in ChartName.__members__.values()] @classmethod def validate_params(cls, params: Params): """Check the search parameters provided by the client are compatible before continuing""" err = False # Add further validations here if err: raise InvalidInputError({ 'code': Codes.invalid_input.value, 'description': err, }) @classmethod def get_one(cls, params: dict): params = Params(**params) result = db.session.query(Chart).get_or_404(params.chart_id) return ChartSchema().dump(result) @classmethod def get_many(cls, params: dict): params = Params(**params) cls.validate_params(params) data = cls._get_data(params) result = ChartSimpleSchema(many=True).dump(data) result = QueryBuilder.sort_results(result, params) result = QueryBuilder.limit_offset_results(result, params) return result @classmethod def _get_data(cls, params: Params): q = db.session.query(Chart) if params.chart_group: q = q.filter(Chart.chart_group == params.chart_group) q = QueryBuilder.or_filters_from_params(q, params, parent=Chart) return q.all()