Skip to content
Snippets Groups Projects
Commit a55ab935 authored by inso's avatar inso
Browse files

Managing transactions

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