Example #1
0
class Survey(form.Form):
    """Marked question"""

    name = fields.Field("Survey name")
    answer = fields.Expression("Your answer", nosave=True, editable=True)
    correct_answer = fields.Expression("Correct Answer", required=True)
    max_error = fields.Expression("Maximal error", default=0)
    before = fields.Markdown("Before field text", default="Your answer:")
    after = fields.Markdown("After field text")
    question = fields.Markdown("Question")
    marking_type = fields.Select(
        "Marking type",
        options=["Default", "Numerical", "Fraction"],
        default="Default",
    )

    template = """
        <p v-if="config.edit || payload.question">`question`</p>
        <widget-settings v-if="config.edit">
            <config-option name="Correct Answer">`correct_answer`</config-option>
            <config-option name="Tolerated error">`max_error`</config-option>
            <config-option name="Marking type">`marking_type`</config-option>
        </widget-settings>
        <survey
            :config="config"
            :name="payload.name"
            :showStats="config.authState.loggedIn"
            :correct="computed.correct"
            :value="payload.answer">
            <span v-if="config.edit || payload.before">`before`</span>
            `answer`
            <span v-if="config.edit || payload.after">`after`</span>
        </survey>
    """

    _total_marks = 1

    @property
    def _marks(self):
        return 1 if self.correct else 0

    @fields.computed("Correct", field=fields.Boolean)
    def correct(self):
        if self.answer is None:
            return False
        elif self.marking_type == "Numerical":
            numbers = sympy.core.numbers
            if not self.answer.func in [numbers.Float, numbers.Integer]:
                return False
        elif self.marking_type == "Fraction":
            if not re.search(r"^[0-9\s/]*$", self._answer):
                return False
        return (sympy.Abs(sympy.nsimplify(self.answer - self.correct_answer))
                <= self.max_error)

    def validate(self):
        if not self.name:
            self.name = str(uuid.uuid1())
Example #2
0
class Tuxie(form.Form):
    """Tuxie says"""

    text = fields.Markdown("Text")
    width = fields.Expression("Tuxie width", default="400")
    image = fields.Select("Image",
                          options=["tuxie", "jigglypuff", "pikachu"],
                          default="tuxie")
    position = fields.Select("Bubble position",
                             options=["left", "right"],
                             default="right")

    template = """
Example #3
0
class Foo(form.Form):
    field = fields.Field("Field", desc="description")
    equation = fields.Equation("Equation")
    real = fields.Expression("Real number")
    markdown = fields.Markdown("Markdown")
    matrix = fields.Matrix("Matrix")
    email = fields.Email("Email")
    password = fields.Password("Email")
    protected = fields.Field("Protected", default="Protected", protected=True)
    select = fields.Select("Select", options=["Hi", "Hello"])

    @fields.constraint("Contraint", default=True)
    def constraint(self):
        return self.real > 0

    @fields.computed("Computed")
    def computed_field(self):
        return self.field
Example #4
0
class MultipleChoice(form.Form):
    """Multiple Choice"""

    name = fields.Field("Survey name")
    answer = fields.Select("Your answer",
                           nosave=True,
                           options=["", "A", "B", "C", "D", "E"])
    correct_answer = fields.Select("Correct Answer",
                                   options=["A", "B", "C", "D", "E"],
                                   default="A")
    question = fields.Markdown("Question")

    option_a = fields.Markdown("Option A")
    option_b = fields.Markdown("Option B")
    option_c = fields.Markdown("Option C")
    option_d = fields.Markdown("Option D")
    option_e = fields.Markdown("Option E")

    @property
    def template(self):
        buttons = []
        for ltr in ["a", "b", "c", "d", "e"]:
            buttons.append(f"""
                <span v-if="!config.edit">
                    <span v-if="payload.option_{ltr}">
                        <b-button @click="$set(payload, 'answer', '{ltr.upper()}')"
                            type="is-primary"
                            v-if="'{ltr.upper()}' === payload.answer">
                            `option_{ltr}`
                        </b-button>
                        <b-button @click="$set(payload, 'answer', '{ltr.upper()}')" v-else>
                            `option_{ltr}`
                        </b-button>
                    </span>
                </span>
                <span v-else>
                    <b-button>`option_{ltr}`</b-button>
                </span>
            """)
        return f"""
            <p v-if="config.edit || payload.question">`question`</p>
            <widget-settings v-if="config.edit">
                <config-option name="Correct Answer">`correct_answer`</config-option>
            </widget-settings>
            <survey
                :config="config"
                :name="payload.name"
                :showStats="config.authState.loggedIn"
                :correct="computed.correct"
                :max-attempts="1"
                :value="payload.answer">
                <span class="buttons are-large">
                    {"".join(buttons)}
                </span>
            </survey>
    """

    @property
    def _marks(self):
        return 1 if self.correct else 0

    @fields.computed("Correct", field=fields.Boolean)
    def correct(self):
        return self.answer == self.correct_answer

    def validate(self):
        if not self.name:
            self.name = str(uuid.uuid1())
Example #5
0
class Pandoc(form.Form):
    """Rich Text"""

    markdown = fields.Markdown("Markdown")
    template = "`markdown`"