from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range, ExtraModel, ) author = 'Your name here' doc = """ Your app description """ class Constants(BaseConstants): name_in_url = 'PN4' players_per_group = 4 num_rounds = 1 d1payoff = 12 d2payoff = 14 d3payoff = 16 d4payoff = 14 class Subsession(BaseSubsession): pass class Group(BaseGroup): link12 = models.IntegerField(initial=0) link13 = models.IntegerField(initial=0) link14 = models.IntegerField(initial=0) link23 = models.IntegerField(initial=0) link24 = models.IntegerField(initial=0) link34 = models.IntegerField(initial=0) def live_method(self, id_in_group, receiveddata): self.link12=receiveddata['initiate_12'] * receiveddata['initiate_21'] self.link13=receiveddata['initiate_13'] * receiveddata['initiate_31'] self.link14=receiveddata['initiate_14'] * receiveddata['initiate_41'] self.link23=receiveddata['initiate_23'] * receiveddata['initiate_32'] self.link24=receiveddata['initiate_24'] * receiveddata['initiate_42'] self.link34=receiveddata['initiate_34'] * receiveddata['initiate_43'] p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p3 = self.get_player_by_id(3) p4 = self.get_player_by_id(4) p1.degree = self.link12 + self.link13 + self.link14 p2.degree = self.link12 + self.link23 + self.link24 p3.degree = self.link13 + self.link23 + self.link34 p4.degree = self.link14 + self.link24 + self.link34 # set payoffs if p1.degree == 0: p1.payoff = Constants.d1payoff elif p1.degree == 1: p1.payoff = Constants.d2payoff elif p1.degree == 2: p1.payoff = Constants.d3payoff elif p1.degree == 3: p1.payoff = Constants.d4payoff if p2.degree == 0: p2.payoff = Constants.d1payoff elif p2.degree == 1: p2.payoff = Constants.d2payoff elif p2.degree == 2: p2.payoff = Constants.d3payoff elif p2.degree == 3: p2.payoff = Constants.d4payoff if p3.degree == 0: p3.payoff = Constants.d1payoff elif p3.degree == 1: p3.payoff = Constants.d2payoff elif p3.degree == 2: p3.payoff = Constants.d3payoff elif p3.degree == 3: p3.payoff = Constants.d4payoff if p4.degree == 0: p4.payoff = Constants.d1payoff elif p4.degree == 1: p4.payoff = Constants.d2payoff elif p4.degree == 2: p4.payoff = Constants.d3payoff elif p4.degree == 3: p4.payoff = Constants.d4payoff # create record clicker = self.get_player_by_id(id_in_group) Record.objects.create( player=clicker, clicked=receiveddata['clicked'], when = receiveddata['time_of_click'], number_of_click = receiveddata['number_of_click']) response = dict ( initiate_21=receiveddata['initiate_21'], initiate_31=receiveddata['initiate_31'], initiate_41=receiveddata['initiate_41'], initiate_12=receiveddata['initiate_12'], initiate_32=receiveddata['initiate_32'], initiate_42=receiveddata['initiate_42'], initiate_13=receiveddata['initiate_13'], initiate_23=receiveddata['initiate_23'], initiate_43=receiveddata['initiate_43'], initiate_14=receiveddata['initiate_14'], initiate_24=receiveddata['initiate_24'], initiate_34=receiveddata['initiate_34'], link12=receiveddata['initiate_12'] * receiveddata['initiate_21'], link13=receiveddata['initiate_13'] * receiveddata['initiate_31'], link14=receiveddata['initiate_14'] * receiveddata['initiate_41'], link23=receiveddata['initiate_23'] * receiveddata['initiate_32'], link24=receiveddata['initiate_24'] * receiveddata['initiate_42'], link34=receiveddata['initiate_34'] * receiveddata['initiate_43'], ) return {0: response} def set_finalpayoffs(self): # this is a test function called on wait page p1 = self.get_player_by_id(1) p2 = self.get_player_by_id(2) p3 = self.get_player_by_id(3) p4 = self.get_player_by_id(4) #p1.finalpayoff = 100 #def testfunction(self): #return 1 # a dummy function that always gives 1 as result class Player(BasePlayer): # personal info Fname = models.StringField(label="First name*:",blank=True) Lname = models.StringField(label="Last name*:",blank=True) sID = models.FloatField(label="Student ID*:",blank=True) cell = models.FloatField(blank=True) address = models.StringField(blank=True) SSN = models.FloatField(blank=True) degree = models.IntegerField(initial=0) finalpayoff= models.FloatField() #def after_all_players_arrive(self): #self.finalpayoff = 120 #self.set_finalpayoffs() class Record(ExtraModel): player = models.Link(Player) clicked = models.IntegerField() when = models.FloatField() number_of_click=models.IntegerField() def custom_export(players): yield ['session_code', 'participant_code', 'id','clicked', 'when', 'count'] for rec in Record.objects.order_by('id'): yield [rec.player.session.code, rec.player.participant.code, rec.player.id_in_group, rec.clicked, rec.when, rec.number_of_click]