from otree.api import * questions = ["Which is the fastest animal in the world?", "What is the longest river in the world?", "Which is the biggest city in the world?"] class C(BaseConstants): NAME_IN_URL = 'public_goods_simple' PLAYERS_PER_GROUP = 3 NUM_ROUNDS = 3 class Subsession(BaseSubsession): pass class Group(BaseGroup): pass class Player(BasePlayer): answer = models.StringField() confidence = models.FloatField() prediction1 = models.StringField() prediction2 = models.StringField(blank=True) prediction3 = models.StringField(blank=True) prediction4 = models.StringField(blank=True) prediction5 = models.StringField(blank=True) class RankedPrediction(ExtraModel): player = models.Link(Player) prediction = models.StringField() rank = models.IntegerField() # FUNCTIONS def custom_export(players): # header row yield ['session', 'participant_code', 'round_number', 'id_in_group', 'prediction', 'rank'] ranked_predictions = RankedPrediction.filter() for rp in ranked_predictions: p = rp.player participant = p.participant session = p.session yield [session.code, participant.code, p.round_number, p.id_in_group, rp.prediction, rp.rank] # PAGES class Question(Page): form_model = 'player' form_fields = ['answer', 'confidence','prediction1', 'prediction2', 'prediction3', 'prediction4', 'prediction5'] @staticmethod def vars_for_template(player): return dict( answer_label= questions[player.round_number -1] ) class ResultsWaitPage(WaitPage): pass class PredictionDrag(Page): @staticmethod def vars_for_template(player): players = player.group.get_players() print("players", players) answers = [p.answer for p in players] return dict( answers=answers, ) @staticmethod def live_method(player, data): for i,item in enumerate(data['ranked']): print(i,item) RankedPrediction.create(player=player, prediction=item, rank=i); print('received data', player.id_in_group, ':', data) return {player.id_in_group: 'thanks'} page_sequence = [Question, ResultsWaitPage, PredictionDrag]