oTree Forum >

UndefinedVariable: Cannot resolve the variable 'previous_price_offer' (line 56, in "previous_price_offer")

#1 by UlkarQ ,

I get the error on the title while the code runs smoothly for all other pages. 
Never had a problem until added progress titles to sliders on the previous page. Could That be the source of the issue?

Here is the page:
{{ block title }}
{{ endblock }}

{% block styles %}
<style>
    body {
        background-color: lightgray;
    }

    .container {
        padding-top: 100px;
    }

    .container-x {
        border: 1px solid #000;
        padding: 10px;
        text-align: center;
        display: flex;
        flex-direction: row;
        flex-wrap: wrap;
        justify-content: center;
        align-items: center;
    }

    .content {
        margin: -120px 0 20px 0;
        text-align: center;
        background-color: lightgray;
        padding: 10px 25px 10px 25px;
        text-transform: uppercase;
        border: 1px solid #000;
        width: 50%;
    }
</style>
{% endblock %}

{{ block content }}

<div class="container-x">
    <div class="content">
        <div class="title">
            <div class="row text-start">
                <div class="col-md-8 offset-md-2">
                    <h6 class="text-center"><b>Your Previous Offer:</b></h6>
                    <table class="table table-borderless">
                        <tbody>
                            <thead>
                    <tr>
                        <th></th>
                        <th>Offer</th>
                        <th>Payoff</th>
                    </tr>
                    </thead>
                        <tr>
                            <td><b>Price</b></td>
                            <td>{{ previous_price_offer }}</td>
                            <td>{{ payoff_previous_price }}</td>
                        </tr>
                        <tr>
                            <td><b>License</b></td>
                            <td>{{ previous_license_offer }}</td>
                            <td>{{ payoff_previous_licence }}</td>
                        </tr>
                        <tr>
                            <td><b>Storage</b></td>
                            <td>{{ previous_storage_offer }}</td>
                            <td>{{ payoff_previous_storage }}</td>
                        </tr>
                        <tr>
                            <td><b>Payoff</b></td>
                            <td>{{ step_payoff }}</td>
                        </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div>
    </div>
    <div class="row">
        <div class="col-md-12">
            <h6><b>Your counterpart’s Offer:</b></h6>
        </div>
        <div class="col-md-12">
            
            <p class="text-start">
                <i>I can offer you a price of $110, 8 years of LCD and 7 GB.</i>

            </p>
        </div>
        <div class="col-md-4 text-start">
            
            <table class="table">
                <tbody>
                    <thead>
                    <tr>
                        <th></th>
                        <th>Offer</th>
                        <th>Payoff</th>
                    </tr>
                    </thead>
                <tr>
                    <td><b>Price:</b></td>
                    <td>$110</strong></td>
                    <td>10</strong></td>
                </tr>
                <tr>
                    <td><b>License:</b></td>
                    <td>8Years</strong></td>
                    <td>6</strong></td>
                </tr>
                <tr>
                    <td><b>Storage</b></td>
                    <td>7GB</strong></td>
                    <td>6</strong></td>
                </tr>
                <tr>
                    <td><b>Counterpart's Concession</b></td>
                    <td></td>
                    <td>22</strong></td>
                </tr>
                <tr>
                    <td><b>Your Total Payoff</b></td>
                    <td></td>
                    <td>22</strong></td>
                </tr>
                </tbody>
            </table>
        </div>
        <div class="col-md-12">
            <div class="row">
                <div class="col-md-12">
                    <div>
                        
                        <div class="col-md-12">
                            <div class="row">
                                <div class="col-md-3">
                                    <button name="offer_5_accept" value="True" class="btn"
                                            style="border: 2px solid black;">
                                        <b>Accept the Offer</b>
                                    </button>
                                </div>
                                <div class="col-md-3">
                                    <button name="offer_5_counteroffer" value="True" class="btn"
                                            style="border: 2px solid black;">
                                        <b>Make Counteroffer</b>
                                    </button>
                                </div>
                                <div class="col-md-3">
                                    <button name="offer_5_end_negotiation" value="True" class="btn"
                                            style="border: 2px solid black;">
                                        <b>End Negotiation</b>
                                    </button>
                                </div>
                            </div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>
{{ endblock }}

The init.py:
from otree.api import *

doc = """
Your app description
"""


class C(BaseConstants):
    NAME_IN_URL = 'HL'
    PLAYERS_PER_GROUP = None
    NUM_ROUNDS = 1

    PRICE_CHOICES = [
        ("$150", "$150"),
        ("$145", "$145"),
        ("$140", "$140"),
        ("$135", "$135"),
        ("$130", "$130"),
        ("$125", "$125"),
        ("$120", "$120"),
        ("$115", "$115"),
        ("$110", "$110"),
        ("$105", "$105"),
        ("$100", "$100")
    ]

    LICENSE_CHOICES = [
        ("0 Years", "0 Years"),
        ("1 Year", "1 Year"),
        ("2 Years", "2 Years"),
        ("3 Years", "3 Years"),
        ("4 Years", "4 Years"),
        ("5 Years", "5 Years"),
        ("6 Years", "6 Years"),
        ("7 Years", "7 Years"),
        ("8 Years", "8 Years"),
        ("9 Years", "9 Years"),
        ("10 Years", "10 Years")
    ]

    STORAGE_CHOICES = [
        ("0 GB", "0 GB"),
        ("1 GB", "1 GB"),
        ("2 GB", "2 GB"),
        ("3 GB", "3 GB"),
        ("4 GB", "4 GB"),
        ("5 GB", "5 GB"),
        ("6 GB", "6 GB"),
        ("7 GB", "7 GB"),
        ("8 GB", "8 GB"),
        ("9 GB", "9 GB"),
        ("10 GB", "10 GB")
    ]

    

    

    PAYOFFS_DICT = {
        "price": {
            PRICE_CHOICES[0][0]: 50,
            PRICE_CHOICES[1][0]: 45,
            PRICE_CHOICES[2][0]: 40,
            PRICE_CHOICES[3][0]: 35,
            PRICE_CHOICES[4][0]: 30,
            PRICE_CHOICES[5][0]: 25,
            PRICE_CHOICES[6][0]: 20,
            PRICE_CHOICES[7][0]: 15,
            PRICE_CHOICES[8][0]: 10,
            PRICE_CHOICES[9][0]: 5,
            PRICE_CHOICES[10][0]: 0
        },
        "license": {
            LICENSE_CHOICES[0][0]: 30,
            LICENSE_CHOICES[1][0]: 27,
            LICENSE_CHOICES[2][0]: 24,
            LICENSE_CHOICES[3][0]: 21,
            LICENSE_CHOICES[4][0]: 18,
            LICENSE_CHOICES[5][0]: 15,
            LICENSE_CHOICES[6][0]: 12,
            LICENSE_CHOICES[7][0]: 9,
            LICENSE_CHOICES[8][0]: 6,
            LICENSE_CHOICES[9][0]: 3,
            LICENSE_CHOICES[10][0]: 0,
        },
        "storage": {
            STORAGE_CHOICES[0][0]: 20,
            STORAGE_CHOICES[1][0]: 18,
            STORAGE_CHOICES[2][0]: 16,
            STORAGE_CHOICES[3][0]: 14,
            STORAGE_CHOICES[4][0]: 12,
            STORAGE_CHOICES[5][0]: 10,
            STORAGE_CHOICES[6][0]: 8,
            STORAGE_CHOICES[7][0]: 6,
            STORAGE_CHOICES[8][0]: 4,
            STORAGE_CHOICES[9][0]: 2,
            STORAGE_CHOICES[10][0]: 0,
        }
    }


class Subsession(BaseSubsession):
    pass


class Group(BaseGroup):
    pass


class Player(BasePlayer):
    nickname = models.StringField(
        verbose_name=""
    )

    i_achieve1 = models.IntegerField(
        verbose_name="",
        min=0,
        max=100,
    )

    cp_achieve1 = models.IntegerField(
        verbose_name="",
        min=0,
        max=100,
    )
    i_achieve2 = models.IntegerField(
        verbose_name="",
        min=0,
        max=100,
    )

    cp_achieve2 = models.IntegerField(
        verbose_name="",
        min=0,
        max=100,
    )
    IQ1 = models.IntegerField(
        label='',
        widget=widgets.RadioSelect(),
        choices=[
            [1, '… mostly distributive with little options for trade-offs.'],
            [2, '… mostly integrative with options for trade-offs.'],
        ]
    )
    IQ2 = models.IntegerField(
        label='',
        widget=widgets.RadioSelect(),
        choices=[
            [1, '… the buyer, and a low price with high licence contract duration, and online storage is advantageous.'],
            [2, '… the seller, and a high price with low licence contract duration, and online storage is advantageous.'],
        ]
    )
    IQ3 = models.IntegerField(
        label='',
        widget=widgets.RadioSelect(),
        choices=[
            [1, 'The Hard RL is 0 payoff points.'],
            [2, 'The Hard RL is 10 payoff points.'],
            [3, 'The Hard RL is 20 payoff points.'],
        ]
    )
    IQ4 = models.IntegerField(
        label='',
        widget=widgets.RadioSelect(),
        choices=[
            [1, 'The Soft RL is 25 payoff points.'],
            [2, 'The Soft RL is 35 payoff points.'],
            [3, 'The Soft RL is 45 payoff points.'],
        ]
    )

    # ***********OFFER 0*******************

    offer_0_accept = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_0_counteroffer = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_0_end_negotiation = models.BooleanField(
        blank=True,
        initial=False
    )

    message_offer_0 = models.LongStringField(
        verbose_name="",
        blank=True
    )

    price_offer_0 = models.StringField(
        label='Price',
        widget=widgets.RadioSelect(),
        choices=C.PRICE_CHOICES
    )

    license_offer_0 = models.StringField(
        label='Licence',
        widget=widgets.RadioSelect(),
        choices=C.LICENSE_CHOICES
    )

    storage_offer_0 = models.StringField(
        label='Storage',
        widget=widgets.RadioSelect(),
        choices=C.STORAGE_CHOICES
    )

    # ***********OFFER 1*******************

    offer_1_accept = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_1_counteroffer = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_1_end_negotiation = models.BooleanField(
        blank=True,
        initial=False
    )

    message_offer_1 = models.LongStringField(
        verbose_name="",
        blank=True
    )

    price_offer_1 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.PRICE_CHOICES
    )

    license_offer_1 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.LICENSE_CHOICES
    )

    storage_offer_1 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.STORAGE_CHOICES
    )

    # ***********OFFER 2*******************

    offer_2_accept = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_2_counteroffer = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_2_end_negotiation = models.BooleanField(
        blank=True,
        initial=False
    )

    message_offer_2 = models.LongStringField(
        verbose_name="",
        blank=True
    )

    price_offer_2 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.PRICE_CHOICES
    )

    license_offer_2 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.LICENSE_CHOICES
    )

    storage_offer_2 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.STORAGE_CHOICES
    )

    # ***********OFFER 3*******************

    offer_3_accept = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_3_counteroffer = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_3_end_negotiation = models.BooleanField(
        blank=True,
        initial=False
    )

    message_offer_3 = models.LongStringField(
        verbose_name="",
        blank=True
    )

    price_offer_3 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.PRICE_CHOICES
    )

    license_offer_3 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.LICENSE_CHOICES
    )

    storage_offer_3 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.STORAGE_CHOICES
    )

    # ***********OFFER 4*******************

    offer_4_accept = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_4_counteroffer = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_4_end_negotiation = models.BooleanField(
        blank=True,
        initial=False
    )

    message_offer_4 = models.LongStringField(
        verbose_name="",
        blank=True
    )

    price_offer_4 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.PRICE_CHOICES
    )

    license_offer_4 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.LICENSE_CHOICES
    )

    storage_offer_4 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.STORAGE_CHOICES
    )


    
    

    own_achievement = models.IntegerField(
        verbose_name="",
        min=0,
        max=100
    )

    counterpart_achievement = models.IntegerField(
        verbose_name="",
        
        max=100
    )
    Coop_Slider=models.IntegerField(min=0)
    Fair_Slider=models.IntegerField(min=0)
    Trust_Slider=models.IntegerField(min=0)
    Weak_Slider=models.IntegerField(min=0)
    Satisfy_Slider=models.IntegerField(min=0)
    LongT_Slider=models.IntegerField(min=0)

    # ***********OFFER 5*******************

    offer_5_accept = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_5_counteroffer = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_5_end_negotiation = models.BooleanField(
        blank=True,
        initial=False
    )

    message_offer_5 = models.LongStringField(
        verbose_name="",
        blank=True
    )

    price_offer_5 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.PRICE_CHOICES
    )

    license_offer_5 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.LICENSE_CHOICES
    )

    storage_offer_5 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.STORAGE_CHOICES
    )

    # ***********OFFER 6*******************

    offer_6_accept = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_6_counteroffer = models.BooleanField(
        blank=True,
        initial=False
    )
    offer_6_end_negotiation = models.BooleanField(
        blank=True,
        initial=False
    )

    message_offer_6 = models.LongStringField(
        verbose_name="",
        blank=True
    )

    price_offer_6 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.PRICE_CHOICES
    )

    license_offer_6 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.LICENSE_CHOICES
    )

    storage_offer_6 = models.StringField(
        verbose_name="",
        widget=widgets.RadioSelect(),
        choices=C.STORAGE_CHOICES
    )

    FinalMessageS = models.LongStringField(
        verbose_name="",
        blank=True
    )

    age = models.IntegerField(
        label='',
        min=18,
        max=99
    )

    sex = models.IntegerField(
        label='',
        widget=widgets.RadioSelect(),
        choices=[
            [1, 'Female'],
            [2, 'Male'],
            [3, 'Other']
        ]
    )

    discipline = models.IntegerField(
        label='',
        widget=widgets.RadioSelect(),
        choices=[
            [1, 'Social Sciences'],
            [2, 'Natural Sciences'],
            [3, 'Art, Letter and Languages'],
            [4, 'Technical Sciences'],
            [6, 'Medicine'],
            [7, 'Business'],
            [8, 'Other']
        ]
    )

    degree = models.IntegerField(
        label='',
        widget=widgets.RadioSelect(),
        choices=[
            [1, 'BA'],
            [2, 'BSc'],
            [3, 'MA'],
            [4, 'MSc'],
            [5, 'Other']
        ]
    )

    # ***************Payoff****************
    payoff_0 = models.IntegerField(initial=10)
    payoff_1 = models.IntegerField(initial=0)
    payoff_2 = models.IntegerField(initial=0)
    payoff_3 = models.IntegerField(initial=0)
    payoff_4 = models.IntegerField(initial=0)
    payoff_5 = models.IntegerField(initial=0)
    payoff_6 = models.IntegerField(initial=0)

    total_payoff = models.IntegerField()


    Coop = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Agree = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Compr = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Accomm = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Oblig = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Fair = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Reason = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Just = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Self = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Soft = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Weak = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Compl = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Yield = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Honest = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Real = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Plaus = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    Sinc = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)

    q1 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)    

    q2 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    q3 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    q4 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    q5 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)    
    q6 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    q7 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]    
)
    q8 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    q9 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    q10 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    q11 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)    
    q12 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)    
    q13 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    q14 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    q15 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
    q16 = models.IntegerField(
    widget=widgets.RadioSelect,
    choices=[1, 2, 3, 4, 6, 6, 7]
)
      


# PAGES


class Intro(Page):
    pass


class Nickname(Page):
    form_model = 'player'
    form_fields = ["nickname"]


class Expectations(Page):
    form_model = 'player'
    form_fields = ["i_achieve1", "cp_achieve1"]

class InitialQuest(Page):
    form_model = 'player'
    form_fields = ['IQ1', 'IQ2', 'IQ3', 'IQ4']    

    @staticmethod
    def error_message(player: Player, values):
        solutions = dict(IQ1=1, IQ2=2,IQ3=2,IQ4=2)
        if values != solutions:
            return "One or more answers were incorrect."


class WhoStartsFirst(Page):
    timeout_seconds = 5
class WhoStartsFirstWaiting(Page):
    timeout_seconds = 5

class Step0OpeningOC(Page):
    form_model = 'player'
    form_fields = ["offer_0_accept",
                   "offer_0_counteroffer",
                   "offer_0_end_negotiation"]


class Step0CounterOS(Page):
    form_model = 'player'
    form_fields = ['message_offer_0',
                   'price_offer_0',
                   'license_offer_0',
                   'storage_offer_0']

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_0_counteroffer


class WaitingScreen1(Page):
    timeout_seconds = 5

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_0_counteroffer


class Step1COC(Page):
    form_model = 'player'
    form_fields = ["offer_1_accept",
                   "offer_1_counteroffer",
                   "offer_1_end_negotiation"]

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_0_counteroffer

    @staticmethod
    def vars_for_template(player: Player):
        previous_price_offer = player.price_offer_0
        previous_license_offer = player.license_offer_0
        previous_storage_offer = player.storage_offer_0

        payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None)
        payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None)
        payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None)

        payoff_0 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage
        player.payoff_0 = payoff_0

        return dict(
            previous_price_offer=previous_price_offer,
            previous_license_offer=previous_license_offer,
            previous_storage_offer=previous_storage_offer,
            payoff_previous_price=payoff_previous_price,
            payoff_previous_licence=payoff_previous_licence,
            payoff_previous_storage=payoff_previous_storage,
            step_payoff=payoff_0
        )


class Step1COS(Page):
    form_model = 'player'
    form_fields = ['message_offer_1',
                   'price_offer_1',
                   'license_offer_1',
                   'storage_offer_1']

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_1_counteroffer


class WaitingScreen2(Page):
    timeout_seconds = 5

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_1_counteroffer


class Step2COC(Page):
    form_model = 'player'
    form_fields = ["offer_2_accept",
                   "offer_2_counteroffer",
                   "offer_2_end_negotiation"]

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_1_counteroffer

    @staticmethod
    def vars_for_template(player: Player):
        previous_price_offer = player.price_offer_1
        previous_license_offer = player.license_offer_1
        previous_storage_offer = player.storage_offer_1

        payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None)
        payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None)
        payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None)

        payoff_1 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage
        player.payoff_1 = payoff_1

        return dict(
            previous_price_offer=previous_price_offer,
            previous_license_offer=previous_license_offer,
            previous_storage_offer=previous_storage_offer,
            payoff_previous_price=payoff_previous_price,
            payoff_previous_licence=payoff_previous_licence,
            payoff_previous_storage=payoff_previous_storage,
            step_payoff=payoff_1
        )


class Step2COS(Page):
    form_model = 'player'
    form_fields = ['message_offer_2',
                   'price_offer_2',
                   'license_offer_2',
                   'storage_offer_2']

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_2_counteroffer


class WaitingScreen3(Page):
    timeout_seconds = 5

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_2_counteroffer


class Step3COC(Page):
    form_model = 'player'
    form_fields = ["offer_3_accept",
                   "offer_3_counteroffer",
                   "offer_3_end_negotiation"]

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_2_counteroffer

    @staticmethod
    def vars_for_template(player: Player):
        previous_price_offer = player.price_offer_2
        previous_license_offer = player.license_offer_2
        previous_storage_offer = player.storage_offer_2

        payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None)
        payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None)
        payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None)

        payoff_2 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage
        player.payoff_2 = payoff_2

        return dict(
            previous_price_offer=previous_price_offer,
            previous_license_offer=previous_license_offer,
            previous_storage_offer=previous_storage_offer,
            payoff_previous_price=payoff_previous_price,
            payoff_previous_licence=payoff_previous_licence,
            payoff_previous_storage=payoff_previous_storage,
            step_payoff=payoff_2
        )


class Step3COS(Page):
    form_model = 'player'
    form_fields = ['message_offer_3',
                   'price_offer_3',
                   'license_offer_3',
                   'storage_offer_3']

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_3_counteroffer


class WaitingScreen4(Page):
    timeout_seconds = 5

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_3_counteroffer


class Step4COC(Page):
    form_model = 'player'
    form_fields = ["offer_4_accept",
                   "offer_4_counteroffer",
                   "offer_4_end_negotiation"]

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_3_counteroffer

    @staticmethod
    def vars_for_template(player: Player):
        previous_price_offer = player.price_offer_3
        previous_license_offer = player.license_offer_3
        previous_storage_offer = player.storage_offer_3

        payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None)
        payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None)
        payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None)

        payoff_3 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage
        player.payoff_3 = payoff_3

        return dict(
            previous_price_offer=previous_price_offer,
            previous_license_offer=previous_license_offer,
            previous_storage_offer=previous_storage_offer,
            payoff_previous_price=payoff_previous_price,
            payoff_previous_licence=payoff_previous_licence,
            payoff_previous_storage=payoff_previous_storage,
            step_payoff=payoff_3
        )


class Step4COS(Page):
    form_model = 'player'
    form_fields = ['message_offer_4',
                   'price_offer_4',
                   'license_offer_4',
                   'storage_offer_4']

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_4_counteroffer


class Step4_Question1(Page):
    form_model = 'player'
    form_fields = ["Coop_Slider","Fair_Slider","Trust_Slider","Weak_Slider"]
    @staticmethod
    def is_displayed(player: Player):
        return player.offer_4_counteroffer

    @staticmethod
    def vars_for_template(player: Player):
        previous_price_offer = player.price_offer_4
        previous_license_offer = player.license_offer_4
        previous_storage_offer = player.storage_offer_4

        payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None)
        payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None)
        payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None)

        payoff_4 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage
        player.payoff_4 = payoff_4

        return dict(
            previous_price_offer=previous_price_offer,
            previous_license_offer=previous_license_offer,
            previous_storage_offer=previous_storage_offer,
            payoff_previous_price=payoff_previous_price,
            payoff_previous_licence=payoff_previous_licence,
            payoff_previous_storage=payoff_previous_storage,
            step_payoff=payoff_4
        )


class Step4_Question2(Page):
    form_model = 'player'
    form_fields = ["Satisfy_Slider", "LongT_Slider"]

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_4_counteroffer

    @staticmethod
    def vars_for_template(player: Player):
        previous_price_offer = player.price_offer_4
        previous_license_offer = player.license_offer_4
        previous_storage_offer = player.storage_offer_4

        payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None)
        payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None)
        payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None)

        payoff_4 = player.payoff_4

        return dict(
            previous_price_offer=previous_price_offer,
            previous_license_offer=previous_license_offer,
            previous_storage_offer=previous_storage_offer,
            payoff_previous_price=payoff_previous_price,
            payoff_previous_licence=payoff_previous_licence,
            payoff_previous_storage=payoff_previous_storage,
            step_payoff=payoff_4
        )


class Step4_Question3(Page):
    form_model = 'player'
    form_fields = ["i_achieve2","cp_achieve2"]

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_4_counteroffer

    @staticmethod
    def vars_for_template(player: Player):
        previous_price_offer = player.price_offer_4
        previous_license_offer = player.license_offer_4
        previous_storage_offer = player.storage_offer_4

        payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None)
        payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None)
        payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None)

        payoff_4 = player.payoff_4

        return dict(
            previous_price_offer=previous_price_offer,
            previous_license_offer=previous_license_offer,
            previous_storage_offer=previous_storage_offer,
            payoff_previous_price=payoff_previous_price,
            payoff_previous_licence=payoff_previous_licence,
            payoff_previous_storage=payoff_previous_storage,
            step_payoff=payoff_4
        )


class Step5COC(Page):
    form_model = 'player'
    form_fields = ["offer_5_accept",
                   "offer_5_counteroffer",
                   "offer_5_end_negotiation"]

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_4_counteroffer

    @staticmethod
    def vars_for_template(player: Player):
        previous_price_offer = player.price_offer_4
        previous_license_offer = player.license_offer_4
        previous_storage_offer = player.storage_offer_4

        payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None)
        payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None)
        payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None)

        payoff_4 = player.payoff_4

        return dict(
            previous_price_offer=previous_price_offer,
            previous_license_offer=previous_license_offer,
            previous_storage_offer=previous_storage_offer,
            payoff_previous_price=payoff_previous_price,
            payoff_previous_licence=payoff_previous_licence,
            payoff_previous_storage=payoff_previous_storage,
            step_payoff=payoff_4
        )


class Step5COS(Page):
    form_model = 'player'
    form_fields = ['message_offer_5',
                   'price_offer_5',
                   'license_offer_5',
                   'storage_offer_5']

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_5_counteroffer


class WaitingScreen6(Page):
    timeout_seconds = 5

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_5_counteroffer


class Step6COC(Page):
    form_model = 'player'
    form_fields = ["offer_6_accept",
                   "offer_6_counteroffer",
                   "offer_6_end_negotiation"]

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_5_counteroffer

    @staticmethod
    def vars_for_template(player: Player):
        previous_price_offer = player.price_offer_5
        previous_license_offer = player.license_offer_5
        previous_storage_offer = player.storage_offer_5

        payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None)
        payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None)
        payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None)

        payoff_5 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage
        player.payoff_5 = payoff_5

        return dict(
            previous_price_offer=previous_price_offer,
            previous_license_offer=previous_license_offer,
            previous_storage_offer=previous_storage_offer,
            payoff_previous_price=payoff_previous_price,
            payoff_previous_licence=payoff_previous_licence,
            payoff_previous_storage=payoff_previous_storage,
            step_payoff=payoff_5
        )


class Step6COS(Page):
    form_model = 'player'
    form_fields = ['message_offer_6',
                   'price_offer_6',
                   'license_offer_6',
                   'storage_offer_6']

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_6_counteroffer


class FinalMessageC(Page):
    @staticmethod
    def is_displayed(player: Player):
        return player.offer_6_counteroffer

    @staticmethod
    def vars_for_template(player: Player):
        previous_price_offer = player.price_offer_6
        previous_license_offer = player.license_offer_6
        previous_storage_offer = player.storage_offer_6

        payoff_previous_price = C.PAYOFFS_DICT["price"].get(previous_price_offer, None)
        payoff_previous_licence = C.PAYOFFS_DICT["license"].get(previous_license_offer, None)
        payoff_previous_storage = C.PAYOFFS_DICT["storage"].get(previous_storage_offer, None)

        payoff_6 = payoff_previous_price + payoff_previous_licence + payoff_previous_storage
        player.payoff_6 = payoff_6

        return dict(
            previous_price_offer=previous_price_offer,
            previous_license_offer=previous_license_offer,
            previous_storage_offer=previous_storage_offer,
            payoff_previous_price=payoff_previous_price,
            payoff_previous_licence=payoff_previous_licence,
            payoff_previous_storage=payoff_previous_storage,
            step_payoff=payoff_6
        )


class FinalMessageS(Page):
    form_model = 'player'
    form_fields = ["FinalMessageS"]

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_0_accept or player.offer_0_end_negotiation or \
               player.offer_1_accept or player.offer_1_end_negotiation or \
               player.offer_2_accept or player.offer_2_end_negotiation or \
               player.offer_3_accept or player.offer_3_end_negotiation or \
               player.offer_4_accept or player.offer_4_end_negotiation or \
               player.offer_5_accept or player.offer_5_end_negotiation


class FinalQuestIntro(Page):

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_0_accept or player.offer_0_end_negotiation or \
               player.offer_1_accept or player.offer_1_end_negotiation or \
               player.offer_2_accept or player.offer_2_end_negotiation or \
               player.offer_3_accept or player.offer_3_end_negotiation or \
               player.offer_4_accept or player.offer_4_end_negotiation or \
               player.offer_5_accept or player.offer_5_end_negotiation or \
               player.offer_6_counteroffer


class FinalQuest(Page):
    form_model = 'player'
    form_fields = ['Coop','Agree','Compr','Accomm','Oblig','Fair','Reason','Just','Self','Soft','Weak','Compl','Yield','Honest','Real','Plaus','Sinc']
    


    @staticmethod
    def is_displayed(player: Player):
        return player.offer_0_accept or player.offer_0_end_negotiation or \
               player.offer_1_accept or player.offer_1_end_negotiation or \
               player.offer_2_accept or player.offer_2_end_negotiation or \
               player.offer_3_accept or player.offer_3_end_negotiation or \
               player.offer_4_accept or player.offer_4_end_negotiation or \
               player.offer_5_accept or player.offer_5_end_negotiation or \
               player.offer_6_counteroffer

    @staticmethod
    def before_next_page(player: Player, timeout_happened):
        player.total_payoff = player.payoff_0 + \
                              player.payoff_1 + \
                              player.payoff_2 + \
                              player.payoff_3 + \
                              player.payoff_4 + \
                              player.payoff_5 + \
                              player.payoff_6

class FinalQuest2(Page):
    form_model = 'player'
    form_fields = ['q1','q2','q3','q4','q5','q6','q7','q8','q9','q10','q11','q12',
    'q13','q14','q15','q16']
    
class ThankYou(Page):

    @staticmethod
    def is_displayed(player: Player):
        return player.offer_0_accept or player.offer_0_end_negotiation or \
               player.offer_1_accept or player.offer_1_end_negotiation or \
               player.offer_2_accept or player.offer_2_end_negotiation or \
               player.offer_3_accept or player.offer_3_end_negotiation or \
               player.offer_4_accept or player.offer_4_end_negotiation or \
               player.offer_5_accept or player.offer_5_end_negotiation or \
               player.offer_6_counteroffer


page_sequence = [
    Intro,
    Nickname,
    Expectations,
    InitialQuest,
    WhoStartsFirstWaiting,
    WhoStartsFirst,
    Step0OpeningOC,
    Step0CounterOS,
    WaitingScreen1,
    Step1COC,
    Step1COS,
    WaitingScreen2,
    Step2COC,
    Step2COS,
    WaitingScreen3,
    Step3COC,
    Step3COS,
    WaitingScreen4,
    Step4COC,
    Step4COS,
    Step4_Question1,
    Step4_Question2,
    Step4_Question3,
    Step5COC,
    Step5COS,
    WaitingScreen6,
    Step6COC,
    Step6COS,
    FinalMessageC,
    FinalMessageS,
    FinalQuestIntro,
    FinalQuest,
    FinalQuest2,
    ThankYou
]

#2 by ccrabbe ,

Hi UlkarQ -

This error happens when you try to use a template variable that the software can't find defined anywhere.  From the screenshot, I can see that the error comes from Step5COS.html.  Looking at your Step5COS Page class, you have no vars_for_template function.  This is the source of your error.  If you  include previous_price_offer in your vars_for_template function, this error will go away.

Thanks,
--Chris

#3 by UlkarQ ,

Thank you very much, Chris!!

Best Regards,
Ulkar

Write a reply

Set forum username