From 293dbe4042fc6fff013e7350b2fa9a46e28e60a9 Mon Sep 17 00:00:00 2001 From: Inso <insomniak.fr@gmail.com> Date: Sat, 8 Mar 2014 14:43:14 +0100 Subject: [PATCH] Refactoring the code to handle lifecycles better --- Makefile | 2 +- res/ui/accountConfiguration.ui | 98 ------------------- ...log.ui => communityConfigurationDialog.ui} | 14 +-- src/cutecoin/gui/addAccountDialog.py | 68 ------------- src/cutecoin/gui/addCommunityDialog.py | 44 --------- src/cutecoin/gui/addContactDialog.py | 1 - src/cutecoin/gui/configureAccountDialog.py | 35 +++++-- src/cutecoin/gui/configureCommunityDialog.py | 54 ++++++++++ src/cutecoin/gui/mainWindow.py | 6 +- src/cutecoin/models/community/__init__.py | 12 +-- src/cutecoin/models/community/treeModel.py | 2 +- src/cutecoin/models/node/__init__.py | 4 +- 12 files changed, 100 insertions(+), 240 deletions(-) delete mode 100644 res/ui/accountConfiguration.ui rename res/ui/{addCommunityDialog.ui => communityConfigurationDialog.ui} (90%) delete mode 100644 src/cutecoin/gui/addAccountDialog.py delete mode 100644 src/cutecoin/gui/addCommunityDialog.py create mode 100644 src/cutecoin/gui/configureCommunityDialog.py diff --git a/Makefile b/Makefile index 8f1d8d15..22ff3a68 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 accountConfigurationDialog.ui addCommunityDialog.ui communityTabWidget.ui issuanceDialog.ui transferDialog.ui addContactDialog.ui communityParametersWidget.ui +UI_FILES = mainwindow.ui accountConfigurationDialog.ui communityConfigurationDialog.ui communityTabWidget.ui issuanceDialog.ui transferDialog.ui addContactDialog.ui communityParametersWidget.ui #Qt resource files to compile RESOURCES = diff --git a/res/ui/accountConfiguration.ui b/res/ui/accountConfiguration.ui deleted file mode 100644 index d1b43c6a..00000000 --- a/res/ui/accountConfiguration.ui +++ /dev/null @@ -1,98 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>Dialog</class> - <widget class="QDialog" name="Dialog"> - <property name="geometry"> - <rect> - <x>0</x> - <y>0</y> - <width>400</width> - <height>300</height> - </rect> - </property> - <property name="windowTitle"> - <string>Dialog</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <widget class="QGroupBox" name="groupBox"> - <property name="title"> - <string>Account parameters</string> - </property> - <layout class="QVBoxLayout" name="verticalLayout_2"> - <item> - <layout class="QHBoxLayout" name="horizontalLayout"> - <item> - <widget class="QLabel" name="label"> - <property name="text"> - <string>Account name</string> - </property> - </widget> - </item> - <item> - <widget class="QLineEdit" name="lineEdit"/> - </item> - </layout> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_2"> - <item> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>PGPKey </string> - </property> - </widget> - </item> - </layout> - </item> - </layout> - </widget> - </item> - <item> - <widget class="QDialogButtonBox" name="buttonBox"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> - </item> - </layout> - </widget> - <resources/> - <connections> - <connection> - <sender>buttonBox</sender> - <signal>accepted()</signal> - <receiver>Dialog</receiver> - <slot>accept()</slot> - <hints> - <hint type="sourcelabel"> - <x>248</x> - <y>254</y> - </hint> - <hint type="destinationlabel"> - <x>157</x> - <y>274</y> - </hint> - </hints> - </connection> - <connection> - <sender>buttonBox</sender> - <signal>rejected()</signal> - <receiver>Dialog</receiver> - <slot>reject()</slot> - <hints> - <hint type="sourcelabel"> - <x>316</x> - <y>260</y> - </hint> - <hint type="destinationlabel"> - <x>286</x> - <y>274</y> - </hint> - </hints> - </connection> - </connections> -</ui> diff --git a/res/ui/addCommunityDialog.ui b/res/ui/communityConfigurationDialog.ui similarity index 90% rename from res/ui/addCommunityDialog.ui rename to res/ui/communityConfigurationDialog.ui index 9da5921f..01a077de 100644 --- a/res/ui/addCommunityDialog.ui +++ b/res/ui/communityConfigurationDialog.ui @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> - <class>AddCommunityDialog</class> - <widget class="QDialog" name="AddCommunityDialog"> + <class>CommunityConfigurationDialog</class> + <widget class="QDialog" name="CommunityConfigurationDialog"> <property name="geometry"> <rect> <x>0</x> @@ -80,7 +80,7 @@ <connection> <sender>buttonBox</sender> <signal>accepted()</signal> - <receiver>AddCommunityDialog</receiver> + <receiver>CommunityConfigurationDialog</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> @@ -96,7 +96,7 @@ <connection> <sender>buttonBox</sender> <signal>rejected()</signal> - <receiver>AddCommunityDialog</receiver> + <receiver>CommunityConfigurationDialog</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> @@ -112,8 +112,8 @@ <connection> <sender>addButton</sender> <signal>clicked()</signal> - <receiver>AddCommunityDialog</receiver> - <slot>addCommunity()</slot> + <receiver>CommunityConfigurationDialog</receiver> + <slot>addNode()</slot> <hints> <hint type="sourcelabel"> <x>337</x> @@ -127,6 +127,6 @@ </connection> </connections> <slots> - <slot>addCommunity()</slot> + <slot>addNode()</slot> </slots> </ui> diff --git a/src/cutecoin/gui/addAccountDialog.py b/src/cutecoin/gui/addAccountDialog.py deleted file mode 100644 index 66cf421f..00000000 --- a/src/cutecoin/gui/addAccountDialog.py +++ /dev/null @@ -1,68 +0,0 @@ -''' -Created on 2 févr. 2014 - -@author: inso -''' -from cutecoin.gen_resources.accountConfigurationDialog_uic import Ui_AccountConfigurationDialog -from PyQt5.QtWidgets import QDialog -from cutecoin.gui.addCommunityDialog import AddCommunityDialog -from cutecoin.models.account import Account -from cutecoin.models.account.communities import Communities -from cutecoin.models.account.communities.listModel import CommunitiesListModel - -import gnupg - - -class AddAccountDialog(QDialog, Ui_AccountConfigurationDialog): - ''' - classdocs - ''' - - - def __init__(self, mainWindow): - ''' - Constructor - ''' - # Set up the user interface from Designer. - super(AddAccountDialog, self).__init__() - self.setupUi(self) - self.mainWindow = mainWindow - - self.buttonBox.accepted.connect(self.mainWindow.actionAddAccount) - - self.setData() - - def setData(self): - gpg = gnupg.GPG() - self.combo_keysList.clear() - availableKeys = gpg.list_keys(True) - for key in availableKeys: - self.combo_keysList.addItem(key['uids'][0]) - - self.account = Account.create(availableKeys[0]['keyid'], "", Communities()) - self.combo_keysList.setEnabled(True) - self.combo_keysList.currentIndexChanged[int].connect(self.keyChanged) - - def openAddCommunityDialog(self): - dialog = AddCommunityDialog(self) - dialog.setAccount(self.account) - dialog.exec_() - - def actionAddCommunity(self): - self.combo_keysList.setEnabled(False) - self.combo_keysList.disconnect() - self.list_communities.setModel(CommunitiesListModel(self.account)) - - def actionRemoveCommunity(self): - #TODO:Remove selected community - pass - - def actionEditCommunity(self): - #TODO: Edit selected community - pass - - def keyChanged(self, keyIndex): - gpg = gnupg.GPG() - availableKeys = gpg.list_keys(True) - self.account.keyId = availableKeys[keyIndex]['keyid'] - diff --git a/src/cutecoin/gui/addCommunityDialog.py b/src/cutecoin/gui/addCommunityDialog.py deleted file mode 100644 index c9dc14df..00000000 --- a/src/cutecoin/gui/addCommunityDialog.py +++ /dev/null @@ -1,44 +0,0 @@ -''' -Created on 2 févr. 2014 - -@author: inso -''' -from cutecoin.gen_resources.addCommunityDialog_uic import Ui_AddCommunityDialog -from PyQt5.QtWidgets import QDialog, QErrorMessage -from cutecoin.models.community.treeModel import CommunityTreeModel -from cutecoin.models.node import MainNode -from cutecoin.core.exceptions import NotMemberOfCommunityError - -class AddCommunityDialog(QDialog, Ui_AddCommunityDialog): - ''' - classdocs - ''' - - - def __init__(self, accountDialog): - ''' - Constructor - ''' - super(AddCommunityDialog, self).__init__() - self.setupUi(self) - self.accountDialog = accountDialog - self.buttonBox.accepted.connect(self.accountDialog.actionAddCommunity) - - def setAccount(self, account): - self.account = account - - def addCommunity(self): - ''' - Add community slot - ''' - server = self.serverEdit.text() - port = self.portBox.value() - try: - community = self.account.communities.addCommunity(MainNode(server, port), self.account.keyFingerprint()) - self.account.wallets.addWallet(community) - self.communityView.setModel( CommunityTreeModel(community) ) - except NotMemberOfCommunityError as e: - QErrorMessage(self).showMessage(e.message) - - - diff --git a/src/cutecoin/gui/addContactDialog.py b/src/cutecoin/gui/addContactDialog.py index ae9e7543..351cd26d 100644 --- a/src/cutecoin/gui/addContactDialog.py +++ b/src/cutecoin/gui/addContactDialog.py @@ -3,7 +3,6 @@ Created on 2 févr. 2014 @author: inso ''' -import logging import re from PyQt5.QtWidgets import QDialog, QDialogButtonBox diff --git a/src/cutecoin/gui/configureAccountDialog.py b/src/cutecoin/gui/configureAccountDialog.py index 776c45ef..98158c49 100644 --- a/src/cutecoin/gui/configureAccountDialog.py +++ b/src/cutecoin/gui/configureAccountDialog.py @@ -4,12 +4,11 @@ Created on 6 mars 2014 @author: inso ''' from cutecoin.gen_resources.accountConfigurationDialog_uic import Ui_AccountConfigurationDialog -from cutecoin.gui.addCommunityDialog import AddCommunityDialog -from cutecoin.models.account import Account -from cutecoin.models.account.communities import Communities +from cutecoin.gui.configureCommunityDialog import ConfigureCommunityDialog from cutecoin.models.account.communities.listModel import CommunitiesListModel from PyQt5.QtWidgets import QDialog - +from cutecoin.models.account import Account +from cutecoin.models.account import Communities import gnupg @@ -19,36 +18,50 @@ class ConfigureAccountDialog(QDialog, Ui_AccountConfigurationDialog): ''' - def __init__(self, mainWindow): + def __init__(self, account): ''' Constructor ''' # Set up the user interface from Designer. super(ConfigureAccountDialog, self).__init__() self.setupUi(self) - self.account = mainWindow.core.currentAccount - self.setWindowTitle("Configure " + self.account.name) + self.account = account + if self.account is None: + self.setWindowTitle("New account") + else: + self.setWindowTitle("Configure " + self.account.name) + self.combo_keysList.setEnabled(False) + self.setData() def setData(self): gpg = gnupg.GPG() self.combo_keysList.clear() availableKeys = gpg.list_keys(True) + + if self.account is None: + self.account = Account.create(availableKeys[0]['keyid'], "", Communities()) + self.combo_keysList.currentIndexChanged[int].connect(self.keyChanged) + for index, key in enumerate(availableKeys): self.combo_keysList.addItem(key['uids'][0]) if (key['keyid']) == self.account.keyId: self.combo_keysList.setCurrentIndex(index) - self.combo_keysList.setEnabled(False) + self.list_communities.setModel(CommunitiesListModel(self.account)) self.edit_accountName.setText(self.account.name) def openAddCommunityDialog(self): - dialog = AddCommunityDialog(self) + dialog = ConfigureCommunityDialog(None) + dialog.setWindowTitle("Add a community") + dialog.buttonBox.accepted.connect(self.actionAddCommunity) dialog.setAccount(self.account) dialog.exec_() def actionAddCommunity(self): + self.combo_keysList.setEnabled(False) + self.combo_keysList.disconnect() self.list_communities.setModel(CommunitiesListModel(self.account)) def actionRemoveCommunity(self): @@ -59,4 +72,8 @@ class ConfigureAccountDialog(QDialog, Ui_AccountConfigurationDialog): #TODO: Edit selected community pass + def keyChanged(self, keyIndex): + gpg = gnupg.GPG() + availableKeys = gpg.list_keys(True) + self.account.keyId = availableKeys[keyIndex]['keyid'] diff --git a/src/cutecoin/gui/configureCommunityDialog.py b/src/cutecoin/gui/configureCommunityDialog.py new file mode 100644 index 00000000..bd220803 --- /dev/null +++ b/src/cutecoin/gui/configureCommunityDialog.py @@ -0,0 +1,54 @@ +''' +Created on 8 mars 2014 + +@author: inso +''' +from cutecoin.gen_resources.communityConfigurationDialog_uic import Ui_CommunityConfigurationDialog +from PyQt5.QtWidgets import QDialog, QErrorMessage +from cutecoin.models.community.treeModel import CommunityTreeModel +from cutecoin.models.node import TrustedNode +from cutecoin.core.exceptions import NotMemberOfCommunityError + +class ConfigureCommunityDialog(QDialog, Ui_CommunityConfigurationDialog): + ''' + classdocs + ''' + + + def __init__(self, community): + ''' + Constructor + ''' + super(ConfigureCommunityDialog, self).__init__() + self.setupUi(self) + self.community = community + + def setData(self): + if self.community is not None: + self.communityView.setModel( CommunityTreeModel(self.community)) + + def setAccount(self, account): + self.account = account + + def addNode(self): + ''' + Add node slot + ''' + server = self.serverEdit.text() + port = self.portBox.value() + if self.community == None: + try: + self.community = self.account.communities.addCommunity(TrustedNode(server, port), self.account.keyFingerprint()) + self.account.wallets.addWallet(self.community) + self.communityView.setModel( CommunityTreeModel(self.community) ) + except NotMemberOfCommunityError as e: + QErrorMessage(self).showMessage(e.message) + else: + self.community.addTrustedNode( TrustedNode(server, port )) + self.communityView.setModel( CommunityTreeModel(self.community )) + + def accept(self): + self.close() + + + diff --git a/src/cutecoin/gui/mainWindow.py b/src/cutecoin/gui/mainWindow.py index 090a9b05..4cf032c4 100644 --- a/src/cutecoin/gui/mainWindow.py +++ b/src/cutecoin/gui/mainWindow.py @@ -6,7 +6,6 @@ Created on 1 févr. 2014 from cutecoin.gen_resources.mainwindow_uic import Ui_MainWindow from PyQt5.QtWidgets import QMainWindow, QAction, QErrorMessage from PyQt5.QtCore import QSignalMapper -from cutecoin.gui.addAccountDialog import AddAccountDialog from cutecoin.gui.configureAccountDialog import ConfigureAccountDialog from cutecoin.gui.transferMoneyDialog import TransferMoneyDialog from cutecoin.gui.communityTabWidget import CommunityTabWidget @@ -36,7 +35,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.refreshMainWindow() def openAddAccountDialog(self): - self.addAccountDialog = AddAccountDialog(self) + self.addAccountDialog = ConfigureAccountDialog(None) + self.addAccountDialog.buttonBox.accepted.connect(self.actionAddAccount) self.addAccountDialog.setData() self.addAccountDialog.exec_() @@ -63,7 +63,7 @@ class MainWindow(QMainWindow, Ui_MainWindow): AddContactDialog(self.core.currentAccount, self).exec_() def openConfigureAccountDialog(self): - ConfigureAccountDialog(self).exec_() + ConfigureAccountDialog(self.core.currentAccount).exec_() ''' Refresh main window diff --git a/src/cutecoin/models/community/__init__.py b/src/cutecoin/models/community/__init__.py index adab6a1a..ebc0570c 100644 --- a/src/cutecoin/models/community/__init__.py +++ b/src/cutecoin/models/community/__init__.py @@ -9,20 +9,20 @@ import hashlib import json import logging -from cutecoin.models.node import MainNode +from cutecoin.models.node import TrustedNode from cutecoin.models.wallet import Wallet class Community(object): ''' classdocs ''' - def __init__(self, knownNodes): + def __init__(self, trustedNodes): ''' A community is a group of nodes using the same currency. They are all using the same amendment and are syncing their datas. An account is a member of a community if he is a member of the current amendment. ''' - self.knownNodes = knownNodes + self.trustedNodes = trustedNodes currentAmendment = self.ucoinRequest(ucoin.hdc.amendments.Current()) self.currency = currentAmendment['currency'] @@ -37,7 +37,7 @@ class Community(object): def load(cls, jsonData, account): knownNodes = [] for nodeData in jsonData['nodes']: - knownNodes.append(MainNode(nodeData['server'], nodeData['port'])) + knownNodes.append(TrustedNode(nodeData['server'], nodeData['port'])) community = cls(knownNodes) @@ -59,7 +59,7 @@ class Community(object): return members def ucoinRequest(self, request, get_args={}): - for node in self.knownNodes: + for node in self.trustedNodes: logging.debug("Trying to connect to : " + node.getText()) request = node.use(request) return request.get(**get_args) @@ -103,7 +103,7 @@ class Community(object): def jsonifyNodesList(self): data = [] - for node in self.knownNodes: + for node in self.trustedNodes: data.append(node.jsonify()) return data diff --git a/src/cutecoin/models/community/treeModel.py b/src/cutecoin/models/community/treeModel.py index 2180564f..c916dadd 100644 --- a/src/cutecoin/models/community/treeModel.py +++ b/src/cutecoin/models/community/treeModel.py @@ -89,7 +89,7 @@ class CommunityTreeModel(QAbstractItemModel): def refreshTreeNodes(self): logging.debug("root : " + self.rootItem.data(0)) - for mainNode in self.community.knownNodes: + for mainNode in self.community.trustedNodes: mainNodeItem = MainNodeItem(mainNode, self.rootItem) logging.debug("mainNode : " + mainNode.getText() + " / " + mainNodeItem.data(0)) self.rootItem.appendChild(mainNodeItem) diff --git a/src/cutecoin/models/node/__init__.py b/src/cutecoin/models/node/__init__.py index 41337c1b..ccf7e8e1 100644 --- a/src/cutecoin/models/node/__init__.py +++ b/src/cutecoin/models/node/__init__.py @@ -24,9 +24,9 @@ class Node(object): return self.server + ":" + str(self.port) -class MainNode(Node): +class TrustedNode(Node): ''' - MainNode is a node the community is reading to get informations. + TrustedNode is a node the community is reading to get informations. The account sends data one of the community main nodes. ''' def downstreamPeers(self): -- GitLab