source: main/waeup.kofa/trunk/src/waeup/kofa/applicants/export.py @ 13033

Last change on this file since 13033 was 12865, checked in by Henrik Bettermann, 10 years ago

Rename classes StudentPaymentsExporter? and BedTicketsExporter? to be in accordance with other exporter names.

  • Property svn:keywords set to Id
File size: 5.7 KB
Line 
1## $Id: export.py 12865 2015-04-20 06:42:44Z 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 applicant-related stuff.
19"""
20import grok
21from zope.catalog.interfaces import ICatalog
22from zope.component import queryUtility
23from waeup.kofa.applicants.interfaces import (
24    IApplicantBaseData, IApplicantsContainer)
25from waeup.kofa.interfaces import ICSVExporter
26from waeup.kofa.interfaces import MessageFactory as _
27from waeup.kofa.utils.batching import ExporterBase
28from waeup.kofa.utils.helpers import iface_names
29
30class ApplicantsContainerExporter(grok.GlobalUtility, ExporterBase):
31    """The Applicants Container Exporter exports container data. It does not
32    export applicants (application records) inside the container.
33    """
34    grok.implements(ICSVExporter)
35    grok.name('applicantscontainers')
36
37    fields = tuple(sorted(iface_names(IApplicantsContainer)))
38    title = _(u'Applicants Containers')
39
40    def mangle_value(self, value, name, context=None):
41        return super(
42            ApplicantsContainerExporter, self).mangle_value(
43            value, name, context=context)
44
45    def export(self, containers, filepath=None):
46        """Export `containers`, an iterable, as CSV file.
47
48        If `filepath` is ``None``, a raw string with CSV data is returned.
49        """
50        writer, outfile = self.get_csv_writer(filepath)
51        for container in containers:
52            self.write_item(container, writer)
53        return self.close_outfile(filepath, outfile)
54
55    def export_all(self, site, filepath=None):
56        """Export applicantscontainer into filepath as CSV data.
57
58        If `filepath` is ``None``, a raw string with CSV data is returned.
59        """
60        writer, outfile = self.get_csv_writer(filepath)
61        containers = site.get('applicants', {})
62        return self.export(containers.values(), filepath)
63
64
65class ApplicantExporter(grok.GlobalUtility, ExporterBase):
66    """The Applicant Exporter exports application records (= applicants)
67    stored in the database. In contrast to the exporters in the academic
68    section this exporter does not iterate over the items of containers
69    but searches the :class:`ApplicantsCatalog` instead.
70
71    The exporter exports all applicants if started in the Data Center
72    which means in the context of the `DataCenter` object. The exporter can also
73    be started 'locally' which means in the context of an `ApplicantsContainer`
74    container. Then the :meth:`export_filtered()` instead of the
75    :meth:`export_all()` method is applied which searches for applicants
76    in the respective container.
77    """
78    grok.implements(ICSVExporter)
79    grok.name('applicants')
80
81    fields = tuple(sorted(IApplicantBaseData.names())) + ('container_code',)
82    title = _(u'Applicants')
83
84    def mangle_value(self, value, name, context=None):
85        """The mangler determines the codes of the atributes `course1`,
86        `course2` and `course_admitted`. It furthermore prepares the
87        history messages and adds a hash symbol at the end of the phone number
88        to avoid annoying automatic number transformation by Excel or Calc.
89        """
90        if name in (
91            'course1', 'course2', 'course_admitted') and value is not None:
92            value = value.code
93        #elif name == 'school_grades':
94        #    value = [eval(entry.to_string()) for entry in value]
95        elif name == 'history':
96            value = value.messages
97        elif name == 'phone' and value is not None:
98            # Append hash '#' to phone numbers to circumvent
99            # unwanted excel automatic
100            value = str('%s#' % value)
101        return super(
102            ApplicantExporter, self).mangle_value(
103            value, name, context=context)
104
105    def export(self, applicants, filepath=None):
106        """Export `applicants`, an iterable, as CSV file.
107        If `filepath` is ``None``, a raw string with CSV data is returned.
108        """
109        writer, outfile = self.get_csv_writer(filepath)
110        for applicant in applicants:
111            self.write_item(applicant, writer)
112        return self.close_outfile(filepath, outfile)
113
114    def export_all(self, site, filepath=None):
115        """Export all applicants into filepath as CSV data.
116        If `filepath` is ``None``, a raw string with CSV data is returned.
117        """
118        catalog = queryUtility(
119            ICatalog, context=site, name='applicants_catalog', default=None)
120        if catalog is None:
121            return self.export([], filepath)
122        applicants = catalog.searchResults(
123            # reg_num might not be set and then would not be found.
124            # We therefore search for applicant_id.
125            applicant_id=(None, None))
126        return self.export(applicants, filepath)
127
128    def export_filtered(self, site, filepath=None, **kw):
129        """Export filtered applicants in container denoted by keywords (`kw`).
130        If `filepath` is ``None``, a raw string with CSV data should
131        be returned.
132        """
133        container = grok.getSite()['applicants'][kw['container']]
134        return self.export(container.values(), filepath=filepath)
Note: See TracBrowser for help on using the repository browser.