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

Add about rules views

parent f321ef96
No related branches found
No related tags found
No related merge requests found
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Form</class>
<widget class="QWidget" name="Form">
<class>AboutMoney</class>
<widget class="QWidget" name="AboutMoney">
<property name="geometry">
<rect>
<x>0</x>
......@@ -61,22 +61,6 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="group_referentials">
<property name="title">
<string>Referentials</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<widget class="QLabel" name="label_referentials">
<property name="text">
<string/>
</property>
</widget>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="group_money">
<property name="title">
......@@ -96,25 +80,6 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="group_wot">
<property name="title">
<string>WoT</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QLabel" name="label_wot">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
......
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>AboutWot</class>
<widget class="QWidget" name="AboutWot">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>509</width>
<height>406</height>
</rect>
</property>
<property name="windowTitle">
<string>Form</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QGroupBox" name="group_wot">
<property name="title">
<string>WoT</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<widget class="QLabel" name="label_wot">
<property name="text">
<string/>
</property>
<property name="alignment">
<set>Qt::AlignLeading|Qt::AlignLeft|Qt::AlignTop</set>
</property>
</widget>
</item>
</layout>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
......@@ -7,6 +7,7 @@ from sakia.gui.dialogs.plugins_manager.controller import PluginsManagerControlle
from sakia.gui.preferences import PreferencesDialog
from .model import ToolbarModel
from .view import ToolbarView
from sakia.data.processors import BlockchainProcessor
import sys
......@@ -28,6 +29,9 @@ class ToolbarController(QObject):
self.view.action_parameters.triggered.connect(self.open_settings_dialog)
self.view.action_plugins.triggered.connect(self.open_plugins_manager_dialog)
self.view.action_about.triggered.connect(self.open_about_dialog)
self.view.action_about_wot.triggered.connect(self.open_about_wot_dialog)
self.view.action_about_money.triggered.connect(self.open_about_money_dialog)
self.view.action_about_referentials.triggered.connect(self.open_about_referentials_dialog)
self.view.action_revoke_uid.triggered.connect(self.open_revocation_dialog)
self.view.button_contacts.clicked.connect(self.open_contacts_dialog)
......@@ -41,7 +45,7 @@ class ToolbarController(QObject):
:rtype: NavigationController
"""
view = ToolbarView(None)
model = ToolbarModel(app, navigation.model)
model = ToolbarModel(app, navigation.model, app.blockchain_service, BlockchainProcessor.instanciate(app))
toolbar = cls(view, model)
return toolbar
......@@ -69,6 +73,21 @@ class ToolbarController(QObject):
text = self.model.about_text()
self.view.show_about(text)
def open_about_wot_dialog(self):
params = self.model.parameters()
self.view.show_about_wot(params)
def open_about_money_dialog(self):
params = self.model.parameters()
currency = self.model.app.currency
localized_data = self.model.get_localized_data()
referentials = self.model.referentials()
self.view.show_about_money(params, currency, localized_data)
def open_about_referentials_dialog(self):
referentials = self.model.referentials()
self.view.show_about_referentials(referentials)
def retranslateUi(self, widget):
"""
Method to complete translations missing from generated code
......
from PyQt5.QtCore import QObject
from PyQt5.QtCore import QObject, QLocale, QDateTime
from sakia.data.processors import ConnectionsProcessor
import attr
import math
from sakia import __version__
from sakia.constants import ROOT_SERVERS
from duniterpy.api import errors
from sakia.money import Referentials
@attr.s()
......@@ -15,13 +19,12 @@ class ToolbarModel(QObject):
app = attr.ib()
navigation_model = attr.ib()
blockchain_service = attr.ib()
blockchain_processor = attr.ib()
def __attrs_post_init__(self):
super().__init__()
async def send_join(self, connection, secret_key, password):
return await self.app.documents_service.send_membership(connection, secret_key, password, "IN")
def notifications(self):
return self.app.parameters.notifications
......@@ -63,3 +66,109 @@ class ToolbarModel(QObject):
<p>Moul</p>
""".format(__version__,
new_version_text=new_version_text)
def get_localized_data(self):
localized_data = {}
# try to request money parameters
params = self.blockchain_service.parameters()
localized_data['currency'] = ROOT_SERVERS[self.app.currency]["display"]
localized_data['growth'] = params.c
localized_data['days_per_dividend'] = QLocale().toString(params.dt / 86400, 'f', 2)
last_ud, last_ud_base = self.blockchain_service.last_ud()
members_count = self.blockchain_service.last_members_count()
previous_ud, previous_ud_base = self.blockchain_service.previous_ud()
previous_ud_time = self.blockchain_service.previous_ud_time()
previous_monetary_mass = self.blockchain_service.previous_monetary_mass()
previous_members_count = self.blockchain_service.previous_members_count()
localized_data['units'] = self.app.current_ref.instance(0,
self.app.currency,
self.app, None).units
localized_data['diff_units'] = self.app.current_ref.instance(0,
self.app.currency,
self.app, None).diff_units
if last_ud:
# display float values
localized_data['ud'] = self.app.current_ref.instance(last_ud * math.pow(10, last_ud_base),
self.app.currency,
self.app).diff_localized(False, True)
localized_data['members_count'] = self.blockchain_service.current_members_count()
computed_dividend = self.blockchain_service.computed_dividend()
# display float values
localized_data['ud_plus_1'] = self.app.current_ref.instance(computed_dividend,
self.app.currency, self.app).diff_localized(False, True)
localized_data['mass'] = self.app.current_ref.instance(self.blockchain_service.current_mass(),
self.app.currency, self.app).localized(False, True)
ud_median_time = self.blockchain_service.last_ud_time()
ud_median_time = self.blockchain_processor.adjusted_ts(self.app.currency, ud_median_time)
localized_data['ud_median_time'] = QLocale.toString(
QLocale(),
QDateTime.fromTime_t(ud_median_time),
QLocale.dateTimeFormat(QLocale(), QLocale.ShortFormat)
)
next_ud_median_time = self.blockchain_service.last_ud_time() + params.dt
next_ud_median_time = self.blockchain_processor.adjusted_ts(self.app.currency, next_ud_median_time)
localized_data['next_ud_median_time'] = QLocale.toString(
QLocale(),
QDateTime.fromTime_t(next_ud_median_time),
QLocale.dateTimeFormat(QLocale(), QLocale.ShortFormat)
)
next_ud_reeval = self.blockchain_service.next_ud_reeval()
next_ud_reeval = self.blockchain_processor.adjusted_ts(self.app.currency, next_ud_reeval)
localized_data['next_ud_reeval'] = QLocale.toString(
QLocale(),
QDateTime.fromTime_t(next_ud_reeval),
QLocale.dateTimeFormat(QLocale(), QLocale.ShortFormat)
)
if previous_ud:
mass_minus_1_per_member = (float(0) if previous_ud == 0 or previous_members_count == 0 else
previous_monetary_mass / previous_members_count)
localized_data['mass_minus_1_per_member'] = self.app.current_ref.instance(mass_minus_1_per_member,
self.app.currency, self.app) \
.localized(False, True)
localized_data['mass_minus_1'] = self.app.current_ref.instance(previous_monetary_mass,
self.app.currency, self.app) \
.localized(False, True)
# avoid divide by zero !
if members_count == 0 or previous_members_count == 0:
localized_data['actual_growth'] = float(0)
else:
localized_data['actual_growth'] = (last_ud * math.pow(10, last_ud_base)) / (
previous_monetary_mass / members_count)
previous_ud_time = self.blockchain_processor.adjusted_ts(self.app.currency, previous_ud_time)
localized_data['ud_median_time_minus_1'] = QLocale.toString(
QLocale(),
QDateTime.fromTime_t(previous_ud_time),
QLocale.dateTimeFormat(QLocale(), QLocale.ShortFormat)
)
return localized_data
def parameters(self):
"""
Get community parameters
"""
return self.blockchain_service.parameters()
def referentials(self):
"""
Get referentials
:return: The list of instances of all referentials
:rtype: list
"""
refs_instances = []
for ref_class in Referentials:
refs_instances.append(ref_class(0, self.app.currency, self.app, None))
return refs_instances
\ No newline at end of file
from PyQt5.QtWidgets import QFrame, QAction, QMenu, QSizePolicy, QInputDialog, QDialog
from PyQt5.QtWidgets import QFrame, QAction, QMenu, QSizePolicy, QInputDialog, QDialog, \
QVBoxLayout, QTabWidget, QWidget, QLabel
from sakia.gui.widgets.dialogs import dialog_async_exec
from PyQt5.QtCore import QObject, QT_TRANSLATE_NOOP, Qt
from PyQt5.QtCore import QObject, QT_TRANSLATE_NOOP, Qt, QLocale
from .toolbar_uic import Ui_SakiaToolbar
from .about_uic import Ui_AboutPopup
from .about_money_uic import Ui_AboutMoney
from .about_wot_uic import Ui_AboutWot
from sakia.helpers import timestamp_to_dhms
class ToolbarView(QFrame, Ui_SakiaToolbar):
......@@ -30,11 +34,14 @@ class ToolbarView(QFrame, Ui_SakiaToolbar):
self.action_plugins = QAction(self.tr("Plugins manager"), tool_menu)
tool_menu.addAction(self.action_plugins)
self.action_about = QAction(self.tr("About Money"), tool_menu)
tool_menu.addAction(self.action_about)
self.action_about_money = QAction(self.tr("About Money"), tool_menu)
tool_menu.addAction(self.action_about_money)
self.action_about = QAction(self.tr("About Web of Trust"), tool_menu)
tool_menu.addAction(self.action_about)
self.action_about_referentials = QAction(self.tr("About Referentials"), tool_menu)
tool_menu.addAction(self.action_about_referentials)
self.action_about_wot = QAction(self.tr("About Web of Trust"), tool_menu)
tool_menu.addAction(self.action_about_wot)
self.action_about = QAction(self.tr("About Sakia"), tool_menu)
tool_menu.addAction(self.action_about)
......@@ -56,6 +63,216 @@ class ToolbarView(QFrame, Ui_SakiaToolbar):
if c.title() == result:
return c
def show_about_wot(self, params):
"""
Set wot text from currency parameters
:param sakia.data.entities.BlockchainParameters params: Parameters of the currency
:return:
"""
dialog = QDialog(self)
about_dialog = Ui_AboutWot()
about_dialog.setupUi(dialog)
# set infos in label
about_dialog.label_wot.setText(
self.tr("""
<table cellpadding="5">
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
</table>
""").format(
QLocale().toString(params.sig_period / 86400, 'f', 2),
self.tr('Minimum delay between 2 certifications (in days)'),
QLocale().toString(params.sig_validity / 86400, 'f', 2),
self.tr('Maximum age of a valid signature (in days)'),
params.sig_qty,
self.tr('Minimum quantity of signatures to be part of the WoT'),
params.sig_stock,
self.tr('Maximum quantity of active certifications made by member.'),
params.sig_window,
self.tr('Maximum delay a certification can wait before being expired for non-writing.'),
params.xpercent,
self.tr('Minimum percent of sentries to reach to match the distance rule'),
params.ms_validity / 86400,
self.tr('Maximum age of a valid membership (in days)'),
params.step_max,
self.tr('Maximum distance between each WoT member and a newcomer'),
)
)
dialog.setWindowTitle(self.tr("Web of Trust rules"))
dialog.exec()
def show_about_money(self, params, currency, localized_data):
dialog = QDialog(self)
about_dialog = Ui_AboutMoney()
about_dialog.setupUi(dialog)
about_dialog.label_general.setText(self.general_text(localized_data))
about_dialog.label_rules.setText(self.rules_text(localized_data))
about_dialog.label_money.setText(self.money_text(params, currency))
dialog.setWindowTitle(self.tr("Money rules"))
dialog.exec()
def show_about_referentials(self, referentials):
dialog = QDialog(self)
layout = QVBoxLayout(dialog)
tabwidget = QTabWidget(dialog)
layout.addWidget(tabwidget)
for ref in referentials:
widget = QWidget()
layout = QVBoxLayout(widget)
label = QLabel()
label.setText(self.text_referential(ref))
layout.addWidget(label)
tabwidget.addTab(widget, ref.translated_name())
dialog.setWindowTitle(self.tr("Referentials"))
dialog.exec()
def general_text(self, localized_data):
"""
Fill the general text with given informations
:return:
"""
# set infos in label
return self.tr("""
<table cellpadding="5">
<tr><td align="right"><b>{:}</b></div></td><td>{:} {:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:} {:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:} {:}</td></tr>
<tr><td align="right"><b>{:2.2%} / {:} days</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
</table>
""").format(
localized_data.get('ud', '####'),
self.tr('Universal Dividend UD(t) in'),
localized_data['diff_units'],
localized_data.get('mass_minus_1', "###"),
self.tr('Monetary Mass M(t-1) in'),
localized_data['units'],
localized_data.get('members_count', '####'),
self.tr('Members N(t)'),
localized_data.get('mass_minus_1_per_member', '####'),
self.tr('Monetary Mass per member M(t-1)/N(t) in'),
localized_data['diff_units'],
localized_data.get('actual_growth', 0),
localized_data.get('days_per_dividend', '####'),
self.tr('Actual growth c = UD(t)/[M(t-1)/N(t)]'),
localized_data.get('ud_median_time_minus_1', '####'),
self.tr('Penultimate UD date and time (t-1)'),
localized_data.get('ud_median_time', '####'),
self.tr('Last UD date and time (t)'),
localized_data.get('next_ud_median_time', '####'),
self.tr('Next UD date and time (t+1)'),
localized_data.get('next_ud_reeaval', '####'),
self.tr('Next UD reevaluation (t+1)')
)
def rules_text(self, localized_data):
"""
Set text in rules
:param dict localized_data:
:return:
"""
# set infos in label
return self.tr("""
<table cellpadding="5">
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
</table>
""").format(
self.tr('{:2.0%} / {:} days').format(localized_data['growth'], localized_data['days_per_dividend']),
self.tr('Fundamental growth (c) / Delta time (dt)'),
self.tr('UDĞ(t) = UDĞ(t-1) + c²*M(t-1)/N(t-1)'),
self.tr('Universal Dividend (formula)'),
self.tr('{:} = {:} + {:2.0%}²* {:} / {:}').format(
localized_data.get('ud_plus_1', '####'),
localized_data.get('ud', '####'),
localized_data.get('growth', '####'),
localized_data.get('mass', '####'),
localized_data.get('members_count', '####')
),
self.tr('Universal Dividend (computed)')
)
def text_referential(self, ref):
"""
Set text from referentials
"""
# set infos in label
ref_template = """
<table cellpadding="5">
<tr><th>{:}</th><td>{:}</td></tr>
<tr><th>{:}</th><td>{:}</td></tr>
<tr><th>{:}</th><td>{:}</td></tr>
<tr><th>{:}</th><td>{:}</td></tr>
</table>
"""
return ref_template.format(self.tr('Name'), ref.translated_name(),
self.tr('Units'), ref.units,
self.tr('Formula'), ref.formula,
self.tr('Description'), ref.description
)
def money_text(self, params, currency):
"""
Set text from money parameters
:param sakia.data.entities.BlockchainParameters params: Parameters of the currency
:param str currency: The currency
"""
dt_dhms = timestamp_to_dhms(params.dt)
if dt_dhms[0] > 0:
dt_as_str = self.tr("{:} day(s) {:} hour(s)").format(*dt_dhms)
else:
dt_as_str = self.tr("{:} hour(s)").format(dt_dhms[1])
if dt_dhms[2] > 0 or dt_dhms[3] > 0:
dt_dhms += ", {:} minute(s) and {:} second(s)".format(*dt_dhms[1:])
dt_reeval_dhms = timestamp_to_dhms(params.dt_reeval)
dt_reeval_as_str = self.tr("{:} day(s) {:} hour(s)").format(*dt_reeval_dhms)
# set infos in label
return self.tr("""
<table cellpadding="5">
<tr><td align="right"><b>{:2.0%} / {:} days</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:} {:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:}</b></td><td>{:}</td></tr>
<tr><td align="right"><b>{:2.0%}</b></td><td>{:}</td></tr>
</table>
""").format(
params.c,
QLocale().toString(params.dt / 86400, 'f', 2),
self.tr('Fundamental growth (c)'),
params.ud0,
self.tr('Initial Universal Dividend UD(0) in'),
currency,
dt_as_str,
self.tr('Time period between two UD'),
dt_reeval_as_str,
self.tr('Time period between two UD reevaluation'),
params.median_time_blocks,
self.tr('Number of blocks used for calculating median time'),
params.avg_gen_time,
self.tr('The average time in seconds for writing 1 block (wished time)'),
params.dt_diff_eval,
self.tr('The number of blocks required to evaluate again PoWMin value'),
params.percent_rot,
self.tr('The percent of previous issuers to reach for personalized difficulty')
)
def show_about(self, text):
dialog = QDialog(self)
about_dialog = Ui_AboutPopup()
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment