class IQuiz(IEvaluation): """A folder containing quizzes """ title = schema.TextLine(title=_(u"Title"), required=True) description = schema.TextLine(title=_(u"Description"), description=_(u"A short summary of this folder"))
def __call__(self): form = self.request.form if 'Next' in form: answers = form.get('answers',[]) timeout = form.get('timeout',0) if not answers and not timeout: IStatusMessage(self.request).addStatusMessage(_(u"You do not select answer"), type='error') return self.template() self.next() return self.template() elif 'Finish' in form: answers = form.get('answers',[]) timeout = form.get('timeout',0) if not answers and not timeout: IStatusMessage(self.request).addStatusMessage(_(u"You do not select answer"), type='error') return self.template() self.next() self.finish() return self.results() if 'Init' in form: return self.template() if self.isResolved(): return self.results() ## cuando se llena debe de rellenar con la pregunta return self.template()
class IGroupQuestion(IQuestion): """A folder containing groupquestions """ title = schema.TextLine(title=_(u"Title"), required=True) description = schema.TextLine(title=_(u"Description"), description=_(u"A short summary of this folder"))
def __call__(self): form = self.request.form userid = form.get('userid',None) prefix = 'question.' interactions = [i for i in form.keys() if i.startswith(prefix)] tmp = {} for key in interactions: tmp[key] = form[key] evaluation = self.context.getLastEvaluation(userid) evaluation.update(tmp) if 'grade' in form: evaluation['evaluation.score'] = self.context.calculateScore(evaluation) evaluation['evaluation.scored'] = 1 self.context.saveUserResponse(evaluation, userId=userid) self.context.sendMessage(evaluation, userId=userid) self.context.setScoreKardex(evaluation, userId=userid) IStatusMessage(self.request).addStatusMessage(_(u"The user has been graded with ") + str(evaluation['evaluation.score']), type='info') elif 'save' in form: self.context.saveUserResponse(evaluation, userId=userid) IStatusMessage(self.request).addStatusMessage(_(u"The exam has been saved for further review"), type='info') url = self.context.absolute_url() + '/@@grade' return self.request.response.redirect(url)
def __call__(self): form = self.request.form userid = form.get('userid', None) prefix = 'question.' interactions = [i for i in form.keys() if i.startswith(prefix)] tmp = {} for key in interactions: tmp[key] = form[key] evaluation = self.context.getLastEvaluation(userid) evaluation.update(tmp) if 'grade' in form: evaluation['evaluation.score'] = self.context.calculateScore( evaluation) evaluation['evaluation.scored'] = 1 self.context.saveUserResponse(evaluation, userId=userid) #self.context.sendMessage(evaluation, userId=userid) self.context.setScoreKardex(evaluation, userId=userid) IStatusMessage(self.request).addStatusMessage( text=_(u"The user has been graded with ") + str(evaluation['evaluation.score']), type='info') elif 'save' in form: self.context.saveUserResponse(evaluation, userId=userid) IStatusMessage(self.request).addStatusMessage( _(u"The exam has been saved for further review"), type='info') url = self.context.absolute_url() + '/@@grade' return self.request.response.redirect(url)
class IEvaluation(Interface): """A folder containing evaluations """ title = schema.TextLine(title=_(u"Title"), required=True) description = schema.TextLine(title=_(u"Description"), description=_(u"A short summary of this folder"))
def getScoreStatus(self, scored=None, score=None): if not scored: return _("Pending") if score < self.getMinScoreGrade(): return _("Unapproved") return _("Approved")
class IExamsPortlet(IPortletDataProvider): count = schema.Int(title=_(u'Number of exams to display'), description=_(u'Maximum number of exams to be shown'), required=True, default=5) randomize = schema.Bool( title=_(u"Randomize exams"), description=_(u"If enabled, exams to show will be picked randomly. " "If disabled, newer courses will be preferred."), default=False)
class AddForm(base.AddForm): form_fields = form.Fields(IExamsPortlet) label = _(u"Add Exam portlet") description = _(u"This portlet displays my exams.") # This method must be implemented to actually construct the object. # The 'data' parameter is a dictionary, containing the values entered # by the user. def create(self, data): assignment = Assignment() form.applyChanges(assignment, self.form_fields, data) return assignment
def sendMessage(self, data=None, isOpen=False, userId=None): manager = getUtility(IMessagesManager) receiver = sender = self.AuthenticatedMember() if userId: receiver = userId subject = _(u"Exam name: ") + self.Title() normal = _(u"Your grade is: ") + str(data['evaluation.score']) openbody = _(u"The instructor has reviewed your exam and your grade was ") + str(data['evaluation.score']) link = _(u"To see the details of this revision, please follow this link: ") + "<a href=%s target=_blank> %s </a>"%(self.absolute_url(),self.Title()) body = normal + link if isOpen: body = openbody + link manager.message_new(2, sender, receiver, subject, body)
def __call__(self): self.errormsg = [] form = self.request.form if 'ExamUpdateExtraGrade' in form: for key in form.keys(): if key.startswith('score_extra.'): #key = extra_grade.username extra_grade = form[key] userid = key.split('.')[-1] if self.is_valid_grade(extra_grade): evaluation = self.context.getLastEvaluation(userid) if extra_grade == '': #Delete the extra grade and disable it. evaluation['evaluation.scored_extra'] = False evaluation['evaluation.score_extra'] = 0.0 else: evaluation['evaluation.scored_extra'] = True evaluation['evaluation.score_extra'] = float(extra_grade) self.context.saveUserResponse(evaluation, userId=userid) else: self.errormsg.append(userid) if len(self.errormsg): IStatusMessage(self.request).addStatusMessage(_(u"Invalid input in one or more fields. Please correct."), type='error') return self.template()
def __call__(self): self.errormsg = [] form = self.request.form if 'ExamUpdateExtraGrade' in form: for key in form.keys(): if key.startswith('score_extra.'): #key = extra_grade.username extra_grade = form[key] userid = key.split('.')[-1] if self.is_valid_grade(extra_grade): evaluation = self.context.getLastEvaluation(userid) if extra_grade == '': #Delete the extra grade and disable it. evaluation['evaluation.scored_extra'] = False evaluation['evaluation.score_extra'] = 0.0 else: evaluation['evaluation.scored_extra'] = True evaluation['evaluation.score_extra'] = float( extra_grade) self.context.saveUserResponse(evaluation, userId=userid) else: self.errormsg.append(userid) if len(self.errormsg): IStatusMessage(self.request).addStatusMessage( _(u"Invalid input in one or more fields. Please correct."), type='error') return self.template()
def __call__(self): form = self.request.form userid = form.get('userid',None) numeval = form.get('numeval',None) if userid and not numeval: for track in self.context.getDataEvaluations(userid): self.context.track.removeTrack(track) IStatusMessage(self.request).addStatusMessage(_(u"The data user has been deleted"), type='info') elif userid and numeval: num = int(numeval) - 1 track = self.context.getDataEvaluations(userid)[num] self.context.track.removeTrack(track) IStatusMessage(self.request).addStatusMessage(_(u"The evaluation user has been deleted"), type='info') url = self.context.absolute_url() + '/@@results' return self.request.response.redirect(url)
def __call__(self): form = self.request.form userid = form.get('userid', None) numeval = form.get('numeval', None) if userid and not numeval: for track in self.context.getDataEvaluations(userid): self.context.track.removeTrack(track) IStatusMessage(self.request).addStatusMessage( _(u"The data user has been deleted"), type='info') elif userid and numeval: num = int(numeval) - 1 track = self.context.getDataEvaluations(userid)[num] self.context.track.removeTrack(track) IStatusMessage(self.request).addStatusMessage( _(u"The evaluation user has been deleted"), type='info') url = self.context.absolute_url() + '/@@results' return self.request.response.redirect(url)
def getEvaluationDetails(self, userId=None, numeval=None): if not userId or not numeval: return {},[] data_eval = {} data_interactions = [] tracks = self.track.getUserTracks(self.getId(), 0, userId) if not tracks: return {},[] num = int(numeval) - 1 evaluation = sorted(tracks, key=lambda x: x.timeStamp)[num] correct_responses = 0 #print evaluation.data data_eval['start'] = self.utilConvertTime(evaluation.data['evaluation.start']) data_eval['end'] = self.utilConvertTime(evaluation.data['evaluation.end']) data_eval['period'] = self.utilCalculeTime(evaluation.data['evaluation.start'], evaluation.data['evaluation.end']) data_eval['score'] = evaluation.data['evaluation.score'] data_eval['scored'] = evaluation.data['evaluation.scored'] data_eval['open'] = evaluation.data['evaluation.open'] data_eval['total_questions'] = (len(evaluation.data)-5)/8 for e in range(data_eval['total_questions']): tmp = {} tmp['index'] = e + 1 tmp['type'] = evaluation.data['question.%s.type'%e] tmp['time'] = self.utilConvertTimeHM(evaluation.data['question.%s.time'%e]) tmp['latency'] = evaluation.data['question.%s.latency'%e] tmp['result'] = evaluation.data['question.%s.result'%e] if tmp['result']: correct_responses += 1 tmp['weighting'] = evaluation.data['question.%s.weighting'%e] tmp['comments'] = evaluation.data['question.%s.comments'%e] obj = self._getOb(evaluation.data['question.%s.id'%e]) tmp['question'] = obj.Title() tmp['student_response'] = evaluation.data['question.%s.student_response'%e] if tmp['type'] == 'choice': if not tmp['student_response']: tmp['student_response'] = _("You did not respond within the time of question") tmp['correct_response'] = '' else: tmp['student_response'] = ', '.join(obj.getAnswerTitles(evaluation.data['question.%s.student_response'%e])) tmp['correct_response'] = ', '.join(obj.getCorrectAnswerTitles()) data_interactions.append(tmp) data_eval['correct_responses'] = correct_responses data_eval['evaluation.score_extra'] = evaluation.data['evaluation.score_extra'] data_eval['evaluation.scored_extra'] = evaluation.data['evaluation.scored_extra'] return data_eval,data_interactions
def post_validate(self, REQUEST=None, errors=None): """Extra validation """ # Check answers answers = REQUEST.form.get('answers', None) error = False if answers is None: error = True elif len(answers) < 2: error = True elif len([x for x in answers if x.get('checked', False)]) < 1: error = True if error: errors['answers'] = _('you must select a least one correct answer') return
from Products.ATContentTypes.content.schemata import finalizeATCTSchema from Products.CMFCore.utils import getToolByName from eduintelligent.evaluation.utility import hideMetadataSchema from eduintelligent.evaluation.interfaces import IQuestion, IQuestionChoice from eduintelligent.evaluation.config import PROJECTNAME from eduintelligent.evaluation import evaluationMessageFactory as _ from eduintelligent.evaluation.content.schemas import questionchoice_schema, base_question_schema from eduintelligent.evaluation.content.question import Question QuestionChoiceSchema = schemata.ATContentTypeSchema.copy() + questionchoice_schema.copy() + base_question_schema.copy() QuestionChoiceSchema['title'].widget = atapi.TextAreaWidget() QuestionChoiceSchema['title'].storage = atapi.AnnotationStorage() QuestionChoiceSchema['title'].widget.label = _(u"Question") QuestionChoiceSchema['title'].widget.description = _(u"") finalizeATCTSchema(QuestionChoiceSchema, folderish=False, moveDiscussion=False) hideMetadataSchema(QuestionChoiceSchema, excludeFromNav=True) QuestionChoiceSchema['description'].widget.visible = False class QuestionChoice(Question): """Describe a film. """ implements(IQuestion, IQuestionChoice) portal_type = "QuestionChoice" _at_rename_after_creation = False schema = QuestionChoiceSchema
def title(self): return _(u"My Exams")
class EditForm(base.EditForm): form_fields = form.Fields(IExamsPortlet) label = _(u"Edit exams portlet") description = _(u"This portlet displays my exams.")
from Products.ATContentTypes.content.schemata import finalizeATCTSchema from Products.CMFCore.utils import getToolByName from eduintelligent.evaluation.utility import hideMetadataSchema from eduintelligent.evaluation.interfaces import IQuestionFillIn, IQuestion from eduintelligent.evaluation.config import PROJECTNAME from eduintelligent.evaluation import evaluationMessageFactory as _ from eduintelligent.evaluation.content.schemas import questionchoice_schema, base_question_schema from eduintelligent.evaluation.content.question import Question QuestionFillInSchema = schemata.ATContentTypeSchema.copy() + base_question_schema.copy() QuestionFillInSchema['title'].widget = atapi.TextAreaWidget() QuestionFillInSchema['title'].storage = atapi.AnnotationStorage() QuestionFillInSchema['title'].widget.label = _(u"Question") QuestionFillInSchema['title'].widget.description = _(u"") finalizeATCTSchema(QuestionFillInSchema, folderish=False, moveDiscussion=False) hideMetadataSchema(QuestionFillInSchema, excludeFromNav=True) QuestionFillInSchema['description'].widget.visible = False class QuestionFillIn(Question): """Describe a film. """ implements(IQuestion, IQuestionFillIn) portal_type = "QuestionFillIn" _at_rename_after_creation = True schema = QuestionFillInSchema
class IQuestionFillIn(IQuestion): """A Question """ title = schema.TextLine(title=_(u"Question"), required=True)
from eduintelligent.evaluation.utility import hideMetadataSchema from eduintelligent.evaluation.interfaces import IQuestion, IQuestionChoice from eduintelligent.evaluation.config import PROJECTNAME from eduintelligent.evaluation import evaluationMessageFactory as _ from eduintelligent.evaluation.content.schemas import questionchoice_schema from eduintelligent.evaluation.content.schemas import base_question_schema from eduintelligent.evaluation.content.question import Question QuestionChoiceSchema = schemata.ATContentTypeSchema.copy() + \ questionchoice_schema.copy() + \ base_question_schema.copy() QuestionChoiceSchema['title'].widget = atapi.TextAreaWidget() QuestionChoiceSchema['title'].storage = atapi.AnnotationStorage() QuestionChoiceSchema['title'].widget.label = _(u"Question") QuestionChoiceSchema['title'].widget.description = _(u"") finalizeATCTSchema(QuestionChoiceSchema, folderish=False, moveDiscussion=False) hideMetadataSchema(QuestionChoiceSchema, excludeFromNav=True) QuestionChoiceSchema['description'].widget.visible = False class QuestionChoice(Question): """Describe a film. """ implements(IQuestion, IQuestionChoice) portal_type = "QuestionChoice" _at_rename_after_creation = False
from Products.ATReferenceBrowserWidget.ATReferenceBrowserWidget import \ ReferenceBrowserWidget ########################################################### # Quiz ########################################################### quiz_schema = atapi.Schema(( atapi.BooleanField( "randomOrder", accessor='isRandomOrder', required=False, default=True, storage=atapi.AnnotationStorage(), widget=atapi.BooleanWidget( label=_(u'Randomize Question Order'), description=_( u'Check this box if you want the questions ' u'in this container to appear in a different, random ' u'order for each candidate. Otherwise the same order ' u'as in the "contents"-view will be used.'), ), ), atapi.IntegerField( "numberOfRandomQuestions", required=False, default=-1, storage=atapi.AnnotationStorage(), widget=atapi.IntegerWidget( label=_(u'Number of Random Questions'), description=_(u'The number of questions which are randomly '
class IBannerProvider(Interface): """A component which can provide an HTML tag for a banner image """ tag = schema.TextLine(title=_(u"A HTML tag for a banner image"))
def getHeaderData(self): form = self.request.form header = form.get('fields', []) row_head = [_('User ID'), _('Name')] if 'employee' in header: row_head.append(_('Employee number')) if 'position' in header: row_head.append(_('Position')) if 'product' in header: row_head.append(_('Product')) if 'division' in header: row_head.append(_('Division')) if 'ingress' in header: row_head.append(_('Ingress')) if 'country' in header: row_head.append(_('Country')) if 'state' in header: row_head.append(_('State')) if 'city' in header: row_head.append(_('City')) if 'place' in header: row_head.append(_('Place')) if 'region' in header: row_head.append(_('Region')) if 'distric' in header: row_head.append(_('District')) config = form.get('reporttype', '') if config == 'average': row_head.extend([_('Average'), _('Opportunities')]) else: row_head.extend([_('Score'), _('Start'), _('End'), _('Time')]) return row_head
#from Products.CMFCore.utils import getToolByName from eduintelligent.evaluation.utility import hideMetadataSchema from eduintelligent.evaluation.interfaces import IQuestionFillIn, IQuestion from eduintelligent.evaluation.config import PROJECTNAME from eduintelligent.evaluation import evaluationMessageFactory as _ from eduintelligent.evaluation.content.schemas import base_question_schema from eduintelligent.evaluation.content.question import Question QuestionFillInSchema = schemata.ATContentTypeSchema.copy() + \ base_question_schema.copy() QuestionFillInSchema['title'].widget = atapi.TextAreaWidget() QuestionFillInSchema['title'].storage = atapi.AnnotationStorage() QuestionFillInSchema['title'].widget.label = _(u"Question") QuestionFillInSchema['title'].widget.description = _(u"") finalizeATCTSchema(QuestionFillInSchema, folderish=False, moveDiscussion=False) hideMetadataSchema(QuestionFillInSchema, excludeFromNav=True) QuestionFillInSchema['description'].widget.visible = False class QuestionFillIn(Question): """Describe a film. """ implements(IQuestion, IQuestionFillIn) portal_type = "QuestionFillIn" _at_rename_after_creation = True
class IQuestion(Interface): """A Question """ title = schema.TextLine(title=_(u"Question"), required=True)
from eduintelligent.evaluation.content.widget import AnswerWidget from Products.ATReferenceBrowserWidget.ATReferenceBrowserWidget import \ ReferenceBrowserWidget ########################################################### # Quiz ########################################################### quiz_schema = atapi.Schema(( atapi.BooleanField("randomOrder", accessor='isRandomOrder', required=False, default=True, storage=atapi.AnnotationStorage(), widget=atapi.BooleanWidget( label=_(u'Randomize Question Order'), description=_(u'Check this box if you want the questions ' u'in this container to appear in a different, random ' u'order for each candidate. Otherwise the same order ' u'as in the "contents"-view will be used.'), ), ), atapi.IntegerField("numberOfRandomQuestions", required=False, default=-1, storage=atapi.AnnotationStorage(), widget=atapi.IntegerWidget( label=_(u'Number of Random Questions'), description=_(u'The number of questions which are randomly ' u'selected when a new quiz is ' u'generated for a student. (This only works if '
def getHeaderData(self): form = self.request.form header = form.get('fields',[]) row_head = [_('User ID'),_('Name')] if 'employee' in header: row_head.append(_('Employee number')) if 'position' in header: row_head.append(_('Position')) if 'product' in header: row_head.append(_('Product')) if 'division' in header: row_head.append(_('Division')) if 'ingress' in header: row_head.append(_('Ingress')) if 'country' in header: row_head.append(_('Country')) if 'state' in header: row_head.append(_('State')) if 'city' in header: row_head.append(_('City')) if 'place' in header: row_head.append(_('Place')) if 'region' in header: row_head.append(_('Region')) if 'distric' in header: row_head.append(_('District')) config = form.get('reporttype','') if config == 'average': row_head.extend([_('Average'),_('Opportunities')]) else: row_head.extend([_('Score'),_('Start'),_('End'),_('Time')]) return row_head