#!/usr/bin/python # -*- coding: utf-8 -*- # # Pyromaths # Un programme en Python qui permet de créer des fiches d'exercices types de # mathématiques niveau collège ainsi que leur corrigé en LaTeX. # Copyright (C) 2006 -- Jérôme Ortais (jerome.ortais@pyromaths.org) # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, write to the Free Software # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA # from lxml import etree class moodle_xml: def __init__(self): self.quiz = etree.Element("quiz") self.question = "" def moodle_xml_category(self, param): self.question = etree.SubElement(self.quiz, "question", type="category") category = etree.SubElement(self.question, "category") etree.SubElement(category, "text").text = ("$course$/%s"%param) def moodle_xml_fin(self, f2): f2.write(etree.tostring(self.quiz, pretty_print=True, encoding='UTF-8', xml_declaration=True).decode('UTF-8', 'strict')) def moodle_question(self, type_moodle, name_quiz, exo, cor): # xml_type -> matching(emparejar), essay(ensayo), numerical, multichoice, # shortanswer, cloze, truefalse, description(sin pregunta) self.question = etree.SubElement(self.quiz, "question", type=type_moodle) name = etree.SubElement(self.question, "name") etree.SubElement(name, u"text").text = name_quiz if type_moodle == "cloze": self.moodle_question_cloze(exo) elif type_moodle == "numerical": self.moodle_question_numerical(exo, cor) elif type_moodle == "shortanswer": self.moodle_question_shortanswer(exo, cor) elif type_moodle == "multichoice": self.moodle_question_multichoice(exo, cor) elif type_moodle == "matching": self.moodle_question_matching(exo, cor) elif type_moodle == "truefalse": self.moodle_question_truefalse(exo, cor) elif type_moodle == "essay": self.moodle_question_essay(exo, cor) elif type_moodle == "description": self.moodle_question_description(exo) else: print(u'\n\n Error: tipo incorrecto de pregunta moodle\n\n') def moodle_question_cloze(self, exo): questiontext = etree.SubElement(self.question, "questiontext", format="html") etree.SubElement(questiontext, "text").text = etree.CDATA(exo) #generalfeedback = etree.SubElement(self.question, "generalfeedback", format="moodle_auto_format") #etree.SubElement(generalfeedback, "text").text = "OK" #etree.SubElement(self.question, "defaultgrade").text = "1.0000000" #etree.SubElement(self.question, "penalty").text = "0.3333333" #etree.SubElement(self.question, "hidden").text = "0" def moodle_question_numerical(self, exo, cor): #Se puede meter más de una respuesta correcta como una lista questiontext = etree.SubElement(self.question, "questiontext", format="moodle_auto_format") etree.SubElement(questiontext, "text").text = exo #generalfeedback = etree.SubElement(self.question, "generalfeedback", format="moodle_auto_format") #etree.SubElement(generalfeedback, "text").text = "OK" #etree.SubElement(self.question, "defaultgrade").text = "1.0000000" #etree.SubElement(self.question, "penalty").text = "0.3333333" #etree.SubElement(self.question, "hidden").text = "0" if isinstance(cor,list): for i in range(len(cor)): answer = etree.SubElement(self.question, "answer", fraction="100", format="moodle_auto_format") etree.SubElement(answer, "text").text = str(cor[i]) #etree.SubElement(answer, "tolerance").text = "0" #feedback = etree.SubElement(answer, "feedback", format="moodle_auto_format") #etree.SubElement(feedback, "text").text = "OK" else: answer = etree.SubElement(self.question, "answer", fraction="100", format="moodle_auto_format") etree.SubElement(answer, "text").text = str(cor) #etree.SubElement(answer, "tolerance").text = "0" #feedback = etree.SubElement(answer, "feedback", format="moodle_auto_format") #etree.SubElement(feedback, "text").text = "" #etree.SubElement(self.question, "unitgradingtype").text = "0" #etree.SubElement(self.question, "unitpenalty").text = "1.0000000" #etree.SubElement(self.question, "showunits").text = "3" #etree.SubElement(self.question, "unitsleft").text = "0" def moodle_question_shortanswer(self, exo, cor): #Se puede meter más de una respuesta correcta como una lista questiontext = etree.SubElement(self.question, "questiontext", format="moodle_auto_format") etree.SubElement(questiontext, "text").text = exo #generalfeedback = etree.SubElement(self.question, "generalfeedback", format="moodle_auto_format") #etree.SubElement(generalfeedback, "text").text = "OK" #etree.SubElement(self.question, "defaultgrade").text = "1.0000000" #etree.SubElement(self.question, "penalty").text = "0.3333333" #etree.SubElement(self.question, "hidden").text = "0" #etree.SubElement(self.question, "usecase").text = "0" if isinstance(cor,list): for i in range(len(cor)): answer = etree.SubElement(self.question, "answer", fraction="100", format="moodle_auto_format") etree.SubElement(answer, "text").text = cor[i] #etree.SubElement(answer, "tolerance").text = "0" #feedback = etree.SubElement(answer, "feedback", format="moodle_auto_format") #etree.SubElement(feedback, "text").text = "OK" else: answer = etree.SubElement(self.question, "answer", fraction="100", format="moodle_auto_format") etree.SubElement(answer, "text").text = cor #etree.SubElement(answer, "tolerance").text = "0" #feedback = etree.SubElement(answer, "feedback", format="moodle_auto_format") #etree.SubElement(feedback, "text").text = "" def moodle_question_multichoice(self, exo, cor): #Meter la respuesta con su puntuación [100,"Paris"] el 100->100% questiontext = etree.SubElement(self.question, "questiontext", format="moodle_auto_format") etree.SubElement(questiontext, "text").text = exo #generalfeedback = etree.SubElement(self.question, "generalfeedback", format="moodle_auto_format") #etree.SubElement(generalfeedback, "text").text = "OK" #etree.SubElement(self.question, "defaultgrade").text = "1.0000000" #etree.SubElement(self.question, "penalty").text = "0.3333333" #etree.SubElement(self.question, "hidden").text = "0" etree.SubElement(self.question, "single").text = "false" etree.SubElement(self.question, "shuffleanswers").text = "false" #etree.SubElement(self.question, "answernumbering").text = "abc" etree.SubElement(self.question, "answernumbering").text = "none" #correctfeedback = etree.SubElement(self.question, "correctfeedback", format="moodle_auto_format") #etree.SubElement(correctfeedback, "text").text = "OK" #partiallycorrectfeedback = etree.SubElement(self.question, "partiallycorrectfeedback", format="moodle_auto_format") #etree.SubElement(partiallycorrectfeedback, "text").text = "Casi" #incorrectfeedback = etree.SubElement(self.question, "incorrectfeedback", format="moodle_auto_format") #etree.SubElement(incorrectfeedback, "text").text = "Mal" for i in range(len(cor)): #answer = etree.SubElement(self.question, "answer", fraction=cor[i][0], format="moodle_auto_format") answer = etree.SubElement(self.question, "answer", fraction=str(cor[i][0]), format="html") etree.SubElement(answer, "text").text = cor[i][1] #feedback = etree.SubElement(answer, "feedback", format="moodle_auto_format") #etree.SubElement(feedback, "text").text = "OK" def moodle_question_matching(self, exo, cor): #Meter la respuesta como una pareja ["Francia","Paris"] questiontext = etree.SubElement(self.question, "questiontext", format="moodle_auto_format") etree.SubElement(questiontext, "text").text = exo #generalfeedback = etree.SubElement(self.question, "generalfeedback", format="moodle_auto_format") #etree.SubElement(generalfeedback, "text").text = "OK" #etree.SubElement(self.question, "defaultgrade").text = "1.0000000" #etree.SubElement(self.question, "penalty").text = "0.3333333" #etree.SubElement(self.question, "hidden").text = "0" etree.SubElement(self.question, "shuffleanswers").text = "false" #correctfeedback = etree.SubElement(self.question, "correctfeedback", format="moodle_auto_format") #etree.SubElement(correctfeedback, "text").text = "OK" #partiallycorrectfeedback = etree.SubElement(self.question, "partiallycorrectfeedback", format="moodle_auto_format") #etree.SubElement(partiallycorrectfeedback, "text").text = "Casi" #incorrectfeedback = etree.SubElement(self.question, "incorrectfeedback", format="moodle_auto_format") #etree.SubElement(incorrectfeedback, "text").text = "Mal" for i in range(len(cor)): subquestion = etree.SubElement(self.question, "subquestion", format="moodle_auto_format") etree.SubElement(subquestion, "text").text = cor[i][0] answer = etree.SubElement(subquestion, "answer") etree.SubElement(answer, "text").text = cor[i][1] def moodle_question_truefalse(self, exo, cor): questiontext = etree.SubElement(self.question, "questiontext", format="moodle_auto_format") etree.SubElement(questiontext, "text").text = exo #generalfeedback = etree.SubElement(self.question, "generalfeedback", format="moodle_auto_format") #etree.SubElement(generalfeedback, "text").text = "OK" #etree.SubElement(self.question, "defaultgrade").text = "1.0000000" #etree.SubElement(self.question, "penalty").text = "0.3333333" #etree.SubElement(self.question, "hidden").text = "0" if str(cor) == "0" or cor.lower() == "true" or cor.lower() == "t": cor = "true" else: cor = "false" answer = etree.SubElement(self.question, "answer", fraction="100", format="moodle_auto_format") etree.SubElement(answer, "text").text = cor #feedback = etree.SubElement(answer, "feedback", format="moodle_auto_format") #etree.SubElement(feedback, "text").text = "OK" def moodle_question_essay(self, exo, cor): questiontext = etree.SubElement(self.question, "questiontext", format="moodle_auto_format") etree.SubElement(questiontext, "text").text = exo #generalfeedback = etree.SubElement(self.question, "generalfeedback", format="moodle_auto_format") #etree.SubElement(generalfeedback, "text").text = "OK" #etree.SubElement(self.question, "defaultgrade").text = "1.0000000" #etree.SubElement(self.question, "penalty").text = "0.3333333" #etree.SubElement(self.question, "hidden").text = "0" etree.SubElement(self.question, "responseformat").text = "editor" etree.SubElement(self.question, "responsefieldlines").text = "15" etree.SubElement(self.question, "attachments").text = "0" #graderinfo = etree.SubElement(self.question, "graderinfo", format="html") #etree.SubElement(graderinfo, "text").text = "OK" def moodle_question_description(self, exo): questiontext = etree.SubElement(self.question, "questiontext", format="moodle_auto_format") etree.SubElement(questiontext, "text").text = exo #generalfeedback = etree.SubElement(self.question, "generalfeedback", format="moodle_auto_format") #etree.SubElement(generalfeedback, "text").text = "OK" #etree.SubElement(self.question, "defaultgrade").text = "1.0000000" #etree.SubElement(self.question, "penalty").text = "0.3333333" #etree.SubElement(self.question, "hidden").text = "0"