diff --git a/src/sakia/app.py b/src/sakia/app.py index a49bb3556d404621d55f6e90a5e1807428398df3..aa1f9358c675beeadab3f2945c826adfdc8ab947 100644 --- a/src/sakia/app.py +++ b/src/sakia/app.py @@ -15,9 +15,10 @@ from duniterpy.api.bma import API from . import __version__ from .options import SakiaOptions from sakia.data.connectors import BmaConnector -from sakia.services import NetworkService, BlockchainService, IdentitiesService +from sakia.services import NetworkService, BlockchainService, IdentitiesService, SourcesServices from sakia.data.repositories import SakiaDatabase -from sakia.data.processors import BlockchainProcessor, NodesProcessor, IdentitiesProcessor, CertificationsProcessor +from sakia.data.processors import BlockchainProcessor, NodesProcessor, IdentitiesProcessor, \ + CertificationsProcessor, SourcesProcessor from sakia.data.files import AppDataFile, UserParametersFile from sakia.decorators import asyncify from sakia.money import Relative @@ -85,11 +86,13 @@ class Application(QObject): bma_connector = BmaConnector(nodes_processor) identities_processor = IdentitiesProcessor(self.db.identities_repo, self.db.blockchains_repo, bma_connector) certs_processor = CertificationsProcessor(self.db.certifications_repo, bma_connector) - blockchain_processor = BlockchainProcessor(self.db.blockchains_repo, bma_connector) + blockchain_processor = BlockchainProcessor.instanciate(self) + sources_processor = SourcesProcessor.instanciate(self) self.blockchain_services = {} self.network_services = {} self.identities_services = {} + self.sources_services = {} for currency in self.db.connections_repo.get_currencies(): self.identities_services[currency] = IdentitiesService(currency, identities_processor, certs_processor, blockchain_processor, @@ -98,6 +101,7 @@ class Application(QObject): self.identities_services[currency]) self.network_services[currency] = NetworkService.load(currency, nodes_processor, self.blockchain_services[currency]) + self.sources_services[currency] = SourcesServices(currency, sources_processor, bma_connector) def set_proxy(self): if self.preferences['enable_proxy'] is True: diff --git a/src/sakia/data/processors/blockchain.py b/src/sakia/data/processors/blockchain.py index fb67afc682ccb2a21ff86933f48ebd1a9ecf6a7d..569ae051e31ef7f2b41f908350c5beff732d63d8 100644 --- a/src/sakia/data/processors/blockchain.py +++ b/src/sakia/data/processors/blockchain.py @@ -27,42 +27,49 @@ class BlockchainProcessor: Get the local current blockuid :rtype: duniterpy.documents.BlockUID """ - return self._repo.get_one({'currency': currency}).current_buid + return self._repo.get_one(currency=currency).current_buid def time(self, currency): """ Get the local current median time :rtype: int """ - return self._repo.get_one({'currency': currency}).median_time + return self._repo.get_one(currency=currency).median_time def parameters(self, currency): """ Get the parameters of the blockchain :rtype: sakia.data.entities.BlockchainParameters """ - return self._repo.get_one({'currency': currency}).parameters + return self._repo.get_one(currency=currency).parameters - def monetary_mass(self, currency): + def current_mass(self, currency): """ Get the local current monetary mass :rtype: int """ - return self._repo.get_one({'currency': currency}).monetary_mass + return self._repo.get_one(currency=currency).current_mass - def members_count(self, currency): + def current_members_count(self, currency): """ Get the number of members in the blockchain :rtype: int """ - return self._repo.get_one({'currency': currency}).members_count + return self._repo.get_one(currency=currency).current_members_count + + def last_members_count(self, currency): + """ + Get the last ud value and base + :rtype: int, int + """ + return self._repo.get_one(currency=currency).last_members_count def last_ud(self, currency): """ Get the last ud value and base :rtype: int, int """ - blockchain = self._repo.get_one({'currency': currency}) + blockchain = self._repo.get_one(currency=currency) return blockchain.last_ud, blockchain.last_ud_base def last_ud_time(self, currency): @@ -70,7 +77,7 @@ class BlockchainProcessor: Get the last ud time :rtype: int """ - blockchain = self._repo.get_one({'currency': currency}) + blockchain = self._repo.get_one(currency=currency) return blockchain.last_ud_time def previous_monetary_mass(self, currency): @@ -78,21 +85,21 @@ class BlockchainProcessor: Get the local current monetary mass :rtype: int """ - return self._repo.get_one({'currency': currency}).previous_mass + return self._repo.get_one(currency=currency).previous_mass def previous_members_count(self, currency): """ Get the local current monetary mass :rtype: int """ - return self._repo.get_one({'currency': currency}).previous_members_count + return self._repo.get_one(currency=currency).previous_members_count def previous_ud(self, currency): """ Get the previous ud value and base :rtype: int, int """ - blockchain = self._repo.get_one({'currency': currency}) + blockchain = self._repo.get_one(currency=currency) return blockchain.previous_ud, blockchain.previous_ud_base def previous_ud_time(self, currency): @@ -100,7 +107,7 @@ class BlockchainProcessor: Get the previous ud time :rtype: int """ - blockchain = self._repo.get_one({'currency': currency}) + blockchain = self._repo.get_one(currency=currency) return blockchain.previous_ud_time async def new_blocks_with_identities(self, currency): @@ -175,6 +182,7 @@ class BlockchainProcessor: block = Block.from_signed_raw(signed_raw) blockchain.current_buid = block.blockUID blockchain.median_time = block.mediantime + blockchain.current_members_count = block.members_count except errors.DuniterError as e: if e.ucode != errors.NO_CURRENT_BLOCK: raise @@ -191,11 +199,11 @@ class BlockchainProcessor: block_with_ud = await self._bma_connector.get(currency, bma.blockchain.Block, req_args={'number': block_number}) if block_with_ud: + blockchain.last_members_count = block_with_ud['membersCount'] blockchain.last_ud = block_with_ud['dividend'] blockchain.last_ud_base = block_with_ud['unitbase'] blockchain.last_ud_time = block_with_ud['medianTime'] blockchain.current_mass = block_with_ud['monetaryMass'] - blockchain.nb_members = block_with_ud['membersCount'] except errors.DuniterError as e: if e.ucode != errors.NO_CURRENT_BLOCK: raise @@ -207,6 +215,10 @@ class BlockchainProcessor: block_with_ud = await self._bma_connector.get(currency, bma.blockchain.Block, req_args={'number': block_number}) blockchain.previous_mass = block_with_ud['monetaryMass'] + blockchain.previous_members_count = block_with_ud['membersCount'] + blockchain.previous_ud = block_with_ud['dividend'] + blockchain.previous_ud_base = block_with_ud['unitbase'] + blockchain.previous_ud_time = block_with_ud['medianTime'] except errors.DuniterError as e: if e.ucode != errors.NO_CURRENT_BLOCK: raise diff --git a/src/sakia/data/processors/sources.py b/src/sakia/data/processors/sources.py index 0268e54d52ad84c5adbdc505cdedfd3340d5d5d8..2e248348dae50b707da8c94ebed5d003abaf1a8e 100644 --- a/src/sakia/data/processors/sources.py +++ b/src/sakia/data/processors/sources.py @@ -45,3 +45,13 @@ class SourcesProcessor: log_stream("{0}/{1} sources".format(i, len(sources_data['sources']))) except errors.DuniterError as e: raise + + def amount(self, currency, pubkey): + """ + Get the amount value of the sources for a given pubkey + :param str currency: the currency of the sources + :param str pubkey: the pubkey owning the sources + :return: + """ + sources = self._repo.get_all(currency=currency, pubkey=pubkey) + return sum([s.amount * (10**s.base) for s in sources]) diff --git a/src/sakia/services/__init__.py b/src/sakia/services/__init__.py index 2c5869f54cae9a872309cb779f6e553fbdfd8999..d98cc6ea4caff14eada3c1535061ec9d972fedf8 100644 --- a/src/sakia/services/__init__.py +++ b/src/sakia/services/__init__.py @@ -2,3 +2,4 @@ from .network import NetworkService from .identities import IdentitiesService from .blockchain import BlockchainService from .documents import DocumentsService +from .sources import SourcesServices diff --git a/src/sakia/services/blockchain.py b/src/sakia/services/blockchain.py index f48d3df14932da90b9119d23d74a2ed8b4057551..a777546a1d8831636768fe28e440a9488ed12266 100644 --- a/src/sakia/services/blockchain.py +++ b/src/sakia/services/blockchain.py @@ -37,15 +37,18 @@ class BlockchainService(QObject): def parameters(self): return self._blockchain_processor.parameters(self.currency) - def members_count(self): - return self._blockchain_processor.members_count(self.currency) + def current_members_count(self): + return self._blockchain_processor.current_members_count(self.currency) - def monetary_mass(self): - return self._blockchain_processor.monetary_mass(self.currency) + def current_mass(self): + return self._blockchain_processor.current_mass(self.currency) def last_ud(self): return self._blockchain_processor.last_ud(self.currency) + def last_members_count(self): + return self._blockchain_processor.last_members_count(self.currency) + def last_ud_time(self): return self._blockchain_processor.last_ud_time(self.currency) @@ -67,5 +70,5 @@ class BlockchainService(QObject): :rtype: int """ parameters = self.parameters() - next_ud = parameters.c * self.monetary_mass() / self.nb_members() + next_ud = parameters.c * self.current_mass() / self.last_members_count() return math.ceil(next_ud) diff --git a/src/sakia/services/sources.py b/src/sakia/services/sources.py new file mode 100644 index 0000000000000000000000000000000000000000..5ef98b7a492897a8d26233500ba1743e3894a881 --- /dev/null +++ b/src/sakia/services/sources.py @@ -0,0 +1,27 @@ +from PyQt5.QtCore import QObject +from duniterpy.api import bma +import math +import logging + + +class SourcesServices(QObject): + """ + Source service is managing sources received + to update data locally + """ + def __init__(self, currency, sources_processor, bma_connector): + """ + Constructor the identities service + + :param str currency: The currency name of the community + :param sakia.data.processors.SourceProcessor sources_processor: the sources processor for given currency + :param sakia.data.connectors.BmaConnector bma_connector: The connector to BMA API + """ + super().__init__() + self._sources_processor = sources_processor + self._bma_connector = bma_connector + self.currency = currency + self._logger = logging.getLogger('sakia') + + def amount(self, pubkey): + return self._sources_processor.amount(self.currency, pubkey) diff --git a/src/sakia/tests/unit/data/test_blockchains_repo.py b/src/sakia/tests/unit/data/test_blockchains_repo.py index 51dbd074f50c7f86aed5b0c5a16644fdae6f3878..cdfd8662dc42dc392d58065d258c58be350d77a2 100644 --- a/src/sakia/tests/unit/data/test_blockchains_repo.py +++ b/src/sakia/tests/unit/data/test_blockchains_repo.py @@ -38,9 +38,10 @@ class TestBlockchainsRepo(unittest.TestCase): 10, 0.66), current_buid="20-7518C700E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67", - members_count = 10, + current_members_count = 10, current_mass = 1000000, median_time = 86400, + last_members_count = 5, last_ud = 100000, last_ud_base = 0, last_ud_time = 86400, @@ -73,7 +74,7 @@ class TestBlockchainsRepo(unittest.TestCase): self.assertEqual(blockchain.current_buid, BlockUID(20, "7518C700E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67") ) - self.assertEqual(blockchain.members_count, 10) + self.assertEqual(blockchain.current_members_count, 10) blockchains_repo.drop(blockchain) blockchain = blockchains_repo.get_one(currency="testcurrency") @@ -101,9 +102,10 @@ class TestBlockchainsRepo(unittest.TestCase): 0.66), current_buid="20-7518C700E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67", - members_count = 10, + current_members_count = 10, current_mass = 1000000, median_time = 86400, + last_members_count = 5, last_ud = 100000, last_ud_base = 0, last_ud_time = 86400, @@ -133,9 +135,10 @@ class TestBlockchainsRepo(unittest.TestCase): 10, 0.66), current_buid="20-7518C700E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67", - members_count = 20, + current_members_count = 20, current_mass = 1000000, median_time = 86400, + last_members_count = 5, last_ud = 100000, last_ud_base = 0, last_ud_time = 86400, @@ -151,11 +154,11 @@ class TestBlockchainsRepo(unittest.TestCase): # result sorted by currency name by default self.assertEquals(86400, blockchains[0].parameters.dt) self.assertEquals("testcurrency", blockchains[0].currency) - self.assertEquals(10, blockchains[0].members_count) + self.assertEquals(10, blockchains[0].current_members_count) self.assertEquals(86400*365, blockchains[1].parameters.dt) self.assertEquals("testcurrency2", blockchains[1].currency) - self.assertEquals(20, blockchains[1].members_count) + self.assertEquals(20, blockchains[1].current_members_count) def test_add_update_blockchain(self): blockchains_repo = BlockchainsRepo(self.meta_repo.conn) @@ -178,9 +181,10 @@ class TestBlockchainsRepo(unittest.TestCase): 10, 0.66), current_buid="20-7518C700E78B56CC21FB1DDC6CBAB24E0FACC9A798F5ED8736EA007F38617D67", - members_count = 10, + current_members_count = 10, current_mass = 1000000, median_time = 86400, + last_members_count = 5, last_ud = 100000, last_ud_base = 0, last_ud_time = 86400, @@ -192,7 +196,7 @@ class TestBlockchainsRepo(unittest.TestCase): currency = "testcurrency" ) blockchains_repo.insert(blockchain) - blockchain.members_count = 30 + blockchain.current_members_count = 30 blockchains_repo.update(blockchain) blockchain2 = blockchains_repo.get_one(currency="testcurrency") - self.assertEquals(30, blockchain2.members_count) + self.assertEquals(30, blockchain2.current_members_count)