diff browser_side/panels.py @ 365:a74a2dfbe4f5

browser_side: groupblog: handle main items with no associated comments node + do not mix up attributes names between the item own service/node and the comments service/node
author souliane <souliane@mailoo.org>
date Thu, 20 Feb 2014 19:33:31 +0100
parents 019e1e706e74
children 39ae5bf92786
line wrap: on
line diff
--- a/browser_side/panels.py	Wed Feb 19 17:52:39 2014 +0100
+++ b/browser_side/panels.py	Thu Feb 20 19:33:31 2014 +0100
@@ -366,22 +366,12 @@
         self.content_xhtml = data.get('content_xhtml', '')
         self.author = data['author']
         self.updated = float(data.get('updated', 0))  # XXX: int doesn't work here
-        try:
-            self.published = float(data['published'])  # XXX: int doesn't work here
-        except KeyError:
-            self.published = self.updated
+        self.published = float(data.get('published', self.updated))  # XXX: int doesn't work here
+        self.service = data.get('service', '')
+        self.node = data.get('node', '')
         self.comments = data.get('comments', False)
-        if self.empty and self.type == 'main_item':
-            self.service = self.node = None
-            self.hash = (self.service, self.node)
-        else:
-            try:
-                self.service = data['comments_service'] if self.comments else data['service']
-                self.node = data['comments_node'] if self.comments else data['node']
-                self.hash = (self.service, self.node)
-            except KeyError:
-                print "Warning: can't manage item [%s] some keys are missing in microblog data (%s)" % (self.id, str(data))
-                self.comments = False
+        self.comments_service = data.get('comments_service', '')
+        self.comments_node = data.get('comments_node', '')
 
 
 class MicroblogEntry(SimplePanel, ClickHandler, FocusHandler, KeyboardHandler):
@@ -393,7 +383,8 @@
         """
         self._base_item = data if isinstance(data, MicroblogItem) else MicroblogItem(data)
         for attr in ['id', 'type', 'empty', 'title', 'title_xhtml', 'content', 'content_xhtml',
-                     'author', 'updated', 'published', 'comments', 'service', 'node', 'hash']:
+                     'author', 'updated', 'published', 'comments', 'service', 'node',
+                     'comments_service', 'comments_node']:
             getter = lambda attr: lambda inst: getattr(inst._base_item, attr)
             setattr(MicroblogEntry, attr, property(getter(attr)))
 
@@ -424,7 +415,7 @@
         ClickHandler.__init__(self)
         self.addClickListener(self)
 
-        self.pub_data = (self.hash[0], self.hash[1], self.id)
+        self.__pub_data = (self.service, self.node, self.id)
         self.__setContent()
 
     def __setContent(self):
@@ -501,7 +492,7 @@
             else:
                 self._blog_panel.host.bridge.call('sendMblogComment', None, self._parent_entry.comments, content['text'], extra)
         else:
-            self._blog_panel.host.bridge.call('updateMblog', None, self.pub_data, self.comments, content['text'], extra)
+            self._blog_panel.host.bridge.call('updateMblog', None, self.__pub_data, self.comments, content['text'], extra)
         return True
 
     def __afterEditCb(self, content):
@@ -543,7 +534,7 @@
         @return: False if the deletion has been cancelled."""
         def confirm_cb(answer):
             if answer:
-                self._blog_panel.host.bridge.call('deleteMblog', None, self.pub_data, self.comments)
+                self._blog_panel.host.bridge.call('deleteMblog', None, self.__pub_data, self.comments)
             else:  # restore the text if it has been emptied during the edition
                 self.bubble.setContent(self.bubble._original_content)
 
@@ -567,10 +558,13 @@
                 'new': True,
                 'type': 'comment',
                 'author': self._blog_panel.host.whoami.bare,
-                'service': self.service,
-                'node': self.node
+                'service': self.comments_service,
+                'node': self.comments_node
                 }
         entry = self._blog_panel.addEntry(data)
+        if entry is None:
+            print "The entry of id %s can not be commented" % self.id
+            return
         entry._parent_entry = self
         self._current_comment = entry
         entry.bubble.edit(True)
@@ -678,10 +672,10 @@
     def onTextEntered(self, text):
         if self.selected_entry:
             # we are entering a comment
-            comments_node = self.selected_entry.comments
-            if not comments_node:
-                raise Exception("ERROR: comments node is empty")
-            target = ("COMMENT", comments_node)
+            comments_url = self.selected_entry.comments
+            if not comments_url:
+                raise Exception("ERROR: the comments URL is empty")
+            target = ("COMMENT", comments_url)
         elif not self._accepted_groups:
             # we are entering a public microblog
             target = ("PUBLIC", None)
@@ -754,10 +748,11 @@
         """
         _entry = MicroblogEntry(self, data)
         if _entry.type == "comment":
-            if not _entry.hash in self.comments:
+            comments_hash = (_entry.service, _entry.node)
+            if not comments_hash in self.comments:
                 # The comments node is not known in this panel
                 return None
-            parent = self.comments[_entry.hash]
+            parent = self.comments[comments_hash]
             parent_idx = self.vpanel.getWidgetIndex(parent)
             # we find or create the panel where the comment must be inserted
             try:
@@ -771,7 +766,7 @@
                 self.vpanel.insert(sub_panel, parent_idx + 1)
             for idx in xrange(0, len(sub_panel.getChildren())):
                 comment = sub_panel.getIndexedChild(idx)
-                if comment.pub_data[2] == _entry.id:
+                if comment.id == _entry.id:
                     # update an existing comment
                     sub_panel.remove(comment)
                     sub_panel.insert(_entry, idx)
@@ -789,9 +784,10 @@
         self.entries[_entry.id] = _entry
 
         if _entry.comments:
-            # entry has comments, we keep the comment node as a reference
-            self.comments[_entry.hash] = _entry
-            self.host.bridge.call('getMblogComments', self.mblogsInsert, _entry.service, _entry.node)
+            # entry has comments, we keep the comments service/node as a reference
+            comments_hash = (_entry.comments_service, _entry.comments_node)
+            self.comments[comments_hash] = _entry
+            self.host.bridge.call('getMblogComments', self.mblogsInsert, _entry.comments_service, _entry.comments_node)
 
         return _entry
 
@@ -802,7 +798,7 @@
         """
         for child in self.vpanel.getChildren():
             if isinstance(child, MicroblogEntry) and type_ == 'main_item':
-                if child.pub_data[2] == id_:
+                if child.id == id_:
                     main_idx = self.vpanel.getWidgetIndex(child)
                     try:
                         sub_panel = self.vpanel.getWidget(main_idx + 1)
@@ -815,7 +811,7 @@
                     break
             elif isinstance(child, VerticalPanel) and type_ == 'comment':
                 for comment in child.getChildren():
-                    if comment.pub_data[2] == id_:
+                    if comment.id == id_:
                         comment.removeFromParent()
                         self.selected_entry = None
                         break