def auto_rand_pass(): import django django.setup() tz_tokyo = pytz.timezone('Asia/Tokyo') time = datetime.datetime.now() print(tz_tokyo.localize(time)) reply_list_list = ReplyList.objects.filter(time_limit_date__lt=tz_tokyo.localize(time), has_replied=False).filter(~Q(time_limit_date=None)) #r_list_list = ReplyList.objects.filter(time_limit_date__it=datetime.datetime.now()) from one_month import settings print("---------------") if not reply_list_list: print("@@@@skip@@@@") print("パスすべき質問がありませんでした。スキップします") return 1 for reply_list in reply_list_list: print("###pass###") qa_manager = QAManager() pass_success = qa_manager.pass_question(reply_list.question, qa_manager.reply_list_update_random_except) if pass_success: # 宛先にロボットが含まれるかどうか調べる try: to_robot = QuestionDestination.objects.filter(question=reply_list.question) to_robot = [i for i in to_robot if i.tag.code == 99] except QuestionDestination.DoesNotExist: to_robot = [] # 何回目のパスでロボットが返信してくるか。現在は1に固定 if len(to_robot) and reply_list.question.pass_counter() == 1 and not reply_list.question.has_reply(): text = '' reply_data = ReplyRobot().reply(reply_list.question) if len(reply_data['reply_list']) == 0: text += "難問です。答えられたらすごいです。\n" else: text = "[StackOverFlowより] 以下のページはどうでしょうか?\n\n" + "\n".join(reply_data['reply_list']) + "\n" if len(reply_data['word_list']) != 0: urls = [] for w in reply_data['word_list']: # すべてのユーザの過去の全質問(各質問の回答は含まない)の中から、抽出結果でキーワード検索をかける(最大3件) questions, reply_lists = QAManager.search_keyword_all_user(keyword=str(w), question=True, tag=True, reply=False) for q in questions: if q.id != reply_list.question.id and len(urls) <= 2: urls.append(q.title + "\n" + 'http://' + settings.HOST_NAME + '/dotchain/q_detail/' + str(q.id) + '\n') text += "\n[過去の質問より] 以下のページはどうでしょうか?\n\n" + "\n".join(list(set(urls))) if len( urls) else "\n過去の関連質問はありませんでした。" text += "\n\n抽出結果:" + "、".join(reply_data['word_list']) text += "\n推定ジャンル:" + reply_data['genre'] robot, created = User.objects.get_or_create(username='******', defaults=dict(first_name='太郎', last_name='ロボット', ), ) Reply.objects.create(question=reply_list.question, answerer=robot, text=text) else: reply_list.question.update(is_closed=True)
def question_pass(request, id=None): """ 来た質問をパスする。 次に質問を回す人は、質問者と既にパスした人にはならないようにする。 また、質問者以外のユーザを質問が回り終わったら、質問者にお知らせする。 v1.1新機能:ロボット(AI)による自動返信。 ある回数(現在は1回に固定)だけパスされたら質問から抽出されたキーワードを使って検索URLを返信する。 カテゴリがITの場合はStackOverFlowで検索+過去の関連質問を返信する。 その他の場合は過去の関連質問を返信する。 """ reply_list = ReplyList.objects.get(id=id) if reply_list.has_replied: return top_default(request, msg=m.INFO_QUESTION_ALREADY_AUTO_PASS) qa_manager = QAManager() pass_success = qa_manager.pass_question(reply_list.question, qa_manager.reply_list_update_random_except) if pass_success: # 宛先にロボットが含まれるかどうか調べる try: to_robot = QuestionDestination.objects.filter(question=reply_list.question) to_robot = [i for i in to_robot if i.tag.code == 99] except QuestionDestination.DoesNotExist: to_robot = [] # 何回目のパスでロボットが返信してくるか。現在は1に固定 if len(to_robot) and reply_list.question.pass_counter() == 1 and not reply_list.question.has_reply(): text = '' reply_data = ReplyRobot().reply(reply_list.question) if len(reply_data['reply_list']) == 0: text += "難問です。答えられたらすごいです。\n" else: text = "[StackOverFlowより] 以下のページはどうでしょうか?\n\n" + "\n".join(reply_data['reply_list']) + "\n" if len(reply_data['word_list']) != 0: urls = [] for w in reply_data['word_list']: # すべてのユーザの過去の全質問(各質問の回答は含まない)の中から、抽出結果でキーワード検索をかける(最大3件) questions, reply_lists = QAManager.search_keyword_all_user(keyword=str(w), question=True, tag=True, reply=False) for q in questions: if q.id != reply_list.question.id and len(urls) <= 2: urls.append(q.title + "\n" + 'http://' + settings.HOST_NAME + '/dotchain/q_detail/' + str(q.id) + '\n') text += "\n[過去の質問より] 以下のページはどうでしょうか?\n\n" + "\n".join(list(set(urls))) if len( urls) else "\n過去の関連質問はありませんでした。" text += "\n\n抽出結果:" + "、".join(reply_data['word_list']) text += "\n推定ジャンル:" + reply_data['genre'] robot, created = User.objects.get_or_create(username='******', defaults=dict(first_name='太郎', last_name='ロボット', ), ) Reply.objects.create(question=reply_list.question, answerer=robot, text=text) return top_default(request, msg=m.INFO_QUESTION_PASS) else: reply_list.question.update(is_closed=True) return top_default(request, msg='{0}\n{1}'.format(m.INFO_QUESTION_PASS, m.INFO_PASS_FINISH))
def auto_rand_pass(): import django django.setup() tz_tokyo = pytz.timezone('Asia/Tokyo') time = datetime.datetime.now() print(tz_tokyo.localize(time)) reply_list_list = ReplyList.objects.filter(time_limit_date__lt=tz_tokyo.localize(time), has_replied=False).filter(~Q(time_limit_date=None)) #r_list_list = ReplyList.objects.filter(time_limit_date__it=datetime.datetime.now()) print("---------------") if not reply_list_list: print("@@@@skip@@@@") print("パスすべき質問がありませんでした。スキップします") return 1 for reply_list in reply_list_list: print("###pass###") qa_manager = QAManager() qa_manager.pass_question(reply_list.question, qa_manager.reply_list_update_random_except)
def question_pass(request, id=None): """ 来た質問をパスする。 次に質問を回す人は、質問者と既にパスした人にはならないようにする。 また、質問者以外のユーザを質問が回り終わったら、質問者にお知らせする。 """ reply_list = ReplyList.objects.get(id=id) if reply_list.has_replied: msg = 'すでにパスした質問です。' return top_default(request, msg) qa_manager = QAManager() if qa_manager.pass_question(reply_list.question, qa_manager.reply_list_update_random_except): msg = '質問をパスしました。' # 何回目のパスでロボットが返信してくるか if reply_list.question.pass_counter() == 1 and not reply_list.question.has_reply(): reply = Reply() reply.question = reply_list.question reply_data = ReplyRobot().reply(reply_list.question) if len(reply_data['reply_list']) == 0: reply.text = "難問です。答えられたらすごいです。" else: reply.text = "以下のページはどうでしょうか?\n\n" + "\n".join(reply_data['reply_list']) if len(reply_data['word_list']) != 0: reply.text += "\n\n抽出結果:" + "、".join(reply_data['word_list']) reply.text += "\n推定ジャンル:" + reply_data['genre'] # ロボットのidを指定 reply.answerer = User.objects.get(id=1) reply.save() return top_default(request, msg) else: reply_list.question.is_closed = True reply_list.question.save() msg = '質問をパスしました。\n' msg += '次の送信先がないため質問は締め切られます。' return top_default(request, msg)