diff --git a/res/ui/addContactDialog.ui b/res/ui/addContactDialog.ui index 0a42df89e7c32a265114c0f9aa8454f467d5d506..b9f2ad6148b07b47323af16a7acc34602175eaeb 100644 --- a/res/ui/addContactDialog.ui +++ b/res/ui/addContactDialog.ui @@ -60,7 +60,7 @@ </layout> </item> <item> - <widget class="QDialogButtonBox" name="buttonBox"> + <widget class="QDialogButtonBox" name="button_box"> <property name="orientation"> <enum>Qt::Horizontal</enum> </property> @@ -74,7 +74,7 @@ <resources/> <connections> <connection> - <sender>buttonBox</sender> + <sender>button_box</sender> <signal>accepted()</signal> <receiver>AddContactDialog</receiver> <slot>accept()</slot> @@ -90,7 +90,7 @@ </hints> </connection> <connection> - <sender>buttonBox</sender> + <sender>button_box</sender> <signal>rejected()</signal> <receiver>AddContactDialog</receiver> <slot>reject()</slot> diff --git a/res/ui/transferDialog.ui b/res/ui/transferDialog.ui index a8035cf87a0702d888e1cf8ed6d7fe27ad012027..90127cd5a5d0d86ae11ee594aa488866470b5298 100644 --- a/res/ui/transferDialog.ui +++ b/res/ui/transferDialog.ui @@ -104,15 +104,12 @@ </widget> </item> <item> - <widget class="QLineEdit" name="edit_port"> - <property name="sizePolicy"> - <sizepolicy hsizetype="Minimum" vsizetype="Fixed"> - <horstretch>0</horstretch> - <verstretch>0</verstretch> - </sizepolicy> + <widget class="QSpinBox" name="spinbox_port"> + <property name="maximum"> + <number>99999</number> </property> - <property name="placeholderText"> - <string>Port</string> + <property name="value"> + <number>8081</number> </property> </widget> </item> diff --git a/src/cutecoin/gui/addContactDialog.py b/src/cutecoin/gui/addContactDialog.py index 4d08264dd69185bb198c34aff9559c5273d0a45f..1946e1dc78f7f94d0d95013effe59a03a1483e6e 100644 --- a/src/cutecoin/gui/addContactDialog.py +++ b/src/cutecoin/gui/addContactDialog.py @@ -32,8 +32,8 @@ class AddContactDialog(QDialog, Ui_AddContactDialog): name = self.edit_name.text() fingerprint = self.edit_fingerprint.text() email = self.edit_email.text() - self.account.addContact(Person(name, fingerprint, email)) - self.main_window.menu_contactsList.addAction(name) + self.account.add_contact(Person(name, fingerprint, email)) + self.main_window.menu_contacts_list.addAction(name) self.close() def name_edited(self, new_name): diff --git a/src/cutecoin/gui/transferMoneyDialog.py b/src/cutecoin/gui/transferMoneyDialog.py index c7c2344cd0c0df2c9aec0a4622bae550e81ef94a..ba856a7a56030d160d6d5645015746ad5011b861 100644 --- a/src/cutecoin/gui/transferMoneyDialog.py +++ b/src/cutecoin/gui/transferMoneyDialog.py @@ -3,13 +3,9 @@ Created on 2 févr. 2014 @author: inso ''' -import logging -from math import pow +from PyQt5.QtWidgets import QDialog, QErrorMessage -from PyQt5.QtWidgets import QDialog, QFrame, QSlider, QLabel, QDialogButtonBox, QErrorMessage - -from cutecoin.models.coin import Coin from cutecoin.models.person import Person from cutecoin.models.node import Node from cutecoin.models.coin.listModel import CoinsListModel @@ -30,13 +26,17 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog): super(TransferMoneyDialog, self).__init__() self.setupUi(self) self.sender = sender + self.wallet = sender.wallets[0] for wallet in sender.wallets: self.combo_wallets.addItem(wallet.get_text()) + for trust in wallet.trusts(): + self.combo_trusted_node.addItem(trust.get_text()) + for contact in sender.contacts: self.combo_contact.addItem(contact.name) - self.refresh_transaction(sender.wallets[0]) + self.refresh_transaction() def remove_coins_from_transfer(self): selection = self.list_coins_sent.selectedIndexes() @@ -47,26 +47,27 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog): coin = sent_coins[selected.row()] sent_coins.remove(coin) wallet_coins.append(coin) - self.list_wallet.setModel(CoinsListModel(wallet_coins)) - self.list_coins_sent.setModel(CoinsListModel(new_wallet)) + self.list_wallet.setModel(CoinsListModel(self.wallet, wallet_coins)) + self.list_coins_sent.setModel(CoinsListModel(self.wallet, new_wallet)) def add_coins_to_transfer(self): selection = self.list_wallet.selectedIndexes() wallet_coins = self.list_wallet.model().coins sent_coins = self.list_coins_sent.model().coins - new_wallet = wallet_coins + new_wallet_coins = wallet_coins for selected in selection: coin = wallet_coins[selected.row()] - new_wallet.remove(coin) + new_wallet_coins.remove(coin) sent_coins.append(coin) - self.list_wallet.setModel(CoinsListModel(new_wallet)) - self.list_coins_sent.setModel(CoinsListModel(sent_coins)) + self.list_wallet.setModel(CoinsListModel(self.wallet, + new_wallet_coins)) + self.list_coins_sent.setModel(CoinsListModel(self.wallet, sent_coins)) def open_manage_wallet_coins(self): pass def accept(self): - sent_coins = self.list_coins_sent.model().toList() + sent_coins = self.list_coins_sent.model().to_list() recipient = None if self.radio_key_fingerprint.isChecked(): @@ -78,28 +79,28 @@ class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog): if self.radio_node_address.isChecked(): node = Node.create( self.edit_node_address.text(), int( - self.edit_port.text())) + self.spinbox_port.text())) else: # TODO: Manage trusted nodes - node = Node.create( - self.edit_node_address.text(), int( - self.edit_port.text())) + node = self.wallet.trusts()[self.combo_trusted_node.currentIndex()] message = self.edit_message.text() # TODO: Transfer money, and validate the window if no error happened - if self.sender.transfer_coins(node, recipient, sent_coins, message): - self.close() + error = self.wallet.transfer_coins(node, recipient, sent_coins, message) + if error: + QErrorMessage(self).showMessage("Cannot transfer coins " + error) else: - QErrorMessage(self).showMessage("Cannot transfer coins.") + self.close() def change_displayed_wallet(self, index): - wallet = self.sender.wallets[index] - self.refresh_transaction(wallet) + self.wallet = self.sender.wallets[index] + self.refresh_transaction() - def refresh_transaction(self, wallet): - coins_sent_model = CoinsListModel([]) + def refresh_transaction(self): + coins_sent_model = CoinsListModel(self.wallet, []) self.list_coins_sent.setModel(coins_sent_model) - wallet_coins_model = CoinsListModel(list(wallet.coins)) + wallet_coins_model = CoinsListModel(self.wallet, + list(self.wallet.coins)) self.list_wallet.setModel(wallet_coins_model) def recipient_mode_changed(self, fingerprint_toggled): diff --git a/src/cutecoin/models/account/__init__.py b/src/cutecoin/models/account/__init__.py index f34f993b9816325cbcb61358b35dda5e94f0b3c1..f043b20da33c0f9479507d06e1165e1012279ed4 100644 --- a/src/cutecoin/models/account/__init__.py +++ b/src/cutecoin/models/account/__init__.py @@ -30,6 +30,7 @@ class Account(object): self.keyid = keyid self.name = name self.communities = communities + print(len(communities)) self.wallets = wallets self.contacts = contacts @@ -86,17 +87,6 @@ class Account(object): return k['fingerprint'] return "" - def transfer_coins(self, node, recipient, coins, message): - transfer = ucoin.wrappers.transactions.RawTransfer( - self.fingerprint(), - recipient.fingerprint, - coins, - message, - keyid=self.keyid, - server=node.server, - port=node.port) - return transfer() - def transactions_received(self): received = [] for w in self.wallets: diff --git a/src/cutecoin/models/account/communities/__init__.py b/src/cutecoin/models/account/communities/__init__.py index bd172932ae4e4ef58b94c78f96399511d6d5b994..22241f288312ef4f27b5a79b7610dc7ad8657625 100644 --- a/src/cutecoin/models/account/communities/__init__.py +++ b/src/cutecoin/models/account/communities/__init__.py @@ -18,7 +18,7 @@ class Communities(object): ''' Constructor ''' - self._communities_list = [] + self._communities_list = _communities_list @classmethod def create(cls): diff --git a/src/cutecoin/models/account/wallets/__init__.py b/src/cutecoin/models/account/wallets/__init__.py index e0432c9830b9f232ce57d35a4716b6d6e82cbf7b..0a9ae2395b0d3753f26e93fc02f5e730a5056cff 100644 --- a/src/cutecoin/models/account/wallets/__init__.py +++ b/src/cutecoin/models/account/wallets/__init__.py @@ -54,9 +54,8 @@ class Wallets(object): wallet = Wallet.create(keyid, community, node, required_trusts, name) # We try to add already present nodes to the wallet - try: - present_nodes = wallet.get_nodes_in_peering(wallet.pull_wht()) - except ValueError: + present_nodes = wallet.get_nodes_in_peering(wallet.pull_wht()) + if present_nodes is None: present_nodes = [] for present_node in present_nodes: @@ -73,11 +72,12 @@ class Wallets(object): return Wallets([w for w in self._wallets_list if w.currency == currency]) def request(self, request, get_args={}): + response = None for wallet in self._wallets_list: try: response = wallet.request(request, get_args) except: - pass + continue return response def post(self, request, get_args={}): @@ -85,7 +85,7 @@ class Wallets(object): try: response = wallet.post(request, get_args) except: - pass + continue return response def jsonify(self): diff --git a/src/cutecoin/models/coin/listModel.py b/src/cutecoin/models/coin/listModel.py index 106a786b38ac705d258b989df208289999f3495a..51d620a94efd2a3c65291daf7c58a17f3c2e2288 100644 --- a/src/cutecoin/models/coin/listModel.py +++ b/src/cutecoin/models/coin/listModel.py @@ -13,12 +13,13 @@ class CoinsListModel(QAbstractListModel): A Qt abstract item model to display communities in a tree ''' - def __init__(self, coins, parent=None): + def __init__(self, wallet, coins, parent=None): ''' Constructor ''' super(CoinsListModel, self).__init__(parent) self.coins = coins + self.wallet = wallet def rowCount(self, parent): return len(self.coins) @@ -26,14 +27,14 @@ class CoinsListModel(QAbstractListModel): def data(self, index, role): if role == Qt.DisplayRole: row = index.row() - value = str(self.coins[row].value()) + value = str(self.coins[row].value(self.wallet)) return value def flags(self, index): return Qt.ItemIsSelectable | Qt.ItemIsEnabled - def toList(self): + def to_list(self): coins_list = [] for c in self.coins: - coins_list.append(c.getId()) + coins_list.append(c.get_id()) return coins_list diff --git a/src/cutecoin/models/community/__init__.py b/src/cutecoin/models/community/__init__.py index eea03aa10e26450f4c66eb28a934128bcf27f1f8..cb7141182e694dc08c44a9dc6070421681cf6aaa 100644 --- a/src/cutecoin/models/community/__init__.py +++ b/src/cutecoin/models/community/__init__.py @@ -73,12 +73,19 @@ class Community(object): return int(current_amendment['number']) def person_quality(self, wallets, fingerprint): - if (fingerprint in self.voters_fingerprints(wallets)): - return "voter" - elif (fingerprint in self.members_fingerprints(wallets)): - return "member" + quality = 'nothing' + voter_req = ucoin.registry.community.voters.Current(fingerprint) + data = wallets.request(voter_req) + if data: + quality = 'voter' else: - return "nothing" + member_req = ucoin.registry.community.members.Current(fingerprint) + data = wallets.request(member_req) + if data: + membership = data['membership'] + if membership['membership'] == 'IN': + quality = 'member' + return quality def members_fingerprints(self, wallets): ''' @@ -87,7 +94,6 @@ class Community(object): memberships = wallets.request( ucoin.registry.community.Members()) members = [] - print(memberships) for m in memberships: members.append(m['membership']['issuer']) return members diff --git a/src/cutecoin/models/transaction/__init__.py b/src/cutecoin/models/transaction/__init__.py index 16f5dc7e597cfe4b6c3e5d8e2d79e1c7f42a92fa..33c28edff37a4d94c8fafebf7d8a92079b8e5cc9 100644 --- a/src/cutecoin/models/transaction/__init__.py +++ b/src/cutecoin/models/transaction/__init__.py @@ -33,7 +33,7 @@ class Transaction(object): transaction_data['recipient'], wallet) - return cls(Transaction(sender, tx_number, wallet, recipient)) + return cls(sender, tx_number, wallet, recipient) def value(self): value = 0 @@ -41,7 +41,8 @@ class Transaction(object): ucoin.hdc.transactions.sender.View(self.sender.fingerprint, self.tx_number)) for coin in trx_data['transaction']['coins']: - value += Coin.from_id(coin['id']).value() + coin = coin.split(':')[0] + value += Coin.from_id(self.wallet, coin).value(self.wallet) return value def currency(self): @@ -53,3 +54,9 @@ class Transaction(object): def transaction_id(self): return self.sender_fingerprint + "-" + self.increment + + def get_receiver_text(self): + return str(self.value()) + " from " + self.sender.name + + def get_sender_text(self): + return str(self.value()) + " to " + self.recipient.name diff --git a/src/cutecoin/models/transaction/receivedListModel.py b/src/cutecoin/models/transaction/receivedListModel.py index 9bbe63445e4726e57d58a4d8e3fab81fd307d0ef..82c78f45b8b5bd1cb52b22fec3b57601acba494a 100644 --- a/src/cutecoin/models/transaction/receivedListModel.py +++ b/src/cutecoin/models/transaction/receivedListModel.py @@ -29,7 +29,7 @@ class ReceivedListModel(QAbstractListModel): if role == Qt.DisplayRole: row = index.row() - value = self.transactions[row].get_text() + value = self.transactions[row].get_receiver_text() return value def flags(self, index): diff --git a/src/cutecoin/models/transaction/sentListModel.py b/src/cutecoin/models/transaction/sentListModel.py index dc767c2aab3f69e16980fe6e46997378e1d52ed2..4e2e48a07457e1f19870e6f588b692f3a1bef375 100644 --- a/src/cutecoin/models/transaction/sentListModel.py +++ b/src/cutecoin/models/transaction/sentListModel.py @@ -29,7 +29,7 @@ class SentListModel(QAbstractListModel): if role == Qt.DisplayRole: row = index.row() - value = self.transactions[row].getText() + value = self.transactions[row].get_sender_text() return value def flags(self, index): diff --git a/src/cutecoin/models/wallet/__init__.py b/src/cutecoin/models/wallet/__init__.py index 57ea71402cba04ee60c7ee795a953406f811c308..47001b58afefb04dbc14a6ea0b723a6cba77b606 100644 --- a/src/cutecoin/models/wallet/__init__.py +++ b/src/cutecoin/models/wallet/__init__.py @@ -24,12 +24,12 @@ class Wallet(object): It's only used to sort coins. ''' - def __init__(self, keyid, coins, currency, + def __init__(self, keyid, currency, nodes, required_trusts, name): ''' Constructor ''' - self.coins = coins + self.coins = [] self.keyid = keyid self.currency = currency self.name = name @@ -41,14 +41,11 @@ class Wallet(object): def create(cls, keyid, currency, node, required_trusts, name): node.trust = True node.hoster = True - return cls(keyid, [], currency, [node], required_trusts, name) + return cls(keyid, currency, [node], required_trusts, name) @classmethod def load(cls, json_data): - coins = [] nodes = [] - for coin_data in json_data['coins']: - coins.append(Coin.from_id(coin_data['coin'])) for node_data in json_data['nodes']: nodes.append(Node.load(node_data)) @@ -57,7 +54,7 @@ class Wallet(object): name = json_data['name'] currency = json_data['currency'] required_trusts = json_data['required_trusts'] - return cls(keyid, coins, currency, nodes, required_trusts, name) + return cls(keyid, currency, nodes, required_trusts, name) def __eq__(self, other): return (self.community == other.community) @@ -70,12 +67,27 @@ class Wallet(object): #TODO: Enhance this code. Loading the amendment each time we load a coin is bad def refresh_coins(self): + self.coins = [] coins_list_request = ucoin.hdc.coins.List(self.fingerprint()) data = self.request(coins_list_request) for coin_data in data['coins']: coin = Coin.from_id(self, coin_data) self.coins.append(coin) + def transfer_coins(self, node, recipient, coins, message): + transfer = ucoin.wrappers.transactions.RawTransfer( + self.fingerprint(), + recipient.fingerprint, + coins, + message, + keyid=self.keyid, + server=node.server, + port=node.port) + + result = transfer() + if result is False: + return transfer.error + def transactions_received(self): received = [] transactions_data = self.request( @@ -93,19 +105,22 @@ class Wallet(object): transactions_data = self.request( ucoin.hdc.transactions.sender.Last( self.fingerprint(), 20)) - for trx_data in transactions_data: + for trx_data in transactions_data['transactions']: # Small bug in ucoinpy library if not isinstance(trx_data, str): sent.append( Transaction.create( - trx_data['value']['transaction']['sender'], - trx_data['value']['transaction']['number'], + trx_data['sender'], + trx_data['number'], self)) return sent def pull_wht(self): wht = self.request(ucoin.network.Wallet(self.fingerprint())) - return wht['entry'] + if wht is None: + return [] + else: + return wht['entry'] def push_wht(self): hosters_fg = [] @@ -172,18 +187,28 @@ Hosters: return nodes def request(self, request, get_args={}): + data = None for node in self.trusts(): logging.debug("Trying to connect to : " + node.get_text()) node.use(request) - return request.get(**get_args) - raise RuntimeError("Cannot connect to any node") + try: + data = request.get(**get_args) + except: + continue + return data + return None def post(self, request, get_args={}): + data = None for node in self.hosters(): logging.debug("Trying to connect to : " + node.get_text()) node.use(request) - return request.post(**get_args) - raise RuntimeError("Cannot connect to any node") + try: + data = request.post(**get_args) + except: + continue + return data + return None def trusts(self): return [node for node in self.nodes if node.trust] @@ -227,7 +252,7 @@ Hosters: return data def jsonify(self): - return {'coins': self.jsonify_coins_list(), + return {'required_trusts': self.required_trusts, 'keyid': self.keyid, 'name': self.name, 'currency': self.currency, diff --git a/src/cutecoin/models/wallet/listModel.py b/src/cutecoin/models/wallet/listModel.py index 6197bed6aa514242c7bf19b965a39af3125f67ab..f311a26444be8f18b4c80feb5c52a6500bd756db 100644 --- a/src/cutecoin/models/wallet/listModel.py +++ b/src/cutecoin/models/wallet/listModel.py @@ -18,7 +18,8 @@ class WalletListModel(QAbstractListModel): Constructor ''' super(WalletListModel, self).__init__(parent) - self.coins = wallet.coins + self.coins = list(wallet.coins) + self.wallet = wallet def rowCount(self, parent): return len(self.coins) @@ -26,7 +27,7 @@ class WalletListModel(QAbstractListModel): def data(self, index, role): if role == Qt.DisplayRole: row = index.row() - value = str(self.coins[row].value()) + value = str(self.coins[row].value(self.wallet)) return value def flags(self, index):