source: main/waeup.kofa/trunk/src/waeup/kofa/university/export.py @ 17628

Last change on this file since 17628 was 17497, checked in by Henrik Bettermann, 18 months ago

Remove redundant ‚key‘ field from exports.
Adjust tests and code.
Add columns to transcript officers landing page.

  • Property svn:keywords set to Id
File size: 9.6 KB
Line 
1## $Id: export.py 17497 2023-07-20 13:38:29Z 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              'results_validated_by', 'results_validation_date',
120              'results_validation_session')
121
122    title = _(u'Courses')
123
124    def mangle_value(self, value, name, context=None):
125        """The mangler additionally computes the department_code
126        and faculty_code values.
127        """
128        if name == 'users_with_local_roles':
129            value = []
130            role_map = IPrincipalRoleMap(context)
131            for local_role, user_name, setting in \
132                role_map.getPrincipalsAndRoles():
133                value.append({'user_name':user_name,'local_role':local_role})
134        elif name == 'faculty_code':
135            try:
136                value = context.__parent__.__parent__.__parent__.code
137            except AttributeError:
138                value = None
139        elif name == 'department_code':
140            try:
141                value = context.__parent__.__parent__.code
142            except AttributeError:
143                value = None
144        return super(CourseExporter, self).mangle_value(
145            value, name, context)
146
147    def export_all(self, site, filepath=None):
148        """Export courses into filepath as CSV data.
149        If `filepath` is ``None``, a raw string with CSV data is returned.
150        """
151        writer, outfile = self.get_csv_writer(filepath)
152        faculties = site.get('faculties', {})
153        for faculty in faculties.values():
154            for department in faculty.values():
155                for course in department.courses.values():
156                    self.write_item(course, writer)
157        return self.close_outfile(filepath, outfile)
158
159
160class CertificateExporter(CourseExporter, grok.GlobalUtility):
161    """The Certificate Exporter exports all certificates in the database.
162    It iterates over all departments and faculties.
163    """
164    grok.implements(ICSVExporter)
165    grok.name('certificates')
166
167    fields = ('code', 'faculty_code', 'department_code', 'title', 'study_mode',
168              'degree',
169              'start_level', 'end_level', 'application_category', 'ratio',
170              'school_fee_1', 'school_fee_2', 'school_fee_3', 'school_fee_4',
171              'custom_textline_1', 'custom_textline_2',
172              'custom_float_1', 'custom_float_2',
173              'users_with_local_roles')
174
175    title = _(u'Certificates')
176
177    def export_all(self, site, filepath=None):
178        """Export certificates into filepath as CSV data.
179        If `filepath` is ``None``, a raw string with CSV data is returned.
180        """
181        writer, outfile = self.get_csv_writer(filepath)
182        faculties = site.get('faculties', {})
183        for faculty in faculties.values():
184            for department in faculty.values():
185                for cert in department.certificates.values():
186                    self.write_item(cert, writer)
187        return self.close_outfile(filepath, outfile)
188
189
190class CertificateCourseExporter(CourseExporter, grok.GlobalUtility):
191    """The Certificate Course Exporter exports all certificate courses
192    (:class:`CertificateCourse
193    <waeup.kofa.university.certificate.CertificateCourse>` instances) in
194    the database. It iterates over all departments and faculties.
195    """
196    grok.implements(ICSVExporter)
197    grok.name('certificate_courses')
198
199    fields = ('course', 'faculty_code', 'department_code', 'certificate_code',
200              'level', 'mandatory', 'course_category')
201
202    title = _(u'Courses in Certificates')
203
204    def mangle_value(self, value, name, context=None):
205        """The mangler computes the codes of the faculty, the department and
206        the certificate which require the course. It also exports the
207        course code.
208
209        .. note:: The course must not necessarily be offered by the same
210                  department.
211        """
212        if name == 'faculty_code':
213            try:
214                value = context.__parent__.__parent__.__parent__.__parent__.code
215            except AttributeError:
216                value = None
217        elif name == 'department_code':
218            try:
219                value = context.__parent__.__parent__.__parent__.code
220            except AttributeError:
221                value = None
222        elif name == 'certificate_code':
223            value = getattr(context, '__parent__', None)
224            value = getattr(value, 'code', None)
225        if name == 'course':
226            value = getattr(value, 'code', None)
227        return super(CourseExporter, self).mangle_value(
228            value, name, context)
229
230    def export_all(self, site, filepath=None):
231        """Export certificate courses into filepath as CSV data.
232        If `filepath` is ``None``, a raw string with CSV data is returned.
233        """
234        writer, outfile = self.get_csv_writer(filepath)
235        faculties = site.get('faculties', {})
236        for faculty in faculties.values():
237            for department in faculty.values():
238                for cert in department.certificates.values():
239                    for certref in cert.values():
240                        self.write_item(certref, writer)
241        return self.close_outfile(filepath, outfile)
Note: See TracBrowser for help on using the repository browser.