code: def _do_config_proposal_vote(args):
      
      signer = _read_signer(args.key)
      rest_client = RestClient(args.url)
  
      proposals = _get_proposals(rest_client)
  
      proposal = None
      for candidate in proposals.candidates:
          if candidate.proposal_id == args.proposal_id:
              proposal = candidate
              break
  
      if proposal is None:
          raise CliException('No proposal exists with the given id')
  
      for vote_record in proposal.votes:
          if vote_record.public_key == signer.get_public_key().as_hex():
              raise CliException(
                  'A vote has already been recorded with this signing key')
  
      txn = _create_vote_txn(
          signer,
          args.proposal_id,
          proposal.proposal.setting,
          args.vote_value)
      batch = _create_batch(signer, [txn])
  
      batch_list = BatchList(batches=[batch])
  
      rest_client.send_batches(batch_list)
docs: Executes the 'proposal vote' subcommand.  Given a key file, a proposal
      id and a vote value, it generates a batch of sawtooth_settings transactions
      in a BatchList instance.  The BatchList is file or submitted to a
      validator.