-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathpages.py
More file actions
137 lines (113 loc) · 5.09 KB
/
pages.py
File metadata and controls
137 lines (113 loc) · 5.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
import math
from ._builtin import Page, WaitPage
from datetime import timedelta
from operator import concat
from functools import reduce
from .models import parse_config
class Introduction(Page):
def is_displayed(self):
return self.round_number == 1
class DecisionWaitPage(WaitPage):
body_text = 'Waiting for all players to be ready'
wait_for_all_groups = True
after_all_players_arrive = 'set_initial_positions'
def is_displayed(self):
return self.subsession.config is not None
class Decision(Page):
def get_timeout_seconds(self):
return parse_config(self.group.session.config['config_file'])[self.group.round_number - 1]['duration']
def is_displayed(self):
return self.subsession.config is not None
class ResultsWaitPage(WaitPage):
wait_for_all_groups = True
after_all_players_arrive = 'set_payoffs'
def is_displayed(self):
return self.subsession.config is not None
class Results(Page):
timeout_seconds = 20
def is_displayed(self):
return self.subsession.config is not None
def vars_for_template(self):
if not self.group:
# If issue in group
return {
'final_position': 'Error in Group',
'initial_position': 'Error in Group',
'transactions': [],
}
events = list(self.group.events.filter(channel='swap'))
transactions = []
for event in events:
if event.value['type'] == 'accept' and event.value['channel'] == 'incoming':
status = 'ACCEPTED'
transfer = event.value['offer']
if self.group.swap_method() == 'Double':
if event.value['transfer'] == 0:
status = 'REJECTED'
transfer = event.value['transfer']
if self.player.id_in_group == event.value['senderID']:
transactions.append({
'original_position': event.value['senderPosition'] + 1,
'new_position': event.value['receiverPosition'] + 1,
'status': status,
'transfer': transfer,
})
elif self.player.id_in_group == event.value['receiverID']:
transactions.append({
'original_position': event.value['receiverPosition'] + 1,
'new_position': event.value['senderPosition'] + 1,
'status': status,
'transfer': -1 * transfer,
})
if event.value['type'] == 'reject' and event.value['channel'] == 'incoming':
if self.player.id_in_group == event.value['senderID']:
transactions.append({
'original_position': event.value['senderPosition'] + 1,
'new_position': event.value['senderPosition'] + 1,
'status': "REJECTED",
'transfer': 1 * event.value['offer'],
})
elif self.player.id_in_group == event.value['receiverID']:
transactions.append({
'original_position': event.value['receiverPosition'] + 1,
'new_position': event.value['receiverPosition'] + 1,
'status': "REJECTED",
'transfer': -1 * event.value['offer'],
})
if event.value['type'] == 'cancel' and event.value['channel'] == 'incoming':
if self.player.id_in_group == event.value['senderID']:
transactions.append({
'original_position': event.value['senderPosition'] + 1,
'new_position': event.value['senderPosition'] + 1,
'status': "CANCELLED",
'transfer': 1 * event.value['offer'],
})
elif self.player.id_in_group == event.value['receiverID']:
transactions.append({
'original_position': event.value['receiverPosition'] + 1,
'new_position': event.value['receiverPosition'] + 1,
'status': "CANCELLED",
'transfer': -1 * event.value['offer'],
})
return {
'final_position': self.player.final_position() + 1,
'initial_position': self.player.initial_position() + 1,
'transactions': transactions,
}
class Payment(Page):
def is_displayed(self):
return self.round_number == self.subsession.num_rounds()
def vars_for_template(self):
return {
'payoff': self.player.in_round(self.session.vars['payment_round1']).payoff + self.player.in_round(self.session.vars['payment_round2']).payoff,
'payoff_round1': self.session.vars['payment_round1'],
'payoff_round2': self.session.vars['payment_round2'],
}
page_sequence = [
Introduction,
DecisionWaitPage,
Decision,
ResultsWaitPage,
Results,
Payment
]