from delphi_api.v3.data_models.postgres_db import Artist, Track, db from delphi_api.v3.data_models.schemas.models import TrackSchema, TrackSimpleSchema from delphi_api.v3.enums import GroupByParam from delphi_api.v3.view_models.params import Params from delphi_api.v3.view_models.query_builder import QueryBuilder class TracksViewModel: @staticmethod def get_one(params: dict): params = Params(**params) result = db.session.query(Track).get_or_404(params.track_id) return TrackSchema().dump(result) @staticmethod def get_many(params: dict): params = Params(**params) q = db.session.query(Track) if params.artist_id: # update params to include participants from artist artist = db.session.query(Artist).get_or_404(params.artist_id) params.artist_id = artist.artist_and_participant_ids if params.group_by == GroupByParam.ISRC.value: q = q.filter(Track.is_main_product == True) q = QueryBuilder.or_filters_from_params(q, params, parent=Track) q = QueryBuilder.add_sort_clause(q, params, parent=Track) q = QueryBuilder.add_query_limit_offset(q, params) result = TrackSimpleSchema(many=True).dump(q.all()) if params.group_by: # instead of writing complex sqlalchemy query with nested objects result = QueryBuilder.sort_results(result, params) return result