def test_topic_position(self): """ Test putting qtemplates into topics and moving them around """ course_id = Courses.create("TEST101", "Test topic position logic", 1, 1) topic1_id = Topics.create(course_id, "TESTTOPIC1", 1, 2) topic2_id = Topics.create(course_id, "TESTTOPIC2", 3, 3) qt1_id = DB.create_qt(1, "TESTQ1", "Test question 1", 0, 5.0, 1) qt2_id = DB.create_qt(1, "TESTQ2", "Test question 2", 0, 4.1, 2, topic1_id) DB.move_qt_to_topic(qt1_id, topic1_id) self.assertEqual(DB.get_qtemplate_practice_pos(qt1_id), 0) self.assertEqual(DB.get_qtemplate_practice_pos(qt2_id), 0) self.assertEqual(DB.get_topic_for_qtemplate(qt1_id), topic1_id) self.assertEqual(DB.get_topic_for_qtemplate(qt2_id), topic1_id) DB.update_qt_practice_pos(qt1_id, 3) DB.update_qt_practice_pos(qt2_id, 2) self.assertEqual(DB.get_qtemplate_practice_pos(qt1_id), 3) self.assertEqual(DB.get_qtemplate_practice_pos(qt2_id), 2) self.assertEqual(DB.get_qtemplate_practice_pos(qt1_id), 3, "Broken cache?") self.assertEqual(DB.get_qtemplate_practice_pos(qt2_id), 2, "Broken cache?") DB.update_qt_practice_pos(qt1_id, 0) DB.update_qt_practice_pos(qt2_id, -1) self.assertEqual(DB.get_qtemplate_practice_pos(qt1_id), 0) self.assertEqual(DB.get_qtemplate_practice_pos(qt2_id), -1) self.assertEqual(DB.get_qtemplate_practice_pos(qt1_id), 0, "Broken cache?") self.assertEqual(DB.get_qtemplate_practice_pos(qt2_id), -1, "Broken cache?") qts = Topics.get_qts(topic1_id) self.assertIn(qt1_id, qts) self.assertIn(qt2_id, qts) self.assertEqual(len(qts), 2) DB.move_qt_to_topic(qt1_id, topic2_id) qts = Topics.get_qts(topic1_id) self.assertNotIn(qt1_id, qts) self.assertIn(qt2_id, qts) self.assertEqual(len(qts), 1)
def get_q_list(tid, uid=None, numdone=True): """ Return a list of dicts with question template information for the topic. [{ qtid: int QTemplate ID name: string Name of Question position: int Position of Question in topic done: Number of times the given user has submitted a question for practice },] """ qlist = [] qtemplates = Topics.get_qts(int(tid)) for qtid in qtemplates: if uid and numdone: num = DB.get_student_q_practice_num(uid, qtid) else: num = 0 qlist.append({ 'qtid': qtid, 'name': qtemplates[qtid]['name'], 'position': qtemplates[qtid]['position'], 'done': num }) # Sort them by position qlist.sort(lambda f, s: cmp(f["position"], s["position"])) return qlist
def topic_to_zip(topic_id): """ :param topic_id: ID of the topic to export :return: binary string containing ZIPped data """ topic = Topics.get_topic(topic_id) qts = Topics.get_qts(topic_id) return qts_to_zip(qts, extra_info={'topic': topic})
def topic_to_zip(topic_id): """ :param topic_id: ID of the topic to export :return: binary string containing ZIPped data """ topic = Topics.get_topic(topic_id) qts = Topics.get_qts(topic_id) return qts_to_zip(qts, extra_info={'topic': topic})
def topic_to_zip(topic_id, fname='oa_export', suffix='oaq'): """ :param topic_id: ID of the topic to export :param fname: filename to create :param suffix: suffix :return: binary string containing ZIPped data """ topic = Topics.get_topic(topic_id) qts = Topics.get_qts(topic_id) return qts_to_zip(qts, fname=fname, extra_info={'topic': topic})
def cadmin_edit_topic(course_id, topic_id): """ Present a page to view and edit a topic, including adding/editing questions and setting some parameters. """ user_id = session['user_id'] if not course_id: abort(404) course = Courses2.get_course(course_id) topic = { 'id': topic_id, 'position': Topics.get_pos(topic_id), 'name': Topics.get_name(topic_id) } questions = [question for question in Topics.get_qts(topic_id).values()] for question in questions: question['embed_id'] = DB.get_qt_embedid(question['id']) if question['embed_id']: question['embed_url'] = "%s/embed/question/%s/question.html" % \ (OaConfig.parentURL, question['embed_id']) else: question['embed_url'] = None question['editor'] = DB.get_qt_editor(question['id']) all_courses = Courses2.get_course_list() all_courses = [crse for crse in all_courses if satisfy_perms(user_id, int(crse['id']), ("questionedit", "courseadmin", "sysadmin"))] all_courses.sort(lambda f, s: cmp(f['name'], s['name'])) all_course_topics = [] for crse in all_courses: topics = Courses.get_topics_all(crse['id'], numq=False) if topics: all_course_topics.append({'course': crse['name'], 'topics': topics}) questions.sort(key=lambda k: k['position']) return render_template( "courseadmin_edittopic.html", course=course, topic=topic, questions=questions, all_course_topics=all_course_topics )
def cadmin_view_topic(course_id, topic_id): """ Present a page to view a topic, including basic stats """ user_id = session['user_id'] if not course_id: abort(404) course = Courses2.get_course(course_id) topic = { 'id': topic_id, 'position': Topics.get_pos(topic_id), 'name': Topics.get_name(topic_id) } questions = [question for question in Topics.get_qts(topic_id).values()] for question in questions: question['embed_id'] = DB.get_qt_embedid(question['id']) if question['embed_id']: question['embed_url'] = "%s/embed/question/%s/question.html" % \ (OaConfig.parentURL, question['embed_id']) else: question['embed_url'] = None question['editor'] = DB.get_qt_editor(question['id']) all_courses = [ crse for crse in Courses2.get_course_list() if satisfy_perms(user_id, int(crse['id']), ("questionedit", "courseadmin", "sysadmin")) ] all_courses.sort(lambda f, s: cmp(f['name'], s['name'])) all_course_topics = [] for crse in all_courses: topics = Courses.get_topics_all(crse['id'], numq=False) if topics: all_course_topics.append({ 'course': crse['name'], 'topics': topics }) questions.sort(key=lambda k: k['position']) return render_template( "courseadmin_viewtopic.html", course=course, topic=topic, questions=questions, all_course_topics=all_course_topics, )
def test_topic_nextprev(self): """ Do the "next/previous" options in practice work? """ course_id = Courses.create("TEST101", "Test topic next/prev logic", 1, 1) topic1_id = Topics.create(course_id, "TESTTOPIC1", 1, 2) qt1_id = DB.create_qt(1, "TESTQ1", "Test question 1", 0, 5.0, 1) qt2_id = DB.create_qt(1, "TESTQ2", "Test question 2", 0, 4.1, 2) qt3_id = DB.create_qt(1, "TESTQ3", "Test question 3", 0, 0.0, 2) qt4_id = DB.create_qt(1, "TESTQ4", "Test question 4", 0, 2.0, 2) DB.move_qt_to_topic(qt1_id, topic1_id) DB.move_qt_to_topic(qt2_id, topic1_id) DB.move_qt_to_topic(qt3_id, topic1_id) DB.move_qt_to_topic(qt4_id, topic1_id) DB.update_qt_practice_pos(qt1_id, 1) DB.update_qt_practice_pos(qt2_id, 2) DB.update_qt_practice_pos(qt3_id, 3) DB.update_qt_practice_pos(qt4_id, 4) qts = Topics.get_qts(topic1_id) self.assertIn(qt1_id, qts) self.assertIn(qt2_id, qts) self.assertIn(qt3_id, qts) self.assertIn(qt4_id, qts) self.assertEqual(len(qts), 4) self.assertTupleEqual(Practice.get_next_prev_pos(qt1_id, topic1_id), (None, 2)) self.assertTupleEqual(Practice.get_next_prev_pos(qt2_id, topic1_id), (1, 3)) self.assertTupleEqual(Practice.get_next_prev_pos(qt3_id, topic1_id), (2, 4)) self.assertTupleEqual(Practice.get_next_prev_pos(qt4_id, topic1_id), (3, None)) DB.update_qt_practice_pos(qt2_id, 3) self.assertEqual(DB.get_qtemplate_practice_pos(qt1_id), 1) self.assertEqual(DB.get_qtemplate_practice_pos(qt2_id), 3) self.assertEqual(DB.get_qtemplate_practice_pos(qt3_id), 3) self.assertEqual(DB.get_qtemplate_practice_pos(qt4_id), 4) self.assertTupleEqual(Practice.get_next_prev_pos(qt1_id, topic1_id), (None, 3)) self.assertTupleEqual(Practice.get_next_prev_pos(qt2_id, topic1_id), (1, 4)) self.assertTupleEqual(Practice.get_next_prev_pos(qt3_id, topic1_id), (1, 4)) self.assertTupleEqual(Practice.get_next_prev_pos(qt4_id, topic1_id), (3, None)) self.assertTupleEqual(Practice.get_next_prev_pos(qt4_id, None), (None, None))
def cadmin_view_topic(course_id, topic_id): """ Present a page to view a topic, including basic stats """ user_id = session["user_id"] if not course_id: abort(404) course = Courses2.get_course(course_id) topic = {"id": topic_id, "position": Topics.get_pos(topic_id), "name": Topics.get_name(topic_id)} questions = [question for question in Topics.get_qts(topic_id).values()] for question in questions: question["embed_id"] = DB.get_qt_embedid(question["id"]) if question["embed_id"]: question["embed_url"] = "%s/embed/question/%s/question.html" % (OaConfig.parentURL, question["embed_id"]) else: question["embed_url"] = None question["editor"] = DB.get_qt_editor(question["id"]) all_courses = Courses2.get_course_list() all_courses = [ crse for crse in all_courses if satisfy_perms(user_id, int(crse["id"]), ("questionedit", "courseadmin", "sysadmin")) ] all_courses.sort(lambda f, s: cmp(f["name"], s["name"])) all_course_topics = [] for crse in all_courses: topics = Courses.get_topics_all(crse["id"], numq=False) if topics: all_course_topics.append({"course": crse["name"], "topics": topics}) questions.sort(key=lambda k: k["position"]) return render_template( "courseadmin_viewtopic.html", course=course, topic=topic, questions=questions, all_course_topics=all_course_topics, )
def get_q_list(tid, uid=None, numdone=True): """ Return a list of dicts with question template information for the topic. [{ qtid: int QTemplate ID name: string Name of Question position: int Position of Question in topic done: Number of times the given user has submitted a question for practice },] """ qlist = [] qtemplates = Topics.get_qts(int(tid)) for qtid in qtemplates: if uid and numdone: num = DB.get_student_q_practice_num(uid, qtid) else: num = 0 qlist.append({'qtid': qtid, 'name': qtemplates[qtid]['name'], 'position': qtemplates[qtid]['position'], 'done': num}) # Sort them by position qlist.sort(lambda f, s: cmp(f["position"], s["position"])) return qlist