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)
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)
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)
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)))
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()
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()
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()
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()
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"Недостаточно прав для данной операции!")
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)
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)
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))
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))
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)))
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)
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))
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
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" ) #меняем значение параметра, чтобы в следующий раз ключи уже не устанавливались.
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"Недостаточно прав для данной операции!")
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)
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)))