From e29cf3fa58c20b376103eedcfa8d0e0144567ad6 Mon Sep 17 00:00:00 2001 From: Inso <insomniak.fr@gmail.com> Date: Sun, 2 Feb 2014 23:32:01 +0100 Subject: [PATCH] =?UTF-8?q?Structure=20des=20models=20initialis=C3=A9e=20e?= =?UTF-8?q?t=20idem=20windowing=20Qt5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 36 ++++++++ doc/uml/models.png | Bin 0 -> 39630 bytes doc/uml/models.pu | 44 ++++++++++ res/ui/addAccountDialog.ui | 52 +++++++++-- res/ui/addCommunityDialog.ui | 117 +++++++++++++++++++++++++ res/ui/mainwindow.ui | 30 ++++++- src/cutecoin/__init__.py | 1 - src/cutecoin/gui/addAccountDialog.py | 28 ++++++ src/cutecoin/gui/addCommunityDialog.py | 21 +++++ src/cutecoin/gui/mainWindow.py | 8 +- src/cutecoin/models/account.py | 8 +- src/cutecoin/models/coin.py | 17 ++++ src/cutecoin/models/community.py | 47 +++++++++- src/cutecoin/models/transaction.py | 8 +- src/cutecoin/models/wallet.py | 7 +- 15 files changed, 406 insertions(+), 18 deletions(-) create mode 100644 Makefile create mode 100644 doc/uml/models.png create mode 100644 doc/uml/models.pu create mode 100644 res/ui/addCommunityDialog.ui create mode 100644 src/cutecoin/gui/addAccountDialog.py create mode 100644 src/cutecoin/gui/addCommunityDialog.py create mode 100644 src/cutecoin/models/coin.py diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..1a3b7868 --- /dev/null +++ b/Makefile @@ -0,0 +1,36 @@ +###### EDIT ##################### +#Directory with ui and resource files +RESOURCE_DIR = res/ui + +#Directory for compiled resources +COMPILED_DIR = src/cutecoin/gen_resources + +#UI files to compile +UI_FILES = mainwindow.ui addAccountDialog.ui addCommunityDialog.ui +#Qt resource files to compile +RESOURCES = + +#pyuic4 and pyrcc4 binaries +PYUIC = pyuic5 +PYRCC = pyrcc5 + +################################# +# DO NOT EDIT FOLLOWING + +COMPILED_UI = $(UI_FILES:%.ui=$(COMPILED_DIR)/%_uic.py) +COMPILED_RESOURCES = $(RESOURCES:%.qrc=$(COMPILED_DIR)/%_rc.py) + +all : resources ui + +resources : $(COMPILED_RESOURCES) + +ui : $(COMPILED_UI) + +$(COMPILED_DIR)/%_uic.py : $(RESOURCE_DIR)/%.ui + $(PYUIC) $< -o $@ + +$(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 diff --git a/doc/uml/models.png b/doc/uml/models.png new file mode 100644 index 0000000000000000000000000000000000000000..a4314ae24e7027f32e61959c854ac9f5ceb327ba GIT binary patch literal 39630 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 Tof=pga<S_HkNws7z~nyx+rYGh literal 0 HcmV?d00001 diff --git a/doc/uml/models.pu b/doc/uml/models.pu new file mode 100644 index 00000000..672dc897 --- /dev/null +++ b/doc/uml/models.pu @@ -0,0 +1,44 @@ +@startuml + +class Account { + pgpkey +} + +Account --> "0..*" Community : is a member of +Account --> "0..*" Node : trusts +Account --> "0..*" Node : send transactions with +Account --> "*" Transaction : send +Account --> "*" Transaction : receive +Account --> "0..*" Wallet : owns + +class Community { +} + +Community "1" -- "1" Currency : uses +Community "1" --> "1..*" Node : known nodes + +class Node { + address + port + auth +} + +Node --> "1" Community + +class Transaction { + value + currency + sender + receiver +} + +class Wallet { + currency + coins +} + + + +@enduml + + diff --git a/res/ui/addAccountDialog.ui b/res/ui/addAccountDialog.ui index a65a745a..807ffccb 100644 --- a/res/ui/addAccountDialog.ui +++ b/res/ui/addAccountDialog.ui @@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <ui version="4.0"> - <class>Dialog</class> - <widget class="QDialog" name="Dialog"> + <class>AddAccountDialog</class> + <widget class="QDialog" name="AddAccountDialog"> <property name="geometry"> <rect> <x>0</x> @@ -11,7 +11,10 @@ </rect> </property> <property name="windowTitle"> - <string>Dialog</string> + <string>Add an account</string> + </property> + <property name="modal"> + <bool>true</bool> </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> @@ -56,10 +59,28 @@ <property name="title"> <string>Communities membership</string> </property> - <layout class="QHBoxLayout" name="horizontalLayout_3"> + <layout class="QVBoxLayout" name="verticalLayout_3"> <item> <widget class="QTableView" name="communitiesTable"/> </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QPushButton" name="addCommunity"> + <property name="text"> + <string>Add a community</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="removeCommunity"> + <property name="text"> + <string>Remove selected community</string> + </property> + </widget> + </item> + </layout> + </item> </layout> </widget> </item> @@ -80,7 +101,7 @@ <connection> <sender>buttonBox</sender> <signal>accepted()</signal> - <receiver>Dialog</receiver> + <receiver>AddAccountDialog</receiver> <slot>accept()</slot> <hints> <hint type="sourcelabel"> @@ -96,7 +117,7 @@ <connection> <sender>buttonBox</sender> <signal>rejected()</signal> - <receiver>Dialog</receiver> + <receiver>AddAccountDialog</receiver> <slot>reject()</slot> <hints> <hint type="sourcelabel"> @@ -109,5 +130,24 @@ </hint> </hints> </connection> + <connection> + <sender>addCommunity</sender> + <signal>clicked()</signal> + <receiver>AddAccountDialog</receiver> + <slot>openAddCommunityDialog()</slot> + <hints> + <hint type="sourcelabel"> + <x>109</x> + <y>237</y> + </hint> + <hint type="destinationlabel"> + <x>199</x> + <y>149</y> + </hint> + </hints> + </connection> </connections> + <slots> + <slot>openAddCommunityDialog()</slot> + </slots> </ui> diff --git a/res/ui/addCommunityDialog.ui b/res/ui/addCommunityDialog.ui new file mode 100644 index 00000000..520b3d13 --- /dev/null +++ b/res/ui/addCommunityDialog.ui @@ -0,0 +1,117 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>AddCommunityDialog</class> + <widget class="QDialog" name="AddCommunityDialog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Add a community</string> + </property> + <property name="modal"> + <bool>true</bool> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Communities nodes</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <widget class="QTableView" name="communitiesTable"/> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QLineEdit" name="lineEdit"> + <property name="text"> + <string/> + </property> + <property name="placeholderText"> + <string>Server</string> + </property> + </widget> + </item> + <item> + <widget class="QLineEdit" name="lineEdit_2"> + <property name="text"> + <string/> + </property> + <property name="placeholderText"> + <string>Port</string> + </property> + </widget> + </item> + <item> + <widget class="QCheckBox" name="checkBox"> + <property name="text"> + <string>Auth</string> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="removeCommunity"> + <property name="text"> + <string>Add</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>AddCommunityDialog</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>AddCommunityDialog</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/mainwindow.ui b/res/ui/mainwindow.ui index b2cda408..c9c3e646 100644 --- a/res/ui/mainwindow.ui +++ b/res/ui/mainwindow.ui @@ -152,8 +152,7 @@ <string>Account</string> </property> <addaction name="actionChange_account"/> - <addaction name="actionManage_accounts"/> - <addaction name="actionConfigure_trustable_nodes"/> + <addaction name="actionAdd_account"/> </widget> <widget class="QMenu" name="menuEdit"> <property name="title"> @@ -216,7 +215,32 @@ <string>Remove contact</string> </property> </action> + <action name="actionAdd_account"> + <property name="text"> + <string>Add account</string> + </property> + </action> </widget> <resources/> - <connections/> + <connections> + <connection> + <sender>actionAdd_account</sender> + <signal>triggered()</signal> + <receiver>MainWindow</receiver> + <slot>openAddAccountDialog()</slot> + <hints> + <hint type="sourcelabel"> + <x>-1</x> + <y>-1</y> + </hint> + <hint type="destinationlabel"> + <x>225</x> + <y>199</y> + </hint> + </hints> + </connection> + </connections> + <slots> + <slot>openAddAccountDialog()</slot> + </slots> </ui> diff --git a/src/cutecoin/__init__.py b/src/cutecoin/__init__.py index e9a7bd24..16edd0be 100644 --- a/src/cutecoin/__init__.py +++ b/src/cutecoin/__init__.py @@ -10,7 +10,6 @@ from cutecoin.models.account import Account if __name__ == '__main__': app = QApplication(sys.argv) - acc = Account() window = MainWindow() window.show() sys.exit(app.exec_()) diff --git a/src/cutecoin/gui/addAccountDialog.py b/src/cutecoin/gui/addAccountDialog.py new file mode 100644 index 00000000..661cee2b --- /dev/null +++ b/src/cutecoin/gui/addAccountDialog.py @@ -0,0 +1,28 @@ +''' +Created on 2 févr. 2014 + +@author: inso +''' +from cutecoin.gen_resources.addAccountDialog_uic import Ui_AddAccountDialog +from PyQt5.QtWidgets import QDialog +from cutecoin.gui.addCommunityDialog import AddCommunityDialog + +class AddAccountDialog(QDialog, Ui_AddAccountDialog): + ''' + classdocs + ''' + + + def __init__(self): + ''' + Constructor + ''' + # Set up the user interface from Designer. + super(AddAccountDialog, self).__init__() + self.setupUi(self) + print("stiio") + + def openAddCommunityDialog(self): + dialog = AddCommunityDialog() + dialog.show() + diff --git a/src/cutecoin/gui/addCommunityDialog.py b/src/cutecoin/gui/addCommunityDialog.py new file mode 100644 index 00000000..8598d396 --- /dev/null +++ b/src/cutecoin/gui/addCommunityDialog.py @@ -0,0 +1,21 @@ +''' +Created on 2 févr. 2014 + +@author: inso +''' +from cutecoin.gen_resources.addCommunityDialog_uic import Ui_AddCommunityDialog +from PyQt5.QtWidgets import QDialog + +class AddCommunityDialog(QDialog, Ui_AddCommunityDialog): + ''' + classdocs + ''' + + + def __init__(self): + ''' + Constructor + ''' + super(AddCommunityDialog, self).__init__() + self.setupUi(self) + diff --git a/src/cutecoin/gui/mainWindow.py b/src/cutecoin/gui/mainWindow.py index 973ec967..9a568311 100644 --- a/src/cutecoin/gui/mainWindow.py +++ b/src/cutecoin/gui/mainWindow.py @@ -5,7 +5,7 @@ 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 class MainWindow(QMainWindow, Ui_MainWindow): ''' @@ -20,3 +20,9 @@ class MainWindow(QMainWindow, Ui_MainWindow): # Set up the user interface from Designer. super(MainWindow, self).__init__() self.setupUi(self) + + def openAddAccountDialog(self): + dialog = AddAccountDialog() + print("shoow") + dialog.show() + print("shoow2") \ No newline at end of file diff --git a/src/cutecoin/models/account.py b/src/cutecoin/models/account.py index 936652d3..6d9a4a46 100644 --- a/src/cutecoin/models/account.py +++ b/src/cutecoin/models/account.py @@ -11,12 +11,18 @@ class Account(object): classdocs ''' - def __init__(self): + def __init__(self, pgpKey, name, communities): ''' Constructor ''' + self.pgpKey = pgpKey + self.name = name + self.communities = communities self.transactionNodes = [] self.trustableNodes = [] + self.wallets = [] + self.receivedTransactions = [] + self.sentTransactions = [] def addTransactionNode(self, node): self.transactionNodes.append(node) diff --git a/src/cutecoin/models/coin.py b/src/cutecoin/models/coin.py new file mode 100644 index 00000000..5188e010 --- /dev/null +++ b/src/cutecoin/models/coin.py @@ -0,0 +1,17 @@ +''' +Created on 2 févr. 2014 + +@author: inso +''' + +class Coin(object): + ''' + classdocs + ''' + + + def __init__(self, number): + ''' + Constructor + ''' + self.number = number diff --git a/src/cutecoin/models/community.py b/src/cutecoin/models/community.py index 73dd4d59..1e085d07 100644 --- a/src/cutecoin/models/community.py +++ b/src/cutecoin/models/community.py @@ -4,13 +4,56 @@ Created on 1 févr. 2014 @author: inso ''' -class communityModel(object): +import ucoinpy as ucoin + +class Community(object): ''' classdocs ''' - def __init__(self, params): + def __init__(self, mainNode, currency): + ''' + Constructor + ''' + self.knowNodes = [] + self.knowNodes.append(mainNode) + + def members(self): + ''' + Listing members of a community + ''' + + # TODO : Try connecting with nodes of the list + # if the first fails + # Maybe create a method + ucoin.settings['server'] = self.knowNodes[0].address + ucoin.settings['port'] = self.knowNodes[0].port + ucoin.settings['auth'] = self.knowNodes[0].auth + + members = ucoin.hdc.amendments.view.Members( ucoin.hdc.amendments.Current ) + return members + +class CommunitiesManager(object): + ''' + classdocs + ''' + def __init__(self): ''' Constructor ''' + self.communities = [] + + def getCommunity(self, currency): + for com in self.communities: + if com.currency == currency: + return com + + def addCommunity(self, node): + ucoin.settings['server'] = node.address + ucoin.settings['port'] = node.port + ucoin.settings['auth'] = node.auth + + currentAmendment = ucoin.hdc.amendments.Current.get(self) + currency = currentAmendment['currency'] + self.communities.append(Community(node), currency) diff --git a/src/cutecoin/models/transaction.py b/src/cutecoin/models/transaction.py index 766a906a..7b9496a1 100644 --- a/src/cutecoin/models/transaction.py +++ b/src/cutecoin/models/transaction.py @@ -4,13 +4,17 @@ Created on 1 févr. 2014 @author: inso ''' -class TransactionModel(object): +class Transaction(object): ''' classdocs ''' - def __init__(self, params): + def __init__(self, value, sender, receiver, currency): ''' Constructor ''' + self.value = value + self.sender = sender + self.receiver = receiver + self.currency = currency diff --git a/src/cutecoin/models/wallet.py b/src/cutecoin/models/wallet.py index 9d6e4929..fb9c9aa1 100644 --- a/src/cutecoin/models/wallet.py +++ b/src/cutecoin/models/wallet.py @@ -4,13 +4,16 @@ Created on 1 févr. 2014 @author: inso ''' -class WalletModel(object): +class Wallet(object): ''' classdocs ''' - def __init__(self, params): + def __init__(self, currency): ''' Constructor ''' + self.initialValue = 0 + self.coins = [] + self.currency = currency -- GitLab