source: main/waeup.uniben/trunk/src/waeup/uniben/students/export.py @ 18099

Last change on this file since 18099 was 18099, checked in by Henrik Bettermann, 8 days ago

Add column.

File size: 11.2 KB
RevLine 
[12856]1## $Id: export.py 12084 2014-11-28 09:54:10Z henrik $
2##
3## Copyright (C) 2015 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
18"""Exporters for student related stuff.
19"""
[16390]20import grok
[17905]21import os
[15025]22from datetime import datetime
[17905]23from waeup.kofa.interfaces import (
24    IExtFileStore, IFileStoreNameChooser, IKofaUtils)
[17862]25from zope.component import getUtility
[12856]26from waeup.uniben.students.interfaces import (
27    ICustomStudent,
28    ICustomStudentStudyCourse,
29    ICustomStudentStudyLevel,
30    ICustomCourseTicket,
[16390]31    ICustomStudentOnlinePayment,
32    IMedicalHistory)
[12856]33from kofacustom.nigeria.students.export import (
34    NigeriaStudentExporter,
35    NigeriaStudentStudyCourseExporter,
36    NigeriaStudentStudyLevelExporter,
37    NigeriaCourseTicketExporter,
[14856]38    NigeriaStudentPaymentExporter,
[15025]39    NigeriaDataForBursaryExporter,
[16498]40    NigeriaTrimmedDataExporter,
[15025]41    )
[16390]42from waeup.kofa.students.export import (
[18098]43    get_tickets_for_lecturer,
44    SchoolFeePaymentsOverviewExporter,
45    StudentExporterBase,
46    DataForLecturerExporter)
[12856]47from waeup.kofa.utils.helpers import iface_names
48
49class CustomStudentExporter(NigeriaStudentExporter):
50    """Exporter for Students.
51    """
52
53    fields = tuple(sorted(iface_names(
54        ICustomStudent, omit=['loggerInfo']))) + (
55        'password', 'state', 'history', 'certcode', 'is_postgrad',
56        'current_level', 'current_session')
57
[16498]58class CustomTrimmedDataExporter(NigeriaTrimmedDataExporter):
59    """The Student Trimmed Data Exporter first filters the set of students
60    by searching the students catalog. Then it exports a trimmed data set
61    of this set of students.
62    """
63    fields = (
64        'student_id',
65        'matric_number',
66        'reg_number',
67        'firstname',
68        'middlename',
69        'lastname',
70        'sex',
71        'email',
72        'email2',
73        'phone',
[17776]74        'perm_address',
[16498]75        'nationality',
76        'date_of_birth',
77        'state',
78        'current_mode',
79        'certcode',
80        'faccode',
81        'depcode',
82        'current_level',
83        'current_session',
84        'current_verdict',
85        'entry_session',
86        'lg_state',
[17624]87        'lg_area',
[17785]88        'flash_notice',
[17806]89        'physical_clearance_date',
90        'former_matric',
91        'hq_matric_no',
[17905]92        'hq2_matric_no',
[17919]93        )
[16498]94
[17919]95    #def mangle_value(self, value, name, context=None):
96    #    if name == 'routing_slip_path':
97    #        file_id = IFileStoreNameChooser(context).chooseName(
98    #            attr='routingslip.pdf')
99    #        os_path = getUtility(IExtFileStore)._pathFromFileID(file_id)
100    #        if not os.path.exists(os_path):
101    #            value = None
102    #        else:
103    #            value = '/'.join(os_path.split('/')[-4:])
104    #    return super(
105    #        CustomTrimmedDataExporter, self).mangle_value(
106    #        value, name, context=context)
[17905]107
108
[12856]109class CustomStudentStudyCourseExporter(NigeriaStudentStudyCourseExporter):
110    """Exporter for StudentStudyCourses.
111    """
112
113    fields = tuple(
[16837]114        sorted(iface_names(ICustomStudentStudyCourse))) + (
115            'student_id', 'previous')
[12856]116
117class CustomStudentStudyLevelExporter(NigeriaStudentStudyLevelExporter):
118    """Exporter for StudentStudyLevels.
119    """
120    #: Fieldnames considered by this exporter
121    fields = tuple(sorted(iface_names(
[12879]122        ICustomStudentStudyLevel))) + (
[16837]123        'student_id', 'number_of_tickets','certcode', 'previous')
[12856]124
125class CustomCourseTicketExporter(NigeriaCourseTicketExporter):
126    """Exporter for CourseTickets.
127    """
128
129    fields = tuple(sorted(iface_names(ICustomCourseTicket) +
130        ['level', 'code', 'level_session'])) + ('student_id',
[17558]131        'certcode', 'display_fullname', 'previous', 'matric_number')
[12856]132
[12879]133class CustomStudentPaymentExporter(NigeriaStudentPaymentExporter):
[12856]134    """Exporter for OnlinePayment instances.
135    """
136
137    fields = tuple(
138        sorted(iface_names(
139            ICustomStudentOnlinePayment, exclude_attribs=False,
[13621]140            omit=['display_item']))) + (
[12856]141            'student_id','state','current_session')
142
[14856]143class CustomDataForBursaryExporter(NigeriaDataForBursaryExporter):
144    """
145    """
146
147    fields = tuple(
148        sorted(iface_names(
149            ICustomStudentOnlinePayment, exclude_attribs=False,
150            omit=['display_item', 'certificate', 'student']))) + (
151            'student_id','matric_number','reg_number',
152            'firstname', 'middlename', 'lastname',
153            'state','current_session',
154            'entry_session', 'entry_mode',
155            'faccode', 'depcode','certcode')
[15025]156
[18098]157class CustomDataForLecturerExporter(DataForLecturerExporter):
158    """
159    """
160
161    fields = ('matric_number', 'student_id', 'display_fullname',
162              'level', 'code', 'level_session',
[18099]163              'certcode', 'ca', 'exam',
[18098]164              'score',
165              )
166
167    def filter_func(self, x, **kw):
168        tickets = get_tickets_for_lecturer(x, **kw)
169        return sorted([ticket for ticket in tickets],
170            key=lambda ticket: str(ticket.fcode) + str(ticket.dcode)
171                + str(ticket.certcode)
172                + str(ticket.student.matric_number))
173
174    def mangle_value(self, value, name, context=None):
175        """The mangler determines the student's id and fullname.
176        """
177        if context is not None:
178            student = context.student
179            if name in ('matric_number',
180                        'reg_number',
181                        'student_id',
[18099]182                        'display_fullname',
183                        'certcode') and student is not None:
[18098]184                value = getattr(student, name, None)
185            if name in ('ca','exam',):
186                value =''
187        return super(
188            DataForLecturerExporter, self).mangle_value(
189            value, name, context=context)
190
[15048]191class CustomSchoolFeePaymentsOverviewExporter(SchoolFeePaymentsOverviewExporter):
[15025]192
193    curr_year = datetime.now().year
[15044]194    year_range = range(curr_year - 14, curr_year + 1) # 3 more years in Uniben
[15025]195    year_range_tuple = tuple([str(year) for year in year_range])
196
[16476]197    fields = ('student_id', 'matric_number', 'firstname', 'middlename',
198        'lastname', 'state', 'certcode', 'faccode', 'depcode', 'is_postgrad',
[15025]199        'current_level', 'current_session', 'current_mode',
[16498]200        'entry_session', 'reg_number', 'email2', 'sex'
[15025]201        ) + year_range_tuple
[16390]202
203class MedicalHistoryExporter(grok.GlobalUtility, StudentExporterBase):
204    """
205    """
206    grok.name('medicalhistory')
207
208    fields = tuple(
209        sorted(iface_names(
210            IMedicalHistory, exclude_attribs=False,))) + (
211            'student_id','display_fullname', 'matric_number', 'faccode',
[17395]212            'depcode', 'state','current_session', 'current_level', 'genotype', 'bloodgroup')
[16390]213    title = 'Medical Questionnaire Data'
214
215    def mangle_value(self, value, name, context=None):
216        """The mangler determines the titles of faculty, department
217        and certificate. It also computes the path of passport image file
218        stored in the filesystem.
219        """
220        if context is not None:
221            student = context.student
222            if name in ('student_id','display_fullname',
223                'matric_number', 'faccode',
224                'depcode', 'state','current_session',
[17395]225                'current_level',
226                'genotype', 'bloodgroup') and student is not None:
[16390]227                value = getattr(student, name, None)
228        return super(
229            MedicalHistoryExporter, self).mangle_value(
230            value, name, context=context)
[17396]231
[17915]232def get_routingslip_exists(students, **kw):
233    """Get students with outstanding certificate courses.
234    """
235    students_with_slip = []
236    for student in students:
237        file_id = IFileStoreNameChooser(student).chooseName(
238            attr='routingslip.pdf')
239        os_path = getUtility(IExtFileStore)._pathFromFileID(file_id)
240        if os.path.exists(os_path):
241            students_with_slip.append(student)
242    return students_with_slip
[17396]243
[17915]244class RoutingSlipExporter(grok.GlobalUtility, StudentExporterBase):
245    """
246    """
247    grok.name('routingslip')
248
[17929]249    fields = ('student_id', 'matric_number',)
[17915]250    title = 'Routing Slip Exists'
251
252    def filter_func(self, x, **kw):
253        return get_routingslip_exists(x, **kw)
254
255    #def mangle_value(self, value, name, context=None):
256    #    if name == 'routing_slip':
257    #        file_id = IFileStoreNameChooser(context).chooseName(
258    #            attr='routingslip.pdf')
259    #        os_path = getUtility(IExtFileStore)._pathFromFileID(file_id)
260    #        if not os.path.exists(os_path):
261    #            value = None
262    #        else:
263    #            value = '1'
264    #    return super(
265    #        RoutingSlipExporter, self).mangle_value(
266    #        value, name, context=context)
267
268
[17396]269class NYSCExporter(SchoolFeePaymentsOverviewExporter):
270    """
271    """
272    grok.name('nysc')
273    curr_year = datetime.now().year
274    year_range = range(curr_year - 11, curr_year + 1)
275    year_range_tuple = tuple([str(year) for year in year_range])
276    fields = ('student_id',
277        'matric_number',
278        'reg_number',
279        'firstname',
280        'middlename',
281        'lastname',
282        'sex',
[17897]283        'email',
284        'email2',
285        'phone',
[17396]286        'nationality',
287        'date_of_birth',
288        'state',
[17834]289        'lg_state',
290        'lg_area',
[17396]291        'current_mode',
[17862]292        'certificate',
[17396]293        'faccode',
294        'depcode',
295        'current_level',
296        'current_session',
297        'current_verdict',
[17831]298        'entry_session',
[17852]299        'nysc_verdict',
[17827]300        'nysc_senate_info',
301        'nysc_date_of_graduation',
302        'nysc_updated',
[17835]303        'nysc_processed',
[17396]304        ) + year_range_tuple
305    title = u'NYSC Indication'
306
307    def filter_func(self, x, **kw):
308        students = list()
309        for student in x:
[17835]310            if student.nysc == True and student.nysc_processed == False:
[17396]311                students.append(student)
[17834]312        return students
313
314    def mangle_value(self, value, name, context=None):
[17862]315        verdicts = getUtility(IKofaUtils).VERDICTS_DICT
[17849]316        if name in ('lg_state', 'lg_area') and context.lga:
317            value = context.lga
318            if value.startswith('cross_river') or value.startswith('akwa_ibom'):
319                value = context.lga.replace('_', '-', 1)
320            if name == 'lg_state':
321                value = value.split('_')[0]
322            if name == 'lg_area':
323                value = '-'.join(value.split('_')[1:])
[17862]324        if name == 'certificate':
325            cert = getattr(context.get('studycourse', None), 'certificate', None)
326            if cert is not None:
327                value = cert.title
328        if name == 'nysc_verdict' and value:
329            value = verdicts[value]
[17834]330        return super(
331            NYSCExporter, self).mangle_value(
332            value, name, context=context)
Note: See TracBrowser for help on using the repository browser.