Skip to content

Commit

Permalink
fixes issue #45
Browse files Browse the repository at this point in the history
* Fixes issue #45 by checking the timestamp of last_payout instead of net_rshares. With these changes, voting of unvoted posts/comments is possible.
* Refactoring of Transactionbuilder and adding of _use_condenser_api for defining the use of condenser api on broadcasting when using appbase nodes..
  • Loading branch information
holgern committed Jul 10, 2018
1 parent 812155c commit fc85671
Show file tree
Hide file tree
Showing 5 changed files with 64 additions and 24 deletions.
14 changes: 9 additions & 5 deletions beem/comment.py
Expand Up @@ -14,7 +14,7 @@
from .account import Account
from .amount import Amount
from .price import Price
from .utils import resolve_authorperm, construct_authorperm, derive_permlink, remove_from_dict, make_patch, formatTimeString
from .utils import resolve_authorperm, construct_authorperm, derive_permlink, remove_from_dict, make_patch, formatTimeString, formatToTimeStamp
from .blockchainobject import BlockchainObject
from .exceptions import ContentDoesNotExistsException, VotingInvalidOnArchivedPost
from beembase import operations
Expand Down Expand Up @@ -551,8 +551,10 @@ def upvote(self, weight=+100, voter=None):
:param str voter: (optional) Voting account
"""
if self.get('net_rshares', None) is None:
raise VotingInvalidOnArchivedPost
last_payout = self.get('last_payout', None)
if last_payout is not None:
if formatToTimeStamp(last_payout) > 0:
raise VotingInvalidOnArchivedPost
return self.vote(weight, account=voter)

def downvote(self, weight=-100, voter=None):
Expand All @@ -563,8 +565,10 @@ def downvote(self, weight=-100, voter=None):
:param str voter: (optional) Voting account
"""
if self.get('net_rshares', None) is None:
raise VotingInvalidOnArchivedPost
last_payout = self.get('last_payout', None)
if last_payout is not None:
if formatToTimeStamp(last_payout) > 0:
raise VotingInvalidOnArchivedPost
return self.vote(weight, account=voter)

def vote(self, weight, account=None, identifier=None, **kwargs):
Expand Down
6 changes: 2 additions & 4 deletions beem/steem.py
Expand Up @@ -30,7 +30,7 @@
from .wallet import Wallet
from .steemconnect import SteemConnect
from .transactionbuilder import TransactionBuilder
from .utils import formatTime, resolve_authorperm, derive_permlink, remove_from_dict, addTzInfo
from .utils import formatTime, resolve_authorperm, derive_permlink, remove_from_dict, addTzInfo, formatToTimeStamp
from beem.constants import STEEM_VOTE_REGENERATION_SECONDS, STEEM_100_PERCENT, STEEM_1_PERCENT

log = logging.getLogger(__name__)
Expand Down Expand Up @@ -452,9 +452,7 @@ def get_steem_per_mvest(self, time_stamp=None, use_stored_data=True):
"""
if time_stamp is not None:
if isinstance(time_stamp, (datetime, date)):
time_stamp = addTzInfo(time_stamp)
epoch = addTzInfo(datetime(1970, 1, 1))
time_stamp = (time_stamp - epoch) // timedelta(seconds=1)
time_stamp = formatToTimeStamp(time_stamp)
a = 2.1325476281078992e-05
b = -31099.685481490847
a2 = 2.9019227739473682e-07
Expand Down
14 changes: 9 additions & 5 deletions beem/transactionbuilder.py
Expand Up @@ -66,6 +66,7 @@ def __init__(
self._require_reconstruction = False
else:
self._require_reconstruction = True
self._use_condenser_api = True
self.set_expiration(kwargs.get("expiration", self.steem.expiration))

def set_expiration(self, p):
Expand All @@ -80,7 +81,7 @@ def list_operations(self):
"""List all ops"""
if self.steem.is_connected() and self.steem.rpc.get_use_appbase():
# appbase disabled by now
appbase = False
appbase = not self._use_condenser_api
else:
appbase = False
return [Operation(o, appbase=appbase) for o in self.ops]
Expand Down Expand Up @@ -238,7 +239,7 @@ def constructTx(self):
if self.steem.is_connected() and self.steem.rpc.get_use_appbase():
# appbase disabled by now
# broadcasting does not work at the moment
appbase = False
appbase = not self._use_condenser_api
else:
appbase = False
for op in self.ops:
Expand Down Expand Up @@ -381,9 +382,12 @@ def broadcast(self, max_block_age=-1):
ret = self.json()
if self.steem.is_connected() and self.steem.rpc.get_use_appbase():
# Returns an internal Error at the moment
# args = {'trx': self.json(), 'max_block_age': max_block_age}
args = self.json()
broadcast_api = "condenser"
if not self._use_condenser_api:
args = {'trx': self.json(), 'max_block_age': max_block_age}
broadcast_api = "network_broadcast"
else:
args = self.json()
broadcast_api = "condenser"
else:
args = self.json()
broadcast_api = "network_broadcast"
Expand Down
29 changes: 21 additions & 8 deletions beem/utils.py
Expand Up @@ -28,21 +28,34 @@ def formatTime(t):
return t.strftime("%Y%m%dt%H%M%S%Z")


def addTzInfo(t, timezone='UTC'):
"""Returns a datetime object with tzinfo added"""
if t and isinstance(t, (datetime, date, time)) and t.tzinfo is None:
utc = pytz.timezone(timezone)
t = utc.localize(t)
return t


def formatTimeString(t):
""" Properly Format Time for permlinks
"""
if isinstance(t, (datetime, date, time)):
return t.strftime(timeFormat)
utc = pytz.timezone('UTC')
return utc.localize(datetime.strptime(t, timeFormat))
return addTzInfo(datetime.strptime(t, timeFormat))


def addTzInfo(t, timezone='UTC'):
"""Returns a datetime object with tzinfo added"""
if t and isinstance(t, (datetime, date, time)) and t.tzinfo is None:
utc = pytz.timezone(timezone)
t = utc.localize(t)
return t
def formatToTimeStamp(t):
""" Retuns a timestamp integer
:param datetime t: datetime object
:return: Timestamp as integer
"""
if isinstance(t, (datetime, date, time)):
t = addTzInfo(t)
else:
t = formatTimeString(t)
epoch = addTzInfo(datetime(1970, 1, 1))
return (t - epoch) // timedelta(seconds=1)


def formatTimeFromNow(secs=0):
Expand Down
25 changes: 23 additions & 2 deletions tests/beem/test_utils.py
Expand Up @@ -3,7 +3,7 @@
from __future__ import print_function
from __future__ import unicode_literals
import unittest
from datetime import datetime
from datetime import datetime, date, timedelta
from beem.utils import (
formatTimedelta,
assets_from_string,
Expand All @@ -15,7 +15,10 @@
derive_permlink,
resolve_root_identifier,
make_patch,
remove_from_dict
remove_from_dict,
formatToTimeStamp,
formatTimeString,
addTzInfo
)


Expand Down Expand Up @@ -77,3 +80,21 @@ def test_remove_from_dict(self):
self.assertEqual(remove_from_dict(b, ['a'], keep_keys=False), {'b': 2})
self.assertEqual(remove_from_dict(b, [], keep_keys=True), {})
self.assertEqual(remove_from_dict(a, ['a', 'b'], keep_keys=False), {})

def test_formatDateTimetoTimeStamp(self):
t = "1970-01-01T00:00:00"
t = formatTimeString(t)
timestamp = formatToTimeStamp(t)
self.assertEqual(timestamp, 0)
t2 = "2018-07-10T10:08:39"
timestamp = formatToTimeStamp(t2)
self.assertEqual(timestamp, 1531217319)
t3 = datetime(2018, 7, 10, 10, 8, 39)
timestamp = formatToTimeStamp(t3)
self.assertEqual(timestamp, 1531217319)

def test_formatTimeString(self):
t = "2018-07-10T10:08:39"
t = formatTimeString(t)
t2 = addTzInfo(datetime(2018, 7, 10, 10, 8, 39))
self.assertEqual(t, t2)

0 comments on commit fc85671

Please sign in to comment.