#1 by AngelVJimenez (edited )
I am designing a multiplayer experiment in which participants at each round choose between two random participants to partner with one of them for a task. Participants are provided with the ID and the reputation of their potential partners.
Because the potential choices are randomly generated, I created a function to do this and then a radio button in the html template with the random options from the function.
However, I am unable to store the ID of the chosen partner.
Does someone know how to do this?
This is my code:
def vars_for_template(player):
import random
# Get all players except the target player
all_players = player.subsession.get_players()
other_players = [p for p in all_players if p.id_in_group != player.id_in_group]
# Specify the number of players to select for the pool of candidates
subsample_size = 2
# Ensure that there are enough players to select in the subsample
if len(other_players) >= subsample_size:
# Select a subsample of other players
potential_partners = random.sample(other_players, subsample_size)
else:
# Handle the case when there are not enough other players
potential_partners = []
# Create a list of dictionaries to store the reputation and cumulative reputation of all potential partners
selected_partners_data = []
for partner in potential_partners:
partner_data = {'id': partner.id_in_group}
# Calculate the cumulative reputation using sum and list comprehension
partner_data['cumulative_reputation'] = sum([p.reputation for p in partner.in_all_rounds()])
selected_partners_data.append(partner_data)
# Extract partner IDs
partner_ids = [partner['id'] for partner in selected_partners_data]
# Pass the list of selected partners' data (including cumulative reputation) and their IDs as context to template
return {
'selected_partners_data': selected_partners_data,
'partner_ids': partner_ids,
}
And this is my HTML template:
<p>Your potential partners and their reputations are:</p>
{% for partner_data in selected_partners_data %}
<label>
<input type="radio" name="chosen_partner" value="{{ partner_data.id }}">
Partner ID: {{ partner_data.id }}
Reputations: {{ partner_data.cumulative_reputation }}
</label><br>
{% endfor %}
{{ formfields }}
{{ next_button }}
Thank you very much.
Angel
#2
by
ccrabbe
Hi Angel - To store the partner data, instead of just storing them in a local variable inside of vars_for_template, you should store them in model fields in the Player class. Define the player model field, then inside of vars_for_template set the values alongside the code you already have. All your player model fields are automatically included in the output reports. I would also like to advise that running randomization inside of vars_for_template isn't recommended, because vars_for_template is executed every time a player refreshes the page. If you randomize there, subjects can refresh the page until they get values they want. Instead, I suggest you do the randomization and value assignments inside of creating_session, which is only run once when the session is created. Thanks, --Chris
#3
by
ccrabbe
Hi Angel - And to store the results of their choice, you need to define a form_model and form_fields inside your Page class, and then name the inputs like described in the documentation here: https://otree.readthedocs.io/en/latest/forms.html#raw-html-widgets Then when they submit the page the decision will be stored in the model field you have in form_fields. Thanks, --Chris