# -*- coding: utf-8 -*- from __future__ import absolute_import """ 广告接口 get (返回广告明细) params(gameid,localid)output(ad_title,ad_body,ad_image,jump_param) post(新增广告定义) params(name,gameid,localid,start_time,end_time,ad_nums,ad_title,ad_body,ad_image,jump_param,ad_sort,status=unapproved,) output(1,0) put(更新广告配置)params(name,gameid,localid,start_time,end_time,ad_nums,ad_title,ad_body,ad_image,jump_param,ad_sort)output(1,0) delete(删除定义的广告)params()output(1,0) """ from flask import Flask, jsonify from flask_restful import reqparse, abort, Api, Resource import logging from ops.reflush_ad import rebuild_ad # from myredis.myredis import ad_redis, expire_time from mysql.mmysql import MysqlBase from prod_config import mysql_promotion_config import datetime import pdb import time log = logging.getLogger(__name__) parser = reqparse.RequestParser() parser.add_argument('id') parser.add_argument('gameid') parser.add_argument('channelid') parser.add_argument('name') parser.add_argument('locationid') parser.add_argument('begin_time') parser.add_argument('end_time') parser.add_argument('ad_num') parser.add_argument('ad_title') parser.add_argument('ad_body') parser.add_argument('ad_image') parser.add_argument('jump_status') parser.add_argument('ad_sort') parser.add_argument('status') parser.add_argument('companyid') parser.add_argument('jump_param') parser.add_argument('ad_property') class Ad(Resource): def __init__(self): self.args = parser.parse_args() self.mydb = MysqlBase(**mysql_promotion_config) def get(self): status = self.args['status'] id = self.args['id'] companyid = self.args['companyid'] gameid = self.args['gameid'] # if not gameid or not localid: # # log.error(f"请输入必须的游戏ID和位置ID字段,当前获得是{gameid},{localid}") # return jsonify({'code': 500, "message": f"请输入必须的游戏ID和位置ID字段,当前获得是{gameid},{localid},{status}"}) # now = datetime.datetime.today().strftime("%Y-%m-%d %H:%M:%S") if not id: base_sql = """SELECT id, name, begin_time, end_time, ad_num, ad_title, ad_body, ad_image, jump_param, ad_sort, status, companyid, locationid, gameid, channelid, jump_status, ad_property FROM ad WHERE in_used=1 """ if companyid: sel_sql = f"{base_sql} and companyid={companyid}" else: sel_sql = f"{base_sql}" if status: sel_sql = f"{sel_sql} and status={status}" if gameid: sel_sql = f"{sel_sql} and gameid={gameid}" else: sel_sql = f"""select id, name, begin_time, end_time, ad_num, ad_title, ad_body, ad_image, jump_param, ad_sort, status, companyid, locationid, gameid, channelid, jump_status, ad_property from ad where in_used=1 and id={id}; """ data = self.mydb.query(sel_sql) #log.info(f"sql={sel_sql},data={data}") if data: all = [] try: for line in data: ad_info = {} ad_info['id'], ad_info['name'], ad_info['begin_time'], ad_info['end_time'], ad_info['ad_num'], ad_info['ad_title'], ad_info['ad_body'], ad_info['ad_image'], ad_info['jump_param'], ad_info['ad_sort'], ad_info['status'], ad_info['companyid'], ad_info['locationid'], ad_info['gameid'], ad_info['channelid'], ad_info['jump_status'], ad_info['ad_property'] = line all.append(ad_info) return jsonify({'code': 200, 'message': all}) except Exception: log.error("split data from mysql failed!", exc_info=True) else: return jsonify({'code': 200, 'message': []}) def post(self): ad = {} id = self.get_adid() ad['id'] = id ad['name'] = self.args['name'] ad['gameid'] = self.args['gameid'] ad['channelid'] = self.args['channelid'] ad['locationid'] = self.args['locationid'] ad['begin_time'] = self.args['begin_time'] or '1999-01-01' ad['end_time'] = self.args['end_time'] or '3000-01-01' ad['ad_num'] = self.args['ad_num'] or -1 ad['ad_title'] = self.args['ad_title'] ad['ad_body'] = self.args['ad_body'] ad['ad_image'] = self.args['ad_image'] ad['jump_param'] = self.args['jump_param'] ad['jump_status'] = self.args['jump_status'] ad['ad_sort'] = self.args['ad_sort'] or 0 ad['companyid'] = self.args['companyid'] ad['ad_property'] = self.args['ad_property'] # 检查必需有的字段 if not ( ad['name'] and ad['gameid'] and ad['locationid'] and ad['ad_image'] and ad['jump_status'] and ad['companyid']): return jsonify({'code': 500, 'message': '一些必填项未提供'}) # 检查该广告是否已存在 try: check_sql = f"select id from ad where name='{ad['name']}' and gameid={ad['gameid']} and \ locationid=‘{ad['locationid']}’ and companyid={ad['companyid']}" data = self.mydb.query(check_sql) if data: return jsonify({'code': 500, 'message': f"name={ad['name']} gameid={ad['gameid']} was in db!"}) except Exception: log.error(f"check new id in db failed!", exc_info=True) return jsonify({'code': 500, 'message': 'check data in db failed!'}) try: self.mydb.insert('ad', ad) return jsonify({'code': 200, 'message': 'add adid={id} success!'}) except Exception: log.error("Insert ad to mysql failed!", exc_info=True) return jsonify({'code': 500, 'message': f'insert {id} failed! '}) def get_adid(self): max_id = f"select id from ad order by id desc limit 1" data = self.mydb.query(max_id) try: max = int(data[0][0]) + 1 log.info(f"max id was {max}!") except Exception: log.error(f"error with get ad id ", exc_info=True) max = 1001 return max def put(self): try: ad = {} ad['id'] = self.args['id'] ad['name'] = self.args['name'] ad['gameid'] = self.args['gameid'] ad['channelid'] = self.args['channelid'] ad['locationid'] = self.args['locationid'] ad['begin_time'] = self.args['begin_time'] or '1999-01-01' ad['end_time'] = self.args['end_time'] or '3000-01-01' ad['ad_num'] = self.args['ad_num'] or -1 ad['ad_title'] = self.args['ad_title'] ad['ad_body'] = self.args['ad_body'] ad['ad_image'] = self.args['ad_image'] ad['jump_param'] = self.args['jump_param'] ad['ad_sort'] = self.args['ad_sort'] ad['status'] = self.args['status'] or 0 ad['companyid'] = self.args['companyid'] ad['jump_status'] = self.args['jump_status'] ad['ad_property'] = self.args['ad_property'] sel_sql = f"select name from ad where id={self.args['id']};" data = self.mydb.query(sel_sql) if data: condition = f"id='{self.args['id']}'" self.mydb.update("ad", ad, condition) if str(ad['status']).strip() == str(1): if rebuild_ad(): log.info(f"rebuild cache via ad change!") return jsonify({'code': 200, 'message': 'update adid={id} success!'}) else: return jsonify({'code': 500, 'message': 'rebuild cache failed!'}) else: return jsonify({'code': 200, 'message': 'update adid={id} success!'}) else: return jsonify({'code': 404, 'message': f"{self.args['id']} not found in mysql!"}) except Exception: log.error("update values to ad mysql failed!", exc_info=True) return jsonify({'code': 500}) def delete(self): id = self.args['id'] or None if not id: return jsonify({'code': 404, 'message': f'{id} not found!'}) #del_sql = f"delete from ad where id={id};" del_sql = f"update ad set in_used=0 where id={id};" try: self.mydb.change(del_sql) return jsonify({'code': 200, 'message': f'remove adid={id} success!'}) except Exception: log.error("remove id from ad failed!", exc_info=True)