from otree.api import * import time doc = """ Preserve same groups as a previous app that used group_by_arrival time. """ class C(BaseConstants): NAME_IN_URL = 'group' PLAYERS_PER_GROUP = None NUM_ROUNDS = 1 class Subsession(BaseSubsession): pass def waiting_seconds(player): participant = player.participant wait = int(time.time() - participant.wait_page_arrival) print('Player', player.id_in_subsession, 'waiting for', wait, 'seconds') return wait def ranked_waiting_seconds(waiting_players): waits = [waiting_seconds(p) for p in waiting_players] waits.sort(reverse=True) print(waits) return waits def group_by_arrival_time_method(subsession: Subsession, waiting_players): # we now place users into different baskets, according to their group in the previous app. # the dict 'd' will contain all these baskets. d = {} for p in waiting_players: group_id = p.participant.past_group_id if group_id not in d: # since 'd' is initially empty, we need to initialize an empty list (basket) # each time we see a new group ID. d[group_id] = [] players_in_my_group = d[group_id] players_in_my_group.append(p) print('in my group there are', players_in_my_group) if len(players_in_my_group) >= 5: return players_in_my_group[:5] waits = ranked_waiting_seconds(players_in_my_group) print(waits) if len(waits) == 4 and waits[3] > 15: return players_in_my_group # print('d is', d) # print("number of players waiting:", len(waiting_players)) # num_waiting = len(waiting_players) # subsession.session.vars['num_waiting'] = num_waiting # print("number of waiting players:", num_waiting, " ", time.strftime('%X %x %Z')) # if len(waiting_players) >= 5: # print("creating group") # return waiting_players[:5] class Group(BaseGroup): group_size_2 = models.IntegerField() class Player(BasePlayer): pass class GBATWait(WaitPage): group_by_arrival_time = True def after_all_players_arrive(group: Group): # print(group.get_players()) not_dropout = [] for p in group.get_players(): if not p.participant.is_dropout: # print(p) not_dropout.append(p) # print('now', not_dropout) group.group_size_2 = len(not_dropout) # print(group.group_size_2) class MyPage(Page): pass page_sequence = [GBATWait, MyPage]