r252485 - Products.EasyNewsletter/branches/bpi-rouet-2011-09/Products/EasyNewsletter/browser
"R??gis Rouet" <svn-changes-z4DKO/[email protected]>
| Newsgroups | gmane.comp.web.zope.plone.collective.cvs |
|---|---|
| Message-ID | <[email protected]> |
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):
------------------------------------------------------------------------------
See everything from the browser to the database with AppDynamics
Get end-to-end visibility with application monitoring from AppDynamics
Isolate bottlenecks and diagnose root cause in seconds.
Start your free trial of AppDynamics Pro today!
http://pubads.g.doubleclick.net/gampad/clk?id=48808831&iu=/4140/ostg.clktrk