def run(self): """ .. usageassignment:: prep_1 :chapters: chap_name1[, chapname2]* :subchapters: subchapter_name[, subchaptername2]* :assignment_name: <str> :assignment_type: <int id of the assignment type object; kind of a hack> :deadline: <str> :sections: <comma separated int ids of the section objects; kind of a hack> :pct_required: <int> :points: <int> """ if all(name in os.environ for name in ['DBHOST', 'DBPASS', 'DBUSER', 'DBNAME']): dburl = 'postgresql://{DBUSER}:{DBPASS}@{DBHOST}/{DBNAME}'.format(**os.environ) else: dburl = None self.state.document.settings.env.warn(self.state.document.settings.env.docname, "Environment variables not set for DB access; can't save usageassignment to DB") return [usageAssignmentNode(self.options)] engine = create_engine(dburl) meta = MetaData() # create a configured "Session" class Session = sessionmaker(bind=engine) session = Session() Chapter = Table('chapters', meta, autoload=True, autoload_with=engine) SubChapter = Table('sub_chapters', meta, autoload=True, autoload_with=engine) Problem = Table('problems', meta, autoload=True, autoload_with=engine) Div = Table('div_ids', meta, autoload=True, autoload_with=engine) AssignmentType = Table('assignment_types', meta, autoload=True, autoload_with=engine) Section = Table('sections', meta, autoload=True, autoload_with=engine) assignment_type_id = getOrCreateAssignmentType("Lecture Prep", grade_type = 'use', points_possible = '50', assignments_count = 23, assignments_dropped = 3) course_name = self.state.document.settings.env.config.html_context['course_id'] self.options['course_name'] = course_name course_id = getCourseID(course_name) basecourse_name = self.state.document.settings.env.config.html_context.get('basecourse', "unknown") # Accumulate all the Chapters and SubChapters that are to be visited # For each chapter, accumulate all subchapters self.options['chapter_data'] = [] sub_chs = [] if 'chapters' in self.options: try: for nm in self.options.get('chapters').split(','): nm = nm.strip() ch = session.query(Chapter).filter(Chapter.c.course_id == course_name, Chapter.c.chapter_label == nm).first() results = session.query(SubChapter).filter(SubChapter.c.chapter_id == str(ch.id)).all() sub_chs += results chapter_data = {'ch': nm, 'sub_chs': [r.sub_chapter_label for r in results]} self.options['chapter_data'].append(chapter_data) except: self.state.document.settings.env.warn(self.state.document.settings.env.docname, "Chapters requested not found: %s" % (self.options.get('chapters'))) # Add any explicit subchapters if 'subchapters' in self.options: try: for nm in self.options.get('subchapters').split(','): (ch_dir, subch_name) = nm.strip().split('/') ch_id = session.query(Chapter).filter(Chapter.c.course_id == course_name, Chapter.c.chapter_label == ch_dir).first().id subch = session.query(SubChapter).filter(SubChapter.c.chapter_id == ch_id, SubChapter.c.sub_chapter_label == subch_name).first() sub_chs.append(subch) if not subch: self.state.document.settings.env.warn(self.state.document.settings.env.docname, "problem with: %s" % nm) self.options['chapter_data'].append({'ch': ch_dir, 'sub_chs': [subch_name]}) except: self.state.document.settings.env.warn(self.state.document.settings.env.docname, "Subchapters requested not found: %s" % (self.options.get('subchapters'))) # Accumulate all the ActiveCodes that are to be run and URL paths to be visited divs = [] paths = [] for subch in sub_chs: try: ch_name = session.query(Chapter).filter(Chapter.c.id == subch.chapter_id).first().chapter_label divs += session.query(Div).filter(Div.c.course_name == course_name, Div.c.chapter == ch_name, Div.c.subchapter == subch.sub_chapter_label).all() paths.append('/runestone/static/%s/%s/%s.html' % (course_name, ch_name, subch.sub_chapter_label)) except: self.state.document.settings.env.warn(self.state.document.settings.env.docname, "Subchapter not found: %s" % (subch)) tracked_div_types = ['activecode', 'actex'] active_codes = [d.div_id for d in divs if d.div_type in tracked_div_types] min_activities = (len(paths) + len(active_codes)) * self.options.get('pct_required', 0) / 100 deadline = None if 'deadline' in self.options: try: deadline = datetime.strptime(self.options['deadline'], '%Y-%m-%d %H:%M') except: try: deadline = datetime.strptime(self.options['deadline'], '%Y-%m-%d %H:%M:%S') self.state.document.settings.env.warn(self.state.document.settings.env.docname, "deadline not in preferred format %Y-%m-%d %H:%M but accepting alternate format with seconds") except: self.state.document.settings.env.warn(self.state.document.settings.env.docname, "deadline missing or incorrectly formatted; Omitting deadline") points = self.options.get('points', 0) assignment_id = addAssignmentToDB(name = self.options.get('assignment_name', 'dummy_assignment'), course_id = course_id, assignment_type_id = assignment_type_id, deadline = deadline, points = points, threshold = min_activities) for acid in paths + active_codes: q_id = getOrInsertQuestionForPage(base_course=basecourse_name, name=acid, is_private='F', question_type="page", autograde = "visited", difficulty=1,chapter=None) addAssignmentQuestionToDB(q_id, assignment_id, 1, autograde="visited") return [usageAssignmentNode(self.options)]
def run(self): """ .. usageassignment:: prep_1 :chapters: chap_name1[, chapname2]* :subchapters: subchapter_name[, subchaptername2]* :assignment_name: <str> :assignment_type: <int id of the assignment type object; kind of a hack> :deadline: <str> :sections: <comma separated int ids of the section objects; kind of a hack> :pct_required: <int> :points: <int> """ if not engine: self.state.document.settings.env.warn( self.state.document.settings.env.docname, "Environment variables not set for DB access; can't save usageassignment to DB" ) return [usageAssignmentNode(self.options)] # create a configured "Session" class Session = sessionmaker(bind=engine) session = Session() Chapter = Table('chapters', meta, autoload=True, autoload_with=engine) SubChapter = Table('sub_chapters', meta, autoload=True, autoload_with=engine) Problem = Table('problems', meta, autoload=True, autoload_with=engine) Div = Table('div_ids', meta, autoload=True, autoload_with=engine) AssignmentType = Table('assignment_types', meta, autoload=True, autoload_with=engine) Section = Table('sections', meta, autoload=True, autoload_with=engine) assignment_type_id = getOrCreateAssignmentType("Lecture Prep", grade_type='use', points_possible='50', assignments_count=23, assignments_dropped=3) course_name = self.state.document.settings.env.config.html_context[ 'course_id'] self.options['course_name'] = course_name course_id = getCourseID(course_name) basecourse_name = self.state.document.settings.env.config.html_context.get( 'basecourse', "unknown") # Accumulate all the Chapters and SubChapters that are to be visited # For each chapter, accumulate all subchapters self.options['chapter_data'] = [] sub_chs = [] if 'chapters' in self.options: try: for nm in self.options.get('chapters').split(','): nm = nm.strip() ch = session.query(Chapter).filter( Chapter.c.course_id == course_name, Chapter.c.chapter_label == nm).first() results = session.query(SubChapter).filter( SubChapter.c.chapter_id == str(ch.id)).all() sub_chs += results chapter_data = { 'ch': nm, 'sub_chs': [r.sub_chapter_label for r in results] } self.options['chapter_data'].append(chapter_data) except: self.state.document.settings.env.warn( self.state.document.settings.env.docname, "Chapters requested not found: %s" % (self.options.get('chapters'))) # Add any explicit subchapters if 'subchapters' in self.options: try: for nm in self.options.get('subchapters').split(','): (ch_dir, subch_name) = nm.strip().split('/') ch_id = session.query(Chapter).filter( Chapter.c.course_id == course_name, Chapter.c.chapter_label == ch_dir).first().id subch = session.query(SubChapter).filter( SubChapter.c.chapter_id == ch_id, SubChapter.c.sub_chapter_label == subch_name).first() sub_chs.append(subch) if not subch: self.state.document.settings.env.warn( self.state.document.settings.env.docname, "problem with: %s" % nm) self.options['chapter_data'].append({ 'ch': ch_dir, 'sub_chs': [subch_name] }) except: self.state.document.settings.env.warn( self.state.document.settings.env.docname, "Subchapters requested not found: %s" % (self.options.get('subchapters'))) # Accumulate all the ActiveCodes that are to be run and URL paths to be visited divs = [] paths = [] for subch in sub_chs: try: ch_name = session.query(Chapter).filter( Chapter.c.id == subch.chapter_id).first().chapter_label divs += session.query(Div).filter( Div.c.course_name == course_name, Div.c.chapter == ch_name, Div.c.subchapter == subch.sub_chapter_label).all() paths.append('/runestone/static/%s/%s/%s.html' % (course_name, ch_name, subch.sub_chapter_label)) except: self.state.document.settings.env.warn( self.state.document.settings.env.docname, "Subchapter not found: %s" % (subch)) tracked_div_types = ['activecode', 'actex'] active_codes = [ d.div_id for d in divs if d.div_type in tracked_div_types ] min_activities = (len(paths) + len(active_codes)) * self.options.get( 'pct_required', 0) / 100 deadline = None if 'deadline' in self.options: try: deadline = datetime.strptime(self.options['deadline'], '%Y-%m-%d %H:%M') except: try: deadline = datetime.strptime(self.options['deadline'], '%Y-%m-%d %H:%M:%S') self.state.document.settings.env.warn( self.state.document.settings.env.docname, "deadline not in preferred format %Y-%m-%d %H:%M but accepting alternate format with seconds" ) except: self.state.document.settings.env.warn( self.state.document.settings.env.docname, "deadline missing or incorrectly formatted; Omitting deadline" ) points = self.options.get('points', 0) assignment_id = addAssignmentToDB( name=self.options.get('assignment_name', 'dummy_assignment'), course_id=course_id, assignment_type_id=assignment_type_id, deadline=deadline, points=points, threshold=min_activities) for acid in paths + active_codes: q_id = getOrInsertQuestionForPage(base_course=basecourse_name, name=acid, is_private='F', question_type="page", autograde="visited", difficulty=1, chapter=None) addAssignmentQuestionToDB(q_id, assignment_id, 1, autograde="visited") usage_assignment_node = usageAssignmentNode(self.options, rawsource=self.block_text) usage_assignment_node.source, usage_assignment_node.line = self.state_machine.get_source_and_line( self.lineno) return [usage_assignment_node]
def run(self): """ .. assignment: :name: Problem Set 1 :assignment_type: formative :questions: (divid_1 50), (divid_2 100), ... :deadline: 23-09-2016 15:30 :points: integer :threshold: integer :autograde: visited :generate_html: """ course_name = self.state.document.settings.env.config.html_context[ 'course_id'] self.options['course_name'] = course_name course_id = getCourseID(course_name) basecourse_name = self.state.document.settings.env.config.html_context.get( 'basecourse', "unknown") self.options[ 'basecourse'] = self.state.document.settings.env.config.html_context.get( 'basecourse', "unknown") name = self.options.get('name') # required; error if missing assignment_type_name = self.options.get('assignment_type') assignment_type_id = getOrCreateAssignmentType(assignment_type_name) deadline = None if 'deadline' in self.options: try: deadline = datetime.strptime(self.options['deadline'], '%Y-%m-%d %H:%M') except: try: deadline = datetime.strptime(self.options['deadline'], '%Y-%m-%d %H:%M:%S') self.state.document.settings.env.warn( self.state.document.settings.env.docname, "deadline not in preferred format %Y-%m-%d %H:%M but accepting alternate format with seconds" ) except: self.state.document.settings.env.warn( self.state.document.settings.env.docname, "deadline missing or incorrectly formatted; Omitting deadline" ) points = self.options.get('points', 0) threshold = self.options.get('threshold', None) if threshold: threshold = int(threshold) autograde = self.options.get('autograde', None) assignment_id = addAssignmentToDB( name=name, course_id=course_id, assignment_type_id=assignment_type_id, deadline=deadline, points=points, threshold=threshold) unparsed = self.options.get('questions', None) question_names = [] if unparsed: summative_type_id = getOrCreateAssignmentType("summative") q_strings = unparsed.split(',') for q in q_strings: (question_name, points) = q.strip().split() question_names.append(question_name) # first get the question_id associated with question_name question_id = getQuestionID(basecourse_name, question_name) if question_id: addAssignmentQuestionToDB( question_id, assignment_id, points, assessment_type=summative_type_id, autograde=autograde) else: self.state.document.settings.env.warn( self.state.document.settings.env.docname, "Question {} is not in the database for basecourse {}". format(question_name, basecourse_name)) else: self.state.document.settings.env.warn( self.state.document.settings.env.docname, "No questions for assignment {}".format(name)) self.options['question_ids'] = question_names if 'generate_html' in self.options: assignment_node = AssignmentNode(self.options, rawsource=self.block_text) assignment_node.source, assignment_node.line = self.state_machine.get_source_and_line( self.lineno) return [assignment_node] else: return []