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 @@
</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>
......
......@@ -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>
......
......@@ -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):
......
......@@ -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):
......
......@@ -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:
......
......@@ -18,7 +18,7 @@ class Communities(object):
'''
Constructor
'''
self._communities_list = []
self._communities_list = _communities_list
@classmethod
def create(cls):
......
......@@ -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):
......
......@@ -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
......@@ -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
......
......@@ -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
......@@ -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):
......
......@@ -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):
......
......@@ -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,
......
......@@ -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):
......
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