#1
by
mitnec
Hi,
The documentation on ExtraModel doesn't mention much of this. I have an app that uses rounds to present new questions, and I want to store the wrong answers to those questions in an ExtraModel (you get 10 tries per question). I do this with somefield_error_message.
This seems to work fine, until I try to export this data with custom_export. I don't like dealing with wide data that has a lot of rounds, it's messy and repetitive. So I would like to export long and just what I need.
I do this:
def custom_export(players):
# header row
yield ['session', 'participant_code', 'round_number', 'prompt', 'prompt_num', 'counter', 'guess']
print("len players: ", len(players))
print(IncorrectResponses.filter())
for p in players:
players_all_rounds = p.in_all_rounds()
for player in players_all_rounds:
print(IncorrectResponses.filter())
# need to figure out which prompt_number s this player got, let's do it by num_rounds
round = player.round_number
# print("round: ", round)
current_prompt = player.participant.vars['exp_subset_word'][(round-1)]
incorrect_responses = IncorrectResponses.filter( player=player, prompt_number=current_prompt['Prompt_number'] )
for guess in incorrect_responses:
yield [player.session.code, player.participant.code, player.round_number, current_prompt['Prompt_with_blank'], current_prompt['Prompt_number'], guess.counter, guess.guess]
...which, for some reason, just gives me repetitions of the same round's data for all players.
Here is how I store it in an ExtraModel:
def guess_error_message(player, value):
prompt = player.participant.vars['exp_subset_word'][(player.round_number-1)]
# strip value of spaces and make it lower case
cleaned_value = ''.join(e for e in value if e.isalnum())
cleaned_value = cleaned_value.lower()
if (cleaned_value != prompt['Answer']) and (player.participant.vars['answer_counter'] < C.NUM_GUESSES):
IncorrectResponses.create(player=player, prompt_number=prompt['Prompt_number'], counter=player.participant.vars['answer_counter'], guess=str(cleaned_value))
player.participant.vars['answer_counter'] += 1
return "Not the right answer. Try again!"
What am I missing?
I could store all this in participant.vars and then export, I guess, but it seems like I should be using ExtraModel.
#2
by
Chris_oTree
You don't need this:
players_all_rounds = p.in_all_rounds()
for player in players_all_rounds:
Because 'players' already includes all players from all rounds of the app.