"""Campaign Model.""" from pymysql.converters import escape_string import sqlalchemy from podcast.connectors import mysql class Campaign(mysql.BaseModel): """Campaign model.""" __tablename__ = 'campaign' id = sqlalchemy.Column(sqlalchemy.Integer, primary_key=True, autoincrement=True) # noqa megaphone_id = sqlalchemy.Column(sqlalchemy.VARCHAR(255)) name = sqlalchemy.Column(sqlalchemy.VARCHAR(255)) advertiser_name = sqlalchemy.Column(sqlalchemy.VARCHAR(1000)) is_deleted = sqlalchemy.Column(sqlalchemy.Boolean, nullable=False, default=False) def to_dict(self): """Return the object as dictionary.""" return dict( id=self.megaphone_id, name=self.name, advertiser_name=self.advertiser_name, is_deleted=self.is_deleted ) def _format_campaign(campaign): campaign_id = escape_string(campaign['id']) campaign_name = escape_string(campaign['name']) advertiser_name = escape_string(campaign['advertiser_name']) return "('{}', '{}', '{}')".format(campaign_id, campaign_name, advertiser_name) def get_all_campaigns(): """Get all non deleted campaign.""" with mysql.pod_db_session(read_only=True) as session: campaigns = session.query(Campaign).filter(Campaign.is_deleted.isnot(True)).all() return [campaign.to_dict() for campaign in campaigns] def get_campaigns_by_megaphone_ids(megaphone_ids): """Get campaigns by megaphone ids. Args: megaphone_ids (list of ints): list of megaphone ids Returns: list (dict): campaigns """ with mysql.pod_db_session(read_only=True) as session: campaigns = session.query(Campaign).filter((Campaign.megaphone_id.in_(megaphone_ids))).all() return [campaign.to_dict() for campaign in campaigns] def create_or_update_campaigns(campaigns): """Create many campaigns. Args: campaigns (list of dicts): the campaigns to create or update. """ if len(campaigns) < 1: return with mysql.pod_db_session() as session: rows = [_format_campaign(campaign) for campaign in campaigns] session.execute(""" INSERT INTO campaign ( megaphone_id, name, advertiser_name ) VALUES {} ON DUPLICATE KEY UPDATE name=VALUES(name), advertiser_name=VALUES(advertiser_name); """.format(','.join(rows))) def delete_campaign_by_megaphone_ids(mp_ids): """Soft delete campaign by megaphone ids.""" with mysql.pod_db_session() as session: campaigns = session.query(Campaign).filter( Campaign.megaphone_id.in_(mp_ids) ).all() for campaign in campaigns: campaign.is_deleted = True return [campaign.to_dict() for campaign in campaigns]