Exemple #1
0
def gridToolBar(context,
                main=None,
                add=None,
                filterinfo=None,
                session=None,
                elementId=None):
    u'''Toolbar для грида. '''

    settings = Settings()

    if 'currentRecordId' not in json.loads(
            session)['sessioncontext']['related']['gridContext']:
        style = "true"
    else:
        style = "false"

    # raise Exception(session)

    data = {"gridtoolbar": {"item": []}}
    if not settings.isEmployees():
        data["gridtoolbar"]["item"].append({
            "@img": 'gridToolBar/addDirectory.png',
            "@text": "Добавить",
            "@hint": "Добавить субъект",
            "@disable": "false",
            "action": {
                "@show_in":
                "MODAL_WINDOW",
                "#sorted": [{
                    "main_context": "current"
                }, {
                    "modalwindow": {
                        "@caption": "Добавление субъекта",
                        "@height": "300",
                        "@width": "450"
                    }
                }, {
                    "datapanel": {
                        "@type": "current",
                        "@tab": "current",
                        "element": {
                            "@id": "subjectsXform",
                            "add_context": "add"
                        }
                    }
                }]
            }
        })
        data["gridtoolbar"]["item"].append({
            "@img": 'gridToolBar/editDocument.png',
            "@text": "Редактировать",
            "@hint": "Редактировать субъект",
            "@disable": style,
            "action": {
                "@show_in":
                "MODAL_WINDOW",
                "#sorted": [{
                    "main_context": "current"
                }, {
                    "modalwindow": {
                        "@caption": "Редактирование субъекта",
                        "@height": "300",
                        "@width": "450"
                    }
                }, {
                    "datapanel": {
                        "@type": "current",
                        "@tab": "current",
                        "element": {
                            "@id": "subjectsXform",
                            "add_context": "edit"
                        }
                    }
                }]
            }
        })
        data["gridtoolbar"]["item"].append({
            "@img": 'gridToolBar/deleteDocument.png',
            "@text": "Удалить",
            "@hint": "Удалить субъект",
            "@disable": style,
            "action": {
                "@show_in":
                "MODAL_WINDOW",
                "#sorted": [{
                    "main_context": "current"
                }, {
                    "modalwindow": {
                        "@caption": "Удаление субъекта",
                        "@height": "150",
                        "@width": "450"
                    }
                }, {
                    "datapanel": {
                        "@type": "current",
                        "@tab": "current",
                        "element": {
                            "@id": "subjectsXformDelete",
                            "add_context": "delete"
                        }
                    }
                }]
            }
        })
    data["gridtoolbar"]["item"].append({
        "@img": 'gridToolBar/addDirectory.png',
        "@text": "Добавить роли",
        "@hint": "Добавить роли",
        "@disable": style,
        "action": {
            "@show_in":
            "MODAL_WINDOW",
            "#sorted": [{
                "main_context": "current"
            }, {
                "modalwindow": {
                    "@caption": "Добавление ролей",
                    "@height": "350",
                    "@width": "500"
                }
            }, {
                "datapanel": {
                    "@type": "current",
                    "@tab": "current",
                    "element": {
                        "@id": "subjectsRolesXform",
                        "add_context": ""
                    }
                }
            }]
        }
    })
    return XMLJSONConverter.jsonToXml(json.dumps(data))
Exemple #2
0
from common.sysfunctions import tableCursorImport
from security.functions import Settings
from security.navigator import authentificationNavigator
from security.securityInit import securityInit
from security.setForeignKeys import setForeignKeys as setConstraint
from security.xform.users import employeesSubjectsPostInsert, employeesSubjectsPostUpdate, employeesSubjectsPreDelete

isInitContext = True
try:
    import initcontext
except ImportError:
    isInitContext = False

if isInitContext:
    settings = Settings()
    if not settings.loginIsSubject() and settings.isEmployees():
        # Если роли привязываются к сотруднику и таблица сотрудников настроена (нужные настройки есть в grainSettings.xml),
        # привязываем к ней триггеры.
        context = initcontext()
        employeesGrain = settings.getEmployeesParam("employeesGrain")
        employeesTable = settings.getEmployeesParam("employeesTable")
        employeesCursor = tableCursorImport(employeesGrain, employeesTable)

        employeesCursor.onPostInsert(context.getCelesta(), employeesSubjectsPostInsert)
        employeesCursor.onPostUpdate(context.getCelesta(), employeesSubjectsPostUpdate)
        employeesCursor.onPreDelete(context.getCelesta(), employeesSubjectsPreDelete)

    if not settings.isSystemInitialised():
        context = initcontext()
        # функция устанавливает внешний ключ в таблицу subjects и меняет значение параметра isSystemInitialised на True
        setConstraint(context)
Exemple #3
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)))
Exemple #4
0
def setForeignKeys(context):
    u"""функция устанавливает внешний ключ в таблицу subjects и меняет значение параметра isSystemInitialised на True
        Функция работает с метаданными челесты.
    """
    settings = Settings()
    celesta = context.getCelesta()  #получаем объект celesta
    score = celesta.getScore()  #получаем объект score
    security_grain = score.getGrain(
        'security')  #получаем объект гранулы security
    subject_table = security_grain.getTable(
        "subjects")  #получаем объект таблицы subjects
    login_table = security_grain.getTable(
        "logins")  #получаем объект таблицы logins
    if settings.isUseAuthServer():
        # Если пользователи приходят из mellophone, поле password в таблице logins становится nullable.
        password_field = login_table.getColumn(
            "password")  #получаем объект поля password таблицы logins
        password_field.setNullableAndDefault(
            settings.isUseAuthServer(),
            None)  #Разрешаем значения null для него
    if settings.isEmployees():
        employees_grain = score.getGrain(
            settings.getEmployeesParam("employeesGrain")
        )  #получаем объект гранулы, которая содержит таблицу сотрудников
        employees_table = employees_grain.getTable(
            settings.getEmployeesParam(
                "employeesTable"))  #получаем объект таблицы сотрудников
        employees_id = employees_table.getColumn(
            settings.getEmployeesParam("employeesId")
        )  #получаем объект колонки первичного ключа таблицы сотрудников
        if isinstance(employees_id, IntegerColumn):
            # если первичный ключ таблицы сотрудников целочисленный, удаляем колонку "employeeId" таблицы subjects
            # и создаём новую целочисленного типа.
            # сделано так потому что по умолчанию поле "employeeId" таблицы subjects текстовое.
            subject_table.getColumn("employeeId").delete()
            IntegerColumn(subject_table, "employeeId")
        else:
            # если первичный ключ таблицы сотрудников текстовый, устанавливаем длину поля "employeeId" таблицы subjects
            # в соответствии с ним
            employees_id_length = employees_id.getLength()
            subject_table.getColumn("employeeId").setLength(
                unicode(employees_id_length))

        subjects_keys = subject_table.getForeignKeys(
        )  #получаем список объектов-внешних ключей таблицы subjects
        for subjects_key in subjects_keys:
            #удаляем все внешние ключи таблицы subjects
            subjects_key.delete()
        subjects_key = ForeignKey(
            subject_table, employees_table, ["employeeId"]
        )  #создаём внешний ключ subjects(employeeId)-<employees>(<employeeId>)

    logins_keys = login_table.getForeignKeys(
    )  #получаем список объектов-внешних ключей таблицы logins
    for logins_key in logins_keys:
        #удаляем все внешние ключи таблицы logins
        logins_key.delete()
    logins_key = ForeignKey(
        login_table, subject_table,
        ["subjectId"])  #создаём внешний ключ logins(subjectId)-subjects(sid)
    if settings.loginIsSubject():  #устанавливаем правила удаления
        # Если logins тождественны subjects:
        logins_key.setDeleteRule(
            FKRule.CASCADE)  # каскадное удаление на ключ logins-subjecs
        if settings.isEmployees():
            subjects_key.setDeleteRule(
                FKRule.SET_NULL)  # установка null на ключ subjects-<employees>
    else:
        logins_key.setDeleteRule(
            FKRule.SET_NULL)  # установка null на ключ logins-subjecs
    score.save()  #сохраняем изменения
    celesta.reInitialize()  # реинициализируем челесту
    settings.setEmployeesParam(
        "isSystemInitialised", "true"
    )  #меняем значение параметра, чтобы в следующий раз ключи уже не устанавливались.
Exemple #5
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)
Exemple #6
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)