This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
tabellio.quiz/tabellio/quiz/form.py

94 lines
3.3 KiB
Python

from five import grok
from Acquisition import aq_inner
from zope.interface import implements
from zope import interface
from zope import schema
from zope.component import getMultiAdapter, provideAdapter
from Products.CMFCore.utils import getToolByName
from z3c.form import form, field, button, validator
from z3c.form.browser.radio import RadioFieldWidget
from plone.z3cform.layout import wrap_form
from z3c.form.ptcompat import ViewPageTemplateFile
from plone.dexterity.content import Item
from plone.formwidget.captcha.widget import CaptchaFieldWidget
from plone.formwidget.captcha.validator import CaptchaValidator
from zope.schema.interfaces import IContextSourceBinder
from zope.schema.vocabulary import SimpleVocabulary
from tabellio.quiz.interfaces import MessageFactory as _
class IQuizForm(interface.Interface):
title = schema.TextLine(title=_(u'Title'))
description = schema.Text(title=_(u'Description'), required=False)
questions = schema.Text(title=_(u'Questions'))
class QuizForm(Item):
implements(IQuizForm)
class View(grok.View):
grok.context(IQuizForm)
grok.require('zope2.View')
def quiz_form(self):
effective_quiz = EffectiveQuiz(self.context)
effective_form = EffectiveQuizForm(effective_quiz, self.request)
effective_form.update()
return effective_form.render()
class EffectiveQuiz(object):
def __init__(self, context):
self.context = context
def absolute_url(self):
return self.context.absolute_url()
class EffectiveQuizForm(form.Form):
@property
def fields(self):
list_of_fields = []
self.good_answers = {}
for i, question in enumerate(self.context.context.questions.split('--')):
question_lines = question.strip().splitlines()
if not question_lines:
continue
question_title = question_lines[0]
question_answers = [x[2:] for x in question_lines[1:]]
self.good_answers['q%s' % (i+1)] = [x[2:] for x in question_lines[1:] if x.startswith('o')]
question_field = schema.Choice(title=question_title,
values=question_answers,
required=False)
question_field.__name__ = 'q%s' % (i+1)
question_field.widgetFactory = RadioFieldWidget
list_of_fields.append(question_field)
fields = field.Fields(*list_of_fields)
for key in fields._data.keys():
fields[key].widgetFactory = RadioFieldWidget
return fields
template = ViewPageTemplateFile('form_templates/view_effectivequiz.pt')
@button.buttonAndHandler(_(u'Submit'))
def handleApply(self, action):
data, errors = self.extractData()
error = False
for key in self.fields._data.keys():
if [data.get(key)] != self.good_answers[key]:
error = True
plone_utils = getToolByName(self.context.context, 'plone_utils')
if error:
plone_utils.addPortalMessage(_('Some errors, somewhere...'))
return self.request.response.redirect(self.context.context.absolute_url())
else:
plone_utils.addPortalMessage(_('Congrats, you know all about us!'))
return self.request.response.redirect('./')