284
284
return self.filter_skills(result)
286
286
def filter_skills(self, skills):
287
skill_type = self.request.get(self.skill_type_filter_id,
289
if 'required' in skill_type:
287
skill_type = self.request.get(self.skill_type_filter_id)
288
if skill_type is not None and 'required' in skill_type:
290
289
condition = lambda (skill, gradebook): skill.required
306
305
return super(SectionReportView, self).render(*args, **kw)
308
class SectionReportByStudentView(SectionReportView):
313
class SectionReportBySkillView(SectionReportView):
315
container_class = 'container widecontainer'
309
318
class CourseDetailsViewlet(flourish.viewlet.Viewlet):
311
320
template = InlineViewPageTemplate('''
349
358
return '<br />'.join(instructors)
352
class ReportDescriptionViewlet(flourish.viewlet.Viewlet):
361
class SectionReportByStudentDescriptionViewlet(flourish.viewlet.Viewlet):
354
363
template = InlineViewPageTemplate('''
355
364
<p i18n:domain="" i18n:translate="">
363
class StudentsTableViewlet(flourish.viewlet.Viewlet):
365
template = InlineViewPageTemplate('''
366
<div tal:content="structure view/view/providers/ajax/view/section/student_skills_table"/>
372
class SectionReportBySkillDescriptionViewlet(flourish.viewlet.Viewlet):
374
template = InlineViewPageTemplate('''
375
<p i18n:domain="" i18n:translate="">
376
XXX This report description goes here XXX
381
class SectionReportTableViewlet(flourish.viewlet.Viewlet):
383
template = InlineViewPageTemplate('''
384
<div tal:content="structure view/view/providers/ajax/view/section/charts_table"/>
372
390
return demographics.get('ID', '')
375
class SkillsColumn(GetterColumn):
393
class SectionReportChartsColumn(GetterColumn):
377
395
template = ViewPageTemplateFile(
378
'templates/section_report_skills_column.pt')
396
'templates/section_report_charts_column.pt')
399
class SkillsColumn(SectionReportChartsColumn):
380
401
def __init__(self, view):
403
self.total = len(view.skills)
382
404
title = _('Skills (of ${count})',
383
mapping={'count': len(view.skills)})
405
mapping={'count': self.total})
385
407
super(SkillsColumn, self).__init__(title, name=name)
387
409
def renderCell(self, item, formatter):
388
410
container_id = 'skills-data-%s' % item.username
389
411
student_data = self.studentSkillsData(item)
390
total = len(self.view.skills)
392
413
passing_index = None
393
414
scores = reversed(self.view.scoresystem.scores)
400
421
# XXX: hack to make the ViewPageTemplateFile to work
401
422
self.context = item
402
423
self.request = formatter.request
403
return self.template(total=total,
424
return self.template(total=self.total,
404
425
passing_index=passing_index,
406
427
container_id=container_id,
441
class StudentsColumn(SectionReportChartsColumn):
443
def __init__(self, view):
445
self.total = len(view.section.members)
446
title = _('Students (${count})',
447
mapping={'count': self.total})
449
super(StudentsColumn, self).__init__(title, name=name)
451
def renderCell(self, item, formatter):
452
skill, gradebook = item
453
container_id = 'skills-data-%s' % skill.__name__
454
skill_data = self.skillScoresData(skill, gradebook)
457
scores = reversed(self.view.scoresystem.scores)
459
for i, score in enumerate(scores):
460
score_labels.append(score[1])
461
data.append(skill_data[score[0]])
462
if score[0] == self.view.passing_score:
464
# XXX: hack to make the ViewPageTemplateFile to work
466
self.request = formatter.request
467
return self.template(total=self.total,
468
passing_index=passing_index,
470
container_id=container_id,
471
score_labels = score_labels)
473
def skillScoresData(self, skill, gradebook):
475
for score in self.view.scoresystem.scores:
477
for student in self.view.section.members:
478
score = gradebook.getScore(student, skill)
479
if score is not None and score.value is not UNSCORED:
480
result[score.value] += 1
420
484
class SectionReportSortFormatter(table.ajax.AJAXFormSortFormatter):
422
486
script_name = 'ST.virginia.on_section_report_sort'
425
class StudentSkillsTable(table.ajax.Table):
489
class SectionReportChartsTable(table.ajax.Table):
428
492
table_formatter = SectionReportSortFormatter
431
496
def html_id(self):
436
501
self.setUp(table_formatter=self.table_formatter,
437
502
batch_size=self.batch_size,
438
503
prefix=self.__name__,
439
css_classes={'table': 'section-report'})
504
css_classes={'table': self.css_classes})
507
class ByStudentChartsTable(SectionReportChartsTable):
509
css_classes = 'section-report section-report-by-student'
441
511
def columns(self):
442
512
title = table.column.LocaleAwareGetterColumn(
459
529
return self.context.members
532
class BySkillChartsTable(SectionReportChartsTable):
534
css_classes = 'section-report section-report-by-skill'
537
# i => (skill, gradebook)
538
label = table.column.LocaleAwareGetterColumn(
541
getter=lambda i, f: i[0].label,
543
title = table.column.LocaleAwareGetterColumn(
546
getter=lambda i, f: i[0].title,
548
students = StudentsColumn(self.view)
549
return [label, title, students]
552
return (('label', False),)
555
return self.view.skills
462
558
class ScoreFilterViewlet(flourish.page.RefineLinksViewlet): pass
615
('all', _('All'), True),
616
('required', _('Required'), False),
516
619
def type_options(self):
519
('required', _('Required'), True),
520
('all', _('All'), False),
522
621
filter_id = self.view.skill_type_filter_id
523
for prefix, title, default in options:
622
for prefix, title, default in self.options:
524
623
option_id = '%s.%s' % (prefix, filter_id)
525
624
if filter_id in self.request:
526
625
checked = self.request.get(filter_id) == option_id