[silva.app.news][Emiliano D'Alterio] Fixed renaming bug. Replace...

[email protected] Fri, 15 Nov 2013 14:04:10 +0100
Newsgroups gmane.comp.web.zope.silva.cvs
Message-ID <[email protected]>
author:    Emiliano D'Alterio
date:      Fri Nov 15 14:03:55 2013 +0100
revision:  2043:bdc6fa33da6b in silva.app.news
branch:    2.4
details:   https://hg.infrae.com/silva.app.news?cmd=changeset;node=bdc6fa33da6b
modified:  src/silva/app/news/ServiceNews.py src/silva/app/news/ServiceNews_templates/manageservicenews.pt
added:     
removed:   
log:       Fixed renaming bug. Replaced renaming methods.


diffstat:

 src/silva/app/news/ServiceNews.py                             |  153 ++++++---
 src/silva/app/news/ServiceNews_templates/manageservicenews.pt |    8 +-
 2 files changed, 100 insertions(+), 61 deletions(-)

diffs (216 lines):

diff -r bd8300f53207 -r bdc6fa33da6b src/silva/app/news/ServiceNews.py
--- a/src/silva/app/news/ServiceNews.py	Tue Nov 12 19:36:40 2013 +0100
+++ b/src/silva/app/news/ServiceNews.py	Fri Nov 15 14:03:55 2013 +0100
@@ -280,8 +280,8 @@
                         'manage_add_target_audience',
                         'manage_remove_target_audience',
                         'manage_rename_start',
-                        'manage_rename_subjects',
-                        'manage_rename_target_audiences',
+                        'manage_rename_subject',
+                        'manage_rename_target_audience',
                         'manage_set_locale']:
             if action in self.request:
                 getattr(self, action)()
@@ -406,63 +406,103 @@
 
         self.status ='Target audiences %s removed' % ', '.join(tas)
 
-    def manage_rename_start(self):
-        """Rename one or more items"""
-        if (not self.request.has_key('subjects') and not
-                self.request.has_key('target_audiences')):
-            self.status ='No items selected to rename'
+    def manage_rename_subject(self):
+        """Rename a subject"""
+        if not self.request.has_key('subjects'):
+            self.status ='No subject specified.'
             return
-        return self.manage_rename_view()
 
-    def manage_rename_subjects(self):
-        """Rename subjects"""
-        illegal = []
-        for name, value in self.request.form.items():
-            if name.startswith('title_'):
-                continue
-            uname = unicode(name, 'UTF-8')
-            uvalue = unicode(value, 'UTF-8')
-            subject = self.context._subjects.get_element(uname)
-            if uvalue != subject.id():
-                try:
-                    subject.set_id(uvalue)
-                except Tree.DuplicateIdError:
-                    illegal.append(uvalue)
-                    continue
-            title = unicode(self.request.form['title_%s' % name], 'UTF-8')
-            subject.set_title(title)
-            self.context._p_changed = 1
-        if illegal:
-            self.status = \
-                'Items %s could not be renamed (name already in use).' % (
-                ', '.join(illegal))
-        else:
-            self.status ='Items renamed'
+        items = [unicode(s, 'UTF-8') for s in self.request['subjects']]
+        if len(items) != 1:
+            self.status ='Please select one subject only.'
+            return
 
-    def manage_rename_target_audiences(self):
-        """Rename target audiences"""
-        illegal = []
-        for name, value in self.request.form.items():
-            if name.startswith('title_'):
-                continue
-            uname = unicode(name, 'UTF-8')
-            uvalue = unicode(value, 'UTF-8')
-            audience = self.context._target_audiences.getElement(uname)
-            if uvalue != audience.id():
-                try:
-                    audience.set_id(uvalue)
-                except Tree.DuplicateIdError:
-                    illegal.append(uvalue)
-                    continue
-            title = unicode(self.request.form['title_%s' % name], 'UTF-8')
-            audience.set_title(title)
-            self.context._p_changed = 1
-        if illegal:
-            self.status = \
-                'Items %s could not be renamed (name already in use).' % (
-                ', '.join(illegal))
-        else:
-            self.status ='Items renamed'
+        if ('subject' not in self.request.form or
+            'title' not in self.request.form or
+                self.request['subject'] == '' or self.request['title'] == ''):
+            self.status ='Missing id or title'
+            return
+
+        try:
+            item = self.context._subjects.get_element(items[0])
+        except KeyError:
+            self.status ='Impossible to rename: subject not found.'
+            return
+
+        item_old_id = item.id()
+        item_old_title = item.title()
+
+        item_new_id = unicode(self.request['subject'], 'UTF-8')
+        item_new_title = unicode(self.request['title'], 'UTF-8')
+
+        changed = 0
+        if item_new_id != item_old_id:
+            try:
+                item.set_id(item_new_id)
+                changed = 1
+            except Tree.DuplicateIdError:
+                self.status ='Impossible to rename: ID already in use.'
+                return
+
+        if item_new_title != item_old_title:
+            item.set_title(item_new_title)
+            changed = 1
+
+        if not changed:
+            self.status ='Nothing to rename. Both Id and Title are equal to the old ones.'
+            return
+
+        self.context._p_changed = changed
+        self.status ='Subject renamed.'
+
+    def manage_rename_target_audience(self):
+        """Rename target audience"""
+        if not self.request.has_key('target_audiences'):
+            self.status ='No target audience specified'
+            return
+
+        items = [unicode(t, 'UTF-8') for t in self.request['target_audiences']]
+        if len(items) != 1:
+            self.status ='Please select one target audience only.'
+            return
+
+        if ('target_audience' not in self.request.form or
+            'title' not in self.request.form or
+                self.request['target_audience'] == '' or self.request['title'] == ''):
+            self.status ='Missing id or title'
+            return
+
+        try:
+            item = self.context._target_audiences.get_element(items[0])
+        except KeyError:
+            self.status ='Impossible to rename: target audience not found.'
+            return
+
+        item_old_id = item.id()
+        item_old_title = item.title()
+
+        item_new_id = unicode(self.request['target_audience'], 'UTF-8')
+        item_new_title = unicode(self.request['title'], 'UTF-8')
+
+        changed = 0
+        if item_new_id != item_old_id:
+            try:
+                item.set_id(item_new_id)
+                changed = 1
+            except Tree.DuplicateIdError:
+                self.status ='Impossible to rename: ID already in use.'
+                return
+
+        if item_new_title != item_old_title:
+            item.set_title(item_new_title)
+            changed = 1
+
+        if not changed:
+            self.status ='Nothing to rename. Both Id and Title are equal to the old ones.'
+            return
+
+        self.context._p_changed = changed
+        self.status ='Target audience renamed.'
 
     # XXX we probably want to move these elsewhere, for now however this seems
     # the most logical location
@@ -487,4 +527,3 @@
         self.context.set_timezone_name(self.request['timezone_name'])
         self.context.set_first_weekday(int(self.request['first_weekday']))
         self.status ='Locale set'
-
diff -r bd8300f53207 -r bdc6fa33da6b src/silva/app/news/ServiceNews_templates/manageservicenews.pt
--- a/src/silva/app/news/ServiceNews_templates/manageservicenews.pt	Tue Nov 12 19:36:40 2013 +0100
+++ b/src/silva/app/news/ServiceNews_templates/manageservicenews.pt	Fri Nov 15 14:03:55 2013 +0100
@@ -31,8 +31,6 @@
                     <span tal:replace="structure python: depth * 3 * u'&nbsp'" /><span tal:content="subject" class="form-text"></span>&nbsp;-&nbsp;<span tal:content="title" class="form-text" /><br />
                 </tal:define>
               </tal:repeat>
-              <input type="submit" name="manage_rename_start"
-                     value="Rename subject(s)" class="form-element">
                 <input type="submit" name="manage_remove_subject"
                        value="Remove subject(s)" class="form-element">
                   <br /><br />
@@ -54,6 +52,8 @@
                       <div class="form-text">or upload tree:</div>
                       <input type="file" name="subjects_json"><br />
                       <input type="submit" value="Add" name="manage_add_subject" class="form-element">
+				              <input type="submit" name="manage_rename_subject"
+												     value="Rename subject" class="form-element">
             </form>
             <form method="POST" action="#"
                   tal:attributes="action string:${context/@@absolute_url}/manage_tree">
@@ -74,8 +74,6 @@
                     <span tal:replace="structure python: depth * 3 * u'&nbsp'" /><span tal:content="target_audience" class="form-text"></span>&nbsp;-&nbsp;<span tal:content="title" class="form-text" /><br />
                 </tal:define>
               </tal:repeat>
-              <input type="submit" name="manage_rename_start"
-                     value="Rename target audience(s)" class="form-element">
                 <input type="submit" name="manage_remove_target_audience"
                        value="Remove target audience(s)" class="form-element">
                   <br /><br />
@@ -97,6 +95,8 @@
                       <input type="file" name="target_audiences_json"><br />
                       <input type="submit" name="manage_add_target_audience"
                              value="Add" class="form-element">
+			                <input type="submit" name="manage_rename_target_audience"
+			                       value="Rename target audience" class="form-element">
             </form>
             <form method="POST" action="#"
                   tal:attributes="action string:${context/@@absolute_url}/manage_tree">