"""InsertionPoint Model. This model represents an InsertionPoint """ import sqlalchemy from sqlalchemy import ForeignKey from sqlalchemy.dialects.mysql import INTEGER from podcast.connectors import mysql from podcast.constants import error from podcast.utils import api_utils from podcast.utils import exc class InsertionPoint(mysql.BaseModel): """InsertionPoint model.""" __tablename__ = 'insertion_point' id = sqlalchemy.Column(INTEGER(unsigned=True), primary_key=True, autoincrement=True) # noqa episode_id = sqlalchemy.Column( INTEGER(unsigned=True), ForeignKey('episode.id'), nullable=False ) point_type = sqlalchemy.Column(sqlalchemy.Enum(*['pre', 'mid', 'post'])) timecode = sqlalchemy.Column(sqlalchemy.DECIMAL(21, 15), nullable=False, default=0) count = sqlalchemy.Column(INTEGER(unsigned=True), nullable=False, default=1) created_by = sqlalchemy.Column(sqlalchemy.Integer) def to_dict(self): """Return the object as dictionary.""" return dict( id=self.id, episode_id=self.episode_id, point_type=self.point_type, timecode=str(self.timecode), count=self.count, created_by=self.created_by ) def get_insertion_points(episode_id): """Return all the insertion points for an episode. Args: episode_id (int): the podcast unique identifier limit (int): how many podcasts to retrieve. offset (int): the offset (for pagination). Returns: dict: items' list of insertion points. """ if not isinstance(episode_id, int): raise exc.OwsError.bad_request(error.ERROR_MESSAGE_BAD_PARAMS) with mysql.pod_db_session() as session: query = session.query(InsertionPoint).filter( InsertionPoint.episode_id == episode_id) rows = query.all() items = [row.to_dict() for row in rows] return {'items': items} def create_insertion_points(episode_id, data, session=None, user_id=None): """Delete existing and insert new insertion points. Args: episode_id (int): The unique identifier of episode data (json): list of insertion points session (sqlalchemy.session.Session): live connection to database. Returns: dict: new insertion points' list """ if not isinstance(episode_id, int): raise exc.OwsError.bad_request(error.ERROR_MESSAGE_BAD_PARAMS) user_id = user_id or api_utils.get_user_id() if session: return _create_insertion_points(episode_id, data, session, user_id) else: with mysql.pod_db_session() as session: return _create_insertion_points(episode_id, data, session, user_id) def _create_insertion_points(episode_id, data, session, user_id): _delete_all(session, episode_id) for item in data: item['episode_id'] = episode_id item['created_by'] = user_id session.add(InsertionPoint(**item)) return get_insertion_points(episode_id) def delete_all(episode_id): """Delete existing insertion points. Args: episode_id (int): The unique identifier of episode Returns: None """ if not isinstance(episode_id, int): raise exc.OwsError.bad_request(error.ERROR_MESSAGE_BAD_PARAMS) with mysql.pod_db_session() as session: _delete_all(session, episode_id) def _delete_all(session, episode_id): session.query(InsertionPoint).filter( InsertionPoint.episode_id == episode_id ).delete()