Exemple #1
0
def usersList(context, main=None, add=None, filterinfo=None, session=None, params=None,
                curvalue=None, startswith=None, firstrecord=None, recordcount=None):
    u'''Функция list селектора типа элемента. '''
    settings=Settings()      
    recordList = ArrayList()
    #raise Exception(startswith, curvalue)
    if settings.isUseAuthServer() and settings.loginIsSubject():        
        sessionId=json.loads(session)["sessioncontext"]["sessionid"]
        server=SecurityParamsFactory.getAuthServerUrl()
        users_xml=getUsersFromAuthServer(server, sessionId)
        for user in users_xml.getElementsByTagName("user"):
            if startswith and string.find(user.getAttribute("name"), curvalue)==0 or \
                    not startswith and string.find(user.getAttribute("name"), curvalue)>0:
                rec = DataRecord()
                rec.setId(user.getAttribute("SID"))
                rec.setName(user.getAttribute("login"))
                recordList.add(rec)        
    else:
        subject = subjectsCursor(context)        
        subject.setFilter('name', "@%s'%s'%%" % ("%"*(not startswith), curvalue.replace("'","''")))        
        subject.orderBy('name')        
        subject.limit(firstrecord, recordcount)
        for subject in subject.iterate():
            rec = DataRecord()
            rec.setId(subject.sid)
            if subject.name is not None or subject.name!='':
                rec.setName(subject.name)
            else:
                rec.setName(u'[Имя не назначено!]')
            recordList.add(rec)        
    return ResultSelectorData(recordList, 0)
Exemple #2
0
def usersCount(context,
               main=None,
               add=None,
               filterinfo=None,
               session=None,
               params=None,
               curvalue=None,
               startswith=None):
    #raise Exception(params)
    settings = Settings()
    if settings.isUseAuthServer() and settings.loginIsSubject():
        server = SecurityParamsFactory.getAuthServerUrl()
        sessionId = json.loads(session)["sessioncontext"]["sessionid"]
        users_xml = getUsersFromAuthServer(server, sessionId)
        count = 0
        for user in users_xml.getElementsByTagName("user"):
            if startswith and string.find(user.getAttribute("name"), curvalue)==0 or \
                    not startswith and string.find(user.getAttribute("name"), curvalue)>0:
                count += 1
        #count=len(users_xml.getElementsByTagName("user"))
    else:
        subject = subjectsCursor(context)
        #raise Exception(useAuthServer)
        subject.setFilter(
            'name', "@%s'%s'%%" %
            ("%" * (not startswith), curvalue.replace("'", "''")))
        count = subject.count()
    return ResultSelectorData(None, count)
Exemple #3
0
def employeesList(context,
                  main=None,
                  add=None,
                  filterinfo=None,
                  session=None,
                  params=None,
                  curvalue="",
                  startswith=False,
                  firstrecord=0,
                  recordcount=None):
    u'''Функция list селектора типа элемента. '''
    settings = Settings()

    # raise Exception(curvalue)
    recordList = ArrayList()
    employeesGrain = settings.getEmployeesParam("employeesGrain")
    employeesTable = settings.getEmployeesParam("employeesTable")
    employeesId = settings.getEmployeesParam("employeesId")
    employeesName = settings.getEmployeesParam("employeesName")

    employeesCursor = tableCursorImport(employeesGrain, employeesTable)
    employees = employeesCursor(context)
    employees.setFilter(
        employeesName,
        "@%s'%s'%%" % ("%" * (not startswith), curvalue.replace("'", "''")))
    employees.orderBy(employeesName)
    employees.limit(firstrecord, recordcount)
    for employees in employees.iterate():
        rec = DataRecord()
        rec.setId(getattr(employees, employeesId))
        rec.setName(getattr(employees, employeesName))
        recordList.add(rec)
    return ResultSelectorData(recordList, 0)
Exemple #4
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)
    currId = json.loads(session)['sessioncontext']['related']['gridContext']['currentRecordId']
    rolesUsers.setRange("roleid", currId)    
    content=[]
    if settings.isUseAuthServer() and settings.loginIsSubject():            
        sessionId=json.loads(session)["sessioncontext"]["sessionid"]
        server=SecurityParamsFactory.getAuthServerUrl()                
        users_xml=getUsersFromAuthServer(server, sessionId)        
        if rolesUsers.tryFindSet():
            while True:
                for user in users_xml.getElementsByTagName("user"):
                    if user.getAttribute("SID")==rolesUsers.userid:
                        content.append({"@sid" : rolesUsers.userid,
                                        "@userName" : user.getAttribute("name")
                                        })
                        break                                                
                if not rolesUsers.nextInSet():
                    break
    else:
        subjects = subjectsCursor(context)
        if rolesUsers.tryFindSet():
            while True:
                if subjects.tryGet(rolesUsers.userid):
                    content.append({"@sid" : subjects.sid,
                                    "@userName" : subjects.name
                                    })
                if not rolesUsers.nextInSet():
                    break
                
    if content==[]:
        xformsdata = {"schema":{"users": ""
                                }
                      }
    else:
        xformsdata = {"schema":{"users": {"user": content}
                                }
                      }

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

    return JythonDTO(XMLJSONConverter.jsonToXml(json.dumps(xformsdata)), XMLJSONConverter.jsonToXml(json.dumps(xformssettings)))
Exemple #5
0
def employeesSubjectsPreDelete(rec):
    # Триггер добавляется только в случае loginEqualSubject = "false"
    settings = Settings()

    context = rec.callContext()
    employeesId = settings.getEmployeesParam("employeesId")
    subjects = subjectsCursor(context)
    subjects.setRange("employeeId", getattr(rec, employeesId))
    if subjects.canDelete():
        subjects.deleteAll()
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()
Exemple #7
0
def employeesSubjectsPostUpdate(rec):
    # Триггер добавляется только в случае loginEqualSubject = "false"
    settings = Settings()

    context = rec.callContext()
    employeesId = settings.getEmployeesParam("employeesId")
    employeesName = settings.getEmployeesParam("employeesName")
    subjects = subjectsCursor(context)
    subjects.setRange("employeeId", getattr(rec, employeesId))
    if subjects.tryFirst():  # and subjects.count()==1:
        subjects.name = getattr(rec, employeesName)
        if subjects.canModify():
            subjects.update()
Exemple #8
0
def employeesSubjectsPostInsert(rec):
    # Триггер добавляется только в случае loginEqualSubject = "false"
    settings = Settings()

    context = rec.callContext()
    employeesId = settings.getEmployeesParam("employeesId")
    employeesName = settings.getEmployeesParam("employeesName")
    sid = getNextNoOfSeries(context, 'subjects') + id_generator()
    subjects = subjectsCursor(context)
    subjects.sid = sid
    subjects.name = getattr(rec, employeesName)
    subjects.employeeId = getattr(rec, employeesId)
    if subjects.canInsert() and subjects.canModify():
        if not subjects.tryInsert():
            subjects.update()
    elif subjects.canInsert():
        subjects.insert()
Exemple #9
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()
Exemple #10
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"Недостаточно прав для данной операции!")
Exemple #11
0
def employeesCount(context,
                   main=None,
                   add=None,
                   filterinfo=None,
                   session=None,
                   params=None,
                   curvalue="",
                   startswith=False):
    settings = Settings()

    employeesGrain = settings.getEmployeesParam("employeesGrain")
    employeesTable = settings.getEmployeesParam("employeesTable")
    #    employeesId=getEmployeesParam("employeesId")
    employeesName = settings.getEmployeesParam("employeesName")

    employeesCursor = tableCursorImport(employeesGrain, employeesTable)
    employees = employeesCursor(context)
    employees.setFilter(
        employeesName,
        "@%s'%s'%%" % ("%" * (not startswith), curvalue.replace("'", "''")))
    count = employees.count()
    # raise Exception(count)
    return ResultSelectorData(None, count)
Exemple #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)
Exemple #13
0
def gridToolBar(context,
                main=None,
                add=None,
                filterinfo=None,
                session=None,
                elementId=None):
    u'''Toolbar для грида. '''
    settings = Settings()

    # raise Exception(session)
    if 'currentRecordId' not in json.loads(session)['sessioncontext'][
            'related']['gridContext'] and not settings.isUseAuthServer():
        style_add = "false"
        style_edit = "true"
        style_delete = "true"
        style_roles = "true"
    elif not settings.isUseAuthServer():
        style_add = "false"
        style_edit = "false"
        style_delete = "false"
        if settings.loginIsSubject():
            style_roles = "false"
        else:
            style_roles = "true"
    elif 'currentRecordId' not in json.loads(
            session)['sessioncontext']['related']['gridContext']:
        style_add = "true"
        style_edit = "true"
        style_delete = "true"
        style_roles = "true"
    else:
        style_add = "true"
        style_edit = "false"
        if settings.loginIsSubject():
            style_roles = "false"
        else:
            style_roles = "true"
        style_delete = "true"

    data = {
        "gridtoolbar": {
            "item": [{
                "@img": 'gridToolBar/addDirectory.png',
                "@text": "Добавить",
                "@hint": "Добавить пользователя",
                "@disable": style_add
            }, {
                "@img": 'gridToolBar/editDocument.png',
                "@text": "Редактировать",
                "@hint": "Редактировать пользователя",
                "@disable": style_edit
            }, {
                "@img": 'gridToolBar/deleteDocument.png',
                "@text": "Удалить",
                "@hint": "Удалить пользователя",
                "@disable": style_delete
            }, {
                "@img": 'gridToolBar/addDirectory.png',
                "@text": "Добавить роли",
                "@hint": "Добавить роли",
                "@disable": style_roles
            }]
        }
    }

    data["gridtoolbar"]["item"][0]["action"] = func.getActionJSON(
        "add", "usersXform", "Добавление пользователя", "350", "500")
    data["gridtoolbar"]["item"][1]["action"] = func.getActionJSON(
        "edit", "usersXform", "Редактирование пользователя", "350", "500")
    data["gridtoolbar"]["item"][2]["action"] = func.getActionJSON(
        "delete", "usersXformDelete", "Удаление пользователя", "150", "450")
    data["gridtoolbar"]["item"][3]["action"] = func.getActionJSON(
        "roles", "usersRolesXform", "Добавление ролей", "350", "500")

    return XMLJSONConverter.jsonToXml(json.dumps(data))
Exemple #14
0
def usersDatapanel(context, main, session):
    u'''Продедура возвращает информационную панель для пункта "Сотрудники и пользователи"'''
    settings = Settings()

    data = {
        "datapanel": {
            "tab": {
                "@id":
                1,
                "@name":
                u"Сотрудники и пользователи",
                "element": [{
                    "@id":
                    "usersGrid",
                    "@type":
                    "grid",
                    "@subtype":
                    "JS_PAGE_GRID",
                    "@plugin":
                    "pageDGrid",
                    "@proc":
                    "security.grid.users.gridData.celesta",
                    "proc": [{
                        "@id": "usersGridMeta",
                        "@name": "security.grid.users.gridMeta.celesta",
                        "@type": "METADATA"
                    }, {
                        "@id": "usersGridToolBar",
                        "@name": "security.grid.users.gridToolBar.celesta",
                        "@type": "TOOLBAR"
                    }]
                }, {
                    "@id": "usersXform",
                    "@type": "xforms",
                    "@template": "security/users.xml",
                    "@neverShowInPanel": "true",
                    "@proc": "security.xform.users.cardData.celesta",
                    "proc": {
                        "@id": "usersGridMeta",
                        "@name": "security.xform.users.cardDataSave.celesta",
                        "@type": "SAVE"
                    },
                    "related": {
                        "@id": "usersGrid"
                    }
                }, {
                    "@id": "usersXformDelete",
                    "@type": "xforms",
                    "@template": "security/delete.xml",
                    "@neverShowInPanel": "true",
                    "@proc": "security.xform.usersDelete.cardData.celesta",
                    "proc": {
                        "@id": "id_roles_card_save",
                        "@name":
                        "security.xform.usersDelete.cardDelete.celesta",
                        "@type": "SAVE"
                    },
                    "related": {
                        "@id": "usersGrid"
                    }
                }, {
                    "@id": "usersRolesXform",
                    "@type": "xforms",
                    "@template": "security/usersRoles.xml",
                    "@neverShowInPanel": "true",
                    "@proc": "security.xform.usersRoles.cardData.celesta",
                    "proc": {
                        "@id": "usersRolesXformMeta",
                        "@name":
                        "security.xform.usersRoles.cardDataSave.celesta",
                        "@type": "SAVE"
                    },
                    "related": {
                        "@id": "usersGrid"
                    }
                }]
            }
        }
    }

    if not settings.loginIsSubject():
        # если роли привязываются к сотрудникам (субъекты тождественны сотрудникам),
        # добавляем в датапанель гриды и карточки для ведения таблицы subjects
        data["datapanel"]["tab"]["element"].extend([{
            "@id":
            "subjectsGrid",
            "@type":
            "grid",
            "@subtype":
            "JS_LIVE_GRID",
            "@plugin":
            "liveDGrid",
            "@proc":
            "security.grid.subjects.gridData.celesta",
            "proc": [{
                "@id": "subjectsGridMeta",
                "@name": "security.grid.subjects.gridMeta.celesta",
                "@type": "METADATA"
            }, {
                "@id": "subjectsGridToolBar",
                "@name": "security.grid.subjects.gridToolBar.celesta",
                "@type": "TOOLBAR"
            }],
        }, {
            "@id": "subjectsXform",
            "@type": "xforms",
            "@template": "security/subjects.xml",
            "@neverShowInPanel": "true",
            "@proc": "security.xform.subjects.cardData.celesta",
            "proc": {
                "@id": "subjectsXformMeta",
                "@name": "security.xform.subjects.cardDataSave.celesta",
                "@type": "SAVE"
            },
            "related": {
                "@id": "subjectsGrid"
            }
        }, {
            "@id": "subjectsXformDelete",
            "@type": "xforms",
            "@template": "security/delete.xml",
            "@neverShowInPanel": "true",
            "@proc": "security.xform.subjectsDelete.cardData.celesta",
            "proc": {
                "@id": "id_roles_card_save",
                "@name": "security.xform.subjectsDelete.cardDelete.celesta",
                "@type": "SAVE"
            },
            "related": {
                "@id": "subjectsGrid"
            }
        }, {
            "@id": "subjectsRolesXform",
            "@type": "xforms",
            "@template": "security/usersRoles.xml",
            "@neverShowInPanel": "true",
            "@proc": "security.xform.usersRoles.cardData.celesta",
            "proc": {
                "@id": "usersRolesXformMeta",
                "@name": "security.xform.usersRoles.cardDataSave.celesta",
                "@type": "SAVE"
            },
            "related": {
                "@id": "subjectsGrid"
            }
        }])
    return XMLJSONConverter.jsonToXml(json.dumps(data))
Exemple #15
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)))
Exemple #16
0
def gridMeta(context,
             main=None,
             add=None,
             filterinfo=None,
             session=None,
             elementId=None):
    u'''Функция получения настроек грида. '''

    subjects = subjectsCursor(context)
    # Вычисляем количества записей в таблице
    totalcount = subjects.count()
    # Заголовок таблицы
    header = "Субъекты"

    sec_settings = Settings()
    _header = {
        "rowid": ["~~id"],
        "sid": [u"SID"],
        "name": [u"Имя"],
        "properties": [u"properties"]
    }

    # Определяем список полей таблицы для отображения
    settings = {}
    currentDatapanelHeight = int(
        json.loads(session)["sessioncontext"]["currentDatapanelHeight"])
    if sec_settings.loginIsSubject():
        number = 1
    else:
        # Вычисляем numberOfGrids, где 2.0 - numberOfGrids для первого грида users.py из датапанели
        # 59 - gridHeaderHeight для обоих гридов, 80 - суммарная дельта
        number = ((currentDatapanelHeight - 59) *
                  2.0) / (2.0 * currentDatapanelHeight - 2.0 * 80 -
                          currentDatapanelHeight + 59)
    settings["gridsettings"] = {
        "columns": {
            "col": []
        },
        "properties": {
            "@pagesize": "25",
            "@gridWidth": "100%",
            "@gridHeight": getGridHeight(session, number, delta=40),
            "@totalCount": totalcount,
            "@profile": "default.properties"
        },
        "labels": {
            "header": header
        }
    }
    # Добавляем поля для отображения в gridsettings
    settings["gridsettings"]["columns"]["col"].append({
        "@id": _header["sid"][0],
        "@width": "240px"
    })
    settings["gridsettings"]["columns"]["col"].append({
        "@id": _header["name"][0],
        "@width": "240px"
    })

    res = XMLJSONConverter.jsonToXml(json.dumps(settings))
    return JythonDTO(None, res)
Exemple #17
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 #18
0
from common.navigator import navigatorsParts
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
Exemple #19
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 #20
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"Недостаточно прав для данной операции!")
Exemple #21
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 #22
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)))