from otree.api import * class Constants(BaseConstants): # des constantes https://otree.readthedocs.io/en/master/models.html#constants name_in_url = 'TestFF' num_rounds = 5; players_per_group = 2 # participant par groupe payoff_both_defect = 50; payoff_high = 150; payoff_low = 0; payoff_both_cooperate = 100; TIMEOUT = 15 TIMER_TEXT = "Voici le temps qu'il vous reste en minute avant ce soir 22h00 pour répondre :" TIMER2_TEXT = "Voici le temps qu'il vous reste minute avant demain 2h à attendre :" # https://otree.readthedocs.io/en/latest/rounds.html class Subsession(BaseSubsession): pass class Group(BaseGroup): # group model pour quand les résultats impactent le groupe total_contribution = models.CurrencyField() individual_share = models.CurrencyField() class Player(BasePlayer): # player model part1_start_time_readable = models.StringField(initial='null') part2_start_time = models.FloatField(initial=0) part2_start_time_readable = models.StringField(initial='null') part1_start_time_readable = models.StringField(initial='null') robotjoue = models.BooleanField(initial=False) pr1 = models.CurrencyField(initial=0) pr2 = models.CurrencyField(initial=0) pr3 = models.CurrencyField(initial=0) pr4 = models.CurrencyField(initial=0) pr5 = models.CurrencyField(initial=0) Gains = models.CurrencyField(initial=0) defect = models.BooleanField( label='Que faites-vous ?', choices=[[True, 'Garder les 50€'], [False, 'Donner les 50€']], widget=widgets.RadioSelect, blank=False, initial=None ) pensee = models.StringField( choices=[['garde', 'Il garde les 50€'], ['donne', 'Il donne les 50€'],['Sais pas', 'Je ne sais pas'] ], label='Que pensez-vous que votre partenaire a décidé ?', widget=widgets.RadioSelect, blank=True, initial='Sais pas' ) # FUNCTIONS def resultatcoop(group): player_Lists = group.get_players() player1 = player_Lists[0] player2 = player_Lists[1] if player1.defect: if player2.defect: player1.payoff = Constants.payoff_both_defect player2.payoff = Constants.payoff_both_defect else: player1.payoff = Constants.payoff_high player2.payoff = Constants.payoff_low else: if player2.defect: player2.payoff = Constants.payoff_high player1.payoff = Constants.payoff_low else: player1.payoff = Constants.payoff_both_cooperate player2.payoff = Constants.payoff_both_cooperate player1.pr1 = player1.in_round(1).payoff player2.pr1 = player2.in_round(1).payoff player1.pr2 = player1.in_round(2).payoff player2.pr2 = player2.in_round(2).payoff player1.pr3 = player1.in_round(3).payoff player2.pr3 = player2.in_round(3).payoff player1.pr4 = player1.in_round(4).payoff player2.pr4 = player2.in_round(4).payoff player1.pr5 = player1.in_round(5).payoff player2.pr5 = player2.in_round(5).payoff player1.Gains = player1.in_round(1).payoff + player1.in_round(2).payoff + player1.in_round(3).payoff + player1.in_round(4).payoff + player1.in_round(5).payoff player2.Gains = player2.in_round(1).payoff + player2.in_round(2).payoff + player2.in_round(3).payoff + player2.in_round(4).payoff + player2.in_round(5).payoff #print (player.Gains) # pas avant 8h du mat le lendemain def still_waiting_for_part_2(player: Player): import time # returns True if the current time is before the designated start time return time.time() < player.part2_start_time def creating_session(subsession): labels = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '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'] groups = ['1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '2', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3', '3'] for player, label in zip(subsession.get_players(), labels): player.participant.label = label for player, group in zip(subsession.get_players(), groups): player.participant.groupe = group # def get_timeout_seconds1(player: Player): # participant = player.participant # import time # # timeleft = participant.expiry - time.time() # player.robotjoue = False; # # ordi random à 10s de la fin # if timeleft < 10: # player.robotjoue = True; # import random # choix = bool(random.getrandbits(1)); # if choix: # player.defect = True; # else: # player.defect = False; # # return participant.expiry - time.time() # # # def is_displayed1(player: Player): # """only returns True if there is time left.""" # return get_timeout_seconds1(player) > 0 # PAGES class pjeu1(Page): # is_displayed = is_displayed1 # get_timeout_seconds = get_timeout_seconds1 # timer_text = Constants.TIMER_TEXT form_model = 'player' form_fields = ['defect','pensee'] #connaitre les dates --> n'affichera pas la page résultats avant la date à minuit # @staticmethod # def before_next_page(player: Player, timeout_happened): # from datetime import datetime, timedelta # # # # if player.round_number == 1 or player.round_number == 2 or player.round_number == 3 or player.round_number == 4 or player.round_number == 5 : # faire pour tous les rounds # # # start = datetime.today() # # t = start + timedelta(seconds=60) # # player.part2_start_time = t.timestamp() # # player.part2_start_time_readable = t.strftime("%d/%m/%Y %H:%M:%S") # # if player.round_number == 1 : # #t = datetime(2023, 1, 9, 16, 59) # t = datetime(2023, 1, 24, 1, 0) # player.part2_start_time = t.timestamp() # player.part2_start_time_readable = t.strftime("%d/%m/%Y %H:%M:%S") # # if player.round_number == 2 : # #t = datetime(2023, 1, 9, 16, 42) # t = datetime(2023, 1, 25, 1, 0) # player.part2_start_time = t.timestamp() # player.part2_start_time_readable = t.strftime("%d/%m/%Y %H:%M:%S") # # if player.round_number == 3 : # #t = datetime(2023, 1, 9, 16, 44) # t = datetime(2023, 1, 26, 1, 0) # player.part2_start_time = t.timestamp() # player.part2_start_time_readable = t.strftime("%d/%m/%Y %H:%M:%S") # # if player.round_number == 4 : # #t = datetime(2023, 1, 9, 16, 46) # t = datetime(2023, 1, 27, 1, 0) # player.part2_start_time = t.timestamp() # player.part2_start_time_readable = t.strftime("%d/%m/%Y %H:%M:%S") # # if player.round_number == 5 : # #t = datetime(2023, 1, 9, 16, 48) # t = datetime(2023, 1, 28, 1, 0) # player.part2_start_time = t.timestamp() # player.part2_start_time_readable = t.strftime("%d/%m/%Y %H:%M:%S") """ @staticmethod def autorep(player: Player, timeout_happened): from datetime import datetime, timedelta """ class ResultsWaitPage(WaitPage): after_all_players_arrive = resultatcoop # condition pour lancer la fonction set_payoffs et passer à la page suivante body_text = "Attente de la réponse de l'autre participant pour prendre part à la suite de l'expérience" class presult1(Page): form_model = 'player' class pfinal(Page): form_model = 'player' # # class Bridge(Page): # """ # If the user arrives at this page after part 2 is ready, this page will # be skipped entirely. # """ # # @staticmethod # def is_displayed(player: Player): # return still_waiting_for_part_2(player) # # @staticmethod # def before_next_page(player: Player, timeout_happened): # return "Player somehow tried to proceed past a page with no next button" # faire pour tous les jours # class Intro(Page): # @staticmethod # def before_next_page(player: Player, timeout_happened): # participant = player.participant # # # # from datetime import datetime, timedelta # import time # # #participant.expiry = time.time() + 60 # # if player.round_number == 1 : # #tpsrestant = datetime(2023, 1, 9, 16, 41) # tpsrestant = datetime(2023, 1, 23, 21, 0) # participant.expiry = tpsrestant.timestamp() # player.part1_start_time_readable = tpsrestant.strftime("%d/%m/%Y %H:%M:%S") # # if player.round_number == 2 : # #tpsrestant = datetime(2023, 1, 9, 16, 43) # tpsrestant = datetime(2023, 1, 24, 21, 0) # participant.expiry = tpsrestant.timestamp() # player.part1_start_time_readable = tpsrestant.strftime("%d/%m/%Y %H:%M:%S") # # if player.round_number == 3 : # #tpsrestant = datetime(2023, 1, 9, 16, 45) # tpsrestant = datetime(2023, 1, 25, 21, 0) # participant.expiry = tpsrestant.timestamp() # player.part1_start_time_readable = tpsrestant.strftime("%d/%m/%Y %H:%M:%S") # # if player.round_number == 4 : # #tpsrestant = datetime(2023, 1, 9, 16, 47) # tpsrestant = datetime(2023, 1, 26, 21, 0) # participant.expiry = tpsrestant.timestamp() # player.part1_start_time_readable = tpsrestant.strftime("%d/%m/%Y %H:%M:%S") # # if player.round_number == 5 : # #tpsrestant = datetime(2023, 1, 9, 16, 49) # tpsrestant = datetime(2023, 1, 27, 21, 0) # # participant.expiry = tpsrestant.timestamp() # player.part1_start_time_readable = tpsrestant.strftime("%d/%m/%Y %H:%M:%S") #page_sequence = [Intro,pjeu1, ResultsWaitPage, Bridge, presult1] page_sequence = [pjeu1, ResultsWaitPage, presult1]