diff --git a/res/ui/transfer.ui b/res/ui/transfer.ui index e26418f64b9e25df12a4394e111d00665cfb4371..04a1d75cc9e23bc5efb99474a3bc7fad1d1075b0 100644 --- a/res/ui/transfer.ui +++ b/res/ui/transfer.ui @@ -7,7 +7,7 @@ <x>0</x> <y>0</y> <width>399</width> - <height>402</height> + <height>409</height> </rect> </property> <property name="windowTitle"> @@ -143,6 +143,9 @@ <property name="suffix"> <string> UD</string> </property> + <property name="decimals"> + <number>6</number> + </property> <property name="maximum"> <double>9999999.000000000000000</double> </property> diff --git a/src/cutecoin/gui/informations_tab.py b/src/cutecoin/gui/informations_tab.py index 1f8fd399c46f03c5da67dd3d9e1d4e21fb8533ba..63d7746ae1dda867e8fa6d9e3e1455d1a4eebb1a 100644 --- a/src/cutecoin/gui/informations_tab.py +++ b/src/cutecoin/gui/informations_tab.py @@ -55,12 +55,12 @@ class InformationsTabWidget(QWidget, Ui_InformationsTabWidget): localized_monetary_mass = QLocale().toString(round(self.get_referential_value(block['monetaryMass']))) localized_mass_per_member = QLocale().toString(round(self.get_referential_value(block['monetaryMass'] / block['membersCount']))) else: - localized_ud = QLocale().toString(ud, 'f', 2) + localized_ud = QLocale().toString(ud, 'f', 6) localized_monetary_mass = QLocale().toString( - round(self.get_referential_value(block['monetaryMass'])), 'f', 2 + round(self.get_referential_value(block['monetaryMass'])), 'f', 6 ) localized_mass_per_member = QLocale().toString( - round(self.get_referential_value(block['monetaryMass'] / block['membersCount']), 'f', 2) + round(self.get_referential_value(block['monetaryMass'] / block['membersCount']), 'f', 6) ) # set infos in label diff --git a/src/cutecoin/gui/mainwindow.py b/src/cutecoin/gui/mainwindow.py index 1aabed473a067dcf0ee667e225e1cebc28a06790..caa26f3b4159117c6f17de76f5db69a082ee1b65 100644 --- a/src/cutecoin/gui/mainwindow.py +++ b/src/cutecoin/gui/mainwindow.py @@ -103,6 +103,8 @@ class MainWindow(QMainWindow, Ui_MainWindow): self.open_ucoin_info = lambda: QDesktopServices.openUrl(QUrl("http://ucoin.io/theoretical/")) self.homescreen.button_info.clicked.connect(self.open_ucoin_info) + self.export_dialog = None + # TODO: There are too much refresh() calls on startup self.refresh() @@ -350,16 +352,23 @@ class MainWindow(QMainWindow, Ui_MainWindow): dialog.exec_() def export_account(self): - selected_file = QFileDialog.getSaveFileName(self, - self.tr("Export an account"), - "", - self.tr("All account files (*.acc)")) - path = "" - if selected_file[0][-4:] == ".acc": - path = selected_file[0] - else: - path = selected_file[0] + ".acc" - self.app.export_account(path, self.app.current_account) + # Testable way off using a QFileDialog + self.export_dialog = QFileDialog(self) + self.export_dialog.setObjectName('ExportFileDialog') + self.export_dialog.setWindowTitle(self.tr("Export an account")) + self.export_dialog.setNameFilter(self.tr("All account files (*.acc)")) + self.export_dialog.setLabelText(QFileDialog.Accept, self.tr('Export')) + self.export_dialog.accepted.connect(self.export_account_accepted) + self.export_dialog.show() + + def export_account_accepted(self): + selected_file = self.export_dialog.selectedFiles() + if selected_file: + if selected_file[0][-4:] == ".acc": + path = selected_file[0] + else: + path = selected_file[0] + ".acc" + self.app.export_account(path, self.app.current_account) def closeEvent(self, event): if self.app.current_account: diff --git a/src/cutecoin/gui/transactions_tab.py b/src/cutecoin/gui/transactions_tab.py index 14eae68324bb069c6da3f104a636f6bba30c3625..514cff55eaa1825da9eb7c08cb6925b8441b3a51 100644 --- a/src/cutecoin/gui/transactions_tab.py +++ b/src/cutecoin/gui/transactions_tab.py @@ -1,6 +1,6 @@ from PyQt5.QtWidgets import QWidget, QAbstractItemView, QHeaderView, QDialog, \ QMenu, QAction, QApplication, QMessageBox -from PyQt5.QtCore import Qt, QDateTime, QModelIndex, QLocale +from PyQt5.QtCore import Qt, QDateTime, QTime, QModelIndex, QLocale from PyQt5.QtGui import QCursor from ..gen_resources.transactions_tab_uic import Ui_transactionsTabWidget from ..models.txhistory import HistoryTableModel, TxFilterProxyModel @@ -11,6 +11,7 @@ from .transfer import TransferMoneyDialog import logging + class TransactionsTabWidget(QWidget, Ui_transactionsTabWidget): """ classdocs @@ -27,7 +28,6 @@ class TransactionsTabWidget(QWidget, Ui_transactionsTabWidget): :return: """ - super().__init__() self.setupUi(self) self.app = app @@ -37,14 +37,15 @@ class TransactionsTabWidget(QWidget, Ui_transactionsTabWidget): self.refresh() def refresh(self): - blockchain_init = QDateTime() - blockchain_init.setTime_t(self.community.get_block(1).mediantime) + minimum_datetime = QDateTime() + minimum_datetime.setTime_t(self.community.get_block(1).mediantime) + minimum_datetime.setTime(QTime(0, 0)) - self.date_from.setMinimumDateTime(blockchain_init) - self.date_from.setDateTime(blockchain_init) + self.date_from.setMinimumDateTime(minimum_datetime) + self.date_from.setDateTime(minimum_datetime) self.date_from.setMaximumDateTime(QDateTime().currentDateTime()) - self.date_to.setMinimumDateTime(blockchain_init) + self.date_to.setMinimumDateTime(minimum_datetime) tomorrow_datetime = QDateTime().currentDateTime().addDays(1) self.date_to.setDateTime(tomorrow_datetime) self.date_to.setMaximumDateTime(tomorrow_datetime) @@ -78,11 +79,11 @@ class TransactionsTabWidget(QWidget, Ui_transactionsTabWidget): else: localized_deposits = QLocale().toString( - self.app.current_account.units_to_ref(proxy.deposits, self.community), 'f', 2) + self.app.current_account.units_to_ref(proxy.deposits, self.community), 'f', 6) localized_payments = QLocale().toString( - self.app.current_account.units_to_ref(proxy.payments, self.community), 'f', 2) + self.app.current_account.units_to_ref(proxy.payments, self.community), 'f', 6) localized_balance = QLocale().toString( - self.app.current_account.units_to_diff_ref(balance, self.community), 'f', 2) + self.app.current_account.units_to_diff_ref(balance, self.community), 'f', 6) self.label_deposit.setText(self.tr("Deposits: {:} {:}").format( localized_deposits, diff --git a/src/cutecoin/gui/transfer.py b/src/cutecoin/gui/transfer.py index e88ef53defd877378adf1daff2f4ff7afec4a242..2600560685b249349a14429a6e9697cea8067659 100644 --- a/src/cutecoin/gui/transfer.py +++ b/src/cutecoin/gui/transfer.py @@ -4,14 +4,12 @@ Created on 2 févr. 2014 @author: inso ''' from PyQt5.QtWidgets import QDialog, QMessageBox, QApplication -from PyQt5.QtCore import QRegExp, Qt +from PyQt5.QtCore import QRegExp, Qt, QLocale from PyQt5.QtGui import QRegExpValidator from ..tools.exceptions import NotEnoughMoneyError, NoPeerAvailable from ..gen_resources.transfer_uic import Ui_TransferMoneyDialog -import logging - class TransferMoneyDialog(QDialog, Ui_TransferMoneyDialog): @@ -125,6 +123,10 @@ Please try again later""")) amount = self.wallet.value(self.community) ref_amount = self.account.units_to_ref(amount, self.community) ref_name = self.account.ref_name(self.community.currency) + if isinstance(ref_amount, int): + ref_amount = QLocale().toString(ref_amount) + else: + ref_amount = QLocale().toString(ref_amount, 'f', 6) self.label_total.setText("{0} {1}".format(ref_amount, ref_name)) self.spinbox_amount.setSuffix(" " + self.community.currency) self.spinbox_amount.setValue(0) @@ -138,6 +140,10 @@ Please try again later""")) amount = self.wallet.value(self.community) ref_amount = self.account.units_to_ref(amount, self.community) ref_name = self.account.ref_name(self.community.currency) + if isinstance(ref_amount, int): + ref_amount = QLocale().toString(ref_amount) + else: + ref_amount = QLocale().toString(ref_amount, 'f', 6) self.label_total.setText("{0} {1}".format(ref_amount, ref_name)) self.spinbox_amount.setValue(0) amount = self.wallet.value(self.community) diff --git a/src/cutecoin/gui/wallets_tab.py b/src/cutecoin/gui/wallets_tab.py index 817a37cf6e5d3150f978bcfe442e521397af280f..565d94ada25a13ba0bd14bfae0f1dbd5d51d5fd8 100644 --- a/src/cutecoin/gui/wallets_tab.py +++ b/src/cutecoin/gui/wallets_tab.py @@ -67,7 +67,7 @@ class WalletsTabWidget(QWidget, Ui_WalletsTab): self.tr("Last renewal on {:}, expiration on {:}").format(date_renewal, date_expiration), self.tr("Your web of trust :"), self.tr("Certified by : {:} members; Certifier of : {:} members").format(len(certifiers), - len(certified)) + len(certified)) ) ) else: @@ -84,24 +84,24 @@ class WalletsTabWidget(QWidget, Ui_WalletsTab): self.tr("Not a member"), self.tr("Your web of trust :"), self.tr("Certified by : {:} members; Certifier of : {:} members").format(len(certifiers), - len(certified)) + len(certified)) ) ) amount = self.account.amount(self.community) maximum = self.community.monetary_mass - if isinstance(amount, int): + if isinstance(self.get_referential_value(amount), int): localized_amount = QLocale().toString(self.get_referential_value(amount)) else: - localized_amount = QLocale().toString(self.get_referential_value(amount), 'f', 2) + localized_amount = QLocale().toString(self.get_referential_value(amount), 'f', 6) - if isinstance(maximum, int): + if isinstance(self.get_referential_value(maximum), int): localized_maximum = QLocale().toString(self.get_referential_value(maximum)) else: - localized_maximum = QLocale().toString(self.get_referential_value(maximum), 'f', 2) + localized_maximum = QLocale().toString(self.get_referential_value(maximum), 'f', 6) - logging.debug( self.tr("{:} {:} in [{:.2f} - {:}] {:}")) + logging.debug(self.tr("{:} {:} in [{:.2f} - {:}] {:}")) # set infos in label self.label_balance.setText( self.tr(""" @@ -109,14 +109,18 @@ class WalletsTabWidget(QWidget, Ui_WalletsTab): <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr> <tr><td align="right"><b>{:}</b></td><td>{:}</td></tr> </table> - """).format(self.tr("Your money share : "), self.tr("{:.2f}%").format(amount / maximum * 100) if maximum != 0 else "0%", - self.tr("Your part : "), self.tr("{:} {:} in [{:.2f} - {:}] {:}") - .format( + """).format( + self.tr("Your money share : "), + self.tr("{:.2f}%").format(amount / maximum * 100) if maximum != 0 else "0%", + self.tr("Your part : "), + self.tr("{:} {:} in [{:.2f} - {:}] {:}") + .format( localized_amount, self.get_referential_name(), self.get_referential_value(0), localized_maximum, - self.get_referential_name()) + self.get_referential_name() + ) ) ) diff --git a/src/cutecoin/models/txhistory.py b/src/cutecoin/models/txhistory.py index e9c4ae1eedcc22a1cec1aede09d9eaaa51731845..3f1456ebb14b029b67e861d36eb674ef48f6c22d 100644 --- a/src/cutecoin/models/txhistory.py +++ b/src/cutecoin/models/txhistory.py @@ -4,12 +4,11 @@ Created on 5 févr. 2014 @author: inso ''' +import datetime import logging from ..core.transfer import Transfer, Received -from ..core.person import Person -from ..tools.exceptions import PersonNotFoundError from PyQt5.QtCore import QAbstractTableModel, Qt, QVariant, QSortFilterProxyModel, \ - QDateTime, QLocale, QModelIndex + QDateTime, QLocale from PyQt5.QtGui import QFont, QColor @@ -28,7 +27,10 @@ class TxFilterProxyModel(QSortFilterProxyModel): """ Filter table by given timestamps """ - logging.debug("Filtering from {0} to {1}".format(ts_from, ts_to)) + logging.debug("Filtering from {0} to {1}".format( + datetime.datetime.fromtimestamp(ts_from).isoformat(' '), + datetime.datetime.fromtimestamp(ts_to).isoformat(' ')) + ) self.ts_from = ts_from self.ts_to = ts_to self.modelReset.emit() @@ -102,7 +104,7 @@ class TxFilterProxyModel(QSortFilterProxyModel): if isinstance(amount_ref, int): return QLocale().toString(amount_ref) else: - return QLocale().toString(amount_ref, 'f', 2) + return QLocale().toString(amount_ref, 'f', 6) if role == Qt.FontRole: font = QFont() diff --git a/src/cutecoin/models/wallets.py b/src/cutecoin/models/wallets.py index a25d871153c998dbfd344e56c2aaefde98d58019..493a841860fbc5df068011745b26107da53077be 100644 --- a/src/cutecoin/models/wallets.py +++ b/src/cutecoin/models/wallets.py @@ -42,7 +42,7 @@ class WalletsFilterProxyModel(QSortFilterProxyModel): if isinstance(amount_ref, int): return QLocale().toString(amount_ref) else: - return QLocale().toString(amount_ref, 'f', 2) + return QLocale().toString(amount_ref, 'f', 6) if role == Qt.TextAlignmentRole: if source_index.column() == self.sourceModel().columns_types.index('amount'): diff --git a/src/cutecoin/tests/__init__.py b/src/cutecoin/tests/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/src/cutecoin/tests/__init__.py @@ -0,0 +1 @@ + diff --git a/src/cutecoin/tests/all.py b/src/cutecoin/tests/all.py new file mode 100644 index 0000000000000000000000000000000000000000..5531ab01fc7b28f8f51a90e8523a692d79df21f3 --- /dev/null +++ b/src/cutecoin/tests/all.py @@ -0,0 +1,4 @@ +import unittest + +# run all tests +unittest.TextTestRunner().run(unittest.defaultTestLoader.discover(start_dir='cutecoin.tests', pattern='test_*')) diff --git a/src/cutecoin/tests/main_window/__init__.py b/src/cutecoin/tests/main_window/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..8b137891791fe96927ad78e64b0aad7bded08bdc --- /dev/null +++ b/src/cutecoin/tests/main_window/__init__.py @@ -0,0 +1 @@ + diff --git a/src/cutecoin/tests/main_window/test_main_window_dialogs.py b/src/cutecoin/tests/main_window/test_main_window_dialogs.py new file mode 100644 index 0000000000000000000000000000000000000000..748ef886a1048eba81adb36f733c94746daf6059 --- /dev/null +++ b/src/cutecoin/tests/main_window/test_main_window_dialogs.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- + +import sys +import unittest +import gc +import PyQt5 +from PyQt5.QtWidgets import QApplication, QMenu +from PyQt5.QtCore import QLocale, QTimer +from cutecoin.gui.mainwindow import MainWindow +from cutecoin.core.app import Application + +# Qapplication cause a core dumped when re-run in setup +# set it as global var +qapplication = QApplication(sys.argv) + + +class MainWindowDialogsTest(unittest.TestCase): + def setUp(self): + QLocale.setDefault(QLocale("en_GB")) + self.application = Application(sys.argv) + self.main_window = MainWindow(self.application) + + def test_action_about(self): + # select menu + self.main_window.actionAbout.trigger() + widgets = qapplication.topLevelWidgets() + for widget in widgets: + if isinstance(widget, PyQt5.QtWidgets.QDialog): + self.assertEqual(widget.objectName(), 'AboutPopup') + self.assertEqual(widget.isVisible(), True) + widget.close() + break + + def test_action_add_account(self): + # asynchronous test, cause dialog is waiting user response + QTimer.singleShot(0, self._async_test_action_add_account) + # select menu + self.main_window.action_add_account.trigger() + + def _async_test_action_add_account(self): + widgets = qapplication.topLevelWidgets() + for widget in widgets: + if isinstance(widget, PyQt5.QtWidgets.QDialog): + self.assertEqual(widget.objectName(), 'AccountConfigurationDialog') + self.assertEqual(widget.isVisible(), True) + widget.close() + break + # + # # fixme: require a app.current_account fixture + # # def test_action_configure_account(self): + # # # asynchronous test, cause dialog is waiting user response + # # QTimer.singleShot(0, self._async_test_action_configure_account) + # # # select about menu + # # self.main_window.action_configure_parameters.trigger() + # # + # # def _async_test_action_configure_account(self): + # # widgets = qapplication.topLevelWidgets() + # # for widget in widgets: + # # if isinstance(widget, PyQt5.QtWidgets.QDialog): + # # self.assertEqual(widget.objectName(), 'AccountConfigurationDialog') + # # self.assertEqual(widget.isVisible(), True) + # # widget.close() + # # break + # + + def test_action_export_account(self): + # select menu + self.main_window.action_export.trigger() + + widgets = qapplication.topLevelWidgets() + for widget in widgets: + if isinstance(widget, PyQt5.QtWidgets.QFileDialog): + self.assertEqual(widget.objectName(), 'ExportFileDialog') + self.assertTrue(widget.isVisible()) + widget.close() + break + +if __name__ == '__main__': + unittest.main() diff --git a/src/cutecoin/tests/MainWindowTest.py b/src/cutecoin/tests/main_window/test_main_window_menus.py similarity index 79% rename from src/cutecoin/tests/MainWindowTest.py rename to src/cutecoin/tests/main_window/test_main_window_menus.py index deca0f8876dee2725af54c298839b66a475b38c5..0a221eac3ab3431d6eb80abe89dda5aaddd6187e 100644 --- a/src/cutecoin/tests/MainWindowTest.py +++ b/src/cutecoin/tests/main_window/test_main_window_menus.py @@ -14,7 +14,7 @@ from cutecoin.core.app import Application qapplication = QApplication(sys.argv) -class MainWindowTest(unittest.TestCase): +class MainWindowMenusTest(unittest.TestCase): def setUp(self): QLocale.setDefault(QLocale("en_GB")) self.application = Application(sys.argv) @@ -64,19 +64,6 @@ class MainWindowTest(unittest.TestCase): self.assertEqual(actions[0].objectName(), 'actionTransfer_money') self.assertEqual(actions[1].objectName(), 'actionCertification') - def test_action_about(self): - # select about menu - self.main_window.actionAbout.trigger() - widgets = qapplication.topLevelWidgets() - dialog = None - for widget in widgets: - if isinstance(widget, PyQt5.QtWidgets.QDialog): - dialog = widget - break - self.assertEqual(dialog.objectName(), 'AboutPopup') - self.assertEqual(dialog.isVisible(), True) if __name__ == '__main__': - main_window_suite = unittest.TestLoader().loadTestsFromTestCase(MainWindowTest) - runner = unittest.TextTestRunner() - runner.run(main_window_suite) + unittest.main()