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())
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 = """
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
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())
class Pandoc(form.Form): """Rich Text""" markdown = fields.Markdown("Markdown") template = "`markdown`"