From: Régis R. <svn...@pl...> - 2013-07-10 16:48:18
|
Author: regisrouet Date: Wed Jul 10 16:48:24 2013 New Revision: 252485 Modified: Products.EasyNewsletter/branches/bpi-rouet-2011-09/Products/EasyNewsletter/browser/configure.zcml Products.EasyNewsletter/branches/bpi-rouet-2011-09/Products/EasyNewsletter/browser/enl_subscribers_view.pt Products.EasyNewsletter/branches/bpi-rouet-2011-09/Products/EasyNewsletter/browser/subscribers.py Log: new feature : delete subscribers from csv Modified: Products.EasyNewsletter/branches/bpi-rouet-2011-09/Products/EasyNewsletter/browser/configure.zcml ============================================================================== --- Products.EasyNewsletter/branches/bpi-rouet-2011-09/Products/EasyNewsletter/browser/configure.zcml (original) +++ Products.EasyNewsletter/branches/bpi-rouet-2011-09/Products/EasyNewsletter/browser/configure.zcml Wed Jul 10 16:48:24 2013 @@ -106,6 +106,13 @@ <browser:page for="..interfaces.IEasyNewsletter" + name="delete_csv" + class=".subscribers.DeleteCSV" + template="delete_csv.pt" + permission="cmf.ReviewPortalContent" /> + + <browser:page + for="..interfaces.IEasyNewsletter" name="download_csv" class=".subscribers.DownloadCSV" permission="cmf.ReviewPortalContent" /> Modified: Products.EasyNewsletter/branches/bpi-rouet-2011-09/Products/EasyNewsletter/browser/enl_subscribers_view.pt ============================================================================== --- Products.EasyNewsletter/branches/bpi-rouet-2011-09/Products/EasyNewsletter/browser/enl_subscribers_view.pt (original) +++ Products.EasyNewsletter/branches/bpi-rouet-2011-09/Products/EasyNewsletter/browser/enl_subscribers_view.pt Wed Jul 10 16:48:24 2013 @@ -82,6 +82,12 @@ <p> <a href="" + tal:attributes="href string:${context/absolute_url}/@@delete_csv" + i18n:translate="easynewsletter_label_delete_subscribers">Mass delete subscribers</a> + </p> + + <p> + <a href="" tal:attributes="href string:${context/absolute_url}/@@download_csv" i18n:translate="easynewsletter_label_export_subscribers">Export subscribers</a> </p> Modified: Products.EasyNewsletter/branches/bpi-rouet-2011-09/Products/EasyNewsletter/browser/subscribers.py ============================================================================== --- Products.EasyNewsletter/branches/bpi-rouet-2011-09/Products/EasyNewsletter/browser/subscribers.py (original) +++ Products.EasyNewsletter/branches/bpi-rouet-2011-09/Products/EasyNewsletter/browser/subscribers.py Wed Jul 10 16:48:24 2013 @@ -179,6 +179,87 @@ return {'success': success, 'fail': fail} +class DeleteCSV(BrowserView): + + def __init__(self, context, request): + self.context = context + self.request = request + + def delete_subscribers(self, csv_data=None): + """Delete newsletter subscribers from uploaded CSV file. + """ + + # Do nothing if no submit button was hit + if 'form.button.Delete' not in self.request.form: + return + + context = aq_inner(self.context) + plone_utils = getToolByName(context, 'plone_utils') + catalog = getToolByName(context, 'portal_catalog') + path='/'.join(context.getPhysicalPath()) + success = 0 + fail = [] + count = 0 + + # Show error if no file was specified + filename = self.request.form.get('csv_upload', None) + if not filename: + msg = _('No file specified.') + IStatusMessage(self.request).addStatusMessage(msg, type='error') + return self.request.response.redirect(context.absolute_url() + '/@@delete_csv') + + # Show error if no data has been provided in the file + reader = csv.reader(filename) + header = reader.next() + if header != CSV_HEADER: + msg = _('Wrong specification of the CSV file. Please correct it and retry.') + IStatusMessage(self.request).addStatusMessage(msg, type='error') + return self.request.response.redirect(context.absolute_url() + '/@@delete_csv') + + for subscriber in reader: + # Check the length of the line + if len(subscriber) != 4: + msg = _('The number of items in the line is not correct. \ + It should be 4. Check your CSV file.') + fail.append( + {'failure': msg}) + else: + salutation = subscriber[0] + fullname = subscriber[1] + email = subscriber[2] + organization = subscriber[3] + sub_id = None + for brain in catalog(portal_type = 'ENLSubscriber', + path=path, + email=email): + sub_id = brain.id + if sub_id is None: + msg = _('This email address is not registered.') + fail.append( + {'salutation': salutation, + 'fullname': fullname, + 'email': email, + 'organization': organization, + 'failure': msg}) + else: + try: + context.manage_delObjects(sub_id) + success += 1 + except Exception, e: + fail.append( + {'salutation': salutation, + 'fullname': fullname, + 'email': email, + 'organization': organization, + 'failure': 'An error occured while deleting this subscriber: %s' % str(e)}) + count += 1 + if count%100 == 0: + logger.info("done %5d lines", count) + + logger.info("Delete of %d lines completed", count) + return {'success': success, 'fail': fail} + + class DownloadCSV(BrowserView): def __call__(self): |