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
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.