from django import forms from .models import Task, Player, CQ from otree.common import BotError from .widgets import AllocationWidget from django.forms import inlineformset_factory from otree.api import widgets from django.utils.safestring import mark_safe from random import shuffle class TaskForm(forms.ModelForm): class Meta: model = Task fields = ['answer'] def __init__(self, *args, **kwargs): kwargs.pop('view') super().__init__(*args, **kwargs) def clean_answer(self): data = self.cleaned_data['answer'] if data != self.instance.correct_answer: # if self.instance.owner.participant._is_bot: # raise BotError('Task submission failed') raise forms.ValidationError("Please provide a correct answer!") return data class AllocationForm(forms.ModelForm): class Meta: model = Player fields = ['reallocation_tax1', 'reallocation_tax2', 'reallocation_tax3'] def __init__(self, *args, **kwargs): kwargs.pop('view') super().__init__(*args, **kwargs) for i, j in enumerate(self.fields): tax = self.instance.subsession.taxes[i] self.fields[j].widget = AllocationWidget(tax=tax, choices=self.instance.reallocation_choices, ) def choice_converter(value, params=None): return [(i, mark_safe(j.format(params=params))) for i, j in enumerate(value)] class CQForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['answer'] = forms.ChoiceField( choices=choice_converter(self.instance.possible_choices), widget=widgets.RadioSelect ) self.fields['answer'].widget.attrs['required'] = True def clean_answer(self): data = int(self.cleaned_data['answer']) if data != self.instance.correct_answer: self.instance.counter += 1 self.instance.save() raise forms.ValidationError('Please check your answer!') return data cq_formset = inlineformset_factory(Player, CQ, fields=['answer'], extra=0, can_delete=False, form=CQForm, )