# coding: utf-8 ''' Created on 21.10.2016 @author: d.gulyakin ''' import json from security.functions import userHasPermission from edu.constants import * from dirusing.commonfunctions import relatedTableCursorImport try: from ru.curs.showcase.core.jython import JythonDTO, JythonDownloadResult, JythonErrorResult except: from ru.curs.celesta.showcase import JythonDTO, JythonDownloadResult, JythonErrorResult from ru.curs.celesta.showcase.utils import XMLJSONConverter from ru.curs.showcase.core import UserMessageFactory from ru.curs.showcase.app.api.grid import GridSaveResult from common.sysfunctions import toHexForXml, getGridHeight from edu._edu_orm import course_cycleCursor, course_cycle_qti_packageCursor def gridData(context, main, add=None, filterinfo=None, session=None, elementId=None, sortColumnList=None, firstrecord=None, pagesize=None): u'''Функция получения данных для tree-грида. ''' _header = {"qti_package_id": ["~~id"], "name": [u'Наименование ЭОР'], "type": [u'Тип ЭОР'], "control_type": [u'Тип контроля'], "order": [u'Порядок прохождения'], "interval": [u'Интервал доступности ЭОР, в часах'], 'properties': [u'properties']} for column in _header: _header[column].append(toHexForXml(_header[column][0])) data = {"records":{"rec":[]}} course_cycle_id = main # ЭОР из темы eor_cur = course_cycle_qti_packageCursor(context) eor_cur.setRange('course_cycle_id', course_cycle_id) eor_cur.orderBy('qti_order') currentTable = {} for key in EOR_TYPE.keys(): currentTable[key] = relatedTableCursorImport(EOR_TYPE[key][1], EOR_TYPE[key][2])(context) for eor in eor_cur.iterate(): row = {} row[_header["qti_package_id"][1]] = eor.qti_package_id eor_type = EOR_TYPE[eor.eor_type] row[_header["order"][1]] = eor.qti_order name = u'' if currentTable[eor.eor_type].tryGet(eor.qti_package_id): name = getattr(currentTable[eor.eor_type], eor_type[3]) row[_header["name"][1]] = name row[_header["type"][1]] = eor_type[0] row[_header["control_type"][1]] = CONTROL_TYPE[eor.control_type] if eor_type[5] else u'' row[_header["interval"][1]] = eor.start_time_interval row[_header['properties'][1]] = {'event': { '@name': 'row_save_data', 'action': { '#sorted': [ {'main_context': 'current'}, {'datapanel': { '@type': 'current', '@tab': 'current', "element": [ {"@id": "courseCycleQtiPackageGrid", "add_context": eor.qti_package_id}]}}]}}} data["records"]["rec"].append(row) eor_cur.close() res = XMLJSONConverter.jsonToXml(json.dumps(data)) return JythonDTO(res, None) def gridMeta(context, main=None, add=None, filterinfo=None, session=None, elementId=None, sortColumnList=None): u'''Функция получения настроек для tree-грида. ''' _header = {"qti_package_id": ["~~id"], "name": [u'Наименование ЭОР'], "type": [u'Тип ЭОР'], "control_type": [u'Тип контроля'], "order": [u'Порядок прохождения'], "interval": [u'Интервал доступности ЭОР, в часах'], 'properties': [u'properties']} panelWidth = '100%' panelHeight = getGridHeight(session, numberOfGrids = 1, delta=35) course_cycle_id = main eor_cur = course_cycle_qti_packageCursor(context) eor_cur.setRange('course_cycle_id', course_cycle_id) totalCount = eor_cur.count() eor_cur.close() # Определяем список полей таблицы для отображения settings = {} settings["gridsettings"] = { # "labels": {'header': u'ЭОР по теме'}, "columns": {"col":[ {"@id":_header["order"][0], "@width":"50px", "@horAlign": 'CENTER', '@editor': "{editOn: has('touch') ? 'click' : 'dblclick', editor: NumberSpinner, editorArgs: {style: 'width: 50px', smallDelta: 1, constraints: {min: 1, max: " + str(totalCount) + "}, disableMouseWheel: true}}"}, {"@id":_header["name"][0], "@width":"400px", '@readonly': "true"}, {"@id":_header["type"][0], "@width":"200px", '@readonly': "true", "@horAlign": 'CENTER'}, {"@id":_header["control_type"][0], "@width":"100px", '@readonly': "true", "@horAlign": 'CENTER'}, {"@id":_header["interval"][0], "@width":"100px", "@horAlign": 'CENTER', '@editor': "{editOn: has('touch') ? 'click' : 'dblclick', editor: NumberSpinner, editorArgs: {style: 'width: 50px', smallDelta: 1, constraints: {min: 0, max: 960}, disableMouseWheel: true}}"}]}, "properties": { "@gridHeight": panelHeight, "@gridWidth": panelWidth, "@pagesize": "10", "@totalCount": totalCount}} # constraints: { min:9, max:1550, places:0 } res_set = XMLJSONConverter.jsonToXml(json.dumps(settings)) return JythonDTO(None, res_set) def gridToolBar(context, main=None, add=None, filterinfo=None, session=None, elementId=None): courseCycleId = main try: qtiRow = json.loads(session)['sessioncontext']['related']['gridContext']["currentRecordId"] except: qtiRow = None u"""Дизактивация кнопок. Для активации кнопок, необходимо, чтобы статус программы был 'Утвежден(-а)'""" delete_style = 'true' add_style = 'true' control_style = 'true' u"""Если программа утрвеждена, разрешить модификации циклов""" if courseCycleId: courseCycleCur = course_cycleCursor(context) courseCycleCur.get(courseCycleId) if courseCycleCur.status_id == 3: add_style = 'false' if qtiRow: delete_style = 'false' courseCycleCur.close() if courseCycleId and qtiRow: qtiPackageCur = course_cycle_qti_packageCursor(context) if qtiPackageCur.tryGet(courseCycleId, qtiRow): control_style = 'false' if EOR_TYPE[qtiPackageCur.eor_type][5] else 'true' qtiPackageCur.close() grid_toolbar = { 'gridtoolbar': { '#sorted': [ {'item': { '@text': u'Добавить', '@hint': u'Добавить ЭОР в тему', '@disable': add_style, 'action': { '@show_in': 'MODAL_WINDOW', '#sorted': [ {'main_context': 'current'}, {'modalwindow': { '@caption': u'Добавление ЭОР', '@height': '430', '@width': '480'}}, {'datapanel': { '@type': 'current', '@tab': 'current', 'element': { '@id': 'courseCycleQtiCard', 'add_context': qtiRow}}}]}}}, {'item': { '@text': u'Удалить', '@hint': u'Удалить ЭОР из темы', '@disable': delete_style, 'action': { '@show_in': 'MODAL_WINDOW', '#sorted': [ {'main_context': 'current'}, {'modalwindow': { '@caption': u'Удаление ЭОР', '@height': '145', '@width': '400'}}, {'datapanel': { '@type': 'current', '@tab': 'current', 'element': { '@id': 'courseCycleQtiDeleteCard', 'add_context': 'delete'}}}]}}}, {'item': { '@text': u'Тип контроля', '@hint': u'Изменить тип контроля', '@disable': control_style, 'action': { '@show_in': 'MODAL_WINDOW', '#sorted': [ {'main_context': 'current'}, {'modalwindow': { '@caption': u'Изменение типа контроля', '@height': '120', '@width': '340'}}, {'datapanel': { '@type': 'current', '@tab': 'current', 'element': { '@id': 'qtiControlTypeChangeCard', 'add_context': json.dumps({"cycle_id": courseCycleId, "qti_id": qtiRow})}}}]}}}]}} return XMLJSONConverter.jsonToXml(json.dumps(grid_toolbar)) def gridSaveData(context, main, add, filterinfo, session, elementId, editorData): u"""Сохранение отредактированных данных.""" data = json.loads(editorData)['savedata']['data'] qti_package_id = data['id'] eor_cur = course_cycle_qti_packageCursor(context) if eor_cur.tryGet(main, qti_package_id): order = eor_cur.qti_order new_order = int(data['col1']) eor_cur.setRange('course_cycle_id', main) eor_cur.setFilter('qti_order', "{}|{}".format(order, new_order)) for eor in eor_cur.iterate(): if eor.qti_package_id == qti_package_id: eor.qti_order = new_order eor_cur.start_time_interval = int(data['col5']) else: eor.qti_order = order eor.update() # print '{} - {}'.format(order, new_order) # if order <> new_order: # eor_cur.qti_order = new_order # eor_cur.update() # if order <> new_order: # eor_cur.clear() # eor_cur.setRange('course_cycle_id', main) # eor_cur.setRange('qti_order', new_order) # eor_cur.setFilter('qti_package_id', """!'{}'""".filter(qti_package_id)) # if eor_cur.tryFirst(): # eor_cur.qti_order = order # eor_cur.update # res = GridSaveResult(context.message(u"Данные обновлены")) res.setRefreshAfterSave(0); return res