def POST(self,cid,rid): ''' '/bfdrest/client/(cid)/operationrules/(rid)' ''' myuuid = uuid.uuid1();LOG("info",_myuuid=myuuid) data = web.data() rv = json.loads(data) range_iids = {} #range_iids = goods.generalize_ranges(cid,rv["rec_ranges"]) riids = [] for key in range_iids: riids.extend(range_iids[key]) operation_rule = ParseFromJson(rv) operation_rule.operation_rule_id = rid rlist = cache.get('%s:OperatorRules:_all_'%cid) if rlist: rlist = json.loads(rlist) else: rlist = {} rlist[rid] = time.time() cache.set('%s:OperatorRules:_all_'%(cid),json.dumps(rlist)) cache.set('%s:OperationRule:%s'%(cid,rid),operation_rule.SerializeToString()) rstr = cache.set('%s:OperatorRules:%s'%(cid,rid),data) ret = {} if rstr: ret["success"] = True else: ret["success"] = False ret["error_info"] = "can't save operation rule." return pub.callback(json.dumps(ret),myuuid)
def POST(self,cid,abid,method=None): ''' '/bfdrest/client/(cid)/ABtest/(abid)' ''' myuuid = uuid.uuid1();LOG("info",_myuuid=myuuid) stop = False if method == "stop": stop = True data = web.data() ret = {} rv = json.loads(data) if not SetBannerABtest(cid,abid,rv,stop): ret["success"] = False ret["error_info"] = "can't save banner abtest." return pub.callback(json.dumps(ret),myuuid) rlist = cache.get('%s:ABtest:_all_'%cid) if rlist: rlist = json.loads(rlist) else: rlist = {} rlist[abid] = time.time() rstr = cache.set('%s:ABtest:_all_'%(cid),json.dumps(rlist)) rstr = cache.set('%s:ABtest:%s'%(cid,abid),data) if rstr: ret["success"] = True else: ret["success"] = False ret["error_info"] = "can't save abtest rule." return pub.callback(json.dumps(ret),myuuid)
def POST(self, cid, abid, method=None): ''' '/bfdrest/client/(cid)/ABtest/(abid)' ''' myuuid = uuid.uuid1() LOG("info", _myuuid=myuuid) stop = False if method == "stop": stop = True data = web.data() ret = {} rv = json.loads(data) if not SetBannerABtest(cid, abid, rv, stop): ret["success"] = False ret["error_info"] = "can't save banner abtest." return pub.callback(json.dumps(ret), myuuid) rlist = cache.get('%s:ABtest:_all_' % cid) if rlist: rlist = json.loads(rlist) else: rlist = {} rlist[abid] = time.time() rstr = cache.set('%s:ABtest:_all_' % (cid), json.dumps(rlist)) rstr = cache.set('%s:ABtest:%s' % (cid, abid), data) if rstr: ret["success"] = True else: ret["success"] = False ret["error_info"] = "can't save abtest rule." return pub.callback(json.dumps(ret), myuuid)
def POST(self, cid, rid): ''' '/bfdrest/client/(cid)/operationrules/(rid)' ''' myuuid = uuid.uuid1() LOG("info", _myuuid=myuuid) data = web.data() rv = json.loads(data) range_iids = {} #range_iids = goods.generalize_ranges(cid,rv["rec_ranges"]) riids = [] for key in range_iids: riids.extend(range_iids[key]) operation_rule = ParseFromJson(rv) operation_rule.operation_rule_id = rid rlist = cache.get('%s:OperatorRules:_all_' % cid) if rlist: rlist = json.loads(rlist) else: rlist = {} rlist[rid] = time.time() cache.set('%s:OperatorRules:_all_' % (cid), json.dumps(rlist)) cache.set('%s:OperationRule:%s' % (cid, rid), operation_rule.SerializeToString()) rstr = cache.set('%s:OperatorRules:%s' % (cid, rid), data) ret = {} if rstr: ret["success"] = True else: ret["success"] = False ret["error_info"] = "can't save operation rule." return pub.callback(json.dumps(ret), myuuid)
def DELETE(self, cid, goodsid): ''' /bfdrest/client/(cid)/goods/(goodsid) ''' myuuid = uuid.uuid1() LOG("info", _myuuid=myuuid) data = web.input() jdata = data ret = {} g_str = cache.get('%s:Goods:%s' % (cid, goodsid)) pgs = RecBanner_pb2.Goods() if g_str: pgs.ParseFromString(g_str) if not pgs.is_ranges: rm_goods_solr(cid, goodsid) cache.delete('%s:Goods:%s' % (cid, goodsid)) remove_goods_relation(cid, goodsid, jdata) goods_list = cache.get('%s:Goods:_all_' % cid) if goods_list: goods_list = json.loads(goods_list) else: goods_list = {} if goodsid in goods_list: del goods_list[goodsid] cache.set('%s:Goods:_all_' % cid, json.dumps(goods_list)) ret['success'] = True return pub.callback(json.dumps(ret), myuuid)
def DELETE(self,cid,rid): ''' '/bfdrest/client/(cid)/operationrules/(rid)' ''' myuuid = uuid.uuid1();LOG("info",_myuuid=myuuid) data = web.input() jdata = data rstr = cache.delete('%s:OperationRule:%s'%(cid,rid)) rstr = cache.delete('%s:OperatorRules:%s'%(cid,rid)) rlist = cache.get('%s:OperatorRules:_all_'%cid) if rlist: rlist = json.loads(rlist) else: rlist = {} if rid in rlist: del rlist[rid] cache.delete('%s:OperatorRulesItems:%s'%(cid,rid)) rstr = cache.set('%s:OperatorRules:_all_'%(cid),json.dumps(rlist)) for p_bid in json.loads(jdata["banner_id"]): p_bid_str = cache.get("%s:RecBanner:%s"%(cid,p_bid)) p_banner = RecBanner_pb2.RecBanner() if p_bid_str: p_banner.ParseFromString(p_bid_str) for i in xrange(len(p_banner.logic_rule.operation_rules)): if p_banner.logic_rule.operation_rules[i].operation_rule == rid: del p_banner.logic_rule.operation_rules[i] break cache.set("%s:RecBanner:%s"%(cid,p_bid),p_banner.SerializeToString()) ret = {} if rstr: ret["success"] = True else: ret["success"] = False ret["error_info"] = "can't delete operation rule." return pub.callback(json.dumps(ret),myuuid)
def set(key, value): if key == 'keys': return False now = time.ctime() keystr = cache.get('keys') if keystr: keys = json.loads(keystr) keys[key] = now else: keys = {key: now} if cache.set(key, value): return cache.set('keys', json.dumps(keys)) else: return False
def set(key,value): if key == 'keys': return False now = time.ctime() keystr = cache.get('keys') if keystr: keys = json.loads(keystr) keys[key] = now else: keys = {key:now} if cache.set(key,value): return cache.set('keys',json.dumps(keys)) else: return False
def DELETE(self, cid, abid): ''' '/bfdrest/client/(cid)/ABtest/(abid)' ''' myuuid = uuid.uuid1() LOG("info", _myuuid=myuuid) data = web.input() rv = data ret = {} if not SetBannerABtest(cid, abid, rv, False, True): ret["success"] = False ret["error_info"] = "can't delete banner abtest." return pub.callback(json.dumps(ret), myuuid) rlist = cache.get('%s:ABtest:_all_' % cid) if rlist: rlist = json.loads(rlist) else: rlist = {} if abid in rlist: del rlist[abid] rstr = cache.set('%s:ABtest:_all_' % (cid), json.dumps(rlist)) rstr = cache.delete('%s:ABtest:%s' % (cid, abid)) rstr = cache.delete('%s:ABtestRule:%s' % (cid, abid)) if rstr: ret["success"] = True else: ret["success"] = True ret["error_info"] = "can't delete abtest rule." return pub.callback(json.dumps(ret), myuuid)
def DELETE(self,cid,abid): ''' '/bfdrest/client/(cid)/ABtest/(abid)' ''' myuuid = uuid.uuid1();LOG("info",_myuuid=myuuid) data = web.input() rv = data ret = {} if not SetBannerABtest(cid,abid,rv,False,True): ret["success"] = False ret["error_info"] = "can't delete banner abtest." return pub.callback(json.dumps(ret),myuuid) rlist = cache.get('%s:ABtest:_all_'%cid) if rlist: rlist = json.loads(rlist) else: rlist = {} if abid in rlist: del rlist[abid] rstr = cache.set('%s:ABtest:_all_'%(cid),json.dumps(rlist)) rstr = cache.delete('%s:ABtest:%s'%(cid,abid)) rstr = cache.delete('%s:ABtestRule:%s'%(cid,abid)) if rstr: ret["success"] = True else: ret["success"] = True ret["error_info"] = "can't delete abtest rule." return pub.callback(json.dumps(ret),myuuid)
def POST(self, cid): ''' /bfdrest/client/(cid)/brand ''' value = web.data() value_error = '{"stat":false,"info":"Wrong json data","format":{"brand":["brand1","brand2"],"category":["cate1","cate2"]}}' try: v = json.loads(value) except: return "json error:" + value_error + value if 'brand' not in v or 'category' not in v: return value_error if len(v['category']) > 0 and v['category'][0] == '_all_': v['category'] = v['category'][1:] cates = v['category'] brands = v['brand'] # 更新_all_的子品牌和子类目 cate = "_all_" catestr = cache.get(u'%s:category:%s' % (cid, cate)) if catestr: cateobj = json.loads(catestr) else: cateobj = {'brand': [], 'category': []} for brand in brands: if brand not in cateobj['brand']: cateobj['brand'].append(brand) if len(cates) > 0 and cates[0] not in cateobj['category']: cateobj['category'].append(cates[0]) cache.set('%s:category:%s' % (cid, cate.decode('utf8')), json.dumps(cateobj)) # 更新各级类目的子品牌和子类目 for i in range(len(cates)): cate = cate + ':' + cates[i] catestr = cache.get(u'%s:category:%s' % (cid, cate)) if catestr: cateobj = json.loads(catestr) else: cateobj = {'brand': [], 'category': []} for brand in brands: if brand not in cateobj['brand']: cateobj['brand'].append(brand) if len(cates) > i + 1 and cates[i + 1] not in cateobj['category']: cateobj['category'].append(cates[i + 1]) cache.set('%s:category:%s' % (cid, cate), json.dumps(cateobj)) ret = json.loads(cache.get('%s:category:%s' % (cid, cate))) ret['category'] = cates return json.dumps(ret)
def PUT(self,cid,col): ''' /bfdrest/(cid)/collocations/(colid) ''' value = web.data() ret = post_data_ret if cache.set('%s:goods:%s' % (cid,goodsid),value): ret["stat"]=True else: pass return json.dumps(ret)
def delete(key,pattern=None): if key == 'keys' and not pattern: return False if key == 'keys' and pattern: r = re.compile(pattern) keys = json.loads(cache.get('keys')) klist = sorted(keys) for k in klist: if r.match(k): cache.delete(k) del keys[k] return cache.set('keys',json.dumps(keys)) keys = json.loads(cache.get('keys')) if cache.delete(key): del keys[key] return cache.set('keys',json.dumps(keys)) else: return False
def delete(key, pattern=None): if key == 'keys' and not pattern: return False if key == 'keys' and pattern: r = re.compile(pattern) keys = json.loads(cache.get('keys')) klist = sorted(keys) for k in klist: if r.match(k): cache.delete(k) del keys[k] return cache.set('keys', json.dumps(keys)) keys = json.loads(cache.get('keys')) if cache.delete(key): del keys[key] return cache.set('keys', json.dumps(keys)) else: return False
def DELETE(self, cid, bid): ''' '/bfdrest/client/(cid)/banners/(bid)' ''' myuuid = uuid.uuid1() LOG("info", _myuuid=myuuid) rlist = cache.get('%s:Banners:_all_' % cid) if rlist: rlist = json.loads(rlist) else: rlist = {} if bid in rlist: del rlist[bid] cache.set('%s:Banners:_all_' % (cid), json.dumps(rlist)) rstr = cache.delete('%s:Banners:%s' % (cid, bid)) rstr = cache.delete('%s:RecBanner:%s' % (cid, bid)) ret = {} if rstr: ret["success"] = True else: ret["success"] = False ret["error_info"] = "can't delete banner info." return pub.callback(json.dumps(ret), myuuid)
def DELETE(self, cid, rid): ''' '/bfdrest/client/(cid)/operationrules/(rid)' ''' myuuid = uuid.uuid1() LOG("info", _myuuid=myuuid) data = web.input() jdata = data rstr = cache.delete('%s:OperationRule:%s' % (cid, rid)) rstr = cache.delete('%s:OperatorRules:%s' % (cid, rid)) rlist = cache.get('%s:OperatorRules:_all_' % cid) if rlist: rlist = json.loads(rlist) else: rlist = {} if rid in rlist: del rlist[rid] cache.delete('%s:OperatorRulesItems:%s' % (cid, rid)) rstr = cache.set('%s:OperatorRules:_all_' % (cid), json.dumps(rlist)) for p_bid in json.loads(jdata["banner_id"]): p_bid_str = cache.get("%s:RecBanner:%s" % (cid, p_bid)) p_banner = RecBanner_pb2.RecBanner() if p_bid_str: p_banner.ParseFromString(p_bid_str) for i in xrange(len(p_banner.logic_rule.operation_rules)): if p_banner.logic_rule.operation_rules[ i].operation_rule == rid: del p_banner.logic_rule.operation_rules[i] break cache.set("%s:RecBanner:%s" % (cid, p_bid), p_banner.SerializeToString()) ret = {} if rstr: ret["success"] = True else: ret["success"] = False ret["error_info"] = "can't delete operation rule." return pub.callback(json.dumps(ret), myuuid)
def POST(self, cid, bid): ''' '/bfdrest/client/(cid)/banners/(bid)' ''' myuuid = uuid.uuid1() LOG("info", _myuuid=myuuid) data = web.data() ret = {} rv = json.loads(data) rec_banner = ParseFromJson(cid, bid, rv) rlist = cache.get('%s:Banners:_all_' % cid) if rlist: rlist = json.loads(rlist) else: rlist = {} rlist[bid] = time.time() rstr = cache.set('%s:Banners:_all_' % (cid), json.dumps(rlist)) rstr = cache.set('%s:RecBanner:%s' % (cid, bid), rec_banner.SerializeToString()) rstr = cache.set('%s:Banners:%s' % (cid, bid), data) if rstr: ret["success"] = True else: ret["success"] = False ret["error_info"] = "can't save banner info." return pub.callback(json.dumps(ret), myuuid)
def SetBannerABtest(cid,abid,jab,stop = False,delete = False): bannerstr = cache.get("%s:RecBanner:%s"%(cid,jab["banner_id"])) if not bannerstr: print "no banner_id" return False rb = RecBanner_pb2.RecBanner() lr = RecBanner_pb2.RecBanner.LogicRule() opr = RecBanner_pb2.RecBanner.LogicRule.OperationRule() pr = RecBanner_pb2.RecBanner.LogicRule.PositionRule() abr = RecBanner_pb2.RecBanner.ABtestRule() ablr= RecBanner_pb2.RecBanner.ABtestRule.LogicRule() absr= RecBanner_pb2.RecBanner.ABtestRule.LogicRule.SortRule() tr = RecBanner_pb2.TimeRange() tp = RecBanner_pb2.TimeRange.TimePoint() ir = RecBanner_pb2.ItemRange() try: rb.ParseFromString(bannerstr) if stop: abrstr = cache.get("%s:ABtestRule:%s"%(cid,abid)) if not abrstr: print "no abtest_id" return False abr.ParseFromString(abrstr) abr.is_active = False cache.set("%s:ABtestRule:%s"%(cid,abid),abr.SerializeToString()) for i in xrange(len(rb.abtest_rules)): if abid == rb.abtest_rules[i].abtest_id: rb.abtest_rules[i].is_active = False break rb.update_time = int(time.time()) return cache.set("%s:RecBanner:%s"%(cid,jab["banner_id"]),rb.SerializeToString()) if delete: for i in xrange(len(rb.abtest_rules)): if abid == rb.abtest_rules[i].abtest_id: del(rb.abtest_rules[i]) break rb.update_time = int(time.time()) return cache.set("%s:RecBanner:%s"%(cid,jab["banner_id"]),rb.SerializeToString()) abr.abtest_id = abid abr.name = jab["name"] abr.description = jab["description"] abr.traffic_ratio = jab["traffic_ratio"] abr.is_active = jab["is_active"] abr.banner_id = jab["banner_id"] if "user_level" in jab: abr.user_level = jab["user_level"] tr.type = jab["time_type"] tp.day = jab["start_time"]["day"] tp.time = jab["start_time"]["time"] tp.wday = jab["start_time"]["wday"] tr.start_time.CopyFrom(tp) tp.day = jab["end_time"]["day"] tp.time = jab["end_time"]["time"] tp.wday = jab["end_time"]["wday"] tr.end_time.CopyFrom(tp) abr.time_range.CopyFrom(tr) def parse_item_range(jir,has_ratio=False): ir.Clear() if len(jir) > 0: ir.type = jir[0] if has_ratio and len(jir) > 1: ir.ratio = int(jir[1]) del jir[0:2] else: del jir[0] if ir.type == "goods": ir.goods_id = jir[0] del jir[0] if ir.type != "_all_": for pv in jir: if pv[0] == 'price_less_than' or pv[0] == 'price_greater_than': setattr(ir,pv[0],float(pv[1])) else: eval("ir.%s.append(pv[1])"%pv[0]) return ir if len(jab["condition"]) > 0: abr.condition.CopyFrom(parse_item_range(jab["condition"])) def parse_logic_rule(jlr): ablr.Clear() if "rec_ranges" in jlr: for jir in jlr["rec_ranges"]: ablr.rec_ranges.add() ablr.rec_ranges[len(ablr.rec_ranges)-1].CopyFrom(parse_item_range(jir,True)) if "filter_ranges" in jlr: for jir in jlr["filter_ranges"]: ablr.filter_ranges.add() ablr.filter_ranges[len(ablr.filter_ranges)-1].CopyFrom(parse_item_range(jir)) if "sort" in jlr: for jsr in jlr["sort"]: absr.Clear() absr.property = jsr[0] absr.type = int(jsr[1]) ablr.sort_rules.add() ablr.sort_rules[len(ablr.sort_rules)-1].CopyFrom(absr) return ablr abr.logic_rules.add() abr.logic_rules.add() abr.logic_rules[0].CopyFrom(parse_logic_rule(jab["test_a"])) abr.logic_rules[1].CopyFrom(parse_logic_rule(jab["test_b"])) new_abtest = True for i in xrange(len(rb.abtest_rules)): if abid == rb.abtest_rules[i].abtest_id: rb.abtest_rules[i].Clear() rb.abtest_rules[i].CopyFrom(abr) new_abtest = False break if new_abtest: rb.abtest_rules.add() rb.abtest_rules[len(rb.abtest_rules)-1].CopyFrom(abr) rb.update_time = int(time.time()) rstr = cache.set('%s:ABtestRule:%s'%(cid,abid),abr.SerializeToString()) return cache.set("%s:RecBanner:%s"%(cid,jab["banner_id"]),rb.SerializeToString()) except Exception,e: print "err: " + str(e) return False
def POST(self,n,b,k): myuuid = uuid.uuid1();LOG("info",_myuuid=myuuid) data = web.data() return pub.callback(cache.set(k,data,n,b),myuuid)
def SetBannerABtest(cid, abid, jab, stop=False, delete=False): bannerstr = cache.get("%s:RecBanner:%s" % (cid, jab["banner_id"])) if not bannerstr: print "no banner_id" return False rb = RecBanner_pb2.RecBanner() lr = RecBanner_pb2.RecBanner.LogicRule() opr = RecBanner_pb2.RecBanner.LogicRule.OperationRule() pr = RecBanner_pb2.RecBanner.LogicRule.PositionRule() abr = RecBanner_pb2.RecBanner.ABtestRule() ablr = RecBanner_pb2.RecBanner.ABtestRule.LogicRule() absr = RecBanner_pb2.RecBanner.ABtestRule.LogicRule.SortRule() tr = RecBanner_pb2.TimeRange() tp = RecBanner_pb2.TimeRange.TimePoint() ir = RecBanner_pb2.ItemRange() try: rb.ParseFromString(bannerstr) if stop: abrstr = cache.get("%s:ABtestRule:%s" % (cid, abid)) if not abrstr: print "no abtest_id" return False abr.ParseFromString(abrstr) abr.is_active = False cache.set("%s:ABtestRule:%s" % (cid, abid), abr.SerializeToString()) for i in xrange(len(rb.abtest_rules)): if abid == rb.abtest_rules[i].abtest_id: rb.abtest_rules[i].is_active = False break rb.update_time = int(time.time()) return cache.set("%s:RecBanner:%s" % (cid, jab["banner_id"]), rb.SerializeToString()) if delete: for i in xrange(len(rb.abtest_rules)): if abid == rb.abtest_rules[i].abtest_id: del (rb.abtest_rules[i]) break rb.update_time = int(time.time()) return cache.set("%s:RecBanner:%s" % (cid, jab["banner_id"]), rb.SerializeToString()) abr.abtest_id = abid abr.name = jab["name"] abr.description = jab["description"] abr.traffic_ratio = jab["traffic_ratio"] abr.is_active = jab["is_active"] abr.banner_id = jab["banner_id"] if "user_level" in jab: abr.user_level = jab["user_level"] tr.type = jab["time_type"] tp.day = jab["start_time"]["day"] tp.time = jab["start_time"]["time"] tp.wday = jab["start_time"]["wday"] tr.start_time.CopyFrom(tp) tp.day = jab["end_time"]["day"] tp.time = jab["end_time"]["time"] tp.wday = jab["end_time"]["wday"] tr.end_time.CopyFrom(tp) abr.time_range.CopyFrom(tr) def parse_item_range(jir, has_ratio=False): ir.Clear() if len(jir) > 0: ir.type = jir[0] if has_ratio and len(jir) > 1: ir.ratio = int(jir[1]) del jir[0:2] else: del jir[0] if ir.type == "goods": ir.goods_id = jir[0] del jir[0] if ir.type != "_all_": for pv in jir: if pv[0] == 'price_less_than' or pv[ 0] == 'price_greater_than': setattr(ir, pv[0], float(pv[1])) else: eval("ir.%s.append(pv[1])" % pv[0]) return ir if len(jab["condition"]) > 0: abr.condition.CopyFrom(parse_item_range(jab["condition"])) def parse_logic_rule(jlr): ablr.Clear() if "rec_ranges" in jlr: for jir in jlr["rec_ranges"]: ablr.rec_ranges.add() ablr.rec_ranges[len(ablr.rec_ranges) - 1].CopyFrom( parse_item_range(jir, True)) if "filter_ranges" in jlr: for jir in jlr["filter_ranges"]: ablr.filter_ranges.add() ablr.filter_ranges[len(ablr.filter_ranges) - 1].CopyFrom( parse_item_range(jir)) if "sort" in jlr: for jsr in jlr["sort"]: absr.Clear() absr.property = jsr[0] absr.type = int(jsr[1]) ablr.sort_rules.add() ablr.sort_rules[len(ablr.sort_rules) - 1].CopyFrom(absr) return ablr abr.logic_rules.add() abr.logic_rules.add() abr.logic_rules[0].CopyFrom(parse_logic_rule(jab["test_a"])) abr.logic_rules[1].CopyFrom(parse_logic_rule(jab["test_b"])) new_abtest = True for i in xrange(len(rb.abtest_rules)): if abid == rb.abtest_rules[i].abtest_id: rb.abtest_rules[i].Clear() rb.abtest_rules[i].CopyFrom(abr) new_abtest = False break if new_abtest: rb.abtest_rules.add() rb.abtest_rules[len(rb.abtest_rules) - 1].CopyFrom(abr) rb.update_time = int(time.time()) rstr = cache.set('%s:ABtestRule:%s' % (cid, abid), abr.SerializeToString()) return cache.set("%s:RecBanner:%s" % (cid, jab["banner_id"]), rb.SerializeToString()) except Exception, e: print "err: " + str(e) return False
class handler: def GET(self, cid, goodsid=None, range=None): ''' /bfdrest/client/(cid)/goods/(goodsid)/(items) ''' myuuid = uuid.uuid1() LOG("info", _myuuid=myuuid) if goodsid == None: if cid in goods_fields_conf: return pub.callback(json.dumps(goods_fields_conf[cid]), myuuid) return pub.callback(json.dumps(goods_fields), myuuid) elif goodsid == "type": return pub.callback(json.dumps(type_define), myuuid) else: gv = cache.get('%s:Goods:%s' % (cid, goodsid)) if gv: ret = json.loads(gv) ret['success'] = True if range == None: if 'keys' in ret: del ret['keys'] pass return pub.callback(json.dumps(ret), myuuid) else: iids = [] # 获取范围的item for key in [goodsid]: ids_str = cache.get('%s:GoodsItems:%s' % (cid, key)) if ids_str: iids.extend(json.loads(ids_str)) return pub.callback(json.dumps(iids), myuuid) else: ret = {} ret['success'] = False ret['error_info'] = 'no such goods id.' return pub.callback(json.dumps(ret), myuuid) def POST(self, cid, goodsid): ''' /bfdrest/client/(cid)/goods/(goodsid) ''' myuuid = uuid.uuid1() LOG("info", _myuuid=myuuid) value = web.data() put_value = {} ret = {} data = {} pgs = RecBanner_pb2.Goods() g_str = cache.get('%s:Goods:%s' % (cid, goodsid)) if g_str: pgs.ParseFromString(g_str) pgs.goods_id = goodsid try: put_value = json.loads(value) except Exception, e: ret["success"] = False ret["error_info"] = "wrong json format: %s" % str(e) return pub.callback(json.dumps(ret), myuuid) if put_value.has_key('name'): data['name'] = put_value['name'] pgs.name = put_value['name'] else: data['name'] = "" if put_value.has_key('description'): data['description'] = put_value['description'] pgs.description = put_value['description'] else: data['description'] = "" if "user_level" in put_value: data["user_level"] = put_value["user_level"] pgs.user_level = put_value["user_level"] pgs.is_ranges = False if put_value.has_key('items') and len(put_value['items']) > 0: ret["success"] = True # save goods data['items'] = put_value['items'] # 待添加具体功能,更新ItemBase,更新商品库商品 rm_goods_solr(cid, goodsid, data['items']) iids, info = generalize_items(cid, goodsid, data['items']) data['keys'] = [goodsid] del data['items'] goods_list = cache.get('%s:Goods:_all_' % cid) if goods_list: goods_list = json.loads(goods_list) else: goods_list = {} goods_list[goodsid] = time.time() cache.set('%s:Goods:_all_' % cid, json.dumps(goods_list)) cache.set('%s:GoodsItems:%s' % (cid, goodsid), json.dumps(iids)) cache.set('%s:Goods:%s' % (cid, goodsid), pgs.SerializeToString()) return pub.callback(json.dumps(info), myuuid) elif put_value.has_key('ranges') and len(put_value['ranges']) > 0: pgs.is_ranges = True for i in xrange(len(pgs.ranges)): del pgs.ranges[0] ret["success"] = True # save goods data['ranges'] = put_value['ranges'] def parse_item_range(jir, has_ratio=False): ir = RecBanner_pb2.ItemRange() if len(jir) > 0: ir.type = jir[0][0] for pv in jir: if len(pv) > 1 and pv[1] != "_all_": eval("ir.%s.append(pv[1])" % pv[0]) return ir for range in put_value['ranges']: pgs.ranges.add() pgs.ranges[len(pgs.ranges) - 1].CopyFrom( parse_item_range(range)) #rm_goods_solr(cid,goodsid) range_iids = generalize_ranges(cid, data['ranges']) data["keys"] = range_iids.keys() iids = [] for key in range_iids: iids.extend(range_iids[key]) goods_list = cache.get('%s:Goods:_all_' % cid) if goods_list: goods_list = json.loads(goods_list) else: goods_list = {} goods_list[goodsid] = time.time() cache.set('%s:Goods:_all_' % cid, json.dumps(goods_list)) cache.set('%s:GoodsItems:%s' % (cid, goodsid), json.dumps(iids)) cache.set('%s:Goods:%s' % (cid, goodsid), pgs.SerializeToString()) # 待添加具体功能,更新商品库商品 return pub.callback(json.dumps(ret), myuuid) else: ret["success"] = True cache.set('%s:Goods:%s' % (cid, goodsid), pgs.SerializeToString()) return pub.callback(json.dumps(ret), myuuid)
def POST(self, n, b, k): myuuid = uuid.uuid1() LOG("info", _myuuid=myuuid) data = web.data() return pub.callback(cache.set(k, data, n, b), myuuid)
def GET(self): ''' '/wx/qr' ''' myuuid = uuid.uuid1() LOG("info", _myuuid=myuuid) args = web.input() if "method" in args: method = args["method"] if method == "getQrTicket": web.header('Content-Type', 'application/javascript') data = args["data"] ret = urllib2.urlopen( "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=FoYOQEtQ-QHjnSv9tPDqpGOA49AFUZNqnQtPhhlRq_8i9XfxII3ofQGVtYpB6rjv", data) retstr = ret.read() return pub.callback(retstr, myuuid) elif method == "getQr": gid = web.cookies().get("bfdid") print gid param_index = int(cache.get("G:weixin:paramindex")) web.header('Content-Type', 'image/png') if param_index == None: param_index = 0 cache.set("G:weixin:paramindex", "0") else: param_index = (int(param_index) + 1) % 100 cache.set("G:weixin:paramindex", str(param_index)) access_token = cache.get("G:weixin:access_token") data = { "expire_seconds": "1800", "action_name": "QR_SCENE", "action_info": { "scene": { "scene_id": str(param_index) } } } def getTicket(access_token): ret = urllib2.urlopen( "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=" + access_token, json.dumps(data)) retstr = ret.read() ticket = json.loads(retstr)["ticket"] return ticket try: ticket = getTicket(access_token) except: appid = "wx68cc9091ef2be695" secret = "c27b72cd1d51114cda5e816bbb95ab6d" get_access_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s' % ( appid, secret) access_token_ret = urllib2.urlopen(get_access_url) access_token = json.loads( access_token_ret.read())["access_token"] cache.set("G:weixin:access_token", access_token) ticket = getTicket(access_token) qrurl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s" % ticket qrimg = urllib2.urlopen(qrurl) img = qrimg.read() cache.set("G:weixin:scene:%d" % param_index, gid) return img elif method == "getgid": web.header('Content-Type', 'application/javascript') open_id = args["open_id"] cid = args["cid"] if "scene_id" in args: scene_id = args["scene_id"] gid = cache.get("G:weixin:scene:%s" % scene_id) cache.set("G:weixin:openid:%s:%s" % (cid, open_id), gid) return pub.callback('"%s"' % gid, myuuid) else: gid = cache.get("G:weixin:openid:%s:%s" % (cid, open_id)) return pub.callback('"%s"' % gid, myuuid) elif method == "getopenid": web.header('Content-Type', 'application/javascript') code = args['code'] access_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx68cc9091ef2be695&secret=c27b72cd1d51114cda5e816bbb95ab6d&code=%s&grant_type=authorization_code' % code ret = urllib2.urlopen(access_url) return pub.callback(ret.read(), myuuid) else: web.header('Content-Type', 'application/javascript') return pub.callback(json.dumps(None), myuuid)
def PUT(self, cid, brd): ''' /bfdrest/client/(cid)/brand/(brd) ''' value = web.data() return cache.set('%s:brand:%s' % (cid, brd), value)
def GET(self): ''' '/wx/qr' ''' myuuid = uuid.uuid1();LOG("info",_myuuid=myuuid) args = web.input() if "method" in args: method = args["method"] if method == "getQrTicket": web.header('Content-Type', 'application/javascript') data = args["data"] ret = urllib2.urlopen( "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=FoYOQEtQ-QHjnSv9tPDqpGOA49AFUZNqnQtPhhlRq_8i9XfxII3ofQGVtYpB6rjv", data) retstr = ret.read() return pub.callback(retstr,myuuid) elif method == "getQr": gid = web.cookies().get("bfdid") print gid param_index = int(cache.get("G:weixin:paramindex")) web.header('Content-Type', 'image/png') if param_index == None: param_index = 0 cache.set("G:weixin:paramindex","0") else: param_index = (int(param_index) + 1)%100 cache.set("G:weixin:paramindex",str(param_index)) access_token = cache.get("G:weixin:access_token") data = {"expire_seconds":"1800","action_name":"QR_SCENE","action_info":{"scene":{"scene_id":str(param_index)}}} def getTicket(access_token): ret = urllib2.urlopen( "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token="+access_token, json.dumps(data)) retstr = ret.read() ticket = json.loads(retstr)["ticket"] return ticket try: ticket = getTicket(access_token) except: appid = "wx68cc9091ef2be695" secret = "c27b72cd1d51114cda5e816bbb95ab6d" get_access_url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s' % (appid,secret) access_token_ret = urllib2.urlopen(get_access_url) access_token = json.loads(access_token_ret.read())["access_token"] cache.set("G:weixin:access_token",access_token) ticket = getTicket(access_token) qrurl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=%s"%ticket qrimg = urllib2.urlopen(qrurl) img = qrimg.read() cache.set("G:weixin:scene:%d"%param_index,gid) return img elif method == "getgid": web.header('Content-Type', 'application/javascript') open_id = args["open_id"] cid = args["cid"] if "scene_id" in args: scene_id = args["scene_id"] gid = cache.get("G:weixin:scene:%s"%scene_id) cache.set("G:weixin:openid:%s:%s"%(cid,open_id),gid) return pub.callback('"%s"'%gid,myuuid) else: gid = cache.get("G:weixin:openid:%s:%s"%(cid,open_id)) return pub.callback('"%s"'%gid,myuuid) elif method == "getopenid": web.header('Content-Type', 'application/javascript') code = args['code'] access_url = 'https://api.weixin.qq.com/sns/oauth2/access_token?appid=wx68cc9091ef2be695&secret=c27b72cd1d51114cda5e816bbb95ab6d&code=%s&grant_type=authorization_code' % code ret = urllib2.urlopen(access_url) return pub.callback(ret.read(),myuuid) else: web.header('Content-Type', 'application/javascript') return pub.callback(json.dumps(None),myuuid)
def remove_goods_relation(cid, goods_id, jdata): for p_bid in json.loads(jdata["banner_id"]): p_bid_str = cache.get("%s:RecBanner:%s" % (cid, p_bid)) p_banner = RecBanner_pb2.RecBanner() if p_bid_str: p_banner.ParseFromString(p_bid_str) n = 0 for i in xrange(len(p_banner.logic_rule.position_rules)): for j in xrange( len(p_banner.logic_rule.position_rules[i - n].goods_id)): if p_banner.logic_rule.position_rules[ i - n].goods_id[j] == goods_id: del p_banner.logic_rule.position_rules[i - n].goods_id[j] break if len(p_banner.logic_rule.position_rules[i - n].goods_id) == 0: del p_banner.logic_rule.position_rules[i - n] n += 1 cache.set("%s:RecBanner:%s" % (cid, p_bid), p_banner.SerializeToString()) for ab_id in json.loads(jdata["abtest_id"]): ab_str = cache.get('%s:ABtestRule:%s' % (cid, ab_id)) p_ab = RecBanner_pb2.RecBanner.ABtestRule() if ab_str: p_ab.ParseFromString(ab_str) for logic_rule in p_ab.logic_rules: for i in xrange(len(logic_rule.rec_ranges)): if logic_rule.rec_ranges[ i].type == "goods" and logic_rule.rec_ranges[ i].goods_id == goods_id: del logic_rule.rec_ranges[i] break for i in xrange(len(logic_rule.filter_ranges)): if logic_rule.filter_ranges[ i].type == "goods" and logic_rule.filter_ranges[ i].goods_id == goods_id: del logic_rule.filter_ranges[i] break cache.set('%s:ABtestRule:%s' % (cid, ab_id), p_ab.SerializeToString()) p_bid = p_ab.banner_id p_bid_str = cache.get("%s:RecBanner:%s" % (cid, p_bid)) p_banner = RecBanner_pb2.RecBanner() if p_bid_str: p_banner.ParseFromString(p_bid_str) for ab in p_banner.abtest_rules: if ab.abtest_id == ab_id: ab.Clear() ab.CopyFrom(p_ab) break cache.set("%s:RecBanner:%s" % (cid, p_bid), p_banner.SerializeToString()) for op_id in json.loads(jdata["operation_id"]): op_str = cache.get('%s:OperationRule:%s' % (cid, op_id)) p_op = RecBanner_pb2.OperationRule() if op_str: p_op.ParseFromString(op_str) for i in xrange(len(p_op.rec_ranges)): if p_op.rec_ranges[i].type == "goods" and p_op.rec_ranges[ i].goods_id == goods_id: del p_op.rec_ranges[i] break for i in xrange(len(p_op.filter_ranges)): if p_op.filter_ranges[i].type == "goods" and p_op.filter_ranges[ i].goods_id == goods_id: del p_op.rec_ranges[i] break cache.set('%s:OperationRule:%s' % (cid, op_id), p_op.SerializeToString())