source: geniuswebcore/geniusweb/actions/Votes.py@ 92

Last change on this file since 92 was 90, checked in by Bart Vastenhouw, 3 years ago

Refactor to help reusing partiesserver.

File size: 3.0 KB
Line 
1from __future__ import annotations
2from typing import Set, Optional, List
3
4from geniusweb.actions.AbstractAction import AbstractAction
5from geniusweb.actions.PartyId import PartyId
6from geniusweb.actions.Vote import Vote
7from geniusweb.issuevalue.Bid import Bid
8
9
10class Votes (AbstractAction):
11 '''
12 Indicates that a party conditionally agrees with any of the {@link Vote}s
13 provided.
14 '''
15 def __init__(self, actor: PartyId, votes:Set[Vote]):
16 '''
17 @param id party id
18 @param votes the {@link Vote}s that the party can agree on, if the
19 condition of the Vote holds. Every {@link Vote#getActor()}
20 should equal the id. There may be at most 1 vote per
21 {@link Bid}.
22 '''
23 super().__init__(actor)
24 if votes == None:
25 raise ValueError("votes must be not null");
26 self._votes = votes.copy()
27 for vote in self._votes:
28 if not vote.getActor()== actor:
29 raise ValueError("All votes must come from "\
30 + str(actor) + " but found " + str(vote))
31
32 # check for duplicate Vote's, possibly with different powers
33 votedfor:List[Bid] = []
34 for vote in votes:
35 bid = vote.getBid()
36 if bid in votedfor:
37 raise ValueError("Votes contains multiple Vote's for "+ str(bid))
38 votedfor.append(bid)
39
40
41 def isExtending(self, otherVotes:Votes ) -> bool:
42 '''
43 Test if Votes extends other votes. Extending means that for each vote on
44 bid B with power P in othervotes, this contains also a vote for bid B
45 with power at most P.
46
47 @param otherVotes the {@link Votes}, usually from a previous round, that
48 this should extend.
49 @return true iff this extends the otherVotes.
50 '''
51 if not otherVotes.getActor()==self.getActor():
52 return False
53 for vote in otherVotes.getVotes():
54 myvote:Optional[Vote] = self.getVote(vote.getBid())
55 if myvote == None or myvote.getMinPower() > vote.getMinPower() or myvote.getMaxPower() < vote.getMaxPower(): # type:ignore
56 return False
57
58 return True
59
60
61 def getVote(self, bid:Bid ) -> Optional[Vote] :
62 '''
63 @param bid the bid that we may have a vote for
64 @return myvote for bid, or null if no vote for that bid;
65 '''
66 for vote in self._votes:
67 if vote.getBid() == bid:
68 return vote;
69 return None;
70
71 def getVotes(self) -> Set[Vote]:
72 return self._votes.copy()
73
74
75 def __eq__(self, other):
76 return isinstance(other, self.__class__) and \
77 self._actor==other._actor and self._votes==other._votes
78
79 def __hash__(self):
80 return hash((self._actor, tuple(self._votes)))
81
82 def __repr__(self) -> str :
83 return "Votes[" + str(self._actor) + "," +\
84 str(self._votes) + "]"
85
Note: See TracBrowser for help on using the repository browser.