Changeset 18021 for main/waeup.kofa
- Timestamp:
- 13 Feb 2025, 11:36:26 (9 hours ago)
- Location:
- main/waeup.kofa/trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
main/waeup.kofa/trunk/CHANGES.txt
r18001 r18021 4 4 1.8.2.dev0 (unreleased) 5 5 ======================= 6 7 * Implement payment ticket exporter with date range filter. 6 8 7 9 * Disable landing pages for transcript officers. -
main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser.py
r17992 r18021 1828 1828 pnav = 3 1829 1829 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): 1831 1832 if CREATE: 1832 1833 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)) 1833 1838 return 1834 1839 if DISCARD and job_id: … … 1882 1887 return 1883 1888 1889 1890 class 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 1884 1923 class ExportJobContainerDownload(ExportCSVView): 1885 """Page that downloads a students export csv file.1924 """Page that downloads an applicants export csv file. 1886 1925 1887 1926 """ -
main/waeup.kofa/trunk/src/waeup/kofa/applicants/browser_templates/exportjobsindex.pt
r13950 r18021 55 55 <form method="POST" i18n:domain="waeup.kofa"> 56 56 <input class="btn btn-primary" type="submit" name="CREATE" 57 value=" Start new exports"57 value="Export all data" 58 58 /> 59 59 </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 19 19 """ 20 20 import grok 21 from datetime import datetime, timedelta 21 22 from zope.catalog.interfaces import ICatalog 22 from zope.component import queryUtility 23 from zope.component import queryUtility, getUtility 23 24 from waeup.kofa.applicants.interfaces import ( 24 25 IApplicantBaseData, IApplicantsContainer, IApplicantOnlinePayment, 25 26 IApplicantRefereeReport, IApplicant) 26 from waeup.kofa.interfaces import ICSVExporter 27 from waeup.kofa.interfaces import ICSVExporter, IKofaUtils 27 28 from waeup.kofa.interfaces import MessageFactory as _ 28 29 from waeup.kofa.utils.batching import ExporterBase 29 from waeup.kofa.utils.helpers import iface_names 30 from waeup.kofa.utils.helpers import iface_names, to_timezone 30 31 31 32 class ApplicantsContainerExporter(grok.GlobalUtility, ExporterBase): … … 213 214 """ 214 215 container = grok.getSite()['applicants'][kw['container']] 216 p_start = kw.get('p_start') 217 p_end = kw.get('p_end') 215 218 container_values = container.values() 216 219 used = [value for value in container_values 217 220 if value.container_code.endswith('+')] 218 221 payments = [] 222 date_format = '%d/%m/%Y' 219 223 for applicant in used: 220 224 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 221 236 if payment.p_state == 'paid': 222 237 payments.append(payment) -
main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_browser.py
r17261 r18021 1702 1702 self.browser.open(container_path) 1703 1703 self.browser.getLink("Export application data").click() 1704 self.browser.getControl(" Start new exports").click()1704 self.browser.getControl("Export all data").click() 1705 1705 job_ids = self.wait_for_export_jobs_completed() 1706 1706 # Three exports were created … … 1782 1782 'zope.mgr - applicants.browser.ExportJobContainerOverview ' 1783 1783 '- 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 1784 1816 ) 1785 1817 -
main/waeup.kofa/trunk/src/waeup/kofa/applicants/tests/test_export.py
r17766 r18021 22 22 from waeup.kofa.testing import KofaUnitTestLayer, FunctionalLayer 23 23 from waeup.kofa.utils.utils import KofaUtils 24 25 curr_year = datetime.datetime.now().year 24 26 25 27 class ApplicantsContainersExporterTest(unittest.TestCase): … … 319 321 def test_export_filtered(self): 320 322 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) 321 326 exporter = ApplicantPaymentExporter() 322 327 exporter.export_filtered( 323 328 self.app, self.outfile, container=self.container.code) 324 329 result = open(self.outfile, 'rb').read() 325 cdate = str('%s#' % self.applicant['p120'].creation_date)326 330 self.assertEqual( 327 331 'ac,amount_auth,creation_date,p_category,p_combi,p_id,' 328 332 'p_item,p_session,p_state,payment_date,r_amount_approved,' 329 333 '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,' 331 356 '123456,Anna M. Tester\r\n' % cdate, result) 332 357 return
Note: See TracChangeset for help on using the changeset viewer.