clean up prev commit
This commit is contained in:
parent
5997c18aef
commit
500c0493d0
|
@ -23,7 +23,6 @@
|
||||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
# SOFTWARE.
|
# SOFTWARE.
|
||||||
import webbrowser
|
import webbrowser
|
||||||
import os
|
|
||||||
|
|
||||||
from electrum.i18n import _
|
from electrum.i18n import _
|
||||||
from electrum.bitcoin import is_address
|
from electrum.bitcoin import is_address
|
||||||
|
|
|
@ -23,10 +23,11 @@
|
||||||
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
# SOFTWARE.
|
# SOFTWARE.
|
||||||
|
|
||||||
from .util import *
|
|
||||||
from electrum.i18n import _
|
from electrum.i18n import _
|
||||||
from electrum.util import format_time
|
from electrum.util import format_time
|
||||||
|
|
||||||
|
from .util import *
|
||||||
|
|
||||||
|
|
||||||
class InvoiceList(MyTreeWidget):
|
class InvoiceList(MyTreeWidget):
|
||||||
filter_columns = [0, 1, 2, 3] # Date, Requestor, Description, Amount
|
filter_columns = [0, 1, 2, 3] # Date, Requestor, Description, Amount
|
||||||
|
|
|
@ -39,15 +39,14 @@ import PyQt5.QtCore as QtCore
|
||||||
from .exception_window import Exception_Hook
|
from .exception_window import Exception_Hook
|
||||||
from PyQt5.QtWidgets import *
|
from PyQt5.QtWidgets import *
|
||||||
|
|
||||||
from electrum.util import bh2u, bfh
|
|
||||||
|
|
||||||
from electrum import keystore, simple_config
|
from electrum import keystore, simple_config
|
||||||
from electrum.bitcoin import COIN, is_address, TYPE_ADDRESS, NetworkConstants
|
from electrum.bitcoin import COIN, is_address, TYPE_ADDRESS, NetworkConstants
|
||||||
from electrum.plugins import run_hook
|
from electrum.plugins import run_hook
|
||||||
from electrum.i18n import _
|
from electrum.i18n import _
|
||||||
from electrum.util import (format_time, format_satoshis, PrintError,
|
from electrum.util import (format_time, format_satoshis, PrintError,
|
||||||
format_satoshis_plain, NotEnoughFunds,
|
format_satoshis_plain, NotEnoughFunds,
|
||||||
UserCancelled, NoDynamicFeeEstimates)
|
UserCancelled, NoDynamicFeeEstimates, profiler,
|
||||||
|
export_meta, import_meta, bh2u, bfh)
|
||||||
from electrum import Transaction
|
from electrum import Transaction
|
||||||
from electrum import util, bitcoin, commands, coinchooser
|
from electrum import util, bitcoin, commands, coinchooser
|
||||||
from electrum import paymentrequest
|
from electrum import paymentrequest
|
||||||
|
@ -58,10 +57,8 @@ from .qrcodewidget import QRCodeWidget, QRDialog
|
||||||
from .qrtextedit import ShowQRTextEdit, ScanQRTextEdit
|
from .qrtextedit import ShowQRTextEdit, ScanQRTextEdit
|
||||||
from .transaction_dialog import show_transaction
|
from .transaction_dialog import show_transaction
|
||||||
from .fee_slider import FeeSlider
|
from .fee_slider import FeeSlider
|
||||||
|
|
||||||
from .util import *
|
from .util import *
|
||||||
|
|
||||||
from electrum.util import profiler, export_meta, import_meta
|
|
||||||
|
|
||||||
class StatusBarButton(QPushButton):
|
class StatusBarButton(QPushButton):
|
||||||
def __init__(self, icon, tooltip, func):
|
def __init__(self, icon, tooltip, func):
|
||||||
|
@ -2420,16 +2417,16 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, PrintError):
|
||||||
|
|
||||||
def do_import_labels(self):
|
def do_import_labels(self):
|
||||||
def import_labels(path):
|
def import_labels(path):
|
||||||
#TODO: Import labels validation
|
def _validate(data):
|
||||||
def import_labels_validate(data):
|
return data # TODO
|
||||||
return data
|
|
||||||
def import_labels_assign(data):
|
def import_labels_assign(data):
|
||||||
for key, value in data.items():
|
for key, value in data.items():
|
||||||
self.wallet.set_label(key, value)
|
self.wallet.set_label(key, value)
|
||||||
import_meta(path, import_labels_validate, import_labels_assign)
|
import_meta(path, _validate, import_labels_assign)
|
||||||
|
|
||||||
def on_import():
|
def on_import():
|
||||||
self.address_list.update()
|
self.need_update.set()
|
||||||
self.history_list.update()
|
|
||||||
import_meta_gui(self, _('labels'), import_labels, on_import)
|
import_meta_gui(self, _('labels'), import_labels, on_import)
|
||||||
|
|
||||||
def do_export_labels(self):
|
def do_export_labels(self):
|
||||||
|
|
|
@ -6,12 +6,15 @@ import queue
|
||||||
from collections import namedtuple
|
from collections import namedtuple
|
||||||
from functools import partial
|
from functools import partial
|
||||||
|
|
||||||
from electrum.i18n import _
|
|
||||||
from PyQt5.QtGui import *
|
from PyQt5.QtGui import *
|
||||||
from PyQt5.QtCore import *
|
from PyQt5.QtCore import *
|
||||||
from PyQt5.QtWidgets import *
|
from PyQt5.QtWidgets import *
|
||||||
|
|
||||||
|
from electrum.i18n import _
|
||||||
from electrum.util import FileImportFailed, FileExportFailed
|
from electrum.util import FileImportFailed, FileExportFailed
|
||||||
|
from electrum.paymentrequest import PR_UNPAID, PR_PAID, PR_EXPIRED
|
||||||
|
|
||||||
|
|
||||||
if platform.system() == 'Windows':
|
if platform.system() == 'Windows':
|
||||||
MONOSPACE_FONT = 'Lucida Console'
|
MONOSPACE_FONT = 'Lucida Console'
|
||||||
elif platform.system() == 'Darwin':
|
elif platform.system() == 'Darwin':
|
||||||
|
@ -22,8 +25,6 @@ else:
|
||||||
|
|
||||||
dialogs = []
|
dialogs = []
|
||||||
|
|
||||||
from electrum.paymentrequest import PR_UNPAID, PR_PAID, PR_EXPIRED
|
|
||||||
|
|
||||||
pr_icons = {
|
pr_icons = {
|
||||||
PR_UNPAID:":icons/unpaid.png",
|
PR_UNPAID:":icons/unpaid.png",
|
||||||
PR_PAID:":icons/confirmed.png",
|
PR_PAID:":icons/confirmed.png",
|
||||||
|
@ -675,28 +676,35 @@ class AcceptFileDragDrop:
|
||||||
def onFileAdded(self, fn):
|
def onFileAdded(self, fn):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
|
||||||
def import_meta_gui(electrum_window, title, importer, on_success):
|
def import_meta_gui(electrum_window, title, importer, on_success):
|
||||||
filename = electrum_window.getOpenFileName(_("Open {} file").format(title) , "*.json")
|
filter_ = "JSON (*.json);;All files (*)"
|
||||||
|
filename = electrum_window.getOpenFileName(_("Open {} file").format(title), filter_)
|
||||||
if not filename:
|
if not filename:
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
importer(filename)
|
importer(filename)
|
||||||
except FileImportFailed as e:
|
except FileImportFailed as e:
|
||||||
electrum_window.show_critical(str(e))
|
electrum_window.show_critical(str(e))
|
||||||
else:
|
else:
|
||||||
electrum_window.show_message(_("Your {} were successfully imported" ).format(title))
|
electrum_window.show_message(_("Your {} were successfully imported").format(title))
|
||||||
on_success()
|
on_success()
|
||||||
|
|
||||||
|
|
||||||
def export_meta_gui(electrum_window, title, exporter):
|
def export_meta_gui(electrum_window, title, exporter):
|
||||||
filename = electrum_window.getSaveFileName(_("Select file to save your {}").format(title), 'electrum_{}.json'.format(title), "*.json")
|
filter_ = "JSON (*.json);;All files (*)"
|
||||||
if not filename:
|
filename = electrum_window.getSaveFileName(_("Select file to save your {}").format(title),
|
||||||
|
'electrum_{}.json'.format(title), filter_)
|
||||||
|
if not filename:
|
||||||
return
|
return
|
||||||
try:
|
try:
|
||||||
exporter(filename)
|
exporter(filename)
|
||||||
except FileExportFailed as e:
|
except FileExportFailed as e:
|
||||||
electrum_window.show_critical(str(e))
|
electrum_window.show_critical(str(e))
|
||||||
else:
|
else:
|
||||||
electrum_window.show_message(_("Your {0} were exported to '{1}'").format(title,str(filename)))
|
electrum_window.show_message(_("Your {0} were exported to '{1}'")
|
||||||
|
.format(title, str(filename)))
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
app = QApplication([])
|
app = QApplication([])
|
||||||
|
|
|
@ -25,7 +25,6 @@ import dns
|
||||||
import json
|
import json
|
||||||
import traceback
|
import traceback
|
||||||
import sys
|
import sys
|
||||||
import os
|
|
||||||
|
|
||||||
from . import bitcoin
|
from . import bitcoin
|
||||||
from . import dnssec
|
from . import dnssec
|
||||||
|
@ -52,14 +51,14 @@ class Contacts(dict):
|
||||||
self.storage.put('contacts', dict(self))
|
self.storage.put('contacts', dict(self))
|
||||||
|
|
||||||
def import_file(self, path):
|
def import_file(self, path):
|
||||||
import_meta(path, self.validate, self.load_meta)
|
import_meta(path, self._validate, self.load_meta)
|
||||||
|
|
||||||
def load_meta(self, data):
|
def load_meta(self, data):
|
||||||
self.update(data)
|
self.update(data)
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
def export_file(self, fileName):
|
def export_file(self, filename):
|
||||||
export_meta(self, fileName)
|
export_meta(self, filename)
|
||||||
|
|
||||||
def __setitem__(self, key, value):
|
def __setitem__(self, key, value):
|
||||||
dict.__setitem__(self, key, value)
|
dict.__setitem__(self, key, value)
|
||||||
|
@ -117,14 +116,14 @@ class Contacts(dict):
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def validate(self, data):
|
def _validate(self, data):
|
||||||
for k,v in list(data.items()):
|
for k, v in list(data.items()):
|
||||||
if k == 'contacts':
|
if k == 'contacts':
|
||||||
return self._validate(v)
|
return self._validate(v)
|
||||||
if not bitcoin.is_address(k):
|
if not bitcoin.is_address(k):
|
||||||
data.pop(k)
|
data.pop(k)
|
||||||
else:
|
else:
|
||||||
_type,_ = v
|
_type, _ = v
|
||||||
if _type != 'address':
|
if _type != 'address':
|
||||||
data.pop(k)
|
data.pop(k)
|
||||||
return data
|
return data
|
||||||
|
|
|
@ -468,31 +468,29 @@ class InvoiceStore(object):
|
||||||
continue
|
continue
|
||||||
|
|
||||||
def import_file(self, path):
|
def import_file(self, path):
|
||||||
import_meta(path, self.validate, self.on_import)
|
def validate(data):
|
||||||
|
return data # TODO
|
||||||
#TODO: Invoice import validation
|
import_meta(path, validate, self.on_import)
|
||||||
def validate(self, data):
|
|
||||||
return data
|
|
||||||
|
|
||||||
def on_import(self, data):
|
def on_import(self, data):
|
||||||
self.load(data)
|
self.load(data)
|
||||||
self.save()
|
self.save()
|
||||||
|
|
||||||
def export_file(self, fileName):
|
def export_file(self, filename):
|
||||||
export_meta(self.before_save(), fileName)
|
export_meta(self.dump(), filename)
|
||||||
|
|
||||||
def before_save(self):
|
def dump(self):
|
||||||
l= {}
|
d = {}
|
||||||
for k, pr in self.invoices.items():
|
for k, pr in self.invoices.items():
|
||||||
l[k] = {
|
d[k] = {
|
||||||
'hex': bh2u(pr.raw),
|
'hex': bh2u(pr.raw),
|
||||||
'requestor': pr.requestor,
|
'requestor': pr.requestor,
|
||||||
'txid': pr.tx
|
'txid': pr.tx
|
||||||
}
|
}
|
||||||
return l
|
return d
|
||||||
|
|
||||||
def save(self):
|
def save(self):
|
||||||
self.storage.put('invoices', self.before_save())
|
self.storage.put('invoices', self.dump())
|
||||||
|
|
||||||
def get_status(self, key):
|
def get_status(self, key):
|
||||||
pr = self.get(key)
|
pr = self.get(key)
|
||||||
|
|
24
lib/util.py
24
lib/util.py
|
@ -66,12 +66,14 @@ class FileImportFailed(Exception):
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return _("Failed to import from file.") + "\n" + self.message
|
return _("Failed to import from file.") + "\n" + self.message
|
||||||
|
|
||||||
|
|
||||||
class FileExportFailed(Exception):
|
class FileExportFailed(Exception):
|
||||||
def __init__(self, reason=''):
|
def __init__(self, message=''):
|
||||||
self.message = str(reason)
|
self.message = str(message)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return( _("Failed to export to file.") + "\n" + self.message )
|
return _("Failed to export to file.") + "\n" + self.message
|
||||||
|
|
||||||
|
|
||||||
# Throw this exception to unwind the stack like when an error occurs.
|
# Throw this exception to unwind the stack like when an error occurs.
|
||||||
# However unlike other exceptions the user won't be informed.
|
# However unlike other exceptions the user won't be informed.
|
||||||
|
@ -788,6 +790,7 @@ def setup_thread_excepthook():
|
||||||
def versiontuple(v):
|
def versiontuple(v):
|
||||||
return tuple(map(int, (v.split("."))))
|
return tuple(map(int, (v.split("."))))
|
||||||
|
|
||||||
|
|
||||||
def import_meta(path, validater, load_meta):
|
def import_meta(path, validater, load_meta):
|
||||||
try:
|
try:
|
||||||
with open(path, 'r') as f:
|
with open(path, 'r') as f:
|
||||||
|
@ -798,13 +801,14 @@ def import_meta(path, validater, load_meta):
|
||||||
traceback.print_exc(file=sys.stderr)
|
traceback.print_exc(file=sys.stderr)
|
||||||
raise FileImportFailed(_("Invalid JSON code."))
|
raise FileImportFailed(_("Invalid JSON code."))
|
||||||
except BaseException as e:
|
except BaseException as e:
|
||||||
traceback.print_exc(file=sys.stdout)
|
traceback.print_exc(file=sys.stdout)
|
||||||
raise FileImportFailed(e)
|
raise FileImportFailed(e)
|
||||||
|
|
||||||
|
|
||||||
def export_meta(meta, fileName):
|
def export_meta(meta, fileName):
|
||||||
try:
|
try:
|
||||||
with open(fileName, 'w+') as f:
|
with open(fileName, 'w+') as f:
|
||||||
json.dump(meta, f, indent=4, sort_keys=True)
|
json.dump(meta, f, indent=4, sort_keys=True)
|
||||||
except (IOError, os.error) as reason:
|
except (IOError, os.error) as e:
|
||||||
traceback.print_exc(file=sys.stderr)
|
traceback.print_exc(file=sys.stderr)
|
||||||
raise FileExportFailed(str(reason))
|
raise FileExportFailed(e)
|
||||||
|
|
Loading…
Reference in New Issue