"""Module with functions that takes data from art_relation database.""" import collections from oto import response from salessheets.connectors import mysql from salessheets.constants import error from salessheets.constants import models from salessheets.models.sql import products @mysql.wrap_db_errors def get_multiple_release_ids(context, context_type=None): """Make queries to db to get release id for each upc. If release for provided upc doesn't exist return 404 error. Args: context (list): list of upcs/display_upcs for which release ids are collected. context_type (str): possible values- 'upc' or 'display_upc'. Returns: oto.Response: response with error message or list of release ids. """ if not context: return response.create_not_found_response() if not context_type: context_type = models.DISPLAY_UPC elif context_type not in [models.UPC, models.DISPLAY_UPC]: return response.create_error_response( code=error.INVALID_CONTEXT_TYPE, message='Context type is not equal to "upc" or "display_upc"') with mysql.ar_db_session() as session: # Wrap ResultProxy in a list, so it is possible to iterate over it # again. rows = [] result = collections.defaultdict(list) if context_type == models.UPC: rows = list(session.execute( products.SELECT_RELEASE_IDS_BY_LIST_OF_UPCS, {models.UPCS: context})) result = { row[models.UPC]: str(row[models.RELEASE_ID]).split(',') for row in rows} elif context_type == models.DISPLAY_UPC: rows = list(session.execute( products.SELECT_RELEASE_IDS_BY_LIST_OF_DISPLAY_UPCS, {models.DISPLAY_UPCS: context})) for row in rows: result[row[models.DISPLAY_UPC]].append( str(row[models.RELEASE_ID])) for upc in context: if upc not in result: return response.create_not_found_response( message='release with {context_type} {upc} ' 'doesn\'t exist'.format( context_type=context_type, upc=upc)) not_allowed_status = [] for row in rows: if (row[models.RELEASE_STATUS] not in models.ALLOWED_RELEASE_STATUSES): not_allowed_status.append(str(row[context_type])) if not_allowed_status: return response.create_not_found_response( message='The following products must be in ' 'one of these statuses: {allowed_statuses} ' 'to generate sales sheets: {upcs}'.format( allowed_statuses=( models.ALLOWED_RELEASE_STATUSES), upcs=', '.join(not_allowed_status))) return response.Response(message=tuple(sum(result.values(), [])))