Exemplo n.º 1
0
def _list_question_groups(
    handler, all_questions, all_question_groups, locations_map):
    """Prepare a list of question groups."""
    if not handler.app_context.is_editable_fs():
        return safe_dom.NodeList()

    question_group_infos = []
    quid_to_question = {long(qu.id): qu for qu in all_questions}
    for question_group in all_question_groups:
        url = 'dashboard?action=edit_question_group&key=%s' % (
            question_group.id)

        question_descriptions = sorted([
            quid_to_question[long(quid)].description
            for quid in question_group.question_ids])

        locations = locations_map.get(question_group.id, {})

        question_group_infos.append(dict(
            description=question_group.description,
            id=question_group.id, locations=locations,
            last_modified=question_group.last_modified,
            question_descriptions=question_descriptions, url=url))

    return safe_dom.Template(
        jinja_utils.get_template('question_group_list.html', [TEMPLATE_DIR]),
        question_groups=question_group_infos)
    def test_template_in_node_list(self):
        template = MockTemplate()
        template_node = safe_dom.Template(template, arg1='foo', arg2='bar')

        self.assertEqual(template.render_received_args, None)
        self.assertEqual(template_node.sanitized, "<div>template</div>")
        self.assertEqual(template.render_received_args, {
            'arg1': 'foo',
            'arg2': 'bar'
        })

        # put it in the beginning, middle, and end of a node list
        node_list = safe_dom.NodeList().append(template_node).append(
            safe_dom.Element(
                'div', className='first')).append(template_node).append(
                    safe_dom.Element('div',
                                     className='second')).append(template_node)

        expected_nodelist = (
            '<div>template</div><div class="first"></div>'
            '<div>template</div><div class="second"></div><div>template</div>')
        self.assertEqual(node_list.sanitized, expected_nodelist)

        # wrap that nodelist in an element
        element = safe_dom.Element('div').add_children(node_list)
        self.assertEqual(element.sanitized,
                         '<div>{}</div>'.format(expected_nodelist))
Exemplo n.º 3
0
 def _default_lesson_title_provider(
         self, app_context, unused_unit, lesson, unused_student):
     return safe_dom.Template(
         self.get_template('lesson_title.html'),
         lesson=lesson,
         can_see_drafts=custom_modules.can_see_drafts(app_context),
         is_course_admin=roles.Roles.is_course_admin(app_context),
         is_read_write_course=app_context.fs.is_read_write())
Exemplo n.º 4
0
def _list_labels(handler, items, name, all_paths):
    """Prepare a list of labels for use on the Assets page."""
    if not handler.app_context.is_editable_fs():
        return safe_dom.NodeList()

    labels = sorted(
        models.LabelDAO.get_all_of_type(models.LabelDTO.LABEL_TYPE_GENERAL),
        key=lambda label: label.title)

    items.append(safe_dom.Template(
        jinja_utils.get_template('label_list.html', [TEMPLATE_DIR]),
        add_text='Add Label', add_action='add_label', edit_action='edit_label',
        items=labels))
Exemplo n.º 5
0
def _list_and_format_file_list(
    handler, title, subfolder, tab_name,
    links=False, upload=False, prefix=None, caption_if_empty='< none >',
    edit_url_template=None, merge_local_files=False,
    all_paths=None):
    """Walks files in folders and renders their names in a section."""

    assets = []
    can_upload = upload and handler.app_context.is_editable_fs()

    upload_url = 'dashboard?{}'.format(urllib.urlencode({
        'action': 'manage_asset', 'from_action': handler.request.get('action'),
        'type': tab_name, 'key': subfolder}))

    # keep a list of files without merging
    unmerged_files = {}
    if merge_local_files:
        unmerged_files = dashboard_utils.list_files(
            handler.app_context, subfolder, all_paths=all_paths,
            merge_local_files=False)

    for filename in dashboard_utils.list_files(
            handler.app_context, subfolder, all_paths=all_paths,
            merge_local_files=merge_local_files):
        if prefix and not filename.startswith(prefix):
            continue

        overridden = (filename in unmerged_files) or (not merge_local_files)

        if edit_url_template and handler.app_context.fs.impl.is_read_write():
            edit_url = edit_url_template % (
                tab_name, urllib.quote(filename), handler.request.get('action'))
        else:
            edit_url = None

        assets.append(Asset(filename, overridden, edit_url))

    overridden_assets = [asset for asset in assets if asset.overridden]
    inherited_assets = [asset for asset in assets if not asset.overridden]

    return safe_dom.Template(
        jinja_utils.get_template('asset_list.html', [TEMPLATE_DIR]),
        inherited_assets=inherited_assets, overridden_assets=overridden_assets,
        can_upload=can_upload, caption_if_empty=caption_if_empty,
        upload_url=upload_url, links=links)
Exemplo n.º 6
0
    def _render_about_courses(self):
        courses_list = (
            courses.Course(None, app_context=app_context)
            for app_context in dashboard.get_visible_courses())

        def list_files(app_context):
            return dashboard_utils.list_files(app_context, '/data/')

        def get_filesystem_type(app_context):
            return app_context.fs.impl.__class__.__name__

        def get_home_folder(app_context):
            return sites.abspath(app_context.get_home_folder(), '/')

        return safe_dom.Template(
            self.get_template('course_infos.html'), courses=courses_list,
            get_filesystem_type=get_filesystem_type,
            get_home_folder=get_home_folder, list_files=list_files)
Exemplo n.º 7
0
 def _render_roles_list(self):
     """Render roles list to HTML."""
     all_roles = sorted(RoleDAO.get_all(), key=lambda role: role.name)
     return safe_dom.Template(
         self.get_template('role_list.html'), roles=all_roles)
Exemplo n.º 8
0
from modules.usage_reporting import constants


def _on_change_report_allowed(config_property, unused_old_value):
    """Callback to report externally when value of REPORT_ALLOWED changes."""
    messaging.Message.send_instance_message(
        messaging.Message.METRIC_REPORT_ALLOWED,
        config_property.value,
        source=messaging.Message.ADMIN_SOURCE)


REPORT_ALLOWED = config.ConfigProperty(
    'gcb_report_usage_permitted',
    bool,
    safe_dom.Template(
        jinja_utils.get_template('message.html', [constants.TEMPLATES_DIR],
                                 default_locale=None)),
    after_change=_on_change_report_allowed,
    default_value=False,
    label='Usage reporting')


def set_report_allowed(value):
    with common_utils.Namespace(appengine_config.DEFAULT_NAMESPACE_NAME):
        entity = config.ConfigPropertyEntity.get_by_key_name(
            REPORT_ALLOWED.name)
        if not entity:
            entity = config.ConfigPropertyEntity(key_name=REPORT_ALLOWED.name)
        entity.value = str(value)
        entity.is_draft = False
        entity.put()
Exemplo n.º 9
0
def _list_questions(handler, all_questions, all_question_groups,
                    location_maps):
    """Prepare a list of the question bank contents."""
    if not handler.app_context.is_editable_fs():
        return safe_dom.NodeList()

    toolbar_template = handler.get_template('question_toolbar.html',
                                            [TEMPLATE_DIR])
    toolbar_node = safe_dom.Template(toolbar_template,
                                     question_count=len(all_questions))

    output = safe_dom.NodeList().append(toolbar_node)

    # Create questions table
    table = _add_assets_table(output, 'question-table',
                              [('Description', 25), ('Question Groups', 25),
                               ('Course Locations', 25), ('Last Modified', 16),
                               ('Type', 9)])
    _attach_filter_data(handler, table)
    token = crypto.XsrfTokenManager.create_xsrf_token('clone_question')
    table.add_attribute(data_clone_question_token=token)
    token = crypto.XsrfTokenManager.create_xsrf_token('add_to_question_group')
    table.add_attribute(data_qg_xsrf_token=token)
    tbody = safe_dom.Element('tbody')
    table.add_child(tbody)

    table.add_child(
        _create_empty_footer('No questions available', 5, all_questions))

    question_to_group = {}
    for group in all_question_groups:
        for quid in group.question_ids:
            question_to_group.setdefault(long(quid), []).append(group)

    for question in all_questions:
        tr = safe_dom.Element('tr', data_quid=str(question.id))
        # Add description including action icons
        td = safe_dom.Element('td', className='description')
        tr.add_child(td)
        td.add_child(
            dashboard_utils.create_edit_button(
                'dashboard?action=edit_question&key=%s' % question.id))
        td.add_child(_create_preview_button())
        td.add_child(_create_clone_button(question.id))
        td.add_text(question.description)

        # Add containing question groups
        used_by_groups = question_to_group.get(question.id, [])
        cell = safe_dom.Element('td', className='groups')
        if all_question_groups:
            cell.add_child(_create_add_to_group_button())
        cell.add_child(
            _create_list([
                safe_dom.Text(group.description)
                for group in sorted(used_by_groups,
                                    key=lambda g: g.description)
            ]))
        tr.add_child(cell)

        # Add locations
        locations = _get_question_locations(question.id, location_maps,
                                            used_by_groups)
        tr.add_child(_create_locations_cell(locations))

        # Add last modified timestamp
        tr.add_child(
            safe_dom.Element('td',
                             data_timestamp=str(question.last_modified),
                             className='timestamp'))

        # Add question type
        tr.add_child(
            safe_dom.Element('td').add_text(
                'MC' if question.type == models.QuestionDTO.MULTIPLE_CHOICE
                else ('SA' if question.type == models.QuestionDTO.
                      SHORT_ANSWER else ('Unknown Type'))).add_attribute(
                          style='text-align: center'))

        # Add filter information
        filter_info = {}
        filter_info['description'] = question.description
        filter_info['type'] = question.type
        filter_info['lessons'] = []
        unit_ids = set()
        for (lesson, unit) in locations.get('lessons', ()):
            unit_ids.add(unit.unit_id)
            filter_info['lessons'].append(lesson.lesson_id)
        filter_info['units'] = list(unit_ids) + [
            a.unit_id for a in locations.get('assessments', ())
        ]
        filter_info['groups'] = [qg.id for qg in used_by_groups]
        filter_info['unused'] = int(not (
            locations and any(locations.values())))
        tr.add_attribute(data_filter=transforms.dumps(filter_info))
        tbody.add_child(tr)

    return output
Exemplo n.º 10
0
def _list_questions(handler, all_questions, all_question_groups, location_maps):
    """Prepare a list of the question bank contents."""
    if not handler.app_context.is_editable_fs():
        return safe_dom.NodeList()

    table_attributes = _get_filter_data(handler)
    table_attributes.update({
        'data-clone-question-token':
            crypto.XsrfTokenManager.create_xsrf_token('clone_question'),
        'data-qg-xsrf-token':
            crypto.XsrfTokenManager.create_xsrf_token('add_to_question_group'),
    })

    question_to_group = {}
    for group in all_question_groups:
        for quid in group.question_ids:
            question_to_group.setdefault(long(quid), []).append(group)

    question_infos = []

    for question in all_questions:
        # containing question groups
        used_by_groups = question_to_group.get(question.id, [])
        in_group_descriptions = sorted([
            group.description for group in used_by_groups])

        # locations
        locations = _get_question_locations(
            question.id, location_maps, used_by_groups)

        # type
        question_type = (
            'MC' if question.type == models.QuestionDTO.MULTIPLE_CHOICE else (
            'SA' if question.type == models.QuestionDTO.SHORT_ANSWER else (
            'Unknown Type')))

        # filter information
        filter_info = {}
        filter_info['description'] = question.description
        filter_info['type'] = question.type
        filter_info['lessons'] = []
        unit_ids = set()
        for (lesson, unit) in locations.get('lessons', ()):
            unit_ids.add(unit.unit_id)
            filter_info['lessons'].append(lesson.lesson_id)
        filter_info['units'] = list(unit_ids) + [
            a.unit_id for a in  locations.get('assessments', ())]
        filter_info['groups'] = [qg.id for qg in used_by_groups]
        filter_info['unused'] = int(not (locations and any(locations.values())))

        question_infos.append(dict(
            description=question.description,
            filter_info=transforms.dumps(filter_info),
            id=question.id,
            group_descriptions=in_group_descriptions,
            last_modified=question.last_modified,
            type=question_type,
            locations=locations,
            url='dashboard?action=edit_question&key=%s' % question.id,
        ))

    return safe_dom.Template(
        jinja_utils.get_template('question_list.html', [TEMPLATE_DIR]),
        table_attributes=table_attributes,
        groups_exist=bool(all_question_groups), questions=question_infos)