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