def get_demo_and_prepare_for_classification(session, tags, account): demo_ktree = rwObjects.get_demo_ktree(session) demo_all = rwObjects.KnowledgeTree.ktree_return_childs(session,demo_ktree.id) already_tags = dict() for leaf in demo_all: if leaf.id != demo_ktree.id: already_tags[leaf.name] = leaf.uuid created = already_tags.keys() for key in tags.keys(): if key not in created: # Добавляем новый узел print "Создаем демо раздел Дерева Знаний: %s" % key params = {'parent_id': demo_ktree.id, 'name': key, 'description': key, 'tags': 'demo', 'expert': account.login, 'type': 'custom'} try: status, obj = rwObjects.create_new_object(session, "knowledge_tree", params, account) except Exception as e: raise e else: already_tags[key] = obj.uuid print status[0] print status[1] else: print "Такой раздел уже существует в демо." for key in tags.keys(): for msg in tags[key]: rwObjects.link_objects(session, already_tags[key], msg)
def create_new(self, **kwargs): data = cherrypy.request.params session_context = cherrypy.session.get('session_context') url = session_context['back_ref'] print "Данные запроса: %s" % data session = rwObjects.Session() # Получаем по uuid создателя кейса try: source = rwObjects.get_by_uuid(session_context['uuid'])[0] except Exception as e: return ShowError("""Case.create_new. Операция: rwObjects.get_by_uuid(). Ошибка : %s""" % str(e)) else: pass # Создаем новый Case и проводим тренировку классификатора расстояний try: status, obj = rwObjects.create_new_object(session, "cases", data, source) except Exception as e: return ShowError("""Ktree.create_new. Операция: rwObjects.create_new_object(session, 'knowledge_tree', params, source). Ошибка : %s""" % str(e)) else: uuid = str(obj.uuid) rwLearn.train_neighbors(session, rwObjects.default_neighbors_classifier) print status # Линкуем новый Case с объектом из которого он был создан try: status = rwObjects.link_objects(session,obj.uuid,data['do_object_uuid']) except Exception as e: return ShowError("""Case.create_new. Операция: rwObjects.link_objects(session,obj.uuid, data['do_object_uuid']). Ошибка : %s""" % str(e)) else: print status[0] print status[1] if not status[0]: return ShowError(str(status[0]) + status[1]) # Линкуем новый Case с узлами Навигатора Знаний коорые были в связаны с объектм родителем do_obj = rwObjects.get_by_uuid(data['do_object_uuid'])[0] print do_obj.NAME print do_obj.__dict__['custom_category'] for cat in do_obj.__dict__['custom_category']: print cat.name try: status = rwObjects.link_objects(session,cat.uuid,obj.uuid) except Exception as e: return ShowError("""Case.create_new. Операция: rwObjects.link_objects(session,obj.uuid,cat). Ошибка : %s""" % str(e)) else: print status[0] print status[1] if not status[0]: return ShowError(str(status[0]) + status[1]) session.close() G.reload() raise cherrypy.HTTPRedirect("/object/%s/addlink" % uuid)
def create_new(self, **kwargs): data = cherrypy.request.params session_context = cherrypy.session.get('session_context') employee_uuid = session_context.pop('employee_uuid') print employee_uuid print "Данные из запроса : " print data print "\nКонтекст :" print session_context params = {} for p in data.keys(): params[p] = data[p] """ Проверка параметров тут. """ """ Извлекаем создателя и Создаем новый объект """ source = rwObjects.get_by_uuid(session_context['uuid'])[0] session = rwObjects.Session() try: print "Создаем новый аккаунт." status, obj = rwObjects.create_new_object(session, "accounts", params, source) except Exception as e: print e else: print status """ Если возвращен объект, выполняем бизнес логику. Если None, значит ошибка. """ if obj: """ Бизнес логика. Связываем новый аккаунт с его пользователем. Пользователь передается в session_context['employee_uuid'] """ print "Делаем линкование с пользователем при создании аккаунта." rwObjects.link_objects(session, employee_uuid, obj.uuid) session.close() cherrypy.session['session_context'] = session_context print "Переадресация на ", session_context['back_ref'] raise cherrypy.HTTPRedirect(session_context['back_ref'])
def apply_rules_for_1(source_uuid, source_type, target_uuid, target_type): """ В момент появления связи "создания" между объектами проходит проверка автоматических правил. Эта функция вызывается автоматически при вызове функции Reference.create() :param source_uuid: UUID объекта источника :param source_type: тип объекта источника :param target_uuid: UUID объекта цели :param target_type: тип объекта цели :return string: OK, в случае успеха. :exception e: Ошибка в случае исключения. """ session = rwObjects.Session() """ Если среди участников проверки есть DynamicObject, то ищем его внутренний тип. """ tt = target_type st = source_type if target_type == "dynamic_object": response = session.query(rwObjects.DynamicObject). \ filter(rwObjects.DynamicObject.uuid == target_uuid).one() tt = response.obj_type elif source_type == "dynamic_object": response = session.query(rwObjects.DynamicObject). \ filter(rwObjects.DynamicObject.uuid == source_uuid).one() tt = response.obj_type """ Objects Rule #1 Acc создает Msg Если S = Account и T = Messages, то связываем Сотрудника владеющего аккаунтом и сообщение. Владелец аккаунта всегда один и связан с ним связью весом 0. """ if st == "accounts" and tt == "messages": try: response = session.query(rwObjects.Reference). \ filter(rwObjects.and_(0 == rwObjects.Reference.link,\ rwObjects.Reference.target_uuid == source_uuid,\ rwObjects.Reference.source_type == 'employees')).one() except Exception as e: raise Exception(str(e)) else: owner_uuid = response.source_uuid print "Objects Rule #1" print "Линкуем %s с %s " % (owner_uuid, target_uuid) """Делаем линкование объектов """ rwObjects.link_objects(session, owner_uuid, target_uuid) """ Objects Rule #1.1 Acc создает Msg Если S = Account и T = Messages, то ищем о полю References в новом сообщении, существующие сообщения с входящими в него message-id. Если находим линкуем. """ # Получаем новый объект класса DO try: new_msg = rwObjects.get_by_uuid(target_uuid)[0] except Exception as e: raise Exception(str(e)) all = dict() # Получаем все сообщения и записываем их id и uuid try: resp = session.query(rwObjects.DynamicObject).all() except Exception as e: raise Exception(str(e)) for msg in resp: try: obj = rwObjects.get_by_uuid(msg.uuid)[0] except Exception as e: raise Exception(str(e)) all[obj.__dict__['message-id'].strip("[ |<|>]")] = msg.uuid # Если есть поле References, то работаем по нему, иначе ничего не делаем if 'references' in new_msg.__dict__.keys(): refs = list() for r in new_msg.__dict__['references'].split(" "): refs.append(r.strip("[ |<|>]")) links = list() for r in refs: if r in all.keys(): links.append([all[r],new_msg.uuid]) print links for l in links: rwObjects.link_objects(session, l[0], l[1]) """ Objects Rule #2 Правило 2. Empl создает Empl Если S = Employee и T = Employee, то связываем нового пользователя с Компанией. Пользователя создает суперюзер, он связан со своей компанией линком весом 0. """ elif st == "" and tt == "": # 1. Находим компанию pass """ Objects Rule #3 Правило 3. Empl создает Acc Если S = Employee и T = Account, то связываем новый Аккаунт с Пользователем. """ elif st == "" and tt == "": # 1. pass """ Knowledge Rule #1 Линкуем стандартные объекты в момент создания со стандартными ветками дерева знаний. Стандартные типы объектов перечисленны в STANDARD_OBJECT_TYPES. Если ветки в ДЗ нет, то она создается в корне дерева. """ standard = rwObjects.STANDARD_OBJECTS_TYPES classes = dict() try: response = session.query(rwObjects.KnowledgeTree).all() except Exception as e: raise Exception("Ошибка чтения ДЗ." + str(e)) else: pass for leaf in response: cls = leaf.get_objects_classes() for c in cls: if c not in classes.keys(): classes[c] = leaf.uuid #print classes.keys() #print standard print "Проверка Knowledge Rule #1 для :",tt if tt in standard and tt in classes.keys(): print "Выполняем Knowledge Rule #1" rwObjects.link_objects(session, classes[tt], target_uuid) pass """ Knowledge Rule #2 Класифицируем объекты типы которых указаны в константе FOR_CLASSIFY. """ print "Проверка Knowledge Rule #2 для : %s" % tt status = rwLearn.check_conditions_for_classify() if not status[0]: raise Exception("Не соблюдены условия для тренировки." + status[1]) if tt in rwObjects.FOR_CLASSIFY: print "-------- Классифицируем объект : %s ---------" % target_uuid obj = rwObjects.get_by_uuid(target_uuid)[0] clf_uuid = rwObjects.default_classifier obj.clear_text() print str(obj.text_plain) probe, Z = rwLearn.predict(clf_uuid, [obj.text_plain]) print 'Вероятности : %s' % probe categories = rwObjects.get_ktree_custom(session) print 'Категория : %s' % categories[Z[0]].name print "--------------Классификация закончена.------------------" # Сохраняем результаты классификации status = rwLearn.save_classification_result(session,target_uuid,clf_uuid,probe) if status[0]: print "Данные классификации сохранены." else: print "Данные классификации НЕ сохранены." session.close() return "OK"
def savelink(self, object_uuid, object_type, category_type=None, category_uuid=None): data = cherrypy.request.params session_context = cherrypy.session.get('session_context') url = session_context['back_ref'] if not category_uuid: print "Не указана категория." raise cherrypy.HTTPRedirect(url) if not isinstance(category_uuid, list): category_uuid = [category_uuid] print "Obj UUID: ", object_uuid print "Obj type: ", object_type print "Category uuid:", category_uuid print "Category type:", category_type session = rwObjects.Session() old_edges = rwObjects.get_ktree_for_object(session, object_uuid)[0] edges_for_delete = list() # Ищем связи которые надо удалить for old in old_edges.values(): if old.uuid not in category_uuid: edges_for_delete.append(old.uuid) # Производим связывание объекта с категориями for category in category_uuid: # Устанавливаем новые связи try: st = rwObjects.link_objects(session, category, object_uuid) except Exception as e: print "Проблемы при связывании..." print e pass else: print "Связывание прошло успешно." print st[0] print st[1] # Получаем список старых связей try: resp = session.query(rwObjects.Reference).filter(rwObjects.and_(\ rwObjects.Reference.source_type == 'knowledge_tree', rwObjects.Reference.source_uuid.in_(edges_for_delete), rwObjects.Reference.target_uuid == object_uuid, rwObjects.Reference.link == 0)).all() except Exception as e: print str(e) return ShowError("Ошибка : %s" % str(e)) # Удаляем старые связи try: for one in resp: session.delete(one) session.commit() except Exception as e: print str(e) return ShowError("Ошибка : %s" % str(e)) try: st = rwLearn.clear_autoclassify(session, object_uuid) except Exception as e: print "Проблемы удаления автоклассфиикации.." print e else: print "Удаление автоклассификации успешно." print st[0] print st[1] print "Переадресация на : ", url G.reload() session.close() raise cherrypy.HTTPRedirect(url)