def msg_delivery_for_user(uuid): session = rwObjects.Session() user = rwObjects.get_by_uuid(uuid)[0] if user.disabled != 0: print "Пользователь %s отключен." % user.uuid return "Disabled." else: refs = session.query(rwObjects.Reference). \ filter(rwObjects.and_(rwObjects.Reference.source_uuid == uuid, rwObjects.Reference.target_type == "accounts", rwObjects.Reference.link == 0)).all() for acc in refs: # print type(acc) get_messages_for_account.delay(acc.target_uuid) return "OK"
def save_classification_result(session,target_uuid,clf_uuid,probe): """ Сохраняет результат автоматической классификации в бд. Если результаты авто классификации для такого классификатора и объекта уже есть в таблице, то перезаписываем их \ новыми. :return: """ try: res = session.query(rwObjects.ClassificationResult).\ filter(rwObjects.and_(rwObjects.ClassificationResult.clf_uuid == clf_uuid,\ rwObjects.ClassificationResult.target_uuid == target_uuid)).one() except rwObjects.sqlalchemy.orm.exc.NoResultFound: print "Сохраняем новаую автоклассификацию для %s" % target_uuid result = rwObjects.ClassificationResult() else: print "Перезаписываем автоклассификацию для %s" % target_uuid result = res print "Запоняем объект результатов." result.clf_uuid = clf_uuid result.target_uuid = target_uuid result.probe = ",".join(map(str,probe[0])) result.status = "new" try: CL = rwObjects.get_by_uuid(clf_uuid)[0] except Exception as e: print "Ошибка получения классификатора: %s " % clf_uuid return [False,"Ошибка получения классификатора: %s. %s" % (clf_uuid, str(e))] result.categories = CL.targets print "Сохраняем данные автоклассификации для %s " % target_uuid try: session.add(result) session.commit() except Exception as e: print "Ошибка сохранения автоклассификации для %s " % target_uuid return [False,"Ошибка сохранения автоклассификации для %s. %s" % (target_uuid, str(e))] return [True,"OK"]
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)
def retrain_classifier(session,clf_uuid): """ Готовит данные для тренировки классификатора и проводит ее. :param session: сессия ORM :param clf_uuid: UUID классификатора для обучения :return: список статуса. Первый элемент - статус операции True/Flase, второй - описание. """ status = check_conditions_for_classify() if not status[0]: raise Exception("Не соблюдены условия для тренировки."+status[1]) # Готовим данные для тренировки. Делаем выборку из Reference с типами из FOR_CLASSIFY привязанных к custom веткам # ДЗ. # Отбираем кастом ветки custom = rwObjects.get_ktree_custom(session) print custom custom_uuid = custom.keys() print "Custom ветки ДЗ: " for i in custom.values(): print i.name # Делаем выборку всех DynamicObjects objects = list() try: res = session.query(rwObjects.DynamicObject).\ filter(rwObjects.DynamicObject.obj_type.in_(rwObjects.FOR_CLASSIFY)).all() except Exception as e: return [False,"Ошибка доступа к базе DO."] else: for r in res: objects.append(r.uuid) # Ищем только связанные с custom узлами DO из нашего списка. try: res = session.query(rwObjects.Reference).\ filter(rwObjects.and_(rwObjects.Reference.source_uuid.in_(custom_uuid), rwObjects.Reference.target_uuid.in_(objects))).all() except Exception as e: return [False,"Ошибка доступа к базе Reference объектов."] else: pass print "Объекты для обучения: " # Готовим данные в объектах для обучения классификатора keys = list() dataset = list() targets = list() for r in res: obj = rwObjects.get_by_uuid(r.target_uuid)[0] obj.clear_text() keys.append(r.target_uuid) dataset.append(obj.text_clear) targets.append(r.source_uuid) print "Объект: ",r.target_uuid print "Текст длина в признаках: ",obj.text_clear print "Категория",r.source_uuid print "" print "Dataset len :",len(dataset) print "Key len :",len(keys) print "Targets len :",len(targets) fit_classifier(rwObjects.default_classifier, dataset, targets) return [True,""]