Ejemplo n.º 1
0
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"
Ejemplo n.º 2
0
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"]
Ejemplo n.º 3
0
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"
Ejemplo n.º 4
0
    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)
Ejemplo n.º 5
0
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,""]