Exemplo n.º 1
0
def getSubjectByLogin(context, login):

    subject = subjectsCursor(context)
    logins = loginsCursor(context)
    logins.get(login)
    subject.get(logins.subjectId)
    logins.close()
    return subject
Exemplo n.º 2
0
def cardDelete(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None):
    currentRecordId = json.loads(session)['sessioncontext']['related']['gridContext']['currentRecordId']
    settings=Settings()
    user = loginsCursor(context)
    user.get(currentRecordId)
    if settings.loginIsSubject():
        subject = subjectsCursor(context)
        subject.get(user.subjectId)
        user.delete()
        subject.delete()
    else:
        user.delete()
Exemplo n.º 3
0
def loginCheck(context, login):
    """Проверяет уникальность логина.

    Параметры:
        - context (CallContext) - контекст Celesta
        - login (string) - логин

    Возвращает:
        (bool) True, если login уникален, иначе - False
    """

    logins = loginsCursor(context)
    exist = not logins.tryGet(login)
    logins.close()
    return exist
Exemplo n.º 4
0
def cardDelete(context,
               main=None,
               add=None,
               filterinfo=None,
               session=None,
               elementId=None,
               xformsdata=None):
    currId = json.loads(
        session)['sessioncontext']['related']['gridContext']["currentRecordId"]
    subject = subjectsCursor(context)
    login = loginsCursor(context)
    subject.get(currId)
    login.setRange('subjectId', subject.sid)
    for login in login.iterate():
        login.subjectId = None
        login.update()
    subject.delete()
Exemplo n.º 5
0
def changePassword(context, sid, password=None, hashalgorithm=None, salt=None):
    """Функция для смены пароля пользователя"""
    settings = Settings()
    logins = loginsCursor(context)
    logins.get(sid)
    if not hashalgorithm:
        hashalgorithm = settings.getParam("hashalgorithm") or "SHA-256"
    if not password:
        password = id_generator(8)

    if not salt:
        salt = generateSalt()
    localsecuritysalt = settings.getParam("localsecuritysalt") or ""

    hash_ = genHash("".join([password, salt, localsecuritysalt]),
                    hashalgorithm)
    logins.password = "******".join(
        [hashalgorithm.lower().replace("-", ""), salt, hash_])
    logins.update()
    logins.close()
Exemplo n.º 6
0
def cardDataSave(context,
                 main=None,
                 add=None,
                 filterinfo=None,
                 session=None,
                 elementId=None,
                 xformsdata=None):
    u'''Функция сохранения карточки редактирования содержимого справочника ролей. '''
    rolesUsers = UserrolesCursor(context)
    logins = loginsCursor(context)
    currId = json.loads(
        session)['sessioncontext']['related']['gridContext']['currentRecordId']
    settings = Settings()
    if settings.isUseAuthServer() and settings.loginIsSubject():
        currId = json.loads(currId)[0]
    logins.get(currId)
    rolesUsers.setRange("userid", logins.subjectId)
    rolesUsers.deleteAll()
    if json.loads(xformsdata)["schema"]["roles"] <> '':
        content = json.loads(xformsdata)["schema"]["roles"]["role"]
        content = content if isinstance(content, list) else [content]
        rolesUsersOld = UserrolesCursor(context)
        for role in content:
            rolesUsers.roleid = role["@id"]
            rolesUsers.userid = logins.subjectId
            if rolesUsers.canInsert() and rolesUsers.canModify():
                if not rolesUsers.tryInsert():
                    rolesUsersOld.get(logins.subjectId, role["@id"])
                    rolesUsers.recversion = rolesUsersOld.recversion
                    rolesUsers.update()
            elif rolesUsers.canInsert():
                rolesUsers.tryInsert()
            elif rolesUsers.canModify():
                rolesUsersOld.get(logins.subjectId, role["@id"])
                rolesUsers.recversion = rolesUsersOld.recversion
                rolesUsers.update()
            else:
                raise CelestaException(
                    u"Недостаточно прав для данной операции!")
Exemplo n.º 7
0
def getLoginsBySubject(context, subject_id):
    """Получает список логинов по subject id"""
    logins = loginsCursor(context)
    logins.setRange("subjectId", subject_id)
    return logins
Exemplo n.º 8
0
def cardData(context,
             main=None,
             add=None,
             filterinfo=None,
             session=None,
             elementId=None):
    u'''Функция данных для карточки редактирования содержимого таблицы ролей. '''

    settings = Settings()

    # ru.curs.showcase.security.SecurityParamsFactory.getAuthServerUrl()
    rolesUsers = UserrolesCursor(context)
    roles = RolesCursor(context)
    logins = loginsCursor(context)

    currId = json.loads(
        session)['sessioncontext']['related']['gridContext']['currentRecordId']
    if settings.isUseAuthServer() and settings.loginIsSubject():
        # В данном режиме в currId передаются имя пользователя и сид.
        # Сделано так, чтобы не лопатить огромный xml, приходящий из меллофона
        currId = json.loads(currId)
        if not logins.tryGet(currId[0]):
            # in "tt" regime we copy record from mellophone(AuthServer) to logins if it doesn't appear in logins.
            subjects = subjectsCursor(context)
            subjects.name = currId[0]
            subjects.sid = currId[1]
            subjects.insert()
            logins.userName = currId[0]
            logins.subjectId = currId[1]
            logins.password = ""
            logins.insert()
        rolesUsers.setRange("userid", logins.subjectId)
    elif settings.loginIsSubject():
        logins.get(currId)
        rolesUsers.setRange(
            "userid", logins.subjectId)  # роли всегда привязываются к сидам
    else:
        rolesUsers.setRange("userid", currId)
    content = []
    if rolesUsers.tryFindSet():
        while True:
            if roles.tryGet(rolesUsers.roleid):
                content.append({
                    "@id":
                    roles.id,
                    "@description":
                    '%s - %s' %
                    (roles.id, roles.description if roles.description else '')
                })
            if not rolesUsers.nextInSet():
                break

    if content == []:
        xformsdata = {"schema": {"roles": ""}}
    else:
        xformsdata = {"schema": {"roles": {"role": content}}}
        # сортировка
        xformsdata["schema"]["roles"]["role"].sort(
            key=lambda x: (x["@id"].lower()))

    # raise Exception(xformsdata)

    # print xformsdata
    xformssettings = {
        "properties": {
            "event": {
                "@name": "single_click",
                "@linkId": "1",
                "action": {
                    "#sorted": [{
                        "main_context": "current"
                    }, {
                        "datapanel": {
                            "@type": "current",
                            "@tab": "current",
                            "element": {
                                "@id": "usersGrid",
                                "add_context": ""
                            }
                        }
                    }]
                }
            }
        }
    }

    return JythonDTO(XMLJSONConverter.jsonToXml(json.dumps(xformsdata)),
                     XMLJSONConverter.jsonToXml(json.dumps(xformssettings)))
Exemplo n.º 9
0
def cardData(context,
             main=None,
             add=None,
             filterinfo=None,
             session=None,
             elementId=None):

    settings = Settings()
    session = json.loads(session)['sessioncontext']
    logins = loginsCursor(context)
    subjects = subjectsCursor(context)
    isEmployees = settings.isEmployees(
    )  # описана ли таблица сотрудников в настройках?
    if isEmployees:
        # Если да, получаем наименование таблицы, импортируем курсор, создаём экземпляр курсора сотрудников
        employeesGrain = settings.getEmployeesParam("employeesGrain")
        employeesTable = settings.getEmployeesParam("employeesTable")
        employeesId = settings.getEmployeesParam(
            "employeesId")  # название поля с первичным ключом
        employeesName = settings.getEmployeesParam(
            "employeesName")  # название поля с именем
        employeesCursor = tableCursorImport(employeesGrain, employeesTable)
        employees = employeesCursor(context)
    subjectId = ""
    subjectName = ""
    empId = ""
    empName = ""
    if 'currentRecordId' in session['related']['gridContext']:
        currId = session['related']['gridContext']['currentRecordId']
        currIdSid = ""
        if settings.loginIsSubject() and settings.isUseAuthServer():
            # в данном режиме Id записи грида - sid+username. делано, чтобы достать сид в карточке,
            # не перелопачивая весь xml пользователй.
            currIdSid = json.loads(currId)[1]
            currId = json.loads(currId)[0]
        if logins.tryGet(currId) and add <> 'add':
            if subjects.tryGet(logins.subjectId):
                subjectId = subjects.sid
                subjectName = subjects.name
                if isEmployees:
                    if employees.tryGet(subjects.employeeId):
                        empId = getattr(employees, employeesId)
                        empName = getattr(employees, employeesName)

    if add == 'add':
        xformsdata = {
            "schema": {
                "@xmlns": "",
                "user": {
                    "@sid": "",
                    "@password": id_generator(),
                    "@userName": "",
                    "@subjectId": "",
                    "@subjectName": "",
                    "@employeeId": "",
                    "@employeeName": "",
                    "@isAuthServer":
                    unicode(settings.isUseAuthServer()).lower(),
                    "@loginIsSubject":
                    unicode(settings.loginIsSubject()).lower(),
                    "@add": add,
                    "@isEmployees": unicode(isEmployees).lower(),
                    "@key": unichr(
                        9911
                    )  # символ ключа, например. Уже не нужен, в иконку вставляется картинка.
                }
            }
        }
        if settings.loginIsSubject():
            # если логины тождественны субъектам, при открытии карточки генерится sid
            sid = getNextNoOfSeries(context, 'subjects') + id_generator(
            )  # последнее слагаемое сделано, чтобы sid
            # нельзя было просто подобрать.
            xformsdata["schema"]["user"]["@subjectId"] = sid
            xformsdata["schema"]["user"]["@sid"] = sid
    elif add == 'edit' and settings.isUseAuthServer():
        # Редактирование в случае получения пользователей из mellophone
        xformsdata = {
            "schema": {
                "user": {
                    "@sid": currIdSid,
                    "@password": "",
                    "@userName": currId,
                    "@subjectId": subjectId,
                    "@subjectName": subjectName,
                    "@employeeId": empId,
                    "@employeeName": empName,
                    "@isAuthServer":
                    unicode(settings.isUseAuthServer()).lower(),
                    "@loginIsSubject":
                    unicode(settings.loginIsSubject()).lower(),
                    "@add": "",
                    "@isEmployees": unicode(isEmployees).lower(),
                    "@key": unichr(9911)
                }
            }
        }
    elif add == 'edit':
        # Редактирование в случае получения пользователей из таблицы logins
        logins.get(currId)
        xformsdata = {
            "schema": {
                "user": {
                    "@sid": logins.subjectId,
                    "@password": "",
                    "@userName": logins.userName,
                    "@subjectId": subjectId,
                    "@subjectName": subjectName,
                    "@employeeId": empId,
                    "@employeeName": empName,
                    "@isAuthServer":
                    unicode(settings.isUseAuthServer()).lower(),
                    "@loginIsSubject":
                    unicode(settings.loginIsSubject()).lower(),
                    "@add": add,
                    "@isEmployees": unicode(isEmployees).lower()
                }
            }
        }

    xformssettings = {
        "properties": {
            "event": {
                "@name": "single_click",
                "@linkId": "1",
                "action": {
                    "#sorted": [{
                        "main_context": "current"
                    }, {
                        "datapanel": {
                            "@type": "current",
                            "@tab": "current",
                            "element": {
                                "@id": "usersGrid",
                                "add_context": ""
                            }
                        }
                    }]
                }
            }
        }
    }

    return JythonDTO(XMLJSONConverter.jsonToXml(json.dumps(xformsdata)),
                     XMLJSONConverter.jsonToXml(json.dumps(xformssettings)))
Exemplo n.º 10
0
def cardDataSave(context,
                 main=None,
                 add=None,
                 filterinfo=None,
                 session=None,
                 elementId=None,
                 xformsdata=None):
    u'''Функция сохранения карточки редактирования содержимого справочника ролей. '''
    settings = Settings()

    logins = loginsCursor(context)
    subject = subjectsCursor(context)
    content = json.loads(xformsdata)["schema"]["user"]
    if not settings.isUseAuthServer():
        # пользователи берутся из logins
        if add == 'edit' and content["@password"] == '':
            # если пароль при редактировании не заполнен, сохраняем в курсоре старый пароль из базы
            loginsOld = loginsCursor(context)
            currId = json.loads(session)['sessioncontext']['related'][
                'gridContext']['currentRecordId']
            loginsOld.get(currId)
            logins.password = loginsOld.password
        else:
            # иначе зашифровываем пароль из карточки
            pass_hash = hashlib.sha1()  # Объект типа hash
            pass_hash.update(content["@password"]
                             )  # Записываем в него текущий пароль из карточки
            logins.password = pass_hash.hexdigest(
            )  # Выполняем hash функцию, записываем результат в курсор.
        logins.userName = content["@userName"]

        if content[
                "@subjectId"] == "":  # если subjectId из карточки пуст, записываем в базу null
            logins.subjectId = None
        else:
            logins.subjectId = content["@subjectId"]

        if settings.loginIsSubject():
            # если loginIsSubject, cохраняем сначала subject, потом login
            subject.sid = content["@subjectId"]
            subject.name = content["@userName"]

            if content[
                    "@employeeId"] == '':  # если employeeId из карточки пуст (сотрудник не выбран), записываем в базу null
                subject.employeeId = None
            else:
                subject.employeeId = content["@employeeId"]

            # сохранение subject
            if add == 'add' and subject.canInsert() and subject.canModify():
                if not subject.tryInsert():
                    subjectOld = subjectsCursor(context)
                    subjectOld.get(content["@subjectId"])
                    subject.recversion = subjectOld.recversion
                    subject.update()
            elif add == 'add' and logins.canInsert():
                subject.insert()
            elif add == 'edit' and subject.canModify():
                subjectOld = subjectsCursor(context)
                subjectOld.get(content["@subjectId"])
                subject.recversion = subjectOld.recversion
                subject.update()
            else:
                raise CelestaException(
                    u"Недостаточно прав для данной операции!")

        # сохранение login
        if add == 'add' and logins.canInsert() and logins.canModify():
            if not logins.tryInsert():
                logins.update()
        elif add == 'add' and logins.canInsert():
            logins.insert()
        elif add == 'edit' and logins.canModify():
            loginsOld = loginsCursor(context)
            loginsOld.get(content["@userName"])
            logins.recversion = loginsOld.recversion
            logins.update()
        else:
            raise CelestaException(u"Недостаточно прав для данной операции!")
    else:
        # пользователи берутся из mellophone
        if logins.tryGet(content["@userName"]):
            # если запись с данным userName уже есть в таблице logins (Подробнее см. ниже)
            if settings.loginIsSubject():
                # если логины и субъекты тождественны
                if not subject.tryGet(logins.subjectId):
                    subject.sid = content["@sid"]
                if content["@employeeId"] == '':
                    subject.employeeId = None
                else:
                    subject.employeeId = content["@employeeId"]
                subject.name = content["@userName"]
                logins.subjectId = subject.sid

                # сохранение subject. Запись в logins уже есть
                if subject.canInsert() and subject.canModify():
                    if not subject.tryInsert():
                        subjectOld = subjectsCursor(context)
                        subjectOld.get(content["@subjectId"])
                        subject.recversion = subjectOld.recversion
                        subject.update()
                elif subject.canModify():
                    subjectOld = subjectsCursor(context)
                    subjectOld.get(content["@subjectId"])
                    subject.recversion = subjectOld.recversion
                    subject.update()
                else:
                    raise CelestaException(
                        u"Недостаточно прав для данной операции!")
            else:
                # Если субъекты тождественны сотрудникам, записываем subjectId в logins.subjectId
                # то есть, просто привязываем logins к subjects
                if content["@subjectId"] == "":
                    logins.subjectId = None
                else:
                    logins.subjectId = content["@subjectId"]

            # обновление logins
            if logins.canModify():
                logins.update()
            else:
                raise CelestaException(
                    u"Недостаточно прав для данной операции!")
        else:
            # пользователя нет в logins
            if settings.loginIsSubject():
                # если loginIsSubject, cохраняем сначала subject, потом login
                if content["@employeeId"] == '':
                    logins.subjectId = None
                else:
                    subject.employeeId = content["@employeeId"]
                    subject.sid = content["@sid"]
                    subject.name = content["@userName"]
                    logins.subjectId = subject.sid
                    if subject.canInsert() and subject.canModify():
                        if not subject.tryInsert():
                            subjectOld = subjectsCursor(context)
                            subjectOld.get(content["@subjectId"])
                            subject.recversion = subjectOld.recversion
                            subject.update()
                    elif subject.canInsert():
                        subject.insert()
                    else:
                        raise CelestaException(
                            u"Недостаточно прав для данной операции!")
            else:
                if content["@subjectId"] == "":
                    logins.subjectId = None
                else:
                    logins.subjectId = content["@subjectId"]
            # В случае, когда пользователи берутся из mellophone, и к пользователю делается привязка,
            # (<employees> к logins-subjects или <employees>-subjects к logins)
            # делается запись в logins
            logins.userName = content["@userName"]
            logins.password = ""
            if logins.canInsert():
                logins.insert()
            else:
                raise CelestaException(
                    u"Недостаточно прав для данной операции!")
Exemplo n.º 11
0
def gridData(context,
             main=None,
             add=None,
             filterinfo=None,
             session=None,
             elementId=None,
             sortColumnList=None,
             firstrecord=None,
             pagesize=None):
    u'''Функция получения данных для грида списка пользователей. '''
    session = json.loads(session)["sessioncontext"]
    settings = Settings()
    logins = loginsCursor(context)
    if sortColumnList:
        sortName = toHexForXml(sortColumnList[0].id)
        sortType = unicode(sortColumnList[0].sorting).lower()
    else:
        sortName = None
    # Определяем переменную для JSON данных
    data = {"records": {"rec": []}}
    _header = {
        "id": ["~~id"],
        "sid": [u"SID"],
        "userName": [u"Имя пользователя"],
        "subject": [u"Субъект"],
        "employee": [u"Сотрудник"],
        "properties": [u"properties"]
    }
    event = {
        "event": {
            "@name": "row_single_click",
            "action": {
                "#sorted": [{
                    "main_context": 'current'
                }, {
                    "datapanel": {
                        "@type": "current",
                        "@tab": "current"
                    }
                }]
            }
        }
    }
    for column in _header:
        _header[column].append(toHexForXml(_header[column][0]))

    isEmployees = settings.isEmployees()

    if isEmployees:
        employeesGrain = settings.getEmployeesParam("employeesGrain")
        employeesTable = settings.getEmployeesParam("employeesTable")
        employeesName = settings.getEmployeesParam(
            "employeesName")  # название поля с именем
        employeesCursor = tableCursorImport(employeesGrain, employeesTable)
        employees = employeesCursor(context)

    if settings.isUseAuthServer():
        sessionId = session[
            "sessionid"]  # получаем из контекста сессии Id сессии
        server = SecurityParamsFactory.getAuthServerUrl(
        )  # получаем url mellophone
        logins_xml = func.getUsersFromAuthServer(
            server, sessionId)  # получаем xml с пользователями

    if settings.isUseAuthServer() and settings.loginIsSubject():
        # грид состоит из колонок sid, имя пользователя и сотрудник
        subjects = subjectsCursor(context)
        for i, user in enumerate(logins_xml.getElementsByTagName("user")):
            if i < firstrecord - 1:
                continue  # пропускаем элементы с 1 по firstrecord
            loginsDict = {}
            loginsDict[_header["id"][1]] = json.dumps(
                [user.getAttribute("login"),
                 user.getAttribute("SID")])
            loginsDict[_header["sid"][1]] = user.getAttribute("SID")
            loginsDict[_header["userName"][1]] = user.getAttribute("login")
            if isEmployees:
                # если таблица сотрудников существует (прописана в настройках)
                # добавляем в грид сотрудника колонку Сотрудник.
                if logins.tryGet(user.getAttribute("login")) and \
                        subjects.tryGet(logins.subjectId) and\
                        employees.tryGet(subjects.employeeId):
                    loginsDict[_header["employee"][1]] = getattr(
                        employees, employeesName)
                else:
                    loginsDict[_header["employee"][1]] = ''
            loginsDict['properties'] = event
            data["records"]["rec"].append(loginsDict)
            if i >= firstrecord + pagesize:
                break  # прерываем цикл после достижения записи № firstrecord + pagesize
    elif settings.isUseAuthServer():
        # грид состоит из колонок sid, имя пользователя и субъект
        subjects = subjectsCursor(context)
        for i, user in enumerate(logins_xml.getElementsByTagName("user")):
            if i < firstrecord - 1:
                continue  # пропускаем элементы с 1 по firstrecord

            loginsDict = {}
            loginsDict[_header["id"][1]] = user.getAttribute("login")
            loginsDict[_header["sid"][1]] = user.getAttribute("SID")
            loginsDict[_header["userName"][1]] = user.getAttribute("login")
            if logins.tryGet(user.getAttribute("login")) and subjects.tryGet(
                    logins.subjectId):
                loginsDict[_header["subject"][1]] = subjects.name
            else:
                loginsDict[_header["subject"][1]] = ''
            loginsDict['properties'] = event

            data["records"]["rec"].append(loginsDict)
            if i >= firstrecord + pagesize:
                break  # прерываем цикл после достижения записи № firstrecord + pagesize

    elif not settings.isUseAuthServer() and not settings.loginIsSubject():
        # грид состоит из колонок имя пользователя и субъект
        subjects = subjectsCursor(context)

        logins.limit(firstrecord - 1, pagesize)

        for logins in logins.iterate():
            loginsDict = {}
            loginsDict[_header["id"][1]] = logins.userName
            loginsDict[_header["userName"][1]] = logins.userName

            if subjects.tryGet(logins.subjectId):
                loginsDict[_header["subject"][1]] = subjects.name
            else:
                loginsDict[_header["subject"][1]] = ""

            loginsDict['properties'] = event

            data["records"]["rec"].append(loginsDict)
    else:
        # грид состоит из колонки имя пользователя
        subjects = subjectsCursor(context)
        logins.limit(firstrecord - 1, pagesize)
        for logins in logins.iterate():
            loginsDict = {}
            loginsDict[_header["id"][1]] = logins.userName
            loginsDict[_header["userName"][1]] = logins.userName
            if isEmployees and subjects.tryGet(
                    logins.subjectId) and employees.tryGet(
                        subjects.employeeId):
                loginsDict[_header["employee"][1]] = getattr(
                    employees, employeesName)
            else:
                loginsDict[_header["employee"][1]] = ""

            loginsDict['properties'] = event
            data["records"]["rec"].append(loginsDict)

    # сортировка
    if sortColumnList:
        data["records"]["rec"].sort(key=lambda x:
                                    (x[unicode(sortName)].lower()),
                                    reverse=(sortType == 'desc'))
    res = XMLJSONConverter.jsonToXml(json.dumps(data))
    return JythonDTO(res, None)
Exemplo n.º 12
0
def gridMeta(context,
             main=None,
             add=None,
             filterinfo=None,
             session=None,
             elementId=None):
    u'''Функция получения настроек грида. '''
    settings = Settings()

    if settings.isUseAuthServer():
        server = SecurityParamsFactory.getAuthServerUrl()
        sessionId = json.loads(session)["sessioncontext"]["sessionid"]
        logins_xml = func.getUsersFromAuthServer(server, sessionId)
        totalcount = len(logins_xml.getElementsByTagName("user"))
    else:
        logins = loginsCursor(context)
        # Вычисляем количества записей в таблице
        totalcount = logins.count()
    # Заголовок таблицы
    _header = {
        "sid": [u"SID"],
        "userName": [u"Имя пользователя"],
        "subject": [u"Субъект"],
        "employee": [u"Сотрудник"]
    }

    gridSettings = {}
    if settings.loginIsSubject():
        number = 1
    else:
        number = 2
    gridSettings["gridsettings"] = {
        "columns": {
            "col": []
        },
        "properties": {
            "@pagesize": "50",
            "@gridWidth": "100%",
            "@gridHeight": getGridHeight(session, number, delta=40),
            "@totalCount": totalcount
        },
        "labels": {
            "header": u"Пользователи"
        },
    }
    # добавляем поля для отображения в gridsettings
    if settings.isUseAuthServer():
        gridSettings["gridsettings"]["columns"]["col"].append({
            "@id":
            _header["sid"][0],
            "@width":
            "320px"
        })
    gridSettings["gridsettings"]["columns"]["col"].append({
        "@id":
        _header["userName"][0],
        "@width":
        "320px"
    })
    if settings.loginIsSubject() and settings.isEmployees():
        gridSettings["gridsettings"]["columns"]["col"].append({
            "@id":
            _header["employee"][0],
            "@width":
            "640px"
        })
    elif not settings.loginIsSubject():
        gridSettings["gridsettings"]["columns"]["col"].append({
            "@id":
            _header["subject"][0],
            "@width":
            "640px"
        })

    # Добавляем поля для отображения в gridsettings
    res = XMLJSONConverter.jsonToXml(json.dumps(gridSettings))
    return JythonDTO(None, res)