def update_channel_read(self): """ 更新通道为已读状态 参数 channel_id --> channel 的本地ID msgSource --> 消息类型 可选参数(message_center/order_msg) :return: """ channel_id = self.params.get("channel_id", "") msgSource = self.params.get("msgSource", "") with sessionCM() as session: channel = Channel.find_by_id(session, channel_id) if not channel: return {"status": 0, "data": "\"channel_id\"不存在!"} if msgSource not in ["message_center", "order_msg"]: return {"status": 0, "data": "\"msgSource\"参数的值不在合法值列表中"} message_handler = AliMessage(self.shop) result = message_handler.update_msg_read_status(channel.origin_id, msg_source=msgSource) if result.get("isSuccess", ""): with sessionCM() as session: Channel.update(session, channel, {"read_stat", 1}) return {"status": 1, "data": "状态更新成功!"} else: return {"status": 0, "data": "状态更新失败!"}
def update_channel_state(self): """ 更新 channel 的处理状态 (已处理、未处理) 参数:channel_id --> channel 的本地Id state --> 状态 0表示未处理、 1表示已处理 :return: """ channel_id = self.params.get("channel_id", "") state = self.params.get("state", "") with sessionCM() as session: channel = Channel.find_by_id(session, channel_id) if not channel: return {"status": 0, "data": "\"channel id\"不存在!"} if state not in ["1", "0"]: return {"status": 0, "data": "\"state\"值只能是字符串0或1!"} message_handler = AliMessage(self.shop) result = message_handler.update_msg_process_status( channel.origin_id, state) if result.get("isSuccess", ""): with sessionCM() as session: Channel.update(session, channel, {"deal_stat", int(state)}) return {"status": 1, "data": "状态更新成功!"} else: return { "status": 0, "data": "状态更新失败!", "errors": result.get("Errors", "") }
def update_channel_flag(self): """ 更新 channel 的标签 参数:channel_id --> channel 的本地Id rank --> 标志 取值 rank0,rank1,rank2,rank3,rank4,rank5 (白,红,橙,绿,蓝,紫) :return: """ channel_id = self.params.get("channel_id", "") rank = self.params.get("rank", "") with sessionCM() as session: channel = Channel.find_by_id(session, channel_id) if not channel: return {"status": 0, "data": "\"channel_id\"不存在!"} if rank not in ["rank0", "rank1", "rank2", "rank3", "rank4", "rank5"]: return {"status": 0, "data": "\"rank\"参数的值不在合法值列表中"} message_handler = AliMessage(self.shop) result = message_handler.update_msg_rank(channel.origin_id, rank=rank) if result.get("isSuccess", ""): with sessionCM() as session: Channel.update(session, channel, {"flag": rank}) return { "status": 1, "data": "为channel %s 打上了 %s 标签!" % (str(channel_id), str(rank)) } else: return {"status": 0, "data": "打标签失败"}
def update_channel_flag(self): """ 更新 channel 的标签 参数:channel_id --> channel 的本地Id rank --> 标志 取值 rank0,rank1,rank2,rank3,rank4,rank5 (白,红,橙,绿,蓝,紫) :return: """ channel_id = self.params.get("channel_id", "") rank = self.params.get("rank", "") with sessionCM() as session: channel = Channel.find_by_id(session, channel_id) if not channel: return {"status": 0, "data": "\"channel_id\"不存在!"} if rank not in ["rank0", "rank1", "rank2", "rank3", "rank4", "rank5"]: return {"status": 0, "data": "\"rank\"参数的值不在合法值列表中"} try: with sessionCM() as session: Channel.update(session, channel, {"flag": rank}) return { "status": 1, "data": "为channel %s 打上了 %s 标签!" % (str(channel_id), str(rank)) } except Exception, e: logger.error(traceback.format_exc(e)) return {"status": 0, "data": "打标签失败"}
def update_channel_state(self): """ 更新 channel 的处理状态 (已处理、未处理) 参数:channel_id --> channel 的本地Id state --> 状态 0表示未处理、 1表示已处理 :return: """ channel_id = self.params.get("channel_id", "") state = self.params.get("state", "") with sessionCM() as session: channel = Channel.find_by_id(session, channel_id) if not channel: return {"status": 0, "data": "\"channel id\"不存在!"} if state not in ["1", "0"]: return {"status": 0, "data": "\"state\"值只能是字符串0或1!"} try: with sessionCM() as session: Channel.update(session, channel, {"deal_stat", int(state)}) return {"status": 1, "data": "状态更新成功!"} except Exception, e: logger.error(traceback.format_exc(e)) return {"status": 0, "data": "状态更新失败!"}
def sync_message_list(self, msg_source, current_page=1, page_size=100): """ 同步订单留言 :return: """ with sessionCM() as session: while True: result = self.msg_handler.get_msg_relation_list( msg_source, current_page, page_size) print type(result), len(result) print result if not result["success"]: return # result["exception"] current_page += 1 for relation in result.get("result", []): print relation # 判断当前同步下来的Channel是否存在 chanel = Channel.find_by_origin_id(session, relation["channelId"]) # 若和上次lastMessageId相同,就不用再获取详情 if chanel and relation["lastMessageId"] == chanel[ "last_msg_id"]: continue if len(str(relation["messageTime"])) == 13: last_msg_date_timestamp = long( str(relation["messageTime"])[:-3]) else: last_msg_date_timestamp = relation["messageTime"] # seller_id 只有在卖家发送一条消息之后从summary中获取到,relation["childId"] 只是子账号ID 并不是loginId chanel = Channel.update( session, chanel, shop_id=self.shop.id, seller_id=relation["childId"], seller_name=relation["childName"], buyer_id=relation["otherLoginId"], buyer_name=relation["otherName"], read_stat=relation["readStat"], deal_stat=relation["dealStat"], open_date="", close_date="", closed_by="", flag=relation["rank"], origin_id=relation["channelId"], msg_source=msg_source, relation_type="", relation_id="", last_msg_id=relation["lastMessageId"], last_msg_date=time.strftime( "%Y-%m-%d %H:%M:%S", time.localtime(last_msg_date_timestamp)), last_msg_content=relation["lastMessageContent"]) # sync_smt_customer_detail.delay(self, chanel.id, msg_source) print chanel.id, chanel.seller_id, chanel.seller_name, chanel.last_msg_content yield chanel.id if len(result["result"]) == 0: break
def sync_message_detail(self, channel_id, **kwargs): # 第三步获取Message的详细信息 # 首先删除此管道中已经发送的消息, 查询参数:channel_id original_id=async message_ids = kwargs["message_ids"] result = self.msg_handler.get_my_messages("ReturnMessages", message_ids=message_ids) txt_pattern = re.compile('<div id="UserInputtedText">([\s\S]+?)</div>') pic_pattern = re.compile('<img id="previewimage\d+".+?src="(.+?)">') href_pattern = re.compile('(<a[^>]+?)>') with sessionCM() as session: channel = Channel.find_by_id(session, channel_id) # 清除‘异步消息’ session.query(Message).filter(and_(Message.channel_id == channel.id, Message.origin_id == 'async')).delete() message_list = result["Messages"]["Message"] if not isinstance(message_list, list): message_list = [message_list] for message in message_list: # if Message.find_by_origin_id(session, message["MessageID"]): # continue if message["Sender"] == "eBay": href_rs = href_pattern.findall(message["Text"]) for href in href_rs: message["Text"] = message["Text"].replace(href, href + ' target="_blank"') print "创建 Ebay Message ..." Message.create( session, channel_id=channel_id, origin_id=message["MessageID"], image_urls="", content=message["Text"], source="ebay", external_message_id="", receive_time=message["ReceiveDate"].rsplit(".", 1)[0], ) print "创建 Ebay Message 完成!" else: txt_rs = txt_pattern.findall(message["Text"]) content = txt_rs[0] if txt_rs else "" pic_rs = pic_pattern.findall(message["Text"]) print "创建普通消息 ..." Message.create( session, channel_id=channel_id, origin_id=message["MessageID"], image_urls=";".join(pic_rs), content=content, receive_time=message["ReceiveDate"].rsplit(".", 1)[0], external_message_id=message.get("ExternalMessageID", ""), source="seller" if message["Sender"] == channel.seller_id else "buyer" ) print "创建普通消息完成!" if message["MessageID"] == channel.last_msg_id: # ?? Channel.update(session, channel, last_msg_content=content)
def _deal_with_result(datas): if isinstance(datas, dict): datas = [datas] print "处理Ticket ... " for ticket in datas: print ticket ticket = ticket["Ticket"] print shop_id kw = { "shop_id": shop_id, "seller_id": ticket["merchant_id"], "seller_name": "", "buyer_id": ticket["UserInfo"]["id"], "buyer_name": ticket["UserInfo"]["name"], "read_stat": "0", "deal_stat": 0 if ticket["state_id"] == '4' else 1, "open_date": ticket["open_date"], "close_date": ticket.get("close-date", ""), "closed_by": "", "flag": "", "msg_source": "", "origin_id": ticket["id"], "relation_id": ticket["transaction_id"], "relation_type": "transaction", "last_msg_date": ticket["last_update_date"], "last_msg_id": "", "last_msg_content": ticket["subject"] + ";" + ticket["sublabel"] } with sessionCM() as session: channel = Channel.find_by_origin_id(session, ticket["id"]) print "更新/生成Ticket ... " channel = Channel.update(session, channel, **kw) print "更新Replies ... " # 直接同步消息内容 self.sync_message_detail(channel, ticket["replies"]) print "更新Replies 完成!"
def update_channel_read(self): """ 更新通道为已读状态 参数 channel_id --> channel 的本地ID msgSource --> 消息类型 可选参数(message_center/order_msg) :return: """ channel_id = self.params.get("channel_id", "") with sessionCM() as session: channel = Channel.find_by_id(session, channel_id) if not channel: return {"status": 0, "data": "\"channel_id\"不存在!"} try: with sessionCM() as session: Channel.update(session, channel, {"read_stat", 1}) return {"status": 1, "data": "状态更新成功!"} except Exception, e: logger.error(traceback.format_exc(e)) return {"status": 0, "data": "状态更新失败!"}
def close_ticket(self): """ 关闭 ticket :return: """ ticket_id = self.params.get("channel_id", "") if not ticket_id: return {"status": 0, "message": "缺少channel_id!"} handler = WishTicket(self.shop) with sessionCM() as session: ticket = Channel.find_by_id(session, ticket_id) if not ticket: return {"status": 0, "message": "无效的channel_id!"} result = handler.close_ticket_by_id(ticket["origin_id"]) if result.get("success", ""): Channel.update(session, channel=ticket, closed_by="buyer") return {"status": 1, "message": "已关闭!"} else: return {"status": 0, "message": result.get("message", "关闭失败!")}
def _get_messages_in_folder(self, folder_id, start, end, current_page=1, page_size=200): seller_id = self.shop.owner with sessionCM() as session: message_dict = dict() while True: logger.info("eBay-%d:正在同步第%d页的MessageList" % (self.shop.id, current_page)) print ("eBay-%d:正在同步第%d页的MessageList" % (self.shop.id, current_page)) result = self.msg_handler.get_my_messages( "ReturnHeaders", folder_id=folder_id, start_time=start, end_time=end, current_page=current_page, page_size=page_size) print result if not result["Messages"]: break message_list = result["Messages"]["Message"] if not isinstance(message_list, list): message_list = [message_list] for header in message_list: read_stat, deal_stat = True, True if header["Sender"] == seller_id: seller_name, buyer_id, buyer_name = seller_id, header["SendToName"], header["SendToName"] else: seller_name, buyer_id, buyer_name = seller_id, header["Sender"], header["Sender"] read_stat = header["Read"] == "true" # ?? deal_stat = header["Replied"] == "true" # ?? channel = Channel.find_by_channel_composition(session, seller_id, buyer_id, header.get("ItemID", 0)) # header中包含来自eBay的消息,该消息不一定拥有ItemID字段,取默认值0 receive_date = datetime.datetime.strptime( header["ReceiveDate"].rsplit(".", 1)[0], "%Y-%m-%dT%H:%M:%S") if channel: kwargs = dict() if receive_date > channel.last_msg_date: kwargs["last_msg_date"] = receive_date kwargs["last_msg_id"] = header["MessageID"] if receive_date < channel.open_date: kwargs["open_date"] = receive_date # 更新channel状态 # kwargs["read_stat"] = channel.read_stat and read_stat # kwargs["deal_stat"] = channel.deal_stat and deal_stat Channel.update(session, channel, **kwargs) else: channel = Channel.create( session, shop_id=self.shop.id, seller_id=seller_id, seller_name=seller_name, buyer_id=buyer_id, buyer_name=buyer_name, read_stat=read_stat, deal_stat=deal_stat, flag="rank0" if header["Flagged"] == "true" else "", msg_source="from ebay" if buyer_id == "eBay" else "from members", relation_id=header.get("ItemID", 0), relation_type="product", origin_id=0, open_date=receive_date, last_msg_date=receive_date, last_msg_id=header["MessageID"], last_msg_content="同步中..." ) product_url = "http://www.ebay.com/itm/%s" % header.get("ItemID", 0) # if not channel: # ??? Attachment.create( session, channel_id=channel.id, name=header.get("ItemTitle", ""), product_url=product_url, product_id=header.get("ItemID", "0"), image_url="", order_id="", order_url="" ) if not message_dict.get(channel.id): message_dict[channel.id] = list() message_dict[channel.id].append(header["MessageID"]) if len(message_list) < page_size: break current_page += 1 return message_dict
def sync_message_detail(self, channel_id, msg_source, current_page=1, page_size=100): """ 同步订单留言 :return: """ with sessionCM() as session: channel = Channel.find_by_id(session, channel_id) # if channel: # print "通道id为%d, buyer_name: %s " % (channel.id, channel.buyer_name) additional_flag = False while True: print current_page result = self.msg_handler.get_msg_detail_list( channel.origin_id, msg_source, current_page, page_size) print json.dumps(result, indent=2, encoding='utf8') # raw_input("enter ... ") if not result["success"]: return result["exception"] current_page += 1 for message in result.get("result", []): old_msg = Message.find_by_origin_id(session, message["id"]) if old_msg: continue print "创建新消息..." Message.create( session, channel_id=channel_id, origin_id=message["id"], content=message["content"], image_urls=";".join( [im["sPath"] for im in message["filePath"]]), receive_time=time.strftime( "%Y-%m-%d %H:%M:%S", time.localtime(long( str(message["gmtCreate"])[:-3]))), source="seller" if message["summary"]["senderName"] == channel.seller_name else "buyer", external_message_id="") print "创建消息完成 !" if additional_flag: continue print "设置关联关系..." if not channel.relation_type or not channel.relation_id: print "更新通道..." Channel.update(session, channel, shop_id=self.shop.id, relation_type=message["messageType"], relation_id=message["typeId"]) print "创建Attachment..." Attachment.create( session, channel_id=channel_id, name=message["summary"]["productName"], image_url=message["summary"]["productImageUrl"], product_url=message.get("productDetailUrl", ""), # ??? order_url=message["summary"]["orderUrl"], product_id="", order_id="") channel.update(session, channel, **{}) additional_flag = True print "设置关联完成..." if len(result["result"]) == 0: break