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))
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())
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))
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)
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)
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)
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()
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
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)