from otree.api import ( models, widgets, BaseConstants, BaseSubsession, BaseGroup, BasePlayer, Currency as c, currency_range ) author = 'Niklas Weller' doc = """ 2D Packing Problem - Experiment """ class Constants(BaseConstants): name_in_url = 'packing_experiment' players_per_group = None num_rounds = 1 goal_correct_value = 'Packing all items while minimizing the used height in the given container' numberOfRounds_correct_value = '2 Rounds' rotationAllowed_correct_value = 'Yes, in all of the rounds' move_correct_value = 'Depends, only the most recently packed item can be moved' class Subsession(BaseSubsession): pass class Group(BaseGroup): pass QUESTIONS = { 'age': { 'label': 'Which category below includes your age?', 'choices': ['17 or younger', '18-24', '25-30', '31 or older', ], 'widget': widgets.RadioSelect }, 'gender': { 'label': 'What is your gender?', 'choices': ['Female', 'Male', 'Other'], 'widget': widgets.RadioSelect }, 'education': { 'label': 'What is the highest level of school you have completed or the highest degree you have received?', 'choices': ['Less than high school degree', 'High school degree or equivalent', 'College degree or equivalent', ], 'widget': widgets.RadioSelect }, 'student': { 'label': 'Are you currently enrolled in a college / university?', 'choices': ['No', 'Yes', ], 'widget': widgets.RadioSelect }, 'employment': { 'label': 'Which of the following categories best describes your employment status?', 'choices': [ 'Part-time employed', 'Full-time employed', 'Unemployed', ], 'widget': widgets.RadioSelect }, 'income': { 'label': 'How much total combined money did all members of your household earn in 2018?', 'choices': [ '$0 – $19,999', '$20,000 – $29,999', '$30,000 – $39,999', '$40,000 – $49,999', '$50,000 or more', ], 'widget': widgets.RadioSelect }, 'region': { 'label': 'Which region do you currently live in?', 'choices': [ 'US', 'Canada', 'Rest of the World', ], 'widget': widgets.RadioSelect }, 'batandball': { 'label': '''A bat and a ball cost $1.10 in total. The bat costs a dollar more than the ball. How many dollars does the ball cost?''', 'min': 0, }, 'machineswidgets': { 'label': '''If it takes 5 machines 5 minutes to make 5 widgets, how many minutes would it take 100 machines to make 100 widgets?''', 'min': 0, }, 'lilypads': { 'label': '''In a lake, there is a patch of lily pads. Every day, the patch doubles in size. If it takes 48 days for the patch to cover the entire lake, how many days would it take for the patch to cover half of the lake?''', 'min': 0, }, 'method': { 'label': '''Did you use any strategy to solve these problems, or was your approach more intuitive?''', 'choices': [ 'Intuitive', 'Strategic', ], 'widget': widgets.RadioSelect }, 'explain': { 'label': '''explain''', } } class Player(BasePlayer): numberOfRounds = models.StringField(choices=['2 Rounds', '3 Rounds', '1 Round'], label='How many rounds of packing tasks will you need to complete?', ) def numberOfRounds_error_message(self, numberOfRounds): if numberOfRounds != Constants.numberOfRounds_correct_value: return "Error: The entered value was incorrect. Please try again." rotationAllowed = models.StringField(choices=['Yes, in all of the rounds', 'No, rotation will never be possible', 'Yes, but only in half of the rounds'], label='Will you be able to rotate boxes?', ) def rotationAllowed_error_message(self, rotationAllowed): if rotationAllowed != Constants.rotationAllowed_correct_value: return "Error: The entered value was incorrect. Please try again." move = models.StringField(choices=['Yes, every item can be moved at any time', 'No, once an item is placed it is impossible to change its position', 'Depends, only the most recently packed item can be moved'], label='Will you be able to move boxes after you have placed them inside the container?', ) def move_error_message(self, move): if move != Constants.move_correct_value: return "Error: The entered value was incorrect. Please try again." goal = models.StringField(choices=['Packing all items in the least possible number of containers', 'Packing all items while minimizing the used height in the given container', 'Filling the container as efficiently as possible with selected items'], label='What should you aim for in the following pages?', ) def goal_error_message(self, goal): if goal != Constants.goal_correct_value: return "Error: The entered value was incorrect. Please try again." age = models.StringField(**QUESTIONS['age']) gender = models.StringField(**QUESTIONS['gender']) method = models.StringField(**QUESTIONS['method']) explain = models.StringField(**QUESTIONS['explain']) x1 = models.IntegerField() y1 = models.IntegerField() x2 = models.IntegerField() y2 = models.IntegerField() x3 = models.IntegerField() y3 = models.IntegerField() x4 = models.IntegerField() y4 = models.IntegerField() x5 = models.IntegerField() y5 = models.IntegerField() x6 = models.IntegerField() y6 = models.IntegerField() x7 = models.IntegerField() y7 = models.IntegerField() x8 = models.IntegerField() y8 = models.IntegerField() x9 = models.IntegerField() y9 = models.IntegerField() x10 = models.IntegerField() y10 = models.IntegerField() x11 = models.IntegerField() y11 = models.IntegerField() x12 = models.IntegerField() y12 = models.IntegerField() x13 = models.IntegerField() y13 = models.IntegerField() x14 = models.IntegerField() y14 = models.IntegerField() x15 = models.IntegerField() y15 = models.IntegerField() seq1 = models.StringField() seq2 = models.StringField() seq3 = models.StringField() seq4 = models.StringField() seq5 = models.StringField() seq6 = models.StringField() seq7 = models.StringField() seq8 = models.StringField() seq9 = models.StringField() seq10 = models.StringField() seq11 = models.StringField() seq12 = models.StringField() seq13 = models.StringField() seq14 = models.StringField() seq15 = models.StringField() highestPoint = models.IntegerField() aRotationCounter = models.IntegerField() bx1 = models.IntegerField() by1 = models.IntegerField() bx2 = models.IntegerField() by2 = models.IntegerField() bx3 = models.IntegerField() by3 = models.IntegerField() bx4 = models.IntegerField() by4 = models.IntegerField() bx5 = models.IntegerField() by5 = models.IntegerField() bx6 = models.IntegerField() by6 = models.IntegerField() bx7 = models.IntegerField() by7 = models.IntegerField() bx8 = models.IntegerField() by8 = models.IntegerField() bx9 = models.IntegerField() by9 = models.IntegerField() bx10 = models.IntegerField() by10 = models.IntegerField() bx11 = models.IntegerField() by11 = models.IntegerField() bx12 = models.IntegerField() by12 = models.IntegerField() bx13 = models.IntegerField() by13 = models.IntegerField() bx14 = models.IntegerField() by14 = models.IntegerField() bx15 = models.IntegerField() by15 = models.IntegerField() bseq1 = models.StringField() bseq2 = models.StringField() bseq3 = models.StringField() bseq4 = models.StringField() bseq5 = models.StringField() bseq6 = models.StringField() bseq7 = models.StringField() bseq8 = models.StringField() bseq9 = models.StringField() bseq10 = models.StringField() bseq11 = models.StringField() bseq12 = models.StringField() bseq13 = models.StringField() bseq14 = models.StringField() bseq15 = models.StringField() bHighestPoint = models.IntegerField() payoffB = bHighestPoint print(bHighestPoint) bRotationCounter = models.IntegerField() cx1 = models.IntegerField() cy1 = models.IntegerField() cx2 = models.IntegerField() cy2 = models.IntegerField() cx3 = models.IntegerField() cy3 = models.IntegerField() cx4 = models.IntegerField() cy4 = models.IntegerField() cx5 = models.IntegerField() cy5 = models.IntegerField() cx6 = models.IntegerField() cy6 = models.IntegerField() cx7 = models.IntegerField() cy7 = models.IntegerField() cx8 = models.IntegerField() cy8 = models.IntegerField() cx9 = models.IntegerField() cy9 = models.IntegerField() cx10 = models.IntegerField() cy10 = models.IntegerField() cx11 = models.IntegerField() cy11 = models.IntegerField() cx12 = models.IntegerField() cy12 = models.IntegerField() cx13 = models.IntegerField() cy13 = models.IntegerField() cx14 = models.IntegerField() cy14 = models.IntegerField() cx15 = models.IntegerField() cy15 = models.IntegerField() cseq1 = models.StringField() cseq2 = models.StringField() cseq3 = models.StringField() cseq4 = models.StringField() cseq5 = models.StringField() cseq6 = models.StringField() cseq7 = models.StringField() cseq8 = models.StringField() cseq9 = models.StringField() cseq10 = models.StringField() cseq11 = models.StringField() cseq12 = models.StringField() cseq13 = models.StringField() cseq14 = models.StringField() cseq15 = models.StringField() cHighestPoint = models.IntegerField() cRotationCounter = models.IntegerField() dx1 = models.IntegerField() dy1 = models.IntegerField() dx2 = models.IntegerField() dy2 = models.IntegerField() dx3 = models.IntegerField() dy3 = models.IntegerField() dx4 = models.IntegerField() dy4 = models.IntegerField() dx5 = models.IntegerField() dy5 = models.IntegerField() dx6 = models.IntegerField() dy6 = models.IntegerField() dx7 = models.IntegerField() dy7 = models.IntegerField() dx8 = models.IntegerField() dy8 = models.IntegerField() dx9 = models.IntegerField() dy9 = models.IntegerField() dx10 = models.IntegerField() dy10 = models.IntegerField() dx11 = models.IntegerField() dy11 = models.IntegerField() dx12 = models.IntegerField() dy12 = models.IntegerField() dx13 = models.IntegerField() dy13 = models.IntegerField() dx14 = models.IntegerField() dy14 = models.IntegerField() dx15 = models.IntegerField() dy15 = models.IntegerField() dseq1 = models.StringField() dseq2 = models.StringField() dseq3 = models.StringField() dseq4 = models.StringField() dseq5 = models.StringField() dseq6 = models.StringField() dseq7 = models.StringField() dseq8 = models.StringField() dseq9 = models.StringField() dseq10 = models.StringField() dseq11 = models.StringField() dseq12 = models.StringField() dseq13 = models.StringField() dseq14 = models.StringField() dseq15 = models.StringField() dHighestPoint = models.IntegerField() dRotationCounter = models.IntegerField()