def getSubjectByLogin(context, login): subject = subjectsCursor(context) logins = loginsCursor(context) logins.get(login) subject.get(logins.subjectId) logins.close() return subject
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 loginCheck(context, login): """Проверяет уникальность логина. Параметры: - context (CallContext) - контекст Celesta - login (string) - логин Возвращает: (bool) True, если login уникален, иначе - False """ logins = loginsCursor(context) exist = not logins.tryGet(login) logins.close() return exist
def cardDelete(context, main=None, add=None, filterinfo=None, session=None, elementId=None, xformsdata=None): currId = json.loads( session)['sessioncontext']['related']['gridContext']["currentRecordId"] subject = subjectsCursor(context) login = loginsCursor(context) subject.get(currId) login.setRange('subjectId', subject.sid) for login in login.iterate(): login.subjectId = None login.update() subject.delete()
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 getLoginsBySubject(context, subject_id): """Получает список логинов по subject id""" logins = loginsCursor(context) logins.setRange("subjectId", subject_id) return logins
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 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 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 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)