"""Distribution Format model.""" from oto import response from sqlalchemy import Column from sqlalchemy import ForeignKey from sqlalchemy import String from sqlalchemy import Integer from sqlalchemy import Enum from sqlalchemy.exc import SQLAlchemyError from product_configuration.connectors import mysql from product_configuration.connectors.mysql import db_session from product_configuration.connectors.sentry import sentry_client from product_configuration.models.distribution_format_media import DistributionFormatMedia # noqa from product_configuration.models.distribution_format_media_format import DistributionFormatMediaFormat # noqa class DistributionFormat(mysql.BaseModel): """Distribution Format model. Represents `distribution_format` table with mapped data from: - distribution_format_media (name, id) - distribution_format_media_format (name, id) """ __tablename__ = 'distribution_format' distribution_format_id = Column( Integer, primary_key=True, autoincrement=True, nullable=False) name = Column(String) display_flag = Column(Enum('Y', 'N')) context_type = Column(Enum('physical', 'digital')) distribution_format_media_fk = \ 'distribution_format_media.distribution_format_media_id' distribution_format_media_format_fk = \ 'distribution_format_media_format.distribution_format_media_format_id' distribution_format_media_id = Column( Integer, ForeignKey(distribution_format_media_fk)) distribution_format_media_format_id = Column( Integer, ForeignKey(distribution_format_media_format_fk)) @mysql.wrap_db_errors def get_all_formats(): """Get all distribution formats with media type/media format metadata. Returns: response.Response: containing list of distribution formats. """ with db_session() as session: try: results = session.query( DistributionFormat.distribution_format_id, DistributionFormat.context_type, DistributionFormat.display_flag, DistributionFormatMedia.distribution_format_media_id, DistributionFormatMedia.name, DistributionFormatMediaFormat.distribution_format_media_format_id, # noqa DistributionFormatMediaFormat.name) \ .join(DistributionFormatMedia, isouter=True) \ .join(DistributionFormatMediaFormat, isouter=True) return response.Response( status=200, message=_map_results_to_dict(results)) except SQLAlchemyError as e: sentry_client.capture_exception(e) return response.create_fatal_response('A database error occurred.') def _map_results_to_dict(results): """Map results from `distribution_format` query to a dictionary.""" return [{ 'distribution_format_id': distribution_format_id, 'context_type': context_type, 'display_flag': display_flag, 'distribution_format_media_id': media_id, 'distribution_format_media_name': media_name, 'distribution_format_media_format_id': media_format_id, 'distribution_format_media_format_name': media_format_name } for distribution_format_id, context_type, display_flag, media_id, media_name, media_format_id, media_format_name in results] @mysql.wrap_db_errors def get_distribution_format_by_distribution_format_id(distribution_format_id): """Get distribution_format by distribution_format_id. Returns: response.Response: containing list of distribution_format. """ with db_session() as session: try: result = session.query( DistributionFormat.distribution_format_id, DistributionFormat.distribution_format_media_id, DistributionFormat.distribution_format_media_format_id, DistributionFormat.context_type, DistributionFormat.display_flag ).filter(DistributionFormat. distribution_format_id == distribution_format_id).all() return _map_result_to_dict(result) except SQLAlchemyError as e: sentry_client.capture_exception(e) return response.create_fatal_response('A database error occurred.') def _map_result_to_dict(results): """Map results from `distribution_format` query to a dictionary.""" return [{ 'distribution_format_id': distribution_format_id, 'distribution_format_media_id': media_id, 'distribution_format_media_format_id': media_format_id, 'context_type': context_type, 'display_flag': display_flag } for distribution_format_id, media_id, media_format_id, context_type, display_flag in results]