From f18dd36065cead823d0ec22c68c42c340eeddda8 Mon Sep 17 00:00:00 2001
From: Inso <insomniak.fr@gmail.com>
Date: Fri, 8 May 2015 20:41:22 +0200
Subject: [PATCH] Handle unpublished uid

---
 res/ui/community_tab.ui                   |  7 +++++++
 src/cutecoin/core/account.py              | 11 +++++++++++
 src/cutecoin/core/person.py               | 24 +++++++++++++++++++++++
 src/cutecoin/core/watching/persons.py     |  6 ++++--
 src/cutecoin/gui/community_tab.py         | 21 ++++++++++++++++----
 src/cutecoin/gui/process_cfg_community.py |  3 ---
 6 files changed, 63 insertions(+), 9 deletions(-)

diff --git a/res/ui/community_tab.ui b/res/ui/community_tab.ui
index 9b000559..c7fa18c7 100644
--- a/res/ui/community_tab.ui
+++ b/res/ui/community_tab.ui
@@ -119,6 +119,13 @@
              </property>
             </widget>
            </item>
+           <item>
+            <widget class="QPushButton" name="button_publish_uid">
+             <property name="text">
+              <string>Publish UID</string>
+             </property>
+            </widget>
+           </item>
            <item>
             <widget class="QPushButton" name="button_membership">
              <property name="text">
diff --git a/src/cutecoin/core/account.py b/src/cutecoin/core/account.py
index c0cf310b..c102d759 100644
--- a/src/cutecoin/core/account.py
+++ b/src/cutecoin/core/account.py
@@ -275,6 +275,16 @@ class Account(QObject):
             value += w.value(community)
         return value
 
+    def published_uid(self, community):
+        '''
+        Check if this account identity is a member of a community
+
+        :param community: The target community of this request
+        :return: True if the account is a member of the target community
+        '''
+        self_person = Person.lookup(self.pubkey, community)
+        return self_person.published_uid(community)
+
     def member_of(self, community):
         '''
         Check if this account identity is a member of a community
@@ -283,6 +293,7 @@ class Account(QObject):
         :return: True if the account is a member of the target community
         '''
         self_person = Person.lookup(self.pubkey, community)
+        logging.debug("Self person : {0}".format(self_person.uid))
         return self_person.is_member(community)
 
     def send_selfcert(self, password, community):
diff --git a/src/cutecoin/core/person.py b/src/cutecoin/core/person.py
index 4e66d309..4a45013f 100644
--- a/src/cutecoin/core/person.py
+++ b/src/cutecoin/core/person.py
@@ -259,6 +259,30 @@ class Person(object):
 
         return membership_data
 
+    @cached
+    def published_uid(self, community):
+        try:
+            data = community.request(bma.wot.Lookup,
+                                     req_args={'search': self.pubkey},
+                                     cached=cached)
+        except ValueError as e:
+            if '404' in str(e):
+                return False
+
+        timestamp = 0
+
+        for result in data['results']:
+            if result["pubkey"] == self.pubkey:
+                uids = result['uids']
+                person_uid = ""
+                for uid_data in uids:
+                    if uid_data["meta"]["timestamp"] > timestamp:
+                        timestamp = uid_data["meta"]["timestamp"]
+                        person_uid = uid_data["uid"]
+                    if person_uid == self.uid:
+                        return True
+        return False
+
     @cached
     def is_member(self, community):
         '''
diff --git a/src/cutecoin/core/watching/persons.py b/src/cutecoin/core/watching/persons.py
index 5d8214cf..6311acd5 100644
--- a/src/cutecoin/core/watching/persons.py
+++ b/src/cutecoin/core/watching/persons.py
@@ -24,12 +24,14 @@ class PersonsWatcher(Watcher):
 
     def watch(self):
         logging.debug("Watching persons")
-        for p in Person._instances.values():
+        instances = Person._instances.copy()
+        for p in instances.values():
             if not self.exiting:
                 for func in [Person.membership,
                              Person.is_member,
                              Person.certifiers_of,
-                             Person.certified_by]:
+                             Person.certified_by,
+                             Person.published_uid]:
                     if not self.exiting:
                         if p.reload(func, self.community):
                             logging.debug("Change detected on {0} about {1}".format(p.pubkey,
diff --git a/src/cutecoin/gui/community_tab.py b/src/cutecoin/gui/community_tab.py
index ea57c499..2def3e5d 100644
--- a/src/cutecoin/gui/community_tab.py
+++ b/src/cutecoin/gui/community_tab.py
@@ -52,11 +52,24 @@ class CommunityTabWidget(QWidget, Ui_CommunityTabWidget):
         self.table_identities.customContextMenuRequested.connect(self.identity_context_menu)
         self.table_identities.sortByColumn(0, Qt.AscendingOrder)
 
-        if self.account.member_of(self.community):
-            self.button_membership.setText("Renew membership")
-        else:
-            self.button_membership.setText("Send membership demand")
+        try:
+            if self.account.published_uid(self.community):
+                if self.account.member_of(self.community):
+                    self.button_membership.setText("Renew membership")
+                    self.button_publish_uid.hide()
+                    self.button_leaving.show()
+                else:
+                    self.button_membership.setText("Send membership demand")
+                    self.button_leaving.hide()
+                    self.button_publish_uid.hide()
+            else:
+                self.button_membership.hide()
+                self.button_leaving.hide()
+                self.button_publish_uid.show()
+        except PersonNotFoundError:
+            self.button_membership.hide()
             self.button_leaving.hide()
+            self.button_publish_uid.show()
 
         self.wot_tab = WotTabWidget(app, account, community, password_asker, self)
         self.tabs_information.addTab(self.wot_tab, QIcon(':/icons/wot_icon'), "WoT")
diff --git a/src/cutecoin/gui/process_cfg_community.py b/src/cutecoin/gui/process_cfg_community.py
index 4b9c6707..037334f8 100644
--- a/src/cutecoin/gui/process_cfg_community.py
+++ b/src/cutecoin/gui/process_cfg_community.py
@@ -217,9 +217,6 @@ Would you like to publish the key ?""").format(self.account.pubkey))
                                          "{0}".format(e),
                                          QMessageBox.Ok)
 
-            else:
-                return
-
         if self.community not in self.account.communities:
             self.account.add_community(self.community)
         super().accept()
-- 
GitLab