Skip to content
This repository has been archived by the owner on Oct 31, 2023. It is now read-only.

Migrate Payments to TaskPayment #4240

Merged
merged 16 commits into from
Jun 5, 2019
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 14 additions & 6 deletions golem/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@

from apps.appsmanager import AppsManager
import golem
from golem import model
from golem.appconfig import TASKARCHIVE_MAINTENANCE_INTERVAL, AppConfig
from golem.clientconfigdescriptor import ConfigApprover, ClientConfigDescriptor
from golem.core import variables
Expand All @@ -32,7 +33,7 @@
from golem.hardware.presets import HardwarePresets
from golem.config.active import EthereumConfig
from golem.core.keysauth import KeysAuth
from golem.core.service import LoopingCallService, IService
from golem.core.service import LoopingCallService
from golem.core.simpleserializer import DictSerializer
from golem.database import Database
from golem.diag.service import DiagnosticsService, DiagnosticsOutputFormat
Expand All @@ -41,7 +42,6 @@
from golem.manager.nodestatesnapshot import ComputingSubtaskStateSnapshot
from golem.ethereum import exceptions as eth_exceptions
from golem.ethereum.fundslocker import FundsLocker
from golem.model import PaymentStatus
from golem.ethereum.transactionsystem import TransactionSystem
from golem.monitor.model.nodemetadatamodel import NodeMetadataModel
from golem.monitor.monitor import SystemMonitor
Expand Down Expand Up @@ -833,17 +833,25 @@ def get_task(self, task_id: str) -> Optional[dict]:
# Get total value and total fee for payments for the given subtask IDs
subtasks_payments = \
self.transaction_system.get_subtasks_payments(subtask_ids)
statuses_of_interest = (
model.WalletOperation.STATUS.sent,
model.WalletOperation.STATUS.confirmed,
)
all_sent = all(
p.status in [PaymentStatus.sent, PaymentStatus.confirmed]
p.wallet_operation.status in statuses_of_interest
for p in subtasks_payments)
if not subtasks_payments or not all_sent:
task_dict['cost'] = None
task_dict['fee'] = None
else:
# Because details are JSON field
task_dict['cost'] = sum(p.value or 0 for p in subtasks_payments)
task_dict['cost'] = sum(
p.wallet_operation.amount for p in subtasks_payments
)
task_dict['fee'] = \
sum(p.details.fee or 0 for p in subtasks_payments)
sum(
p.wallet_operation.gas_cost for p in subtasks_payments
if p.wallet_operation.gas_cost
)

# Convert to string because RPC serializer fails on big numbers
for k in ('cost', 'fee', 'estimated_cost', 'estimated_fee'):
Expand Down
3 changes: 1 addition & 2 deletions golem/database/database.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,8 +55,7 @@ def execute_sql(self, sql, params=None, require_commit=True):


class Database:

SCHEMA_VERSION = 26
SCHEMA_VERSION = 27

def __init__(self, # noqa pylint: disable=too-many-arguments
db: peewee.Database,
Expand Down
2 changes: 1 addition & 1 deletion golem/database/schemas/007_schema.py
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ class Payment(pw.Model):
index=True)
payee = pw.RawCharField()
value = pw.HexIntegerField()
details = pw.PaymentDetailsField()
details = pw.TextField()
processed_ts = pw.IntegerField(null=True)

class Meta:
Expand Down
29 changes: 29 additions & 0 deletions golem/database/schemas/026_create_wallet_operation.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# pylint: disable=no-member
# pylint: disable=unused-argument
import datetime

import peewee as pw

SCHEMA_VERSION = 26


def migrate(migrator, database, fake=False, **kwargs):
@migrator.create_model # pylint: disable=unused-variable
class WalletOperation(pw.Model):
tx_hash = pw.CharField()
direction = pw.CharField()
status = pw.CharField()
sender_address = pw.CharField()
recipient_address = pw.CharField()
amount = pw.CharField()
currency = pw.CharField()
gas_cost = pw.CharField()
created_date = pw.DateTimeField(default=datetime.datetime.now)
modified_date = pw.DateTimeField(default=datetime.datetime.now)

class Meta:
db_table = "walletoperation"


def rollback(migrator, database, fake=False, **kwargs):
migrator.remove_model("walletoperation")
28 changes: 28 additions & 0 deletions golem/database/schemas/027_create_task_payment.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
# pylint: disable=no-member
# pylint: disable=unused-argument
import datetime

import peewee as pw

SCHEMA_VERSION = 27


def migrate(migrator, database, fake=False, **kwargs):
@migrator.create_model # pylint: disable=unused-variable
class TaskPayment(pw.Model):
wallet_operation = pw.IntegerField()
node = pw.CharField()
task = pw.CharField()
subtask = pw.CharField()
expected_amount = pw.CharField()
accepted_ts = pw.DateTimeField()
settled_ts = pw.DateTimeField()
created_date = pw.DateTimeField(default=datetime.datetime.now)
modified_date = pw.DateTimeField(default=datetime.datetime.now)

class Meta:
db_table = "taskpayment"


def rollback(migrator, database, fake=False, **kwargs):
migrator.remove_model("taskpayment")
Loading