source: main/waeup.kofa/branches/henrik-transcript-workflow/src/waeup/kofa/university/export.py @ 17397

Last change on this file since 17397 was 14511, checked in by Henrik Bettermann, 8 years ago

Add officer name fields do IDepartment and IFaculty. Plugins must be updated!

  • Property svn:keywords set to Id
File size: 9.8 KB
Line 
1## $Id: export.py 14511 2017-02-07 08:33:05Z henrik $
2##
3## Copyright (C) 2012 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 faculties, departments, and other academics components.
19"""
20import grok
21from zope.securitypolicy.interfaces import IPrincipalRoleMap
22from waeup.kofa.interfaces import ICSVExporter
23from waeup.kofa.interfaces import MessageFactory as _
24from waeup.kofa.utils.batching import ExporterBase
25
26
27class FacultyExporter(grok.GlobalUtility, ExporterBase):
28    """The Faculty Exporter exports all faculties in the `faculties`
29    container. This is the only place where faculties are stored.
30    """
31    grok.implements(ICSVExporter)
32    grok.name('faculties')
33
34    fields = ('code', 'title', 'title_prefix', 'users_with_local_roles',
35              'officer_1', 'officer_2')
36
37    title = _(u'Faculties')
38
39    def mangle_value(self, value, name, context=None):
40        """The mangler computes the `users_with_local_roles` value which
41        is a Python expression like:
42
43        ``[{'user_name': u'bob', 'local_role': u'bobsrole'},
44        {'user_name': u'anna', 'local_role': u'annasrole'}]``
45        """
46        if name == 'users_with_local_roles':
47            value = []
48            role_map = IPrincipalRoleMap(context)
49            for local_role, user_name, setting in \
50                role_map.getPrincipalsAndRoles():
51                value.append({'user_name':user_name,'local_role':local_role})
52        return super(FacultyExporter, self).mangle_value(
53            value, name, context)
54
55    def export(self, faculties, filepath=None):
56        """Export `faculties`, an iterable, as CSV file.
57        If `filepath` is ``None``, a raw string with CSV data is returned.
58        """
59        writer, outfile = self.get_csv_writer(filepath)
60        for faculty in faculties:
61            self.write_item(faculty, writer)
62        return self.close_outfile(filepath, outfile)
63
64    def export_all(self, site, filepath=None):
65        """Export faculties in facultycontainer into filepath as CSV data.
66        If `filepath` is ``None``, a raw string with CSV data is returned.
67        """
68        faculties = site.get('faculties', {})
69        return self.export(faculties.values(), filepath)
70
71
72class DepartmentExporter(FacultyExporter, grok.GlobalUtility):
73    """The Department Exporter exports all departments stored in the faculty
74    containers. The exporter iterates over all faculties and then over all
75    departments inside each faculty container.
76    """
77    grok.implements(ICSVExporter)
78    grok.name('departments')
79
80    fields = ('code', 'faculty_code', 'title', 'title_prefix',
81              'users_with_local_roles',
82              'officer_1', 'officer_2','officer_3', 'officer_4')
83
84    title = _(u'Departments')
85
86    def mangle_value(self, value, name, context=None):
87        """The mangler additionally computes the faculty_code value
88        which is the code (= object id) of the faculty that hosts
89        the department.
90        """
91        if name == 'faculty_code':
92            value = getattr(
93                getattr(context, '__parent__', None),
94                'code', None)
95        return super(DepartmentExporter, self).mangle_value(
96            value, name, context)
97
98    def export_all(self, site, filepath=None):
99        """Export departments in faculty into filepath as CSV data.
100        If `filepath` is ``None``, a raw string with CSV data is returned.
101        """
102        writer, outfile = self.get_csv_writer(filepath)
103        faculties = site.get('faculties', {})
104        for faculty in faculties.values():
105            for department in faculty.values():
106                self.write_item(department, writer)
107        return self.close_outfile(filepath, outfile)
108
109
110class CourseExporter(FacultyExporter, grok.GlobalUtility):
111    """The Course Exporter exports all courses in the database. It iterates
112    over all departments and faculties.
113    """
114    grok.implements(ICSVExporter)
115    grok.name('courses')
116
117    fields = ('code', 'faculty_code', 'department_code', 'title', 'credits',
118              'passmark', 'semester', 'users_with_local_roles', 'former_course')
119
120    title = _(u'Courses')
121
122    def mangle_value(self, value, name, context=None):
123        """The mangler additionally computes the department_code value
124        which is the code of the department that offers the course.
125        """
126        if name == 'users_with_local_roles':
127            value = []
128            role_map = IPrincipalRoleMap(context)
129            for local_role, user_name, setting in \
130                role_map.getPrincipalsAndRoles():
131                value.append({'user_name':user_name,'local_role':local_role})
132        elif name == 'faculty_code':
133            try:
134                value = context.__parent__.__parent__.__parent__.code
135            except AttributeError:
136                value = None
137        elif name == 'department_code':
138            try:
139                value = context.__parent__.__parent__.code
140            except AttributeError:
141                value = None
142        return super(CourseExporter, self).mangle_value(
143            value, name, context)
144
145    def export_all(self, site, filepath=None):
146        """Export courses into filepath as CSV data.
147        If `filepath` is ``None``, a raw string with CSV data is returned.
148        """
149        writer, outfile = self.get_csv_writer(filepath)
150        faculties = site.get('faculties', {})
151        for faculty in faculties.values():
152            for department in faculty.values():
153                for course in department.courses.values():
154                    self.write_item(course, writer)
155        return self.close_outfile(filepath, outfile)
156
157
158class CertificateExporter(CourseExporter, grok.GlobalUtility):
159    """The Certificate Exporter exports all certificates in the database.
160    It iterates over all departments and faculties.
161    """
162    grok.implements(ICSVExporter)
163    grok.name('certificates')
164
165    fields = ('code', 'faculty_code', 'department_code', 'title', 'study_mode',
166              'degree',
167              'start_level', 'end_level', 'application_category', 'ratio',
168              'school_fee_1', 'school_fee_2', 'school_fee_3', 'school_fee_4',
169              'custom_textline_1', 'custom_textline_2',
170              'custom_float_1', 'custom_float_2',
171              'users_with_local_roles')
172
173    title = _(u'Certificates')
174
175    def mangle_value(self, value, name, context=None):
176        """The mangler additionally computes the department_code value
177        which is the code of the department that offers the certificate.
178        """
179        return super(CertificateExporter, self).mangle_value(
180            value, name, context)
181
182    def export_all(self, site, filepath=None):
183        """Export certificates into filepath as CSV data.
184        If `filepath` is ``None``, a raw string with CSV data is returned.
185        """
186        writer, outfile = self.get_csv_writer(filepath)
187        faculties = site.get('faculties', {})
188        for faculty in faculties.values():
189            for department in faculty.values():
190                for cert in department.certificates.values():
191                    self.write_item(cert, writer)
192        return self.close_outfile(filepath, outfile)
193
194
195class CertificateCourseExporter(CourseExporter, grok.GlobalUtility):
196    """The Certificate Course Exporter exports all certificate courses
197    (:class:`CertificateCourse
198    <waeup.kofa.university.certificate.CertificateCourse>` instances) in
199    the database. It iterates over all departments and faculties.
200    """
201    grok.implements(ICSVExporter)
202    grok.name('certificate_courses')
203
204    fields = ('course', 'faculty_code', 'department_code', 'certificate_code',
205              'level', 'mandatory')
206
207    title = _(u'Courses in Certificates')
208
209    def mangle_value(self, value, name, context=None):
210        """The mangler computes the codes of the faculty, the department and
211        the certificate which require the course. It also exports the
212        course code.
213
214        .. note:: The course must not necessarily be offered by the same
215                  department.
216        """
217        if name == 'faculty_code':
218            try:
219                value = context.__parent__.__parent__.__parent__.__parent__.code
220            except AttributeError:
221                value = None
222        elif name == 'department_code':
223            try:
224                value = context.__parent__.__parent__.__parent__.code
225            except AttributeError:
226                value = None
227        elif name == 'certificate_code':
228            value = getattr(context, '__parent__', None)
229            value = getattr(value, 'code', None)
230        if name == 'course':
231            value = getattr(value, 'code', None)
232        return super(CourseExporter, self).mangle_value(
233            value, name, context)
234
235    def export_all(self, site, filepath=None):
236        """Export certificate courses into filepath as CSV data.
237        If `filepath` is ``None``, a raw string with CSV data is returned.
238        """
239        writer, outfile = self.get_csv_writer(filepath)
240        faculties = site.get('faculties', {})
241        for faculty in faculties.values():
242            for department in faculty.values():
243                for cert in department.certificates.values():
244                    for certref in cert.values():
245                        self.write_item(certref, writer)
246        return self.close_outfile(filepath, outfile)
Note: See TracBrowser for help on using the repository browser.