~schooltool-owners/schooltool.peas/packaging

« back to all changes in this revision

Viewing changes to src/schooltool/peas/browser/assessment.py

  • Committer: Douglas Cerna
  • Date: 2015-02-20 00:38:35 UTC
  • mfrom: (9.1.54 schooltool.peas)
  • Revision ID: douglascerna@yahoo.com-20150220003835-q6d2zq8ysvdduurk
New release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
59
59
from schooltool.gradebook.interfaces import IGradebook
60
60
from schooltool.group.browser.group import GroupAwarePersonTableFilter
61
61
from schooltool.group.browser.group import GroupJSONSearchView
 
62
from schooltool.group.group import defaultGroups
62
63
from schooltool.group.interfaces import IGroupContainer
63
64
from schooltool.level.interfaces import ILevelContainer
64
65
from schooltool.level.level import LevelCourses
78
79
from schooltool.peas.assessment import default_deploy_term
79
80
from schooltool.peas.assessment import get_peas_scoresystem
80
81
from schooltool.peas.assessment import find_division
 
82
from schooltool.peas.assessment import ASSESSMENT_SHEETS
 
83
from schooltool.peas.assessment import MOCK_SHEET_ID
 
84
from schooltool.peas.assessment import MOCK_OTHER_SHEET_ID
81
85
from schooltool.peas.assessment import UCE_SHEET_ID
82
86
from schooltool.peas.browser.report import ICurrentTerm
83
87
from schooltool.peas.browser.report import term_id_getter
657
661
        return result
658
662
 
659
663
 
660
 
class BasicClassroomReportLink(ReportLinkViewlet,
661
 
                               ActiveSchoolYearContentMixin):
662
 
 
663
 
    @property
664
 
    def enabled(self):
665
 
        preferences = IAssessmentPreferences(self.schoolyear)
666
 
        return (preferences.bot is not None or
667
 
                preferences.mot is not None or
668
 
                preferences.eot is not None or
669
 
                preferences.mock is not None or
670
 
                preferences.mock_other is not None)
671
 
 
672
 
    def render(self, *args, **kw):
673
 
        if not self.enabled:
674
 
            return ''
675
 
        return super(BasicClassroomReportLink, self).render(*args, **kw)
 
664
class SchoolYearReportLink(ReportLinkViewlet,
 
665
                           ActiveSchoolYearContentMixin):
676
666
 
677
667
    @property
678
668
    def report_link(self):
680
670
        return '%s/%s' % (url, self.link)
681
671
 
682
672
 
 
673
class BasicClassroomReportLink(SchoolYearReportLink):
 
674
 
 
675
    @property
 
676
    def enabled(self):
 
677
        preferences = IAssessmentPreferences(self.schoolyear)
 
678
        return (preferences.bot is not None or
 
679
                preferences.mot is not None or
 
680
                preferences.eot is not None or
 
681
                preferences.mock is not None or
 
682
                preferences.mock_other is not None)
 
683
 
 
684
    def render(self, *args, **kw):
 
685
        if not self.enabled:
 
686
            return ''
 
687
        return super(BasicClassroomReportLink, self).render(*args, **kw)
 
688
 
 
689
 
683
690
class CoursesVocabulary(SimpleVocabulary):
684
691
 
685
692
    implements(IContextSourceBinder)
726
733
    return TeachersVocabulary
727
734
 
728
735
 
729
 
 
730
736
class IBasicClassroomReport(Interface):
731
737
 
732
738
    level = Choice(
982
988
    def enabled_mocks(self):
983
989
        preferences = IAssessmentPreferences(self.schoolyear)
984
990
        enabled_mocks = OrderedDict()
985
 
        for sheet in ['mock', 'mock_other']:
986
 
            if getattr(preferences, sheet):
987
 
                enabled_mocks[sheet] = getattr(preferences, '%s_term' % sheet)
 
991
        for sheet in ['mock', 'mock-other']:
 
992
            # XXX: needed because of a typo in the MOCK - Other sheet __name__
 
993
            preference = sheet.replace('-', '_')
 
994
            if getattr(preferences, preference):
 
995
                enabled_mocks[sheet] = getattr(preferences,
 
996
                                               '%s_term' % preference)
988
997
        return enabled_mocks
989
998
                
990
999
 
1012
1021
 
1013
1022
        mock_titles = {
1014
1023
            'mock': 'MOCK - PEAS',
1015
 
            'mock_other': 'MOCK - Other',
 
1024
            'mock-other': 'MOCK - Other',
1016
1025
        }
1017
1026
 
1018
1027
        for mock in self.enabled_mocks:
1245
1254
                    count += 1
1246
1255
                    averages.append(average)
1247
1256
        return self.div(sum(averages), count)
 
1257
 
 
1258
 
 
1259
class IStudentReport(Interface):
 
1260
 
 
1261
    level = Choice(
 
1262
        title=STMessage('Level'),
 
1263
        vocabulary='schooltool.level.level.levelvocabulary')
 
1264
 
 
1265
    group = Choice(
 
1266
        title=_('Stream'),
 
1267
        source='schooltool.peas.groups')
 
1268
 
 
1269
    term = Choice(
 
1270
        title=_('Term / Exam'),
 
1271
        source='schooltool.peas.term_exams')
 
1272
 
 
1273
 
 
1274
class StudentReportRequestView(RequestXLSReportDialog):
 
1275
 
 
1276
    report_builder = 'student_report.xls'
 
1277
 
 
1278
    fields = field.Fields(IStudentReport)
 
1279
 
 
1280
    def resetForm(self):
 
1281
        RequestXLSReportDialog.resetForm(self)
 
1282
        self.form_params['schoolyear'] = self.context
 
1283
 
 
1284
    def updateTaskParams(self, task):
 
1285
        level = self.form_params.get('level')
 
1286
        group= self.form_params.get('group')
 
1287
        term = self.form_params.get('term')
 
1288
        task.request_params['level'] = level.__name__
 
1289
        if group is not u'':
 
1290
            task.request_params['group'] = group.__name__
 
1291
        preferences = IAssessmentPreferences(self.context)
 
1292
        if term == MOCK_SHEET_ID:
 
1293
            term = preferences.mock_term
 
1294
            sheet = MOCK_SHEET_ID
 
1295
        elif term == MOCK_OTHER_SHEET_ID:
 
1296
            term = preferences.mock_other_term
 
1297
            sheet = MOCK_OTHER_SHEET_ID
 
1298
        elif term == UCE_SHEET_ID:
 
1299
            term = default_deploy_term(self.context)
 
1300
            sheet = UCE_SHEET_ID
 
1301
        else:
 
1302
            sheet = ''
 
1303
        task.request_params['term'] = term.__name__
 
1304
        task.request_params['sheet'] = sheet
 
1305
 
 
1306
    def updateWidgets(self):
 
1307
        super(StudentReportRequestView, self).updateWidgets()
 
1308
        self.widgets['level'].prompt = True
 
1309
        self.widgets['term'].prompt = True
 
1310
 
 
1311
 
 
1312
class GroupsVocabulary(SimpleVocabulary):
 
1313
 
 
1314
    implements(IContextSourceBinder)
 
1315
 
 
1316
    def __init__(self, context):
 
1317
        self.context = context
 
1318
        terms = self.createTerms()
 
1319
        SimpleVocabulary.__init__(self, terms)
 
1320
 
 
1321
    def createTerms(self):
 
1322
        result = []
 
1323
        result.append(self.createTerm(
 
1324
            u'',
 
1325
            '__all_groups__',
 
1326
            _('All'),
 
1327
        ))
 
1328
        schoolyear = self.context['schoolyear']
 
1329
        groups = IGroupContainer(schoolyear)
 
1330
        for group_id, group in sorted(groups.items(),
 
1331
                                      key=lambda i: i[1].title):
 
1332
            if group_id in defaultGroups:
 
1333
                continue
 
1334
            result.append(self.createTerm(group, group_id, group.title))
 
1335
        return result
 
1336
 
 
1337
 
 
1338
def GroupsVocabularyFactory():
 
1339
    return GroupsVocabulary
 
1340
 
 
1341
 
 
1342
class TermExamsVocabulary(SimpleVocabulary):
 
1343
 
 
1344
    implements(IContextSourceBinder)
 
1345
 
 
1346
    def __init__(self, context):
 
1347
        self.context = context
 
1348
        terms = self.createTerms()
 
1349
        SimpleVocabulary.__init__(self, terms)
 
1350
 
 
1351
    def createTerms(self):
 
1352
        result = []
 
1353
        schoolyear = self.context['schoolyear']
 
1354
        for term in sorted(schoolyear.values(),
 
1355
                           key=lambda t: t.first):
 
1356
            result.append(self.createTerm(term, term.__name__, term.title))
 
1357
        mocks = [MOCK_SHEET_ID, MOCK_OTHER_SHEET_ID]
 
1358
        preferences = IAssessmentPreferences(schoolyear)
 
1359
        for sheet in mocks + [UCE_SHEET_ID]:
 
1360
            if sheet in mocks:
 
1361
                # XXX: needed because of a typo in MOCK_OTHER_SHEET_ID
 
1362
                preference = sheet.replace('-', '_')
 
1363
                if not getattr(preferences, preference):
 
1364
                    continue
 
1365
            title = ASSESSMENT_SHEETS[sheet]['title']
 
1366
            result.append(self.createTerm(sheet, sheet, title))
 
1367
        return result
 
1368
 
 
1369
 
 
1370
def TermExamsVocabularyFactory():
 
1371
    return TermExamsVocabulary
 
1372
 
 
1373
 
 
1374
class StudentReportView(OverallReportBase):
 
1375
 
 
1376
    message_title = _('Student report')
 
1377
 
 
1378
    sheet_1_title = _('Assessment - Student attainment for all subjects '
 
1379
                      'and comparison to target ')
 
1380
    sheet_1_label = _('Student report')
 
1381
 
 
1382
    @property
 
1383
    def base_filename(self):
 
1384
        return 'student_report_%s' % self.schoolyear.title
 
1385
 
 
1386
    def print_report_filters(self, ws, row):
 
1387
        ws.write(row, 0, STMessage('Level'), xlwt.easyxf(
 
1388
            'font: bold on, color black; '
 
1389
            'pattern: pattern solid, fore_color white; '
 
1390
            'borders: top no_line, right no_line, bottom no_line, left medium; '
 
1391
        ))
 
1392
        ws.write(row, 1, self.level.title, xlwt.easyxf(
 
1393
            'font: bold on, color black; '
 
1394
            'pattern: pattern solid, fore_color white; '
 
1395
            'borders: top no_line, right medium, bottom no_line, left no_line; '
 
1396
        ))
 
1397
        row += 1
 
1398
        ws.write(row, 0, _('Stream'), xlwt.easyxf(
 
1399
            'font: bold on, color black; '
 
1400
            'pattern: pattern solid, fore_color white; '
 
1401
            'borders: top no_line, right no_line, bottom no_line, left medium; '
 
1402
        ))
 
1403
        ws.write(row, 1, self.group.title if self.group else 'All', xlwt.easyxf(
 
1404
            'font: bold on, color black; '
 
1405
            'pattern: pattern solid, fore_color white; '
 
1406
            'borders: top no_line, right medium, bottom no_line, left no_line; '
 
1407
        ))
 
1408
        row += 1
 
1409
        ws.write(row, 0, _('Term / Exam'), xlwt.easyxf(
 
1410
            'font: bold on, color black; '
 
1411
            'pattern: pattern solid, fore_color white; '
 
1412
            'borders: top no_line, right no_line, bottom no_line, left medium; '
 
1413
        ))
 
1414
        if not self.sheet:
 
1415
            title = self.term.title
 
1416
        else:
 
1417
            title = ASSESSMENT_SHEETS[self.sheet]['title']
 
1418
        ws.write(row, 1, title, xlwt.easyxf(
 
1419
            'font: bold on, color black; '
 
1420
            'pattern: pattern solid, fore_color white; '
 
1421
            'borders: top no_line, right medium, bottom no_line, left no_line; '
 
1422
        ))
 
1423
        row += 1
 
1424
        ws.write(row, 0, _('Year selected'), xlwt.easyxf(
 
1425
            'font: bold on, color black; '
 
1426
            'pattern: pattern solid, fore_color white; '
 
1427
            'borders: top no_line, right no_line, bottom medium, left medium; '
 
1428
        ))
 
1429
        ws.write(row, 1, self.schoolyear.title, xlwt.easyxf(
 
1430
            'font: bold on, color black; '
 
1431
            'pattern: pattern solid, fore_color white; '
 
1432
            'borders: top no_line, right medium, bottom medium, left no_line; '
 
1433
        ))
 
1434
 
 
1435
    @Lazy
 
1436
    def level(self):
 
1437
        app = ISchoolToolApplication(None)
 
1438
        container = ILevelContainer(app)
 
1439
        return container.get(self.request.get('level'))
 
1440
 
 
1441
    @Lazy
 
1442
    def group(self):
 
1443
        groups = IGroupContainer(self.schoolyear)
 
1444
        return groups.get(self.request.get('group'))
 
1445
 
 
1446
    @Lazy
 
1447
    def schoolyear(self):
 
1448
        return self.context
 
1449
 
 
1450
    @Lazy
 
1451
    def term(self):
 
1452
        for term in self.schoolyear.values():
 
1453
            if term.__name__ == self.request.get('term'):
 
1454
                return term
 
1455
 
 
1456
    @Lazy
 
1457
    def sheet(self):
 
1458
        return self.request.get('sheet') or None
 
1459
 
 
1460
    @Lazy
 
1461
    def data(self):
 
1462
        result = []
 
1463
        return result
 
1464
 
 
1465
    def export_report(self, wb):
 
1466
        self.task_progress.force('sheet1', active=True)
 
1467
        ws = wb.add_sheet(self.sheet_1_label)
 
1468
        self.print_headers(ws, self.sheet_1_title)
 
1469
        self.finish('sheet1')