~schooltool-owners/schooltool.gradebook/trunk

« back to all changes in this revision

Viewing changes to src/schooltool/gradebook/browser/pdf_views.py

  • Committer: Douglas Cerna
  • Date: 2014-10-14 11:49:11 UTC
  • Revision ID: douglascerna@yahoo.com-20141014114911-0c75w26d51riie21
Added absences for range of dates schoolyear report

Show diffs side-by-side

added added

removed removed

Lines of Context:
794
794
        return rows
795
795
 
796
796
 
 
797
class AbsencesByDateRangePDFView(AbsencesByDayPDFView):
 
798
 
 
799
    name = _('Absences for Range of Dates')
 
800
 
 
801
    @property
 
802
    def message_title(self):
 
803
        start = self.getRangeDay('start')
 
804
        end = self.getRangeDay('end')
 
805
        if start is None or end is None:
 
806
            return _('absences by range of dates report')
 
807
        return _('absences for ${start} to ${end}',
 
808
                 mapping={'start': self.formatDate(start),
 
809
                          'end': self.formatDate(end)})
 
810
 
 
811
    @property
 
812
    def title(self):
 
813
        start = self.getRangeDay('start')
 
814
        end = self.getRangeDay('end')
 
815
        if start is None or end is None:
 
816
            return None
 
817
        return '%s - %s' % (self.formatDate(start, format='mediumDate'),
 
818
                            self.formatDate(end, format='mediumDate'))
 
819
 
 
820
    @property
 
821
    def base_filename(self):
 
822
        start = self.getRangeDay('start')
 
823
        end = self.getRangeDay('end')
 
824
        if start is None or end is None:
 
825
            filename = 'abs_range_of_dates_' + self.context.__name__
 
826
        else:
 
827
            filename = 'abs_range_of_dates_%d_%02d_%02d_to_%d_%02d_%02d' % (
 
828
                start.year, start.month, start.day,
 
829
                end.year, end.month, end.day)
 
830
        return filename
 
831
 
 
832
    def inRange(self, value, start, end):
 
833
        return start <= value.date() <= end
 
834
 
 
835
    def getRangeDay(self, name):
 
836
        day = self.request.get(name, None)
 
837
        if day is None:
 
838
            return datetime.date(datetime.now())
 
839
        try:
 
840
            year, month, day = [int(part) for part in day.split('-')]
 
841
            return datetime.date(datetime(year, month, day))
 
842
        except (TypeError, ValueError):
 
843
            pass
 
844
        try:
 
845
            return datetime.date(day)
 
846
        except (TypeError, ValueError):
 
847
            return None
 
848
 
 
849
    def getData(self):
 
850
        start = self.getRangeDay('start')
 
851
        end = self.getRangeDay('end')
 
852
        if start is None or end is None:
 
853
            return {}
 
854
        terms = []
 
855
        for term in self.schoolyear.values():
 
856
            if start in term or end in term:
 
857
                terms.append(term)
 
858
        if not terms:
 
859
            return {}
 
860
        data = {}
 
861
        for term in terms:
 
862
            for section in ISectionContainer(term).values():
 
863
                jd = ISectionJournalData(section, None)
 
864
                if jd is None:
 
865
                    continue
 
866
                for student in section.members:
 
867
                    for meeting, score in jd.absentMeetings(student):
 
868
                        if not self.inRange(meeting.dtstart, start, end):
 
869
                            continue
 
870
                        period = self.guessPeriodGroup(meeting)
 
871
                        ss = score.scoreSystem
 
872
                        result = None
 
873
                        if ss.isExcused(score):
 
874
                            continue
 
875
                        elif ss.isAbsent(score):
 
876
                            result = ABSENT_ABBREVIATION
 
877
                        if result:
 
878
                            if student not in data:
 
879
                                data[student] = {}
 
880
                            if period not in data[student]:
 
881
                                data[student][period] = []
 
882
                            data[student][period].append(result)
 
883
        return data
 
884
 
 
885
    def students(self):
 
886
        data = self.getData()
 
887
        periods = self.getPeriods(data)
 
888
 
 
889
        rows = []
 
890
        for student in sorted(data, key=getSortingKey(self.request)):
 
891
            scores = [''] * len(periods)
 
892
            for period in data[student]:
 
893
                index = periods.index(period)
 
894
                scores[index] = len(data[student][period])
 
895
            row = {
 
896
                'name': student.title,
 
897
                'periods': scores,
 
898
                }
 
899
            rows.append(row)
 
900
        return rows
 
901
 
 
902
 
797
903
class SectionAbsencesPDFView(TermPDFPage):
798
904
    """A view for printing a report with absences for a given section"""
799
905