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.sysfunctions import tableCursorImport from security.functions import Settings from security.navigator import authentificationNavigator from security.securityInit import securityInit from security.setForeignKeys import setForeignKeys as setConstraint from security.xform.users import employeesSubjectsPostInsert, employeesSubjectsPostUpdate, employeesSubjectsPreDelete isInitContext = True try: import initcontext except ImportError: isInitContext = False if isInitContext: settings = Settings() if not settings.loginIsSubject() and settings.isEmployees(): # Если роли привязываются к сотруднику и таблица сотрудников настроена (нужные настройки есть в grainSettings.xml), # привязываем к ней триггеры. context = initcontext() employeesGrain = settings.getEmployeesParam("employeesGrain") employeesTable = settings.getEmployeesParam("employeesTable") employeesCursor = tableCursorImport(employeesGrain, employeesTable) employeesCursor.onPostInsert(context.getCelesta(), employeesSubjectsPostInsert) employeesCursor.onPostUpdate(context.getCelesta(), employeesSubjectsPostUpdate) employeesCursor.onPreDelete(context.getCelesta(), employeesSubjectsPreDelete) if not settings.isSystemInitialised(): context = initcontext() # функция устанавливает внешний ключ в таблицу subjects и меняет значение параметра isSystemInitialised на True setConstraint(context)
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)))
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 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 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)