コード例 #1
0
    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)]
コード例 #2
0
    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]
コード例 #3
0
    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 []