65 lines
2.4 KiB
Python
65 lines
2.4 KiB
Python
# Copyright © 2020 Interplanetary Database Association e.V.,
|
|
# BigchainDB and IPDB software contributors.
|
|
# SPDX-License-Identifier: (Apache-2.0 AND CC-BY-4.0)
|
|
# Code is Apache-2.0 and docs are CC-BY-4.0
|
|
|
|
from bigchaindb.common.transaction import Transaction
|
|
from bigchaindb.common.schema import (_validate_schema,
|
|
TX_SCHEMA_COMMON,
|
|
TX_SCHEMA_TRANSFER,
|
|
TX_SCHEMA_VOTE)
|
|
|
|
|
|
class Vote(Transaction):
|
|
|
|
OPERATION = 'VOTE'
|
|
# NOTE: This class inherits TRANSFER txn type. The `TRANSFER` property is
|
|
# overriden to re-use methods from parent class
|
|
TRANSFER = OPERATION
|
|
ALLOWED_OPERATIONS = (OPERATION,)
|
|
# Custom validation schema
|
|
TX_SCHEMA_CUSTOM = TX_SCHEMA_VOTE
|
|
|
|
def validate(self, bigchain, current_transactions=[]):
|
|
"""Validate election vote transaction
|
|
NOTE: There are no additional validity conditions on casting votes i.e.
|
|
a vote is just a valid TRANFER transaction
|
|
|
|
For more details refer BEP-21: https://github.com/bigchaindb/BEPs/tree/master/21
|
|
|
|
Args:
|
|
bigchain (BigchainDB): an instantiated bigchaindb.lib.BigchainDB object.
|
|
|
|
Returns:
|
|
Vote: a Vote object
|
|
|
|
Raises:
|
|
ValidationError: If the election vote is invalid
|
|
"""
|
|
self.validate_transfer_inputs(bigchain, current_transactions)
|
|
return self
|
|
|
|
@classmethod
|
|
def generate(cls, inputs, recipients, election_id, metadata=None):
|
|
(inputs, outputs) = cls.validate_transfer(inputs, recipients, election_id, metadata)
|
|
election_vote = cls(cls.OPERATION, {'id': election_id}, inputs, outputs, metadata)
|
|
cls.validate_schema(election_vote.to_dict())
|
|
return election_vote
|
|
|
|
@classmethod
|
|
def validate_schema(cls, tx):
|
|
"""Validate the validator election vote transaction. Since `VOTE` extends `TRANSFER`
|
|
transaction, all the validations for `CREATE` transaction should be inherited
|
|
"""
|
|
_validate_schema(TX_SCHEMA_COMMON, tx)
|
|
_validate_schema(TX_SCHEMA_TRANSFER, tx)
|
|
_validate_schema(cls.TX_SCHEMA_CUSTOM, tx)
|
|
|
|
@classmethod
|
|
def create(cls, tx_signers, recipients, metadata=None, asset=None):
|
|
raise NotImplementedError
|
|
|
|
@classmethod
|
|
def transfer(cls, tx_signers, recipients, metadata=None, asset=None):
|
|
raise NotImplementedError
|