# coding: utf-8 u''' Основной грид реестра тем по курсам. ''' from java.text import SimpleDateFormat import json from common.sysfunctions import toHexForXml, getGridHeight from edu._edu_orm import vw_course_cycleCursor, cycle_edu_baseCursor, course_cycleCursor, courseCursor from nci._nci_orm import person_edu_organizationCursor, education_formCursor, education_baseCursor, status_listCursor from ru.curs.celesta.showcase.utils import XMLJSONConverter from security.functions import userHasPermission from com.jayway.jsonpath import JsonPath from nci.functions.persons import getPersonIdBySid from java.sql import Timestamp from gridsettings.functions.gridSettings import toolbar_button_default, toolbar_button, filter_button, filter_reset_button, get_column_meta, get_column_data, get_column_header from gridsettings._gridsettings_orm import grid_fieldCursor, \ user_grid_fieldCursor try: from ru.curs.showcase.core.jython import JythonDTO except: from ru.curs.celesta.showcase import JythonDTO def gridData(context, main, add=None, filterinfo=None, session=None, elementId=None, sortColumnList=None, firstrecord=None, pagesize=None): sid = JsonPath.read(session, "$.sessioncontext.sid") course_cycle = vw_course_cycleCursor(context) status_list = status_listCursor(context) # edu_formCursor = education_formCursor(context) cycle_edu_base = cycle_edu_baseCursor(context) edu_base = education_baseCursor(context) grid_field = grid_fieldCursor(context) user_grid_field = user_grid_fieldCursor(context) session = json.loads(session) u"""ID выделенного курса""" # currentId = session["sessioncontext"]["related"]["gridContext"]["currentRecordId"] currentId = main course_cycle.setRange("course_id", currentId) if sortColumnList: sortName = toHexForXml(sortColumnList[0].id) sortType = unicode(sortColumnList[0].sorting).lower() else: sortName = None course_cycle.orderBy('cycle_order', 'note') if not userHasPermission(context, sid, "allEduOrgCourse"): # hasPermission = "false" person_org = person_edu_organizationCursor(context) person_org.setRange("person_id", getPersonIdBySid(context, sid)) if not person_org.count(): context.error(u"Обратитесь к администратору для приписывания к образовательной организации") edu_list = [] for person_org in person_org.iterate(): edu_list.append("'%s'" % person_org.edu_organization_id) course_cycle.setFilter("edu_organization_id", "|".join(edu_list)) else: # hasPermission = "true" course_cycle.setFilter('status_id','1|3|4|5|6') # if context.getData().get('courseCycleFilter',''): # filter_string = ext_filter(context.getData['courseCycleFilter'],course_cycle,context) # Заголовки _header = { 'uid': ['~~id', 'uid'], 'properties': [u'properties', 'properties'] } _header.update(get_column_header(grid_field,user_grid_field,elementId,sid)) for column in _header: _header[column].append(toHexForXml(_header[column][0])) if column != "edu_form" and column != "edu_base": if sortName == _header[column][-1]: course_cycle.orderBy("%s %s" % (column, sortType)) # course_cycle.limit(firstrecord - 1, pagesize) grid_data = {'records': {'rec': []}} # df = SimpleDateFormat("dd.MM.yyyy") for course_cycle in course_cycle.iterate(): u"""Получение формы и статуса обучения""" # edu_formCursor.get(course_cycle.education_form_id) status_list.get(course_cycle.status_id) u"""Название основы обучения""" edu_base_name = "" u"""Получение названия основы обучения""" cycle_edu_base.setRange("cycle_id",course_cycle.uid) for base in cycle_edu_base.iterate(): edu_base.get(base.edu_base_id) edu_base_name += edu_base.name + ", " edu_base_name = edu_base_name[:-2]#отсечение последней запятой и пробела add_info = {"base": edu_base_name} row = {} row[_header['uid'][2]] = course_cycle.uid get_column_data(_header, grid_field, user_grid_field, elementId, sid, course_cycle, row,**add_info) # if course_cycle.start_date: # row[_header['start_date'][1]] = df.format(course_cycle.start_date) # if course_cycle.end_date: # row[_header['end_date'][1]] = df.format(course_cycle.end_date) # row[_header['edu_form'][1]] = edu_formCursor.name # row[_header['edu_base'][1]] = edu_base_name # row[_header['clinic_base'][1]] = course_cycle.clinic_base # row[_header['budget_places'][1]] = int(course_cycle.budget_places) # row[_header['paid_places'][1]] = int(course_cycle.paid_places) # row[_header['outside'][1]] = u'Да' if course_cycle.outside else u'Нет' # row[_header['status_name'][1]] = status_list.name # row[_header['dot_and_eo'][1]] = u'Да' if course_cycle.dot_and_eo else u'Нет' #{"div": {"#text": "ddd", # #"@align": "center", # #"@title": "" # # } # #} # row[_header['note'][1]] = course_cycle.note # row[_header['properties'][2]] = { # 'event': { # '@name': 'row_single_click', # 'action': { # '#sorted': [ # {'main_context': 'current'}]}}} if course_cycle.dot_and_eo: row[_header['properties'][2]] = {'event': { '@name': 'row_single_click', 'action': { '#sorted': [ {'main_context': 'current'}, {'datapanel': { '@type': 'current', '@tab': 'current', "element": [ {"@id": "courseCycleQtiPackageGrid", "add_context": ''}]}}]}}} grid_data['records']['rec'].append(row) return JythonDTO(XMLJSONConverter.jsonToXml(json.dumps(grid_data)), None) def gridMeta(context, main=None, add=None, filterinfo=None, session=None, elementId=None): session = json.loads(session) sid = session["sessioncontext"]["sid"] course_cycle = vw_course_cycleCursor(context) currentId = main course_cycle.setRange("course_id", currentId) if not userHasPermission(context, sid, "allEduOrgCourse"): person_org = person_edu_organizationCursor(context) person_org.setRange("person_id", getPersonIdBySid(context, sid)) if not person_org.count(): context.error(u"Обратитесь к администратору для приписывания к образовательной организации") edu_list = [] for person_org in person_org.iterate(): edu_list.append("'%s'" % person_org.edu_organization_id) course_cycle.setFilter("edu_organization_id", "|".join(edu_list)) else: course_cycle.setFilter('status_id','1|3|4|5|6') filter_string = '' if context.getData().get('courseCycleFilter',''): filter_string = ext_filter(context.getData['courseCycleFilter'],course_cycle,context) grid_settings = {} grid_settings['gridsettings'] = { # 'labels': { # 'header': u'Темы '+filter_string}, 'columns': { 'col': get_column_meta(context,elementId,sid)}, 'properties': { '@pagesize': 10, '@gridWidth': '100%', '@gridHeight': getGridHeight(session, numberOfGrids=1, gridHeaderHeight=35), '@totalCount': course_cycle.count(), '@profile': 'default_excel.properties'}} return JythonDTO(None, XMLJSONConverter.jsonToXml(json.dumps(grid_settings))) def gridToolBar(context, main=None, add=None, filterinfo=None, session=None, elementId=None): session_json = json.loads(session)['sessioncontext'] sid = session_json['sid'] grid_context = session_json['related']['gridContext'] string_bool = lambda x: x and 'true' or 'false' course_cycle = course_cycleCursor(context) course = courseCursor(context) currentCourseId = main course.get(currentCourseId) u"""Выбор записи в гриде""" try: current_id = grid_context['currentRecordId'] except: current_id = None recordChosen = current_id is not None u"""Дизактивация кнопок. Для активации кнопок, необходимо, чтобы статус программы был 'Утвежден(-а)'""" edit_style = 'true' delete_style = 'true' change_style = 'true' add_style = 'true' u"""Если программа утрвеждена, разрешить модификации циклов""" if course.status_id == 3: add_style = 'false' # добавление курса if recordChosen and course_cycle.tryGet(current_id): if userHasPermission(context, session_json['sid'], 'allEduOrgCourse'): if course_cycle.status_id == 4:#если тема не формируется и не на доработке, то методист может редактировать и менять статус edit_style = 'false' change_style = 'false' elif course_cycle.status_id == 3 or course_cycle.status_id == 6: change_style = 'false' if userHasPermission(context,session_json['sid'], 'cycleDelete'): delete_style = 'false' edit_style = 'false' change_style = 'false' else: if course_cycle.status_id == 0:#тема формируется, обр. орг. может редактировать, удалять и менять статус edit_style = 'false' delete_style = 'false' change_style = 'false' elif course_cycle.status_id == 1:#тема на доработке, обр. орг. может редактировать и менять статус edit_style = 'false' change_style = 'false' #В стальных случаях кнопки заблокированы grid_toolbar = { 'gridtoolbar': { '#sorted': [ toolbar_button(context, sid, elementId), toolbar_button_default(context, sid, elementId), filter_button("courseCycleFilter",270,630), filter_reset_button("courseCycleGrid","courseCycleFilter"), {'item': { '@text': u'Добавить', '@hint': u'Добавить тему', '@disable': add_style, 'action': { '@show_in': 'MODAL_WINDOW', '#sorted': [ {'main_context': 'current'}, {'modalwindow': { '@caption': u'Добавить тему', '@height': '780', '@width': '660'}}, {'datapanel': { '@type': 'current', '@tab': 'current', 'element': { '@id': 'courseCycleCard', 'add_context': 'add' }}}]}}}, {'item': { '@text': u'Редактировать', '@hint': u'Редактировать тему', '@disable': edit_style, 'action': { '@show_in': 'MODAL_WINDOW', '#sorted': [ {'main_context': 'current'}, {'modalwindow': { '@caption': u'Редактировать тему', '@height': '780', '@width': '660'}}, {'datapanel': { '@type': 'current', '@tab': 'current', 'element': { '@id': 'courseCycleCard', 'add_context': 'edit'}}}]}}}, {'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': 'courseCycleDeleteCard', 'add_context': ''}}}]}}}, {'item': { '@text': u'Изменить статус', '@hint': u'Изменить статус', '@disable': change_style, 'action': { '@show_in': 'MODAL_WINDOW', '#sorted': [ {'main_context': 'current'}, {'modalwindow': { '@caption': u'Изменение статуса', '@height': '200', '@width': '500'}}, {'datapanel': { '@type': 'current', '@tab': 'current', 'element': { '@id': 'courseCycleChangeStatusCard', 'add_context': ''}}}]}}}]}} return XMLJSONConverter.jsonToXml(json.dumps(grid_toolbar)) def ext_filter(session,course_cycle, context): sdf = SimpleDateFormat('dd.MM.yyyy') status_list = status_listCursor(context) filter_string = u"Фильтр: " filter_list = [] whereclause = '1 = 1' def str2bool(str): if str == 'false': return False elif str == 'true': return True else: return False if True:#'formData' in session['related']['xformsContext']: data = session['schema']['record'] status = data["status"] fromDate = data["fromDate"] toDate = data["toDate"] outside = data["outside"] if status != '-': status_list.get(int(status)) filter_list.append(u'статус: %s'%(status_list.name)) course_cycle.setRange("status_id",int(status)) if fromDate != '': fromDate = Timestamp.valueOf(u'%s 00:00:00.0' % fromDate) if toDate != '': toDate = Timestamp.valueOf(u'%s 23:59:59.0' % toDate) if fromDate != '' and toDate != '': filter_list.append(u"дата начала с %s по %s"%(sdf.format(fromDate),sdf.format(toDate))) course_cycle.setRange('start_date',fromDate,toDate) elif fromDate != '' and toDate == '': filter_list.append(u"дата начала с %s"%sdf.format(fromDate)) whereclause += " and start_date >= '%s'"%(fromDate) elif fromDate == '' and toDate != '': filter_list.append(u"дата начала по %s"%sdf.format(toDate)) whereclause += " and start_date <= '%s'"%(toDate) if outside != '-': filter_list.append(u"выездной: %s"%(u'Да' if str2bool(outside) else u'Нет')) course_cycle.setRange('outside',str2bool(outside)) course_cycle.setComplexFilter(whereclause) filter_string = '' + filter_string + ','.join(filter_list) +'' return filter_string