From 4bbc417081c2c942ba317cf9407666b54055aed6 Mon Sep 17 00:00:00 2001
From: Inso <insomniak.fr@gmail.com>
Date: Sat, 8 Feb 2014 16:02:46 +0100
Subject: [PATCH] Ajout d'un compte et listing des wallets

---
 Makefile                                      |  4 +-
 res/ui/communityTabWidget.ui                  | 49 ++++++++++++++++++
 res/ui/mainwindow.ui                          | 50 ++-----------------
 src/cutecoin/core/__init__.py                 |  2 +-
 src/cutecoin/core/appData.py                  |  9 ++--
 src/cutecoin/gui/addAccountDialog.py          |  2 +-
 src/cutecoin/gui/addCommunityDialog.py        |  7 +--
 src/cutecoin/gui/mainWindow.py                | 16 ++++--
 src/cutecoin/models/account/__init__.py       | 25 +++++++---
 .../models/account/communities/__init__.py    |  9 +++-
 .../models/account/wallets/__init__.py        | 15 ++++++
 .../models/account/wallets/listModel.py       | 30 +++++++++++
 src/cutecoin/models/coin/__init__.py          | 25 +++++++++-
 src/cutecoin/models/community/__init__.py     |  4 ++
 src/cutecoin/models/node/__init__.py          |  5 ++
 src/cutecoin/models/wallet/__init__.py        | 29 ++++++++++-
 src/cutecoin/models/wallet/listModel.py       | 30 +++++++++++
 17 files changed, 240 insertions(+), 71 deletions(-)
 create mode 100644 res/ui/communityTabWidget.ui
 create mode 100644 src/cutecoin/models/account/wallets/listModel.py
 create mode 100644 src/cutecoin/models/wallet/listModel.py

diff --git a/Makefile b/Makefile
index 1a3b7868..15d694eb 100644
--- a/Makefile
+++ b/Makefile
@@ -6,7 +6,7 @@ RESOURCE_DIR = res/ui
 COMPILED_DIR = src/cutecoin/gen_resources
  
 #UI files to compile
-UI_FILES = mainwindow.ui addAccountDialog.ui addCommunityDialog.ui
+UI_FILES = mainwindow.ui addAccountDialog.ui addCommunityDialog.ui communityTabWidget.ui
 #Qt resource files to compile
 RESOURCES = 
  
@@ -33,4 +33,4 @@ $(COMPILED_DIR)/%_rc.py : $(RESOURCE_DIR)/%.qrc
 	$(PYRCC) $< -o $@
  
 clean : 
-	$(RM) $(COMPILED_UI) $(COMPILED_RESOURCES) $(COMPILED_UI:.py=.pyc) $(COMPILED_RESOURCES:.py=.pyc)  
\ No newline at end of file
+	$(RM) $(COMPILED_UI) $(COMPILED_RESOURCES) $(COMPILED_UI:.py=.pyc) $(COMPILED_RESOURCES:.py=.pyc)  
diff --git a/res/ui/communityTabWidget.ui b/res/ui/communityTabWidget.ui
new file mode 100644
index 00000000..acee98be
--- /dev/null
+++ b/res/ui/communityTabWidget.ui
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>CommunityTabWidget</class>
+ <widget class="QWidget" name="CommunityTabWidget">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>400</width>
+    <height>300</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>communityTabWidget</string>
+  </property>
+  <layout class="QHBoxLayout" name="horizontalLayout">
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout_6">
+     <item>
+      <widget class="QLabel" name="label">
+       <property name="text">
+        <string>Members</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QListView" name="communityMembers_2"/>
+     </item>
+    </layout>
+   </item>
+   <item>
+    <layout class="QVBoxLayout" name="verticalLayout">
+     <item>
+      <widget class="QLabel" name="label_2">
+       <property name="text">
+        <string>Last issuance</string>
+       </property>
+      </widget>
+     </item>
+     <item>
+      <widget class="QListView" name="listView"/>
+     </item>
+    </layout>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/res/ui/mainwindow.ui b/res/ui/mainwindow.ui
index c6ab23c0..349fdfce 100644
--- a/res/ui/mainwindow.ui
+++ b/res/ui/mainwindow.ui
@@ -32,12 +32,12 @@
       </property>
       <layout class="QVBoxLayout" name="verticalLayout">
        <item>
-        <widget class="QTabWidget" name="tabWidget">
+        <widget class="QTabWidget" name="accountTabs">
          <property name="enabled">
           <bool>false</bool>
          </property>
          <property name="currentIndex">
-          <number>2</number>
+          <number>0</number>
          </property>
          <widget class="QWidget" name="walletsTab">
           <attribute name="title">
@@ -87,56 +87,16 @@
            </item>
           </layout>
          </widget>
-         <widget class="QWidget" name="communitiesTab">
+         <widget class="QWidget" name="communitiesWidget">
           <attribute name="title">
            <string>Communities</string>
           </attribute>
           <layout class="QHBoxLayout" name="horizontalLayout_4">
            <item>
-            <widget class="QTabWidget" name="tabWidget_2">
+            <widget class="QTabWidget" name="communitiesTab">
              <property name="currentIndex">
-              <number>1</number>
+              <number>-1</number>
              </property>
-             <widget class="QWidget" name="ucoinTab">
-              <attribute name="title">
-               <string>Ucoin</string>
-              </attribute>
-             </widget>
-             <widget class="QWidget" name="freecoinTab">
-              <attribute name="title">
-               <string>FreeCoin</string>
-              </attribute>
-              <layout class="QHBoxLayout" name="horizontalLayout_5">
-               <item>
-                <layout class="QVBoxLayout" name="verticalLayout_4">
-                 <item>
-                  <widget class="QLabel" name="label_3">
-                   <property name="text">
-                    <string>Members</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QListView" name="communityMembers"/>
-                 </item>
-                </layout>
-               </item>
-               <item>
-                <layout class="QVBoxLayout" name="verticalLayout_5">
-                 <item>
-                  <widget class="QLabel" name="label_4">
-                   <property name="text">
-                    <string>Last issuance</string>
-                   </property>
-                  </widget>
-                 </item>
-                 <item>
-                  <widget class="QListView" name="communityIssuance"/>
-                 </item>
-                </layout>
-               </item>
-              </layout>
-             </widget>
             </widget>
            </item>
           </layout>
diff --git a/src/cutecoin/core/__init__.py b/src/cutecoin/core/__init__.py
index 43ea9c67..0267f0dc 100644
--- a/src/cutecoin/core/__init__.py
+++ b/src/cutecoin/core/__init__.py
@@ -13,7 +13,7 @@ class Core(object):
         '''
         Constructor
         '''
-        self.account = []
+        self.accounts = []
         self.currentAccount = None
         config.parseArguments(argv)
         AppData().load(self)
diff --git a/src/cutecoin/core/appData.py b/src/cutecoin/core/appData.py
index 11e25062..617bda8e 100644
--- a/src/cutecoin/core/appData.py
+++ b/src/cutecoin/core/appData.py
@@ -5,6 +5,7 @@ Created on 7 févr. 2014
 '''
 import json
 from cutecoin.core import config
+import os
 
 class AppData(object):
     '''
@@ -18,10 +19,10 @@ class AppData(object):
         '''
 
     def load(self, core):
-        json_data=open(config.data['home'])
-        data = json.load(json_data)
-        json_data.close()
-        data['accounts']
+        if (os.path.exists(config.data['home'])):
+            json_data=open(config.data['home'], 'w+')
+            data = json.load(json_data)
+            json_data.close()
 
 
     def save(self, core):
diff --git a/src/cutecoin/gui/addAccountDialog.py b/src/cutecoin/gui/addAccountDialog.py
index 9af46cdd..027b244f 100644
--- a/src/cutecoin/gui/addAccountDialog.py
+++ b/src/cutecoin/gui/addAccountDialog.py
@@ -43,7 +43,7 @@ class AddAccountDialog(QDialog, Ui_AddAccountDialog):
         self.account = Account(self.pgpkeyList.currentText(), "", Communities())
 
     def openAddCommunityDialog(self):
-        self.dialog.setCommunities(self.account.communities)
+        self.dialog.setAccount(self.account)
         self.dialog.exec_()
 
     def actionAddCommunity(self):
diff --git a/src/cutecoin/gui/addCommunityDialog.py b/src/cutecoin/gui/addCommunityDialog.py
index 0c930213..a58976f3 100644
--- a/src/cutecoin/gui/addCommunityDialog.py
+++ b/src/cutecoin/gui/addCommunityDialog.py
@@ -23,8 +23,8 @@ class AddCommunityDialog(QDialog, Ui_AddCommunityDialog):
         self.accountDialog = accountDialog
         self.buttonBox.accepted.connect(self.accountDialog.actionAddCommunity)
 
-    def setCommunities(self, communities):
-        self.communities = communities
+    def setAccount(self, account):
+        self.account = account
 
     def addCommunity(self):
         '''
@@ -32,7 +32,8 @@ class AddCommunityDialog(QDialog, Ui_AddCommunityDialog):
         '''
         server = self.serverEdit.text()
         port = self.portBox.value()
-        community = self.communities.addCommunity(MainNode(server, port))
+        community = self.account.communities.addCommunity(MainNode(server, port))
+        self.account.wallets.addWallet(community.currency)
         self.communityView.setModel( CommunityTreeModel(community) )
 
 
diff --git a/src/cutecoin/gui/mainWindow.py b/src/cutecoin/gui/mainWindow.py
index 0a1613fd..ec6c296f 100644
--- a/src/cutecoin/gui/mainWindow.py
+++ b/src/cutecoin/gui/mainWindow.py
@@ -6,6 +6,8 @@ Created on 1 févr. 2014
 from cutecoin.gen_resources.mainwindow_uic import Ui_MainWindow
 from PyQt5.QtWidgets import QMainWindow
 from cutecoin.gui.addAccountDialog import AddAccountDialog
+from cutecoin.models.account.wallets.listModel import WalletsListModel
+from cutecoin.models.wallet.listModel import WalletListModel
 
 class MainWindow(QMainWindow, Ui_MainWindow):
     '''
@@ -23,12 +25,14 @@ class MainWindow(QMainWindow, Ui_MainWindow):
         self.core = core
 
     def openAddAccountDialog(self):
-        self.dialog = AddAccountDialog()
+        self.dialog = AddAccountDialog(self)
         self.dialog.setData()
         self.dialog.exec_()
 
     def actionAddAccount(self):
+        self.dialog.account.name = self.dialog.accountName.text()
         self.core.addAccount(self.dialog.account)
+        self.refreshMainWindow()
 
     '''
     Refresh main window
@@ -36,6 +40,10 @@ class MainWindow(QMainWindow, Ui_MainWindow):
     in the window have to be refreshed
     '''
     def refreshMainWindow(self):
-        if self.core.currentAccount != None:
-            #TODO: rafraichissement de la fenetre
-            pass
+        if self.core.currentAccount == None:
+            self.accountTabs.setEnabled(False)
+        else:
+            self.accountTabs.setEnabled(True)
+            self.accountNameLabel = self.core.currentAccount.name
+            self.walletsList.setModel(WalletsListModel(self.core.currentAccount))
+            self.walletContent.setModel(WalletListModel(self.core.currentAccount.wallets.walletsList[0]))
diff --git a/src/cutecoin/models/account/__init__.py b/src/cutecoin/models/account/__init__.py
index 6d9a4a46..1a79025d 100644
--- a/src/cutecoin/models/account/__init__.py
+++ b/src/cutecoin/models/account/__init__.py
@@ -5,6 +5,8 @@ Created on 1 févr. 2014
 '''
 
 import ucoinpy as ucoin
+import gnupg
+from cutecoin.models.account.wallets import Wallets
 
 class Account(object):
     '''
@@ -18,16 +20,25 @@ class Account(object):
         self.pgpKey = pgpKey
         self.name = name
         self.communities = communities
-        self.transactionNodes = []
-        self.trustableNodes = []
-        self.wallets = []
+        self.wallets = Wallets()
+        for community in self.communities.communitiesList:
+            wallet = self.wallets.addWallet(community.currency)
+            #TODO: Gerer le cas ou plusieurs noeuds sont presents dans la liste et le 0 ne repond pas
+            wallet.refreshCoins(community.knownNodes[0], self.keyFingerprint())
+
         self.receivedTransactions = []
         self.sentTransactions = []
 
-    def addTransactionNode(self, node):
-        self.transactionNodes.append(node)
+    def addWallet(name, currency):
+        self.wallets.addWallet(name, currency)
+
+    def keyFingerprint():
+        gpg = gnupg.GPG()
+        availableKeys = gpg.list_keys(True)
+        for k in availableKeys:
+            if k['key_id'] == self.pgpKey:
+                return k['fingerprint']
+        return ""
 
-    def addTrustableNode(self, node):
-        self.trustableNodes.append(node)
 
 
diff --git a/src/cutecoin/models/account/communities/__init__.py b/src/cutecoin/models/account/communities/__init__.py
index 7e50ad20..458185ff 100644
--- a/src/cutecoin/models/account/communities/__init__.py
+++ b/src/cutecoin/models/account/communities/__init__.py
@@ -18,9 +18,11 @@ class Communities(object):
 
     def getCommunity(self, currency):
         for com in self.communitiesList:
+            #TODO: Compare communities by amendment hash instead of currency
             if com.currency == currency:
                 return com
 
+    #TODO: Check membership
     def addCommunity(self, mainNode):
         ucoin.settings['server'] = mainNode.server
         ucoin.settings['port'] = mainNode.port
@@ -31,4 +33,9 @@ class Communities(object):
             community = Community(mainNode, currency)
             self.communitiesList.append(community)
 
-        return community
\ No newline at end of file
+        return community
+
+
+    #TODO: Jsonify this model
+    def saveJson(self):
+        pass
diff --git a/src/cutecoin/models/account/wallets/__init__.py b/src/cutecoin/models/account/wallets/__init__.py
index 2323764d..8cc4fa2f 100644
--- a/src/cutecoin/models/account/wallets/__init__.py
+++ b/src/cutecoin/models/account/wallets/__init__.py
@@ -4,6 +4,8 @@ Created on 7 févr. 2014
 @author: inso
 '''
 
+from cutecoin.models.wallet import Wallet
+
 class Wallets(object):
     '''
     classdocs
@@ -12,4 +14,17 @@ class Wallets(object):
         '''
         Constructor
         '''
+        self.walletsList = []
+
+    def addWallet(self, currency):
+        wallet = Wallet(currency)
+        if wallet not in self.walletsList:
+            self.walletsList.append(wallet)
+        else:
+            return self.walletsList.get(wallet)
 
+    def getWallet(self, wallet):
+        for w in self.walletsLists:
+            if w == wallet:
+                return w
+        return None
diff --git a/src/cutecoin/models/account/wallets/listModel.py b/src/cutecoin/models/account/wallets/listModel.py
new file mode 100644
index 00000000..bdefb4cb
--- /dev/null
+++ b/src/cutecoin/models/account/wallets/listModel.py
@@ -0,0 +1,30 @@
+'''
+Created on 8 févr. 2014
+
+@author: inso
+'''
+
+from PyQt5.QtCore import QAbstractListModel, Qt
+
+class WalletsListModel(QAbstractListModel):
+    '''
+    A Qt abstract item model to display communities in a tree
+    '''
+    def __init__(self, account, parent=None):
+        '''
+        Constructor
+        '''
+        super(WalletsListModel, self).__init__(parent)
+        self.wallets = account.wallets
+
+    def rowCount(self ,parent):
+        return len(self.wallets.walletsList)
+
+    def data(self,index,role):
+        if role == Qt.DisplayRole:
+            row=index.row()
+            value = self.wallets.walletsList[row].getText()
+            return value
+
+    def flags(self,index):
+        return Qt.ItemIsSelectable | Qt.ItemIsEnabled
diff --git a/src/cutecoin/models/coin/__init__.py b/src/cutecoin/models/coin/__init__.py
index 5188e010..ddf7eff5 100644
--- a/src/cutecoin/models/coin/__init__.py
+++ b/src/cutecoin/models/coin/__init__.py
@@ -4,14 +4,35 @@ Created on 2 févr. 2014
 @author: inso
 '''
 
+import re
+import math
+
 class Coin(object):
     '''
     classdocs
     '''
 
 
-    def __init__(self, number):
+    def __init__(self, ownerFingerprint, coin_id):
         '''
         Constructor
         '''
-        self.number = number
+        # Regex to parse the coin id
+        regex = "/^([A-Z\d]{40})-(\d+)-(\d)-(\d+)-((A|F|D)-\d+))$/"
+        m = re.search(regex, coin_id)
+        self.issuer = m.group(0)
+        self.number = int(m.group(1))
+        self.base = int(m.group(2))
+        self.power = int(m.group(3))
+        self.origin = m.group(4)
+        self.ownerFingerprint = ownerFingerprint
+
+    def value(self):
+        return math.pow(self.base, self.power)
+
+    def getId(self):
+        return self.issuer + "-" \
+            + str(self.number) + "-" \
+            + str(self.base) + "-" \
+            + str(self.power) + "-" \
+            + self.origin
\ No newline at end of file
diff --git a/src/cutecoin/models/community/__init__.py b/src/cutecoin/models/community/__init__.py
index 4dd21146..7ed15479 100644
--- a/src/cutecoin/models/community/__init__.py
+++ b/src/cutecoin/models/community/__init__.py
@@ -35,3 +35,7 @@ class Community(object):
         return self.knownNodes
 
 
+    #TODO: Jsonify this model
+    def saveJson(self):
+        pass
+
diff --git a/src/cutecoin/models/node/__init__.py b/src/cutecoin/models/node/__init__.py
index d73ad3f4..eb844020 100644
--- a/src/cutecoin/models/node/__init__.py
+++ b/src/cutecoin/models/node/__init__.py
@@ -24,6 +24,7 @@ class Node(object):
     def getText(self):
         return self.server + ":" + str(self.port)
 
+
 class MainNode(Node):
 
     def downstreamPeers(self):
@@ -36,3 +37,7 @@ class MainNode(Node):
             peers.append(node)
         return peers
 
+    #TODO: Jsonify this model
+    def saveJson(self):
+        pass
+
diff --git a/src/cutecoin/models/wallet/__init__.py b/src/cutecoin/models/wallet/__init__.py
index fb9c9aa1..b781a505 100644
--- a/src/cutecoin/models/wallet/__init__.py
+++ b/src/cutecoin/models/wallet/__init__.py
@@ -4,6 +4,10 @@ Created on 1 févr. 2014
 @author: inso
 '''
 
+import ucoinpy as ucoin
+import gnupg
+from cutecoin.models.coin import Coin
+
 class Wallet(object):
     '''
     classdocs
@@ -14,6 +18,29 @@ class Wallet(object):
         '''
         Constructor
         '''
-        self.initialValue = 0
         self.coins = []
         self.currency = currency
+
+
+    def __eq__(self, other):
+        return ( self.currency == other.currency )
+
+    def value(self):
+        value = 0
+        for coin in self.coins:
+            value += coin.value()
+        return value
+
+    def refreshCoins(self, mainNode, pgpFingerprint):
+        ucoin.settings['server'] = mainNode
+        ucoin.settings['port'] = mainNode
+        dataList = ucoin.hdc.coins.List(pgpFingerprint).get()
+        for issaunces in dataList['coins']:
+            issuer = issaunces['issuer']
+            for coinsIds in issaunces['ids']:
+                shortened_id = coinsIds
+                coin = Coin(pgpFingerprint, issuer+"-"+shortened_id)
+                self.coins.append(coin)
+
+    def getText(self):
+        return str(self.value()) + " " + self.currency
diff --git a/src/cutecoin/models/wallet/listModel.py b/src/cutecoin/models/wallet/listModel.py
new file mode 100644
index 00000000..d55d24e9
--- /dev/null
+++ b/src/cutecoin/models/wallet/listModel.py
@@ -0,0 +1,30 @@
+'''
+Created on 8 févr. 2014
+
+@author: inso
+'''
+
+from PyQt5.QtCore import QAbstractListModel, Qt
+
+class WalletListModel(QAbstractListModel):
+    '''
+    A Qt abstract item model to display communities in a tree
+    '''
+    def __init__(self, wallet, parent=None):
+        '''
+        Constructor
+        '''
+        super(WalletListModel, self).__init__(parent)
+        self.coins = wallet.coins
+
+    def rowCount(self ,parent):
+        return len(self.coins)
+
+    def data(self,index,role):
+        if role == Qt.DisplayRole:
+            row=index.row()
+            value = str(self.coins[row].value())
+            return value
+
+    def flags(self,index):
+        return Qt.ItemIsSelectable | Qt.ItemIsEnabled
-- 
GitLab