Changeset 18021 for main/waeup.kofa


Ignore:
Timestamp:
13 Feb 2025, 11:36:26 (9 hours ago)
Author:
Henrik Bettermann
Message:

Implement payment ticket exporter with date range filter.

Location:
main/waeup.kofa/trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • main/waeup.kofa/trunk/CHANGES.txt

    r18001 r18021  
    441.8.2.dev0 (unreleased)
    55=======================
     6
     7* Implement payment ticket exporter with date range filter.
    68
    79* Disable landing pages for transcript officers.
  • main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py

    r17992 r18021  
    18281828    pnav = 3
    18291829
    1830     def update(self, CREATE=None, DISCARD=None, job_id=None):
     1830    def update(self, CREATE=None, CREATE_PAYMENTS=None, payments_start=None,
     1831               payments_end=None, DISCARD=None, job_id=None):
    18311832        if CREATE:
    18321833            self.redirect(self.url('@@start_export'))
     1834            return
     1835        if CREATE_PAYMENTS:
     1836            args = {'payments_start':payments_start, 'payments_end':payments_end}
     1837            self.redirect(self.url('@@start_export_payments') + '?%s' % urlencode(args))
    18331838            return
    18341839        if DISCARD and job_id:
     
    18821887        return
    18831888
     1889
     1890class PaymentsExportJobContainerJobStart(UtilityView, grok.View):
     1891    """View that starts only payment export jobs.
     1892    """
     1893    grok.context(VirtualApplicantsExportJobContainer)
     1894    grok.require('waeup.exportApplication')
     1895    grok.name('start_export_payments')
     1896
     1897    def update(self, payments_start=None, payments_end= None):
     1898        utils = queryUtility(IKofaUtils)
     1899        if not utils.expensive_actions_allowed():
     1900            self.flash(_(
     1901                "Currently, exporters cannot be started due to high "
     1902                "system load. Please try again later."), type='danger')
     1903            self.entries = doll_up(self, user=None)
     1904            return
     1905
     1906        ob_class = self.__implemented__.__name__.replace('waeup.kofa.','')
     1907        container_code = self.context.__parent__.code
     1908        job_id = self.context.start_export_job('applicantpayments',
     1909                                      self.request.principal.id,
     1910                                      container=container_code,
     1911                                      p_start=payments_start,
     1912                                      p_end=payments_end)
     1913        self.context.logger.info(
     1914            '%s - exported: %s (%s), job_id=%s'
     1915            % (ob_class, 'applicantpayments', container_code, job_id))
     1916        self.flash(_('Exports started.'))
     1917        self.redirect(self.url(self.context))
     1918        return
     1919
     1920    def render(self):
     1921        return
     1922
    18841923class ExportJobContainerDownload(ExportCSVView):
    1885     """Page that downloads a students export csv file.
     1924    """Page that downloads an applicants export csv file.
    18861925
    18871926    """
  • main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/exportjobsindex.pt

    r13950 r18021  
    5555<form method="POST" i18n:domain="waeup.kofa">
    5656  <input class="btn btn-primary" type="submit" name="CREATE"
    57          value="Start new exports"
     57         value="Export all data"
    5858          />
    5959</form>
     60<br />
     61<form method="POST" i18n:domain="waeup.kofa">
     62  <input class="btn btn-primary" type="submit" name="CREATE_PAYMENTS"
     63         value="Export payment data only"
     64          />
     65  from
     66  <input class="datepicker-le-year datepicker-short textType"
     67         name="payments_start" type="text" value="" />
     68  to <input class="datepicker-le-year datepicker-short textType"
     69         name="payments_end" type="text" value="" />
     70</form>
  • main/waeup.kofa/trunk/src/waeup/kofa/applicants/export.py

    r17760 r18021  
    1919"""
    2020import grok
     21from datetime import datetime, timedelta
    2122from zope.catalog.interfaces import ICatalog
    22 from zope.component import queryUtility
     23from zope.component import queryUtility, getUtility
    2324from waeup.kofa.applicants.interfaces import (
    2425    IApplicantBaseData, IApplicantsContainer, IApplicantOnlinePayment,
    2526    IApplicantRefereeReport, IApplicant)
    26 from waeup.kofa.interfaces import ICSVExporter
     27from waeup.kofa.interfaces import ICSVExporter, IKofaUtils
    2728from waeup.kofa.interfaces import MessageFactory as _
    2829from waeup.kofa.utils.batching import ExporterBase
    29 from waeup.kofa.utils.helpers import iface_names
     30from waeup.kofa.utils.helpers import iface_names, to_timezone
    3031
    3132class ApplicantsContainerExporter(grok.GlobalUtility, ExporterBase):
     
    213214        """
    214215        container = grok.getSite()['applicants'][kw['container']]
     216        p_start = kw.get('p_start')
     217        p_end = kw.get('p_end')
    215218        container_values = container.values()
    216219        used = [value for value in container_values
    217220                if value.container_code.endswith('+')]
    218221        payments = []
     222        date_format = '%d/%m/%Y'
    219223        for applicant in used:
    220224            for payment in applicant.payments:
     225                if p_start and p_end:
     226                    if not payment.payment_date:
     227                        continue
     228                    payments_start = datetime.strptime(p_start, date_format)
     229                    payments_end = datetime.strptime(p_end, date_format)
     230                    tz = getUtility(IKofaUtils).tzinfo
     231                    payments_start = tz.localize(payments_start)
     232                    payments_end = tz.localize(payments_end) + timedelta(days=1)
     233                    payment_date = to_timezone(payment.payment_date, tz)
     234                    if payment_date < payments_start or payment_date > payments_end:
     235                        continue
    221236                if payment.p_state == 'paid':
    222237                    payments.append(payment)
  • main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py

    r17261 r18021  
    17021702        self.browser.open(container_path)
    17031703        self.browser.getLink("Export application data").click()
    1704         self.browser.getControl("Start new exports").click()
     1704        self.browser.getControl("Export all data").click()
    17051705        job_ids = self.wait_for_export_jobs_completed()
    17061706        # Three exports were created
     
    17821782            'zope.mgr - applicants.browser.ExportJobContainerOverview '
    17831783            '- discarded: job_id=%s' % job_ids[2] in logcontent
     1784            )
     1785
     1786    def test_payments_in_container_export(self):
     1787        self.browser.addHeader('Authorization', 'Basic mgr:mgrpw')
     1788        container_path = 'http://localhost/app/applicants/%s' % container_name_1
     1789        self.browser.open(container_path)
     1790        self.browser.getLink("Export application data").click()
     1791        self.browser.getControl("Export payment data only").click()
     1792        job_ids = self.wait_for_export_jobs_completed()
     1793        # Three exports were created
     1794        self.assertEqual(len(self.app['datacenter'].running_exports), 1)
     1795       # When the job is finished and we reload the page...
     1796        self.browser.open(container_path + '/exports')
     1797        self.browser.getLink("Download", index=0).click()
     1798        self.assertEqual(self.browser.headers['content-type'],
     1799            'text/csv; charset=UTF-8')
     1800        self.assertTrue(
     1801            'filename="WAeUP.Kofa_applicantpayments_%s.csv' % job_ids[0] in
     1802            self.browser.headers['content-disposition'])
     1803        # Creation and downloading was logged
     1804        logfile = os.path.join(
     1805            self.app['datacenter'].storage, 'logs', 'datacenter.log')
     1806        logcontent = open(logfile).read()
     1807        self.assertTrue(
     1808            'zope.mgr - applicants.browser.PaymentsExportJobContainerJobStart - '
     1809            'exported: applicantpayments (%s), job_id=%s'
     1810            % (container_name_1, job_ids[0]) in logcontent
     1811            )
     1812        self.assertTrue(
     1813            'zope.mgr - applicants.browser.ExportJobContainerDownload - '
     1814            'downloaded: WAeUP.Kofa_applicantpayments_%s.csv, job_id=%s'
     1815            % (job_ids[0], job_ids[0]) in logcontent
    17841816            )
    17851817
  • main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_export.py

    r17766 r18021  
    2222from waeup.kofa.testing import KofaUnitTestLayer, FunctionalLayer
    2323from waeup.kofa.utils.utils import KofaUtils
     24
     25curr_year = datetime.datetime.now().year
    2426
    2527class ApplicantsContainersExporterTest(unittest.TestCase):
     
    319321    def test_export_filtered(self):
    320322        self.applicant = self.setup_applicant(self.applicant)
     323        cdate = str('%s#' % self.applicant['p120'].creation_date)
     324        self.applicant['p120'].payment_date = datetime.datetime(
     325            curr_year-6, 4, 1, 14, 12, 1)
    321326        exporter = ApplicantPaymentExporter()
    322327        exporter.export_filtered(
    323328            self.app, self.outfile, container=self.container.code)
    324329        result = open(self.outfile, 'rb').read()
    325         cdate = str('%s#' % self.applicant['p120'].creation_date)
    326330        self.assertEqual(
    327331            'ac,amount_auth,creation_date,p_category,p_combi,p_id,'
    328332            'p_item,p_session,p_state,payment_date,r_amount_approved,'
    329333            'r_code,r_desc,applicant_id,reg_number,display_fullname\r\n'
    330             ',0.0,%s,application,[],p120,,2012,paid,,0.0,,,dp2011_654321,'
     334            ',0.0,%s,application,[],p120,,2012,paid,2019-04-01 14:12:01#,0.0,'
     335            ',,dp2011_654321,'
     336            '123456,Anna M. Tester\r\n' % cdate, result)
     337        exporter.export_filtered(
     338            self.app, self.outfile, container=self.container.code,
     339            p_start='03/02/2025', p_end='04/02/2025')
     340        result = open(self.outfile, 'rb').read()
     341        self.assertEqual(
     342            'ac,amount_auth,creation_date,p_category,p_combi,p_id,'
     343            'p_item,p_session,p_state,payment_date,r_amount_approved,'
     344            'r_code,r_desc,applicant_id,reg_number,display_fullname\r\n',
     345            result)
     346        exporter.export_filtered(
     347            self.app, self.outfile, container=self.container.code,
     348            p_start='03/02/2019', p_end='04/05/2019')
     349        result = open(self.outfile, 'rb').read()
     350        self.assertEqual(
     351            'ac,amount_auth,creation_date,p_category,p_combi,p_id,'
     352            'p_item,p_session,p_state,payment_date,r_amount_approved,'
     353            'r_code,r_desc,applicant_id,reg_number,display_fullname\r\n'
     354            ',0.0,%s,application,[],p120,,2012,paid,2019-04-01 14:12:01#,0.0,'
     355            ',,dp2011_654321,'
    331356            '123456,Anna M. Tester\r\n' % cdate, result)
    332357        return
Note: See TracChangeset for help on using the changeset viewer.