def store_question_post(store_id): q = request.form.get('question', '') a = request.form.get('answer', '') if not q or not a: return "0" qid = Question.add(g._db, q, a, store_id) #更新robotd的问题库 try: rpc.refresh_questions() except xmlrpclib.ProtocolError as err: logging.warning("refresh questions err:%s", err) except Exception as err: logging.warning("refresh questions err:%s", err) return redirect(url_for('.store_question', store_id=store_id))
def questions(): """ (1) Creates endpoint for: - fetching all questions paginated - Searching for questions by a keyword - Adding a new question (2) Methods: GET, POST (3) Arguments for GET, POST [in search state]: - page=<integer: page_number> [optional, default=1] - length=<integer: items_per_page> [optional, default=10] (4) Body for POST: - search for questions by providing: JSON Object { "search_term": <string: search_keyword> } - or add new question by providing: JSON Object { "question": <string: question> "answer": <string: answer> "difficulty": <integer: difficulty_number> "category_id": <integer: category_id> } :return(GET): JSON view for "questions" [collection], "total_questions" [item], "categories" [collection], "current_category" [item] :return(POST): - in search state JSON view for "questions" [collection], "total_questions" [item], "categories" [collection], "current_category" [item] - in add state JSON view for "success_status" [boolean], "new_question" [item], "message" [string] """ # Set questions per page value qpp = int(request.args.get("length", 10)) # Set page number page = (int(request.args.get("page", 1)) - 1) * qpp if request.method == "GET": try: return jsonify({ "questions": format_collection( Question.query.order_by( Question.id).offset(page).limit(qpp).all()), "total_questions": Question.query.count(), "categories": format_collection(Category.query.all()), "current_category": "", }) except BaseException: abort(404) elif request.method == "POST": data = None if request.data: # Load json data from response body data = json.loads(request.data) else: abort(422) # Get search term search_term = data.get("search_term") # Check if search term is provided if search_term: # Fetch results results = Question.query.filter( Question.question.ilike(f"%{search_term}%")) # Format results for a single page results_to_show = results.offset(page).limit(qpp).all() if results_to_show: return jsonify({ "questions": format_collection(results_to_show), "total_questions": len(results.all()), "categories": format_collection(Category.query.all()), "current_category": "", }) else: abort(404) else: try: # Create a new Question instance question = Question( question=data.get("question"), answer=data.get("answer"), difficulty=data.get("difficulty"), category_id=data.get("category_id"), ) # Commit add Question object question.add() return jsonify({ "success_status": True, "new_question": question.format(), "message": ("addition operation has been done successfully"), }) except BaseException: db.session.rollback() db.session.close() abort(422)