~replaceafill/schooltool/schooltool.virginia_section_report_charts

« back to all changes in this revision

Viewing changes to src/schooltool/virginia/browser/report.py

  • Committer: Douglas Cerna
  • Date: 2012-08-10 09:32:25 UTC
  • Revision ID: douglascerna@yahoo.com-20120810093225-oun26q33cb6kjq87
Added section report by skill

Show diffs side-by-side

added added

removed removed

Lines of Context:
284
284
        return self.filter_skills(result)
285
285
 
286
286
    def filter_skills(self, skills):
287
 
        skill_type = self.request.get(self.skill_type_filter_id,
288
 
                                      'required')
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
291
290
        else:
292
291
            condition = None
306
305
        return super(SectionReportView, self).render(*args, **kw)
307
306
 
308
307
 
 
308
class SectionReportByStudentView(SectionReportView):
 
309
 
 
310
    pass
 
311
 
 
312
 
 
313
class SectionReportBySkillView(SectionReportView):
 
314
 
 
315
    container_class = 'container widecontainer'
 
316
 
 
317
 
309
318
class CourseDetailsViewlet(flourish.viewlet.Viewlet):
310
319
 
311
320
    template = InlineViewPageTemplate('''
349
358
        return '<br />'.join(instructors)
350
359
 
351
360
 
352
 
class ReportDescriptionViewlet(flourish.viewlet.Viewlet):
 
361
class SectionReportByStudentDescriptionViewlet(flourish.viewlet.Viewlet):
353
362
 
354
363
    template = InlineViewPageTemplate('''
355
364
      <p i18n:domain="" i18n:translate="">
360
369
    ''')
361
370
 
362
371
 
363
 
class StudentsTableViewlet(flourish.viewlet.Viewlet):
364
 
 
365
 
    template = InlineViewPageTemplate('''
366
 
      <div tal:content="structure view/view/providers/ajax/view/section/student_skills_table"/>
 
372
class SectionReportBySkillDescriptionViewlet(flourish.viewlet.Viewlet):
 
373
 
 
374
    template = InlineViewPageTemplate('''
 
375
      <p i18n:domain="" i18n:translate="">
 
376
        XXX This report description goes here XXX
 
377
      </p>
 
378
    ''')
 
379
 
 
380
 
 
381
class SectionReportTableViewlet(flourish.viewlet.Viewlet):
 
382
 
 
383
    template = InlineViewPageTemplate('''
 
384
      <div tal:content="structure view/view/providers/ajax/view/section/charts_table"/>
367
385
    ''')
368
386
 
369
387
 
372
390
    return demographics.get('ID', '')
373
391
 
374
392
 
375
 
class SkillsColumn(GetterColumn):
 
393
class SectionReportChartsColumn(GetterColumn):
376
394
 
377
395
    template = ViewPageTemplateFile(
378
 
        'templates/section_report_skills_column.pt')
 
396
        'templates/section_report_charts_column.pt')
 
397
 
 
398
 
 
399
class SkillsColumn(SectionReportChartsColumn):
379
400
 
380
401
    def __init__(self, view):
381
402
        self.view = view
 
403
        self.total = len(view.skills)
382
404
        title = _('Skills (of ${count})',
383
 
                  mapping={'count': len(view.skills)})
 
405
                  mapping={'count': self.total})
384
406
        name = 'skills'
385
407
        super(SkillsColumn, self).__init__(title, name=name)
386
408
 
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)
391
412
        data = []
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,
405
426
                             data=data,
406
427
                             container_id=container_id,
417
438
        return result
418
439
 
419
440
 
 
441
class StudentsColumn(SectionReportChartsColumn):
 
442
 
 
443
    def __init__(self, view):
 
444
        self.view = view
 
445
        self.total = len(view.section.members)
 
446
        title = _('Students (${count})',
 
447
                  mapping={'count': self.total})
 
448
        name = 'students'
 
449
        super(StudentsColumn, self).__init__(title, name=name)
 
450
 
 
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)
 
455
        data = []
 
456
        passing_index = None
 
457
        scores = reversed(self.view.scoresystem.scores)
 
458
        score_labels = []
 
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:
 
463
                passing_index = i
 
464
        # XXX: hack to make the ViewPageTemplateFile to work
 
465
        self.context = item
 
466
        self.request = formatter.request
 
467
        return self.template(total=self.total,
 
468
                             passing_index=passing_index,
 
469
                             data=data,
 
470
                             container_id=container_id,
 
471
                             score_labels = score_labels)
 
472
 
 
473
    def skillScoresData(self, skill, gradebook):
 
474
        result = {}
 
475
        for score in self.view.scoresystem.scores:
 
476
            result[score[0]] = 0
 
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
 
481
        return result
 
482
 
 
483
 
420
484
class SectionReportSortFormatter(table.ajax.AJAXFormSortFormatter):
421
485
 
422
486
    script_name = 'ST.virginia.on_section_report_sort'
423
487
 
424
488
 
425
 
class StudentSkillsTable(table.ajax.Table):
 
489
class SectionReportChartsTable(table.ajax.Table):
426
490
 
427
491
    batch_size = 0
428
492
    table_formatter = SectionReportSortFormatter
 
493
    css_classes = ''
429
494
 
430
495
    @property
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})
 
505
 
 
506
 
 
507
class ByStudentChartsTable(SectionReportChartsTable):
 
508
 
 
509
    css_classes = 'section-report section-report-by-student'
440
510
 
441
511
    def columns(self):
442
512
        title = table.column.LocaleAwareGetterColumn(
459
529
        return self.context.members
460
530
 
461
531
 
 
532
class BySkillChartsTable(SectionReportChartsTable):
 
533
 
 
534
    css_classes = 'section-report section-report-by-skill'
 
535
 
 
536
    def columns(self):
 
537
        # i => (skill, gradebook)
 
538
        label = table.column.LocaleAwareGetterColumn(
 
539
            name='label',
 
540
            title=_(u'Label'),
 
541
            getter=lambda i, f: i[0].label,
 
542
            subsort=True)
 
543
        title = table.column.LocaleAwareGetterColumn(
 
544
            name='title',
 
545
            title=_(u'Skill'),
 
546
            getter=lambda i, f: i[0].title,
 
547
            subsort=True)
 
548
        students = StudentsColumn(self.view)
 
549
        return [label, title, students]
 
550
 
 
551
    def sortOn(self):
 
552
        return (('label', False),)
 
553
 
 
554
    def items(self):
 
555
        return self.view.skills
 
556
 
 
557
 
462
558
class ScoreFilterViewlet(flourish.page.RefineLinksViewlet): pass
463
559
 
464
560
 
513
609
      </ul>
514
610
    ''')
515
611
 
 
612
    @property
 
613
    def options(self):
 
614
        return [
 
615
            ('all', _('All'), True),
 
616
            ('required', _('Required'), False),
 
617
            ]
 
618
 
516
619
    def type_options(self):
517
620
        result = []
518
 
        options = [
519
 
            ('required', _('Required'), True),
520
 
            ('all', _('All'), False),
521
 
            ]
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