# coding: utf-8 ''' Created on 27.07.2015 ☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦ @author: tr0glo)|(I╠╣ ☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦☦ ''' from java.util import Date from java.util import Calendar import json from ru.curs.celesta.showcase.utils import XMLJSONConverter from qt.functions import getImageById, getPrevNextQuestionId, getAttributeValue from fileRepository._fileRepository_orm import fileCursor from fileRepository.functions import getRelativePathById try: from ru.curs.showcase.core.jython import JythonDTO from ru.curs.showcase.core.jython import JythonDownloadResult except: from ru.curs.celesta.showcase import JythonDTO from qt._qt_orm import TestingVariantAssignCursor, QtiVariantQuestionCursor, QtiVariantAnswerCursor, \ QtiQuestionCursor, QtiDestructorCursor, \ QtiVariantDestructorCursor, QtiVariantDestructorAnswerCursor,\ QtiResourceCursor, QtiVariantParamsCursor def cardData(context, main=None, add=None, filterinfo=None, session=None, elementId=None): u'''Карточка вопроса с множественным выбором. ''' variantQuestionId = main QtiVariantQuestion = QtiVariantQuestionCursor(context) QtiVariantQuestion.get(variantQuestionId) variantId = QtiVariantQuestion.VariantID QtiVariantQuestion.setRange('VariantID',variantId) QtiVariantQuestion.orderBy('QuestionNumber') questionNumber = QtiVariantQuestion.QuestionNumber questionCount = QtiVariantQuestion.count() QtiQuestion = QtiQuestionCursor(context) QtiQuestion.get(QtiVariantQuestion.QuestionID) questionHtml = QtiQuestion.QuestionHtml if QtiQuestion.QuestionHtml is not None else '' imgId = QtiQuestion.QuestionImg QtiResource = QtiResourceCursor(context) if imgId: imagesJson = json.loads(getImageById(QtiResource, imgId, isImage=False)) if imagesJson: imageFiles = {'image_file': []} file_cursor = fileCursor(context) imageItems = imagesJson['question_img'] if isinstance(imageItems, dict): imageItems = [imageItems] for imageItem in imageItems: imageItemId = imageItem['@id'] if file_cursor.tryGet(imageItemId): imageFiles['image_file'].append({'#text': '/'.join(getRelativePathById(context, str(imageItemId), file_version_id=None))}) else: imageFiles['image_file'].append({'#text': ''}) file_cursor.close() questionImg = imageFiles else: questionImg = '' QtiQuestion.close() TVA = TestingVariantAssignCursor(context) TVA.get(variantId) if TVA.AlgorithmTestingID == 1: testingAlgorithm = u'Тестирование для самоконтроля' elif TVA.AlgorithmTestingID == 2: testingAlgorithm = u'Аудиторное тестирование' else: testingAlgorithm = u'Тестирование' TVA.close() questionHeader = u'Вопрос %s из %s'%(questionNumber,questionCount) # QtiVariantQuestion.setRange("QuestionNumber",1) # QtiVariantQuestion.first() # # firstVariantQuestionId = QtiVariantQuestion.VariantQuestionID # # QtiVariantQuestion.setRange("QuestionNumber") # QtiVariantQuestion.get(variantQuestionId) # # nextVariantQuestionId = 'ID_FINISH' # if QtiVariantQuestion.navigate('>'): # nextVariantQuestionId = QtiVariantQuestion.VariantQuestionID # # prevVariantQuestionId = firstVariantQuestionId # QtiVariantQuestion.get(variantQuestionId) # if QtiVariantQuestion.navigate('<'): # prevVariantQuestionId = QtiVariantQuestion.VariantQuestionID prevVariantQuestionId, nextVariantQuestionId = getPrevNextQuestionId(context, QtiVariantQuestion, variantQuestionId) QtiVariantQuestion.close() QtiVariantAnswer = QtiVariantAnswerCursor(context) QtiVariantAnswer.setRange('VariantID',variantId) QtiVariantAnswer.first() timeEnd = QtiVariantAnswer.TimeEnd timeout = '1' if QtiVariantAnswer.TimeEnd < Date() else '0' if QtiVariantAnswer.TimeFinish is None and QtiVariantAnswer.TimeEnd < Date(): testingStatus = '2' elif QtiVariantAnswer.TimeFinish is not None: testingStatus = '1' else: testingStatus = '0' QtiVariantAnswer.close() optionList = [] resultList = [] letter = ord('A') QtiDestructor = QtiDestructorCursor(context) QtiVariantDestructor = QtiVariantDestructorCursor(context) QtiVariantDestructor.setRange('VariantQuestionID',variantQuestionId) QtiVariantDestructor.orderBy('VariantDestructorID') QtiVariantDestructorAnswer = QtiVariantDestructorAnswerCursor(context) for QtiVariantDestructor in QtiVariantDestructor.iterate(): QtiDestructor.get(QtiVariantDestructor.DestructorID) variantDestructorId = QtiVariantDestructor.VariantDestructorID destructorHtml = QtiDestructor.DestructorHtml if QtiDestructor.DestructorHtml is not None else '' destructorHtml2 = QtiDestructor.DestructorHtml2 if QtiDestructor.DestructorHtml2 is not None else '' destructorImg = '<img src="getImage?proc=spQtiGetTestImage¶ms=%s&responsetype=jpeg" />' % QtiDestructor.DestructorImg\ if QtiDestructor.DestructorImg is not None else '' optionList.append({"id":variantDestructorId, "letter":chr(letter), "destructorHTML": destructorHtml + destructorImg + destructorHtml2 }) letter += 1 checked = '1_' if testingStatus != '0' else '0_' QtiVariantDestructorAnswer.setRange('VariantDestructorID',QtiVariantDestructor.VariantDestructorID) if QtiVariantDestructorAnswer.tryFirst(): if QtiVariantDestructorAnswer.IsTrue: checked += '1' else: checked += '0' else: checked += '0' resultList.append({"id":variantDestructorId, "checked":checked}) QtiDestructor.close() QtiVariantDestructor.close() QtiVariantDestructorAnswer.close() calNow = Calendar.getInstance() timeNow = Date() calNow.setTime(timeNow) calEnd = Calendar.getInstance() calEnd.setTime(timeEnd) js = '''javascript:injectCounter(new Date(%s,%s,%s,%s,%s,%s),new Date(%s,%s,%s,%s,%s,%s))'''%\ (calEnd.get(Calendar.YEAR),calEnd.get(Calendar.MONTH),calEnd.get(Calendar.DAY_OF_MONTH),\ calEnd.get(Calendar.HOUR_OF_DAY),calEnd.get(Calendar.MINUTE),calEnd.get(Calendar.SECOND),\ calNow.get(Calendar.YEAR),calNow.get(Calendar.MONTH),calNow.get(Calendar.DAY_OF_MONTH),\ calNow.get(Calendar.HOUR_OF_DAY),calNow.get(Calendar.MINUTE),calNow.get(Calendar.SECOND)) QtiVariantParams = QtiVariantParamsCursor(context) skipQuestions = getAttributeValue(QtiVariantParams, variantId, 'SkipQuestions') QtiVariantParams.close() xformsdata = {"schema": { "@xmlns":"", "description": { "testingAlgorithm": testingAlgorithm, "js":js, "questionHeader":questionHeader, "questionType":'2', 'variantId': variantId, "skipQuestions": skipQuestions, "testingStatus": testingStatus, "captchaText":'', "images": questionImg, "question": { "@number": questionNumber, "@isLastQuestion":'1' if nextVariantQuestionId == 'ID_FINISH' else '0', "@timeout":timeout, "#text":questionHtml},# + questionImg + questionHtml2 + ']]>' "options":{"option":optionList}}, "result":{"option":resultList}}} xformssettings = {"properties": { "event": [ {"@name":"single_click", "@linkId": "1", "action": { "#sorted": [ {"navigator": {"@element": prevVariantQuestionId}}]}}, {"@name":"single_click", "@linkId": "2", "action": { "#sorted": [ {"navigator": {"@element": nextVariantQuestionId}}]}}, {"@name":"single_click", "@linkId": "3", "action": { "#sorted": [ {"navigator": {"@element": "ID_FINISH"}}]}}, {"@name":"single_click", "@linkId": "4", "action": { "#sorted": [ {"navigator": {"@element": "ID_CONTENTS"}}]}}]}} data = XMLJSONConverter.jsonToXml(json.dumps(xformsdata)) data = data.replace(' ','&nbsp;') settings = XMLJSONConverter.jsonToXml(json.dumps(xformssettings)) # data = data.replace('<','<') # data = data.replace('>','>') # raise Exception(data) # raise Exception(settings) return JythonDTO(data, settings)