diff --git a/res/ui/accountConfigurationDialog.ui b/res/ui/accountConfigurationDialog.ui index c7d28bc9a97629ae68431a17623a2e5e2eb70373..e1cfb9aa731770e7034a4af75889dde27a936873 100644 --- a/res/ui/accountConfigurationDialog.ui +++ b/res/ui/accountConfigurationDialog.ui @@ -138,7 +138,7 @@ <sender>button_add_community</sender> <signal>clicked()</signal> <receiver>AccountConfigurationDialog</receiver> - <slot>open_add_community_dialog()</slot> + <slot>open_process_add_community()</slot> <hints> <hint type="sourcelabel"> <x>109</x> @@ -170,7 +170,7 @@ <sender>list_communities</sender> <signal>doubleClicked(QModelIndex)</signal> <receiver>AccountConfigurationDialog</receiver> - <slot>open_edit_community_dialog(QModelIndex)</slot> + <slot>open_process_edit_community(QModelIndex)</slot> <hints> <hint type="sourcelabel"> <x>199</x> @@ -184,9 +184,9 @@ </connection> </connections> <slots> - <slot>open_add_community_dialog()</slot> + <slot>open_process_add_community()</slot> <slot>key_changed(int)</slot> <slot>action_remove_community()</slot> - <slot>open_edit_community_dialog(QModelIndex)</slot> + <slot>open_process_edit_community(QModelIndex)</slot> </slots> </ui> diff --git a/res/ui/communityConfigurationDialog.ui b/res/ui/communityConfigurationDialog.ui index 28cdbae627d9442edfee300a8076183e73f3495b..2e440ce6120766dcc32293a009787aa84374e3da 100644 --- a/res/ui/communityConfigurationDialog.ui +++ b/res/ui/communityConfigurationDialog.ui @@ -10,6 +10,9 @@ <height>300</height> </rect> </property> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> <property name="windowTitle"> <string>Add a community</string> </property> @@ -18,110 +21,226 @@ </property> <layout class="QVBoxLayout" name="verticalLayout"> <item> - <widget class="QGroupBox" name="groupBox_2"> - <property name="title"> - <string>Communities nodes</string> + <widget class="QStackedWidget" name="stacked_pages"> + <property name="currentIndex"> + <number>0</number> </property> - <layout class="QVBoxLayout" name="verticalLayout_3"> - <item> - <widget class="QTreeView" name="tree_nodes"> - <property name="contextMenuPolicy"> - <enum>Qt::CustomContextMenu</enum> - </property> - </widget> - </item> - <item> - <layout class="QHBoxLayout" name="horizontalLayout_3"> - <item> - <widget class="QLineEdit" name="server_edit"> - <property name="text"> - <string/> - </property> - <property name="placeholderText"> - <string>Server</string> - </property> - </widget> - </item> - <item> - <widget class="QSpinBox" name="port_box"> - <property name="minimum"> - <number>1025</number> - </property> - <property name="maximum"> - <number>99999</number> - </property> - <property name="value"> - <number>8081</number> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="add_button"> - <property name="text"> - <string>Add</string> - </property> - </widget> - </item> - </layout> - </item> - </layout> + <widget class="QWidget" name="page_init"> + <layout class="QVBoxLayout" name="verticalLayout_4"> + <item> + <spacer name="verticalSpacer_2"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>Please enter the address of a node :</string> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout"> + <property name="rightMargin"> + <number>5</number> + </property> + <item> + <widget class="QLineEdit" name="lineedit_server"/> + </item> + <item> + <widget class="QLabel" name="label_double_dot"> + <property name="text"> + <string>:</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="spinbox_port"> + <property name="maximum"> + <number>25000</number> + </property> + <property name="value"> + <number>8081</number> + </property> + </widget> + </item> + </layout> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_2"/> + </item> + <item> + <spacer name="verticalSpacer"> + <property name="orientation"> + <enum>Qt::Vertical</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>20</width> + <height>40</height> + </size> + </property> + </spacer> + </item> + </layout> + </widget> + <widget class="QWidget" name="page_add_nodes"> + <layout class="QVBoxLayout" name="verticalLayout_2"> + <item> + <widget class="QGroupBox" name="groupBox_2"> + <property name="title"> + <string>Communities nodes</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout_3"> + <item> + <widget class="QTreeView" name="tree_nodes"> + <property name="contextMenuPolicy"> + <enum>Qt::CustomContextMenu</enum> + </property> + </widget> + </item> + <item> + <layout class="QHBoxLayout" name="horizontalLayout_3"> + <item> + <widget class="QLineEdit" name="lineedit_add_address"> + <property name="text"> + <string/> + </property> + <property name="placeholderText"> + <string>Server</string> + </property> + </widget> + </item> + <item> + <widget class="QSpinBox" name="spinbox_add_port"> + <property name="minimum"> + <number>1025</number> + </property> + <property name="maximum"> + <number>99999</number> + </property> + <property name="value"> + <number>8081</number> + </property> + </widget> + </item> + <item> + <widget class="QPushButton" name="button_add"> + <property name="text"> + <string>Add</string> + </property> + </widget> + </item> + </layout> + </item> + </layout> + </widget> + </item> + </layout> + </widget> + <widget class="QWidget" name="page_wallets"> + <layout class="QVBoxLayout" name="verticalLayout_5"> + <item> + <widget class="QTabWidget" name="tabs_wallets"> + <property name="currentIndex"> + <number>-1</number> + </property> + </widget> + </item> + </layout> + </widget> </widget> </item> <item> - <widget class="QDialogButtonBox" name="button_box"> - <property name="orientation"> - <enum>Qt::Horizontal</enum> - </property> - <property name="standardButtons"> - <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set> - </property> - </widget> + <layout class="QHBoxLayout" name="horizontalLayout_4"> + <item> + <widget class="QPushButton" name="button_previous"> + <property name="enabled"> + <bool>false</bool> + </property> + <property name="text"> + <string>Previous</string> + </property> + </widget> + </item> + <item> + <spacer name="horizontalSpacer_2"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="sizeHint" stdset="0"> + <size> + <width>40</width> + <height>20</height> + </size> + </property> + </spacer> + </item> + <item> + <widget class="QPushButton" name="button_next"> + <property name="enabled"> + <bool>true</bool> + </property> + <property name="text"> + <string>Next</string> + </property> + </widget> + </item> + </layout> </item> </layout> </widget> <resources/> <connections> <connection> - <sender>button_box</sender> - <signal>accepted()</signal> + <sender>button_add</sender> + <signal>clicked()</signal> <receiver>CommunityConfigurationDialog</receiver> - <slot>accept()</slot> + <slot>add_node()</slot> <hints> <hint type="sourcelabel"> - <x>248</x> - <y>254</y> + <x>337</x> + <y>236</y> </hint> <hint type="destinationlabel"> - <x>157</x> - <y>274</y> + <x>199</x> + <y>149</y> </hint> </hints> </connection> <connection> - <sender>button_box</sender> - <signal>rejected()</signal> + <sender>tree_nodes</sender> + <signal>customContextMenuRequested(QPoint)</signal> <receiver>CommunityConfigurationDialog</receiver> - <slot>reject()</slot> + <slot>showContextMenu(QPoint)</slot> <hints> <hint type="sourcelabel"> - <x>316</x> - <y>260</y> + <x>199</x> + <y>128</y> </hint> <hint type="destinationlabel"> - <x>286</x> - <y>274</y> + <x>199</x> + <y>149</y> </hint> </hints> </connection> <connection> - <sender>add_button</sender> + <sender>button_next</sender> <signal>clicked()</signal> <receiver>CommunityConfigurationDialog</receiver> - <slot>add_node()</slot> + <slot>next()</slot> <hints> <hint type="sourcelabel"> - <x>337</x> - <y>236</y> + <x>349</x> + <y>278</y> </hint> <hint type="destinationlabel"> <x>199</x> @@ -130,14 +249,14 @@ </hints> </connection> <connection> - <sender>tree_nodes</sender> - <signal>customContextMenuRequested(QPoint)</signal> + <sender>button_previous</sender> + <signal>clicked()</signal> <receiver>CommunityConfigurationDialog</receiver> - <slot>showContextMenu(QPoint)</slot> + <slot>previous()</slot> <hints> <hint type="sourcelabel"> - <x>199</x> - <y>128</y> + <x>49</x> + <y>278</y> </hint> <hint type="destinationlabel"> <x>199</x> @@ -149,5 +268,8 @@ <slots> <slot>add_node()</slot> <slot>showContextMenu(QPoint)</slot> + <slot>check()</slot> + <slot>next()</slot> + <slot>previous()</slot> </slots> </ui> diff --git a/res/ui/communityTabWidget.ui b/res/ui/communityTabWidget.ui index a5681fcec66a1525847e326df1a423fcb7ee7e80..73c017090e437e16e690416b929db87548ad0ab5 100644 --- a/res/ui/communityTabWidget.ui +++ b/res/ui/communityTabWidget.ui @@ -29,47 +29,12 @@ </layout> </item> <item> - <layout class="QVBoxLayout" name="verticalLayout"> - <item> - <widget class="QLabel" name="label_2"> - <property name="text"> - <string>Last issuances</string> - </property> - </widget> - </item> - <item> - <widget class="QPushButton" name="button_issuance"> - <property name="text"> - <string>Issue money</string> - </property> - </widget> - </item> - <item> - <widget class="QListView" name="list_issuances"/> - </item> - </layout> + <layout class="QVBoxLayout" name="verticalLayout"/> </item> </layout> </widget> <resources/> - <connections> - <connection> - <sender>button_issuance</sender> - <signal>clicked()</signal> - <receiver>CommunityTabWidget</receiver> - <slot>open_issuance_dialog()</slot> - <hints> - <hint type="sourcelabel"> - <x>296</x> - <y>42</y> - </hint> - <hint type="destinationlabel"> - <x>199</x> - <y>149</y> - </hint> - </hints> - </connection> - </connections> + <connections/> <slots> <slot>open_issuance_dialog()</slot> </slots> diff --git a/res/ui/issuanceDialog.ui b/res/ui/issuanceDialog.ui deleted file mode 100644 index 82728b1207ec590364e6aa29639deb146d934a06..0000000000000000000000000000000000000000 --- a/res/ui/issuanceDialog.ui +++ /dev/null @@ -1,106 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<ui version="4.0"> - <class>IssuanceDialog</class> - <widget class="QDialog" name="IssuanceDialog"> - <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> - <spacer name="verticalSpacer"> - <property name="orientation"> - <enum>Qt::Vertical</enum> - </property> - <property name="sizeHint" stdset="0"> - <size> - <width>20</width> - <height>40</height> - </size> - </property> - </spacer> - </item> - <item> - <widget class="QLabel" name="label_total"> - <property name="text"> - <string>Total : </string> - </property> - <property name="alignment"> - <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> - </property> - </widget> - </item> - <item> - <widget class="QDialogButtonBox" name="button_box"> - <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>button_box</sender> - <signal>accepted()</signal> - <receiver>IssuanceDialog</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>button_box</sender> - <signal>rejected()</signal> - <receiver>IssuanceDialog</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> - <connection> - <sender>button_box</sender> - <signal>accepted()</signal> - <receiver>IssuanceDialog</receiver> - <slot>action_issue_coins()</slot> - <hints> - <hint type="sourcelabel"> - <x>199</x> - <y>279</y> - </hint> - <hint type="destinationlabel"> - <x>199</x> - <y>149</y> - </hint> - </hints> - </connection> - </connections> - <slots> - <slot>action_issue_coins()</slot> - </slots> -</ui> diff --git a/src/cutecoin/core/__init__.py b/src/cutecoin/core/__init__.py index 11ef6d81c8ba18d356613fc13a6d2fa760264949..c31390349a50a05e80fe754334ad6ce77f44f662 100644 --- a/src/cutecoin/core/__init__.py +++ b/src/cutecoin/core/__init__.py @@ -9,7 +9,7 @@ import logging import json from cutecoin.core import config -from cutecoin.core.exceptions import KeyAlreadyUsed +from cutecoin.tools.exceptions import KeyAlreadyUsed from cutecoin.models.account import Account diff --git a/src/cutecoin/gui/communityTabWidget.py b/src/cutecoin/gui/communityTabWidget.py index 1e26c34ee32121ac8d1172822b4d328118b2a334..e53a9c2d56ac0c3c9ddc7adf769adfffb5c577b8 100644 --- a/src/cutecoin/gui/communityTabWidget.py +++ b/src/cutecoin/gui/communityTabWidget.py @@ -7,8 +7,6 @@ Created on 2 févr. 2014 import logging from PyQt5.QtWidgets import QWidget from cutecoin.models.community.membersListModel import MembersListModel -from cutecoin.models.transaction.issuancesListModel import IssuancesListModel -from cutecoin.gui.issuanceDialog import IssuanceDialog from cutecoin.gen_resources.communityTabWidget_uic import Ui_CommunityTabWidget @@ -28,13 +26,3 @@ class CommunityTabWidget(QWidget, Ui_CommunityTabWidget): self.account = account #TODO: Rename to list: self.list_community_members.setModel(MembersListModel(community)) - self.list_issuances.setModel(IssuancesListModel(account, community)) - if self.account.issued_last_dividend(community): - self.button_issuance.setEnabled(False) - else: - self.button_issuance.setEnabled(True) - - def open_issuance_dialog(self): - logging.debug("Display dialog") - dialog = IssuanceDialog(self.account, self.community) - dialog.exec_() diff --git a/src/cutecoin/gui/configureAccountDialog.py b/src/cutecoin/gui/configureAccountDialog.py index 09538544e4e76b113ca1c5e0b40fd8b645b103cf..434f1d42d23cecc76586c9029086650f2a4a4bdc 100644 --- a/src/cutecoin/gui/configureAccountDialog.py +++ b/src/cutecoin/gui/configureAccountDialog.py @@ -4,9 +4,9 @@ Created on 6 mars 2014 @author: inso ''' from cutecoin.gen_resources.accountConfigurationDialog_uic import Ui_AccountConfigurationDialog -from cutecoin.gui.configureCommunityDialog import ConfigureCommunityDialog +from cutecoin.gui.processConfigureCommunity import ProcessConfigureCommunity from cutecoin.models.account.communities.listModel import CommunitiesListModel -from cutecoin.core.exceptions import KeyAlreadyUsed +from cutecoin.tools.exceptions import KeyAlreadyUsed from cutecoin.models.account import Account from cutecoin.models.account import Communities from cutecoin.models.node import Node @@ -59,21 +59,8 @@ class ConfigureAccountDialog(QDialog, Ui_AccountConfigurationDialog): self.list_communities.setModel(CommunitiesListModel(self.account)) self.edit_account_name.setText(self.account.name) - def open_add_community_dialog(self): - - text, ok = QInputDialog.getText( - self, 'Add a community', 'Enter a main node address you trust :') - - if ok: - server, port = text.split(':')[0], int(text.split(':')[1]) - - dialog = ConfigureCommunityDialog( - self.account, - None, - Node( - server, - port)) - dialog.button_box.accepted.connect(self.action_add_community) + def open_process_add_community(self): + dialog = ProcessConfigureCommunity(self.account, None) dialog.exec_() def action_add_community(self): @@ -92,9 +79,9 @@ class ConfigureAccountDialog(QDialog, Ui_AccountConfigurationDialog): def action_edit_community(self): self.list_communities.setModel(CommunitiesListModel(self.account)) - def open_edit_community_dialog(self, index): + def open_process_edit_community(self, index): community = self.account.communities.communities_list[index.row()] - dialog = ConfigureCommunityDialog(self.account, community) + dialog = ProcessConfigureCommunity(self.account, community) dialog.button_box.accepted.connect(self.action_edit_community) dialog.exec_() diff --git a/src/cutecoin/gui/configureCommunityDialog.py b/src/cutecoin/gui/configureCommunityDialog.py deleted file mode 100644 index 96eb6ecb601280e1914d7af7c9075b105f4ba4ee..0000000000000000000000000000000000000000 --- a/src/cutecoin/gui/configureCommunityDialog.py +++ /dev/null @@ -1,88 +0,0 @@ -''' -Created on 8 mars 2014 - -@author: inso -''' -import logging -from cutecoin.gen_resources.communityConfigurationDialog_uic import Ui_CommunityConfigurationDialog -from PyQt5.QtWidgets import QDialog, QErrorMessage, QMenu, QMessageBox -from cutecoin.models.community.treeModel import CommunityTreeModel -from cutecoin.models.node import Node -from cutecoin.core.exceptions import NotMemberOfCommunityError - - -class ConfigureCommunityDialog(QDialog, Ui_CommunityConfigurationDialog): - - ''' - classdocs - ''' - - def __init__(self, account, community, default_node=None): - ''' - Constructor - ''' - super(ConfigureCommunityDialog, self).__init__() - self.setupUi(self) - self.community = community - self.account = account - if self.community is None: - self.setWindowTitle("Add a community") - try: - default_node.trust = True - default_node.hoster = True - self.community = self.account.communities.add_community( - default_node) - self.account.wallets.add_wallet(self.community) - self.tree_nodes.setModel(CommunityTreeModel(self.community)) - # TODO: Ask for THT pull - msg_box = QMessageBox() - msg_box.setText("Add a community") - msg_box.setInformativeText( - "Would you like to existing THT from this community ?") - msg_box.setStandardButtons(QMessageBox.Yes | QMessageBox.No) - msg_box.exec_() - if msg_box.clickedButton() == QMessageBox.Yes: - self.account.pull_tht(self.community) - except NotMemberOfCommunityError as e: - QErrorMessage(self).showMessage(e.message) - else: - self.setWindowTitle( - "Configure community " + - self.community.currency) - self.tree_nodes.setModel(CommunityTreeModel(self.community)) - - def add_node(self): - ''' - Add node slot - ''' - server = self.edit_server.text() - port = self.box_port.value() - if self.community is not None: - self.community.nodes.append(Node(server, port, trust=True)) - self.tree_nodes.setModel(CommunityTreeModel(self.community)) - - def showContextMenu(self, point): - menu = QMenu() - action = menu.addAction("Delete", self.removeNode) - if self.community is not None: - if len(self.community.nodes) == 1: - action.setEnabled(False) - menu.exec_(self.tree_nodes.mapToGlobal(point)) - - def remove_node(self): - for index in self.tree_nodes.selectedIndexes(): - self.community.nodes.pop(index.row()) - - self.tree_nodes.setModel(CommunityTreeModel(self.community)) - - def accept(self): - reply = QMessageBox.question( - self, - "Trusts and hosters changed", - "Would you like to push THT to the community ?", - QMessageBox.Yes | QMessageBox.No) - if reply == QMessageBox.Yes: - logging.debug("Yes clicked") - self.account.push_tht(self.community) - - self.close() diff --git a/src/cutecoin/gui/issuanceDialog.py b/src/cutecoin/gui/issuanceDialog.py deleted file mode 100644 index 31d41f8e842dcb623d8428edd458d5cf3f377f87..0000000000000000000000000000000000000000 --- a/src/cutecoin/gui/issuanceDialog.py +++ /dev/null @@ -1,94 +0,0 @@ -''' -Created on 2 févr. 2014 - -@author: inso -''' -import logging -from math import pow - -from PyQt5.QtWidgets import QDialog, QVBoxLayout, QFrame, QSlider, QLabel, QDialogButtonBox -from PyQt5.QtCore import Qt, QSignalMapper - -from cutecoin.models.coin import Coin - -from cutecoin.gen_resources.issuanceDialog_uic import Ui_IssuanceDialog - - -class IssuanceDialog(QDialog, Ui_IssuanceDialog): - - ''' - classdocs - ''' - - def __init__(self, issuer, community): - ''' - Constructor - ''' - super(IssuanceDialog, self).__init__() - self.setupUi(self) - self.issuer = issuer - self.community = community - self.dividend = self.community.dividend() - self.coin_minimal_power = self.community.coin_minimal_power() - self.button_box.button(QDialogButtonBox.Ok).setEnabled(False) - - self.sliders = [] - self.sliders_labels = [] - max_coin_power = 1 - nmax = 0 - # We look for the power of 10 which is directly higher than the - # dividend - while max_coin_power < self.dividend: - max_coin_power = pow(10, nmax) - nmax += 1 - - # N max is the power just before the one we found - - logging.debug("Pow max : " + str(nmax)) - - for i in range(self.coinMinimalPower, nmax): - self.generateSliderFrame(i) - - def generateSliderFrame(self, n): - frame = QFrame(self) - frame.setLayout(QVBoxLayout()) - - label = QLabel(frame) - frame.layout().addWidget(label) - - slider = QSlider(Qt.Horizontal, frame) - slider.setMinimum(0) - slider.setMaximum(9) - slider.valueChanged.connect(self.refresh_total) - - frame.layout().addWidget(slider) - - label.setText("0 coins of " + str(pow(10, n))) - - self.sliders_labels.append(label) - self.sliders.append(slider) - - self.layout().insertWidget(n, frame) - - def refresh_total(self): - n = 0 - total = 0 - for slider in self.sliders: - self.sliders_labels[n].setText( - str(slider.value()) + " coins of " + str(pow(10, n))) - self.total_label.setText("Total : " + str(total)) - total += slider.value() * pow(10, n) - n += 1 - self.total_label.setText("Total : " + str(total)) - if total != self.dividend: - self.button_box.button(QDialogButtonBox.Ok).setEnabled(False) - else: - self.button_box.button(QDialogButtonBox.Ok).setEnabled(True) - - def action_issue_coins(self): - coins = [] - n = 0 - for slider in self.sliders: - coins.append(str(slider.value()) + "," + str(n)) - n += 1 - self.issuer.issue_dividend(self.community, coins) diff --git a/src/cutecoin/models/account/__init__.py b/src/cutecoin/models/account/__init__.py index ad99bf5b734f6e1fceba144a8f077a48ffdada13..60ccc0dbf19ead1542c3185770ee76bd291e79ce 100644 --- a/src/cutecoin/models/account/__init__.py +++ b/src/cutecoin/models/account/__init__.py @@ -13,7 +13,7 @@ from cutecoin.models.account.communities import Communities from cutecoin.models.community import Community from cutecoin.models.transaction import Transaction from cutecoin.models.person import Person -from cutecoin.core.exceptions import CommunityNotFoundError +from cutecoin.tools.exceptions import CommunityNotFoundError class Account(object): @@ -128,56 +128,6 @@ class Account(object): port=node.port) return transfer() - #TODO: Adapt to new WHT - def tht(self, community): - if community in self.communities.communities_list: - #tht = community.ucoinRequest(ucoin.wallets.tht(self.fingerprint())) - #return tht['entries'] - return None - return None - - def push_tht(self, community): - if community in self.communities.communities_list: - hosters_fg = [] - trusts_fg = [] - for trust in community.network.trusts(): - peering = trust.peering() - logging.debug(peering) - trusts_fg.append(peering['fingerprint']) - for hoster in community.network.hosters(): - logging.debug(peering) - peering = hoster.peering() - hosters_fg.append(peering['fingerprint']) - entry = { - 'version': '1', - 'currency': community.currency, - 'fingerprint': self.fingerprint(), - 'hosters': hosters_fg, - 'trusts': trusts_fg - } - logging.debug(entry) - json_entry = json.JSONEncoder(indent=2).encode(entry) - gpg = gnupg.GPG() - signature = gpg.sign(json_entry, keyid=self.keyid, clearsign=True) - - dataPost = { - 'entry': entry, - 'signature': str(signature) - } - - #community.network.post( - # ucoin.ucg.THT( - # pgp_fingerprint=self.fingerprint()), - # dataPost) - else: - raise CommunityNotFoundError(self.keyid, community.amendment_id()) - - def pull_tht(self, community): - if community in self.communities.communities_list: - community.pull_tht(self.fingerprint()) - else: - raise CommunityNotFoundError(self.keyid, community.amendment_id()) - def quality(self, community): if community in self.communities.communities_list: return community.person_quality(self.fingerprint()) diff --git a/src/cutecoin/models/account/communities/__init__.py b/src/cutecoin/models/account/communities/__init__.py index 201265d88bc295c0a925b9f5db8b7382a8a88e04..829ea4df1547629f0c978d1db1b4e7219bbbf5da 100644 --- a/src/cutecoin/models/account/communities/__init__.py +++ b/src/cutecoin/models/account/communities/__init__.py @@ -4,7 +4,6 @@ Created on 5 févr. 2014 @author: inso ''' from cutecoin.models.community import Community -from cutecoin.core.exceptions import NotMemberOfCommunityError import ucoin import logging diff --git a/src/cutecoin/models/community/treeModel.py b/src/cutecoin/models/community/treeModel.py index 9f671ee927a56dd88a758b8c060151004b74e679..81c5ec791c8c61c5b4f6a5b2b259be13dbc880c9 100644 --- a/src/cutecoin/models/community/treeModel.py +++ b/src/cutecoin/models/community/treeModel.py @@ -26,7 +26,7 @@ class CommunityTreeModel(QAbstractItemModel): self.refresh_tree_nodes() def columnCount(self, parent): - return 3 + return 1 def data(self, index, role): if not index.isValid(): @@ -36,10 +36,6 @@ class CommunityTreeModel(QAbstractItemModel): if role == Qt.DisplayRole and index.column() == 0: return item.data(0) - elif role == Qt.CheckStateRole and index.column() == 1: - return Qt.Checked if item.trust else Qt.Unchecked - elif role == Qt.CheckStateRole and index.column() == 2: - return Qt.Checked if item.hoster else Qt.Unchecked return None @@ -49,16 +45,10 @@ class CommunityTreeModel(QAbstractItemModel): if index.column() == 0: return Qt.ItemIsEnabled | Qt.ItemIsSelectable - else: - return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsUserCheckable def headerData(self, section, orientation, role): if orientation == Qt.Horizontal and role == Qt.DisplayRole and section == 0: return self.root_item.data(0) + " nodes" - elif orientation == Qt.Horizontal and role == Qt.DisplayRole and section == 1: - return "Trust" - elif orientation == Qt.Horizontal and role == Qt.DisplayRole and section == 2: - return "Hoster" return None def index(self, row, column, parent): @@ -101,17 +91,6 @@ class CommunityTreeModel(QAbstractItemModel): def setData(self, index, value, role=Qt.EditRole): if index.column() == 0: - return False - - if role == Qt.EditRole: - return False - if role == Qt.CheckStateRole: - item = index.internalPointer() - if index.column() == 1: - item.trust = value - elif index.column() == 2: - item.host = value - self.dataChanged.emit(index, index) return True def refresh_tree_nodes(self): @@ -120,7 +99,7 @@ class CommunityTreeModel(QAbstractItemModel): node_item = NodeItem(node, self.root_item) logging.debug( "mainNode : " + - node.getText() + + node.get_text() + " / " + node_item.data(0)) self.root_item.appendChild(node_item) @@ -128,7 +107,7 @@ class CommunityTreeModel(QAbstractItemModel): child_node_item = NodeItem(node, node_item) logging.debug( "\t node : " + - node.getText() + + node.get_text() + " / " + child_node_item.data(0)) node_item.appendChild(child_node_item) diff --git a/src/cutecoin/models/community/trustsTreeModel.py b/src/cutecoin/models/community/trustsTreeModel.py new file mode 100644 index 0000000000000000000000000000000000000000..3a217772ac322dc3501cb4d8eaf4104b23dce01b --- /dev/null +++ b/src/cutecoin/models/community/trustsTreeModel.py @@ -0,0 +1,134 @@ +''' +Created on 5 févr. 2014 + +@author: inso +''' + +from PyQt5.QtCore import QAbstractItemModel, QModelIndex, Qt +from cutecoin.models.node.itemModel import NodeItem +from cutecoin.models.community.itemModel import CommunityItemModel +import logging + + +class CommunityTrustsTreeModel(QAbstractItemModel): + + ''' + A Qt abstract item model to display nodes of a community + ''' + + def __init__(self, community): + ''' + Constructor + ''' + super(CommunityTrustsTreeModel, self).__init__(None) + self.community = community + self.root_item = CommunityItemModel(self.community) + self.refresh_tree_nodes() + + def columnCount(self, parent): + return 3 + + def data(self, index, role): + if not index.isValid(): + return None + + item = index.internalPointer() + + if role == Qt.DisplayRole and index.column() == 0: + return item.data(0) + elif role == Qt.CheckStateRole and index.column() == 1: + return Qt.Checked if item.trust else Qt.Unchecked + elif role == Qt.CheckStateRole and index.column() == 2: + return Qt.Checked if item.hoster else Qt.Unchecked + + return None + + def flags(self, index): + if not index.isValid(): + return Qt.NoItemFlags + + if index.column() == 0: + return Qt.ItemIsEnabled | Qt.ItemIsSelectable + else: + return Qt.ItemIsEnabled | Qt.ItemIsSelectable | Qt.ItemIsUserCheckable + + def headerData(self, section, orientation, role): + if orientation == Qt.Horizontal and role == Qt.DisplayRole and section == 0: + return self.root_item.data(0) + " nodes" + elif orientation == Qt.Horizontal and role == Qt.DisplayRole and section == 1: + return "Trust" + elif orientation == Qt.Horizontal and role == Qt.DisplayRole and section == 2: + return "Hoster" + return None + + def index(self, row, column, parent): + if not self.hasIndex(row, column, parent): + return QModelIndex() + + if not parent.isValid(): + parent_item = self.root_item + else: + parent_item = parent.internalPointer() + + child_item = parent_item.child(row) + if child_item: + return self.createIndex(row, column, child_item) + else: + return QModelIndex() + + def parent(self, index): + if not index.isValid(): + return QModelIndex() + + child_item = index.internalPointer() + parent_item = child_item.parent() + + if parent_item == self.root_item: + return QModelIndex() + + return self.createIndex(parent_item.row(), 0, parent_item) + + def rowCount(self, parent): + if parent.column() > 0: + return 0 + + if not parent.isValid(): + parent_item = self.root_item + else: + parent_item = parent.internalPointer() + + return parent_item.childCount() + + def setData(self, index, value, role=Qt.EditRole): + if index.column() == 0: + return False + + if role == Qt.EditRole: + return False + if role == Qt.CheckStateRole: + item = index.internalPointer() + if index.column() == 1: + item.trust = value + elif index.column() == 2: + item.host = value + self.dataChanged.emit(index, index) + return True + + def refresh_tree_nodes(self): + logging.debug("root : " + self.root_item.data(0)) + for node in self.community.network.nodes: + node_item = NodeItem(node, self.root_item) + logging.debug( + "mainNode : " + + node.getText() + + " / " + + node_item.data(0)) + self.root_item.appendChild(node_item) + for node in node.downstream_peers(): + child_node_item = NodeItem(node, node_item) + logging.debug( + "\t node : " + + node.getText() + + " / " + + child_node_item.data(0)) + node_item.appendChild(child_node_item) diff --git a/src/cutecoin/models/node/itemModel.py b/src/cutecoin/models/node/itemModel.py index ca9b4befb4d9445cbfd321ba4bcb98048c0be68e..b55f309cba8ae340e98ad7577add4fd2a0990390 100644 --- a/src/cutecoin/models/node/itemModel.py +++ b/src/cutecoin/models/node/itemModel.py @@ -9,7 +9,7 @@ class NodeItem(object): def __init__(self, main_node, community_item=None): self.community_item = community_item - self.main_node_text = main_node.getText() + self.main_node_text = main_node.get_text() self.trust = main_node.trust self.hoster = main_node.hoster self.node_items = [] diff --git a/src/cutecoin/models/person/__init__.py b/src/cutecoin/models/person/__init__.py index cd6ff8b658ec1cf473c0b9166929ce44fef57ae7..720e6b553b4ed9d7cc0e431e8941aefe81000fd7 100644 --- a/src/cutecoin/models/person/__init__.py +++ b/src/cutecoin/models/person/__init__.py @@ -5,7 +5,7 @@ Created on 11 févr. 2014 ''' import ucoin -from cutecoin.core.exceptions import PersonNotFoundError +from cutecoin.tools.exceptions import PersonNotFoundError class Person(object): diff --git a/src/cutecoin/models/transaction/issuancesListModel.py b/src/cutecoin/models/transaction/issuancesListModel.py deleted file mode 100644 index 658c7faf7b4f93e5abe333336c688a41be049e8b..0000000000000000000000000000000000000000 --- a/src/cutecoin/models/transaction/issuancesListModel.py +++ /dev/null @@ -1,34 +0,0 @@ -''' -Created on 5 févr. 2014 - -@author: inso -''' - -from PyQt5.QtCore import QAbstractListModel, Qt - - -class IssuancesListModel(QAbstractListModel): - - ''' - A Qt abstract item model to display communities in a tree - ''' - - def __init__(self, account, community, parent=None): - ''' - Constructor - ''' - super(IssuancesListModel, self).__init__(parent) - self.issuances = account.last_issuances(community) - - def rowCount(self, parent): - return len(self.issuances) - - def data(self, index, role): - - if role == Qt.DisplayRole: - row = index.row() - value = self.issuances[row].getText() - return value - - def flags(self, index): - return Qt.ItemIsSelectable | Qt.ItemIsEnabled diff --git a/src/cutecoin/models/wallet/__init__.py b/src/cutecoin/models/wallet/__init__.py index 8eeca0ea94418c19d4b0c494a9f7a216d17ea309..e1e23ee846bcca2ed3c6be52bc738fd5d823008d 100644 --- a/src/cutecoin/models/wallet/__init__.py +++ b/src/cutecoin/models/wallet/__init__.py @@ -5,8 +5,11 @@ Created on 1 févr. 2014 ''' import ucoin +import logging import gnupg +import json from cutecoin.models.coin import Coin +from cutecoin.tools.exceptions import CommunityNotFoundError class Wallet(object): @@ -16,13 +19,14 @@ class Wallet(object): It's only used to sort coins. ''' - def __init__(self, coins, community): + def __init__(self, fingerprint, coins, community, name="Main Wallet"): ''' Constructor ''' self.coins = coins + self.fingerprint = fingerprint self.community = community - self.name = "Main Wallet" + self.name = name @classmethod def create(cls, community): @@ -45,9 +49,9 @@ class Wallet(object): return value # TODO: Refresh coins when changing current account - def refresh_coins(self, fingerprint): + def refresh_coins(self): data_list = self.community.network.request( - ucoin.hdc.coins.List({'pgp_fingerprint': fingerprint})) + ucoin.hdc.coins.List({'pgp_fingerprint': self.fingerprint})) for issuances in data_list['coins']: issuer = issuances['issuer'] for coins_ids in issuances['ids']: @@ -55,6 +59,57 @@ class Wallet(object): coin = Coin.from_id(issuer + "-" + shortened_id) self.coins.append(coin) + + #TODO: Adapt to new WHT + def tht(self, community): + if community in self.communities.communities_list: + #tht = community.ucoinRequest(ucoin.wallets.tht(self.fingerprint())) + #return tht['entries'] + return None + return None + + def push_tht(self, community): + if community in self.communities.communities_list: + hosters_fg = [] + trusts_fg = [] + for trust in community.network.trusts(): + peering = trust.peering() + logging.debug(peering) + trusts_fg.append(peering['fingerprint']) + for hoster in community.network.hosters(): + logging.debug(peering) + peering = hoster.peering() + hosters_fg.append(peering['fingerprint']) + entry = { + 'version': '1', + 'currency': community.currency, + 'fingerprint': self.fingerprint(), + 'hosters': hosters_fg, + 'trusts': trusts_fg + } + logging.debug(entry) + json_entry = json.JSONEncoder(indent=2).encode(entry) + gpg = gnupg.GPG() + signature = gpg.sign(json_entry, keyid=self.keyid, clearsign=True) + + dataPost = { + 'entry': entry, + 'signature': str(signature) + } + + #community.network.post( + # ucoin.ucg.THT( + # pgp_fingerprint=self.fingerprint()), + # dataPost) + else: + raise CommunityNotFoundError(self.keyid, community.amendment_id()) + + def pull_tht(self, community): + if community in self.communities.communities_list: + community.pull_tht(self.fingerprint()) + else: + raise CommunityNotFoundError(self.keyid, community.amendment_id()) + def get_text(self): return self.name + " : " + \ str(self.value()) + " " + self.community.currency diff --git a/src/cutecoin/core/exceptions.py b/src/cutecoin/tools/exceptions.py similarity index 100% rename from src/cutecoin/core/exceptions.py rename to src/cutecoin/tools/exceptions.py