コード例 #1
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    def use(self,case_uuid, for_uuid):
        tmpl = lookup.get_template("use_case.html")
        session_context = cherrypy.session.get('session_context')
        session = rwObjects.Session()
        # Получаем объекты
        try:
            obj = rwObjects.get_by_uuid(for_uuid)[0]
            case = rwObjects.get_by_uuid(case_uuid)[0]
        except Exception as e:
            return ShowError(str(e))
        else:
            pass

        accounts = dict()
        obj_nbrs = G.neighbors(for_uuid)
        user_nbrs = G.neighbors(session_context['uuid'])
        # Создаем список аккаунтов пользователя через которые можно отправить ответ
        for i in user_nbrs:
            node = G.graph.node[i]['obj']
            if node.__class__.__name__ == 'Account':
                print "Аккаунт объекта: %s" % node.login
                accounts[node.uuid] = node
        # Получаем аккаунт объекта через который можно отправить ответ
        for i in obj_nbrs:
            node = G.graph.node[i]['obj']
            if node.__class__.__name__ == 'Account':
                print "Аккаунт пользователя: %s" % node.login
                obj_account = node

        soup = BeautifulSoup(obj.__dict__['raw_text_html'], from_encoding="utf8")
        body_old = str(soup.find('body').contents[0])

        session.close()
        return tmpl.render(obj=obj, case=case, session_context=session_context, body_old=body_old,
                           accounts=accounts, obj_account=obj_account)
コード例 #2
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    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)
コード例 #3
0
def test():
    
    kt =  rwObjects.KnowledgeTree() 
    s,o = kt.return_full_tree('string')
    #print s
    #print o

    
    #print get_edges_for_object('d004073c-31fc-11e5-9635-f46d04')

    print rwObjects.get_by_uuid('e9fa9342-3614-11e5-b267-f46d04d35cbd')[0].uuid
コード例 #4
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    def index(self, category_uuid):

        tmpl = lookup.get_template("ktree_show_category.html")
        session_context = cherrypy.session.get('session_context')
        session_context['back_ref'] = '/ktree'
        session_context['menu'] = 'ktree_category'
        if session_context['menu'] == 'ktree_category':
            #session_context['back_ref'] = '/ktree/' + str(category_uuid)
            session_context['menu'] = 'ktree_category'

        if session_context['menu'] == 'ktree_settings':
            session_context['back_ref'] = '/settings?menu=ktree'
            session_context['menu'] = 'ktree_settings'

        cherrypy.session['session_context'] = session_context

        # print category_uuid

        session = rwObjects.Session()
        leaf = rwObjects.get_by_uuid(category_uuid)[0]

        # Получаем все связанные объекты для этого пользователя
        neighbors = G.neighbors(session_context['uuid'])
        neighbors.append(session_context['uuid'])

        # Получаем все объекты связанные с этим узлом НЗ
        try:
            response = session.query(rwObjects.Reference). \
                filter(rwObjects.or_(rwObjects.Reference.source_uuid == leaf.uuid, \
                                     rwObjects.Reference.target_uuid == leaf.uuid)). \
                order_by(rwObjects.desc(rwObjects.Reference.timestamp)).all()
        except Exception as e:
            raise e
        else:
            pass
        nodes = list()
        for line in response:
            source = rwObjects.get_by_uuid(line.source_uuid)[0]
            target = rwObjects.get_by_uuid(line.target_uuid)[0]
            if line.link == 0 and source.uuid == category_uuid:
                nodes.append(target)
            elif line.link == 0 and target.uuid == category_uuid:
                nodes.append(source)

        # Получаем результаты автоклассификации для объектов в этом узле НЗ
        auto_cats = dict()
        for node in nodes:
            auto_cats[node.uuid] = rwObjects.get_classification_results(session, node.uuid)
            # print "Автоклассификация : %s" % auto_cats[node.uuid]

        return tmpl.render(obj=leaf, session=session, name=leaf.name,
                           nodes=nodes, session_context=session_context,
                           auto_cats=auto_cats, cats_name=rwObjects.get_ktree_custom(session),
                           neighbors=neighbors)
コード例 #5
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    def edit(self, uuid):

        try:
            obj = rwObjects.get_by_uuid(uuid)[0]
        except Exception as e:
            print e[0]
            print e[1]
            return ShowError("EditObject. Операция rwObjects.get_by_uuid(uuid)[0]. Ошибка : %s" % str(e))
        else:
            tmpl = lookup.get_template("edit_object.html")
            obj_keys = obj.get_attrs()
            f = obj.get_fields()
            session_context = cherrypy.session.get('session_context')
            neighbors = G.neighbors(session_context['uuid'])

            print "session_context['menu'] : %s " % session_context['menu']

            if session_context['menu'] in ['accounts', 'employee', 'ktree']:
                session_context['back_ref'] = "/settings/?menu=" + session_context['menu']
            if session_context['menu'] == 'settings':
                session_context['back_ref'] = "/settings"

            session_context['menu'] = "edit_object"

            return tmpl.render(obj=obj, keys=obj_keys,
                               session_context=session_context,
                               all_f=f[0], view_f=f[1], edit_f=f[2],
                               neighbors=neighbors)
コード例 #6
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    def index(self):

        tmpl = lookup.get_template("employee.html")
        session_context = cherrypy.session.get('session_context')
        session_context['back_ref'] = '/employee'
        session = rwObjects.Session()
        users = session.query(rwObjects.Employee). \
            filter_by(comp_id=session_context['comp_id']).all()
        obj_keys = users[0].get_attrs()
        f = users[0].get_fields()
        linked_objects = dict()
        for user in users:
            refs = session.query(rwObjects.Reference). \
                filter(rwObjects.sqlalchemy.and_(rwObjects.Reference.source_uuid == user.uuid,
                                                 rwObjects.Reference.target_type == "accounts",
                                                 rwObjects.Reference.link == 0)).all()
            linked_objects[user.uuid] = []

            for ref in refs:
                linked_objects[user.uuid].append(rwObjects.get_by_uuid(ref.target_uuid)[0])

        session.close()

        return tmpl.render(obj=users, keys=obj_keys,
                           session_context=session_context,
                           view_f=f[1],
                           all_f=f[0],
                           linked=linked_objects)
コード例 #7
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
 def frame(self, uuid):
     print "Отдаем данные во фрейм..."
     try:
         obj = rwObjects.get_by_uuid(uuid)[0]
     except Exception as e:
         print e
         return ShowError(str(e))
     else:
         pass
     if obj.__tablename__ == 'dynamic_object' and obj.__dict__['raw_text_html']:
         return obj.__dict__['raw_text_html']
     else:
         return ShowError("Frame не может быть вызван для других объектов.")
コード例 #8
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    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'])
コード例 #9
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"
コード例 #10
0
def apply_rules_for_0(source_uuid, source_type, target_uuid, target_type):
    """
    В момент появления связи между объектами проходит проверка правил.
    Эта функция вызывается автоматически при вызове функции Reference.create() когда link = 0.

    :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

    """
    Rule #1
     При связывании ветки Навигатора Знаний и DO, проверяем какую операцию надо выполнить согласно настройкам ветки.
     Если не no, то выполняем операцию.
    """
    if st == 'knowledge_tree' and target_type == 'dynamic_object':
        source_obj = rwObjects.get_by_uuid(source_uuid)[0]
        if source_obj.__class__.__name__ != 'KnowledgeTree' and source_obj.action == 'no':
            print "\n ----- Rule #1. Ничего не делаем -----\n"
            return "OK."

        print source_obj.action
        if source_obj.action == 'create_case':
            print "\nСоздаем кейс\n"
        else:
            pass
コード例 #11
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    def addlink(self, uuid):
        data = cherrypy.request.params
        session = rwObjects.Session()
        tmpl = lookup.get_template("add_link_to_ktree.html")

        try:
            obj = rwObjects.get_by_uuid(uuid)[0]
            custom = rwObjects.get_ktree_custom(session)
        except Exception as e:
            return ShowError("""LinkObject.addlink. Операция rwObjects.get_by_uuid() или
                                rwObjects.get_by_uuid(uuid)[0]. Ошибка : %s""" % str(e))
        print custom.values()
        used_category = rwObjects.get_ktree_for_object(session, uuid)[0]

        session.close()
        return tmpl.render(obj=obj, category=custom,
                           session_context=cherrypy.session.get('session_context'),
                           used_category=used_category)
コード例 #12
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    def edit(self, uuid):
        print uuid
        tmpl = lookup.get_template("edit_ktree.html")
        session_context = cherrypy.session.get('session_context')
        session = rwObjects.Session()
        obj = rwObjects.get_by_uuid(uuid)[0]
        f = obj.get_fields()
        experts = rwObjects.get_userlist_in_group(session, 'expert')
        all_leafs = obj.get_all(session)

        # print "OBJ : %s" % obj
        # print "Status experts : %s" % experts[0]
        # print "Experts : %s" % experts[1]
        # print "All leafs : %s" % all_leafs
        session.close()
        return tmpl.render(obj=obj, experts=experts[1], all=all_leafs,
                           session_context=session_context,
                           all_f=f[0], edit_f=f[2])
コード例 #13
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"]
コード例 #14
0
def autoclassify_all_notlinked_objects():
    """
    Проводит автоматическую классификацию всех не связанных ни с одним custom узлом Навигатора Знаний объектов класса
    DynamicObject. При этом используется текущие настройки и обученная модель классификатора. Если автоматическая
    классификация для объекта уже существует, то ее результаты будут перезаписаны.

    :return:
    """

    # Ищем все сообщения, их них отбираем только те которые не имеют связей с custom
    # т.е. имею пустое свойство self.__dict__['custom_category']
    session = rwObjects.Session()
    resp = session.query(rwObjects.DynamicObject).all()
    for obj in resp:
        obj.read(session)
        print obj.uuid
        print obj.__dict__['custom_category']
        if not obj.__dict__['custom_category'] and obj.obj_type in rwObjects.FOR_CLASSIFY:
            print "-------- Классифицируем объект : %s ---------" % obj.uuid
            obj = rwObjects.get_by_uuid(obj.uuid)[0]

            obj.clear_text()
            #print str(obj.text_clear)
            try:
                probe, Z = predict(rwObjects.default_classifier, [obj.text_clear])
            except Exception as e:
                raise e
            else:
                pass
            print 'Вероятности : %s' % probe
            categories = rwObjects.get_ktree_custom(session)
            print 'Категория : %s' % categories[Z[0]].name
            print "--------------Классификация закончена.------------------"

            # Сохраняем результаты классификации
            status = save_classification_result(session,obj.uuid,rwObjects.default_classifier,probe)
            if status[0]:
                print "Данные классификации сохранены."
            else:
                print "Данные классификации НЕ сохранены."

    session.close()
コード例 #15
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    def add(self, uuid):

        tmpl = lookup.get_template("add_case.html")
        session_context = cherrypy.session.get('session_context')
        session = rwObjects.Session()
        try:
            do_object = rwObjects.get_by_uuid(uuid)[0]
        except Exception as e:
            return ShowError(str(e))
        else:
            pass

        obj = rwObjects.Case()
        obj_keys = obj.get_attrs()
        f = obj.get_fields()
        session.close()
        return tmpl.render(obj=obj, keys=obj_keys, name=obj.NAME,
                           session_context=session_context,
                           all_f=f[0], create_f=f[3],
                           do_object=do_object)
コード例 #16
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    def create_new(self, **kwargs):
        data = cherrypy.request.params
        session_context = cherrypy.session.get('session_context')
        url = session_context['back_ref']

        print "Данные из запроса : "
        print data
        print "\nКонтекст :"
        print session_context
        print "Переадресация на show_object... ", url

        session = rwObjects.Session()
        try:
            rwObjects.KnowledgeTree.ktree_return_childs(session, data['parent_id'])
        except Exception as e:
            return ShowError("""Ktree.create_new. Операция: rwObjects.KnowledgeTree.ktree_return_childs(session,
            data['parent_id']). Ошибка : %s""" % str(e))
        else:
            pass

        source = rwObjects.get_by_uuid(session_context['uuid'])[0]

        """
        Создаем новый объект класса KnowledgeTree
        Для каждого нового типа необходимо добавить в  create_new_object условия.
        Проверка параметров происходит там же, если чего-то не хватает то ловим Exception.
        """

        try:
            status, obj = rwObjects.create_new_object(session, "knowledge_tree", data, source)
        except Exception as e:
            return ShowError("""Ktree.create_new. Операция: rwObjects.create_new_object(session, 'knowledge_tree',
                             params, source). Ошибка : %s""" % str(e))
        else:
            print status

        session.close()
        raise cherrypy.HTTPRedirect(url)
コード例 #17
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"
コード例 #18
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    def index(self, uuid):

        tmpl = lookup.get_template("show_object.html")
        try:
            obj = rwObjects.get_by_uuid(uuid)[0]
        except Exception as e:
            print e
            return ShowError(str(e))
        else:
            obj_keys = obj.get_attrs()
            f = obj.get_fields()
            session_context = cherrypy.session.get('session_context')
            neighbors = G.neighbors(session_context['uuid'])

            # Ищем подходящие для этого ДО кейсы, считаем расстояние и выбираем только подходящие
            cases = dict()
            nbrs = list()

            if obj.__tablename__ == 'dynamic_object':
                obj.clear_text()
                nbr = list()
                try:
                    nbr = rwLearn.predict_neighbors(rwObjects.default_neighbors_classifier,\
                                                                        [obj.__dict__['text_clear']])
                except ValueError as e:
                    print "Недостаточно кейсов для тренировки. Ошибка: %s" % str(e)
                    session_context['message_to_user'] = "******" \
                                                         "или больше кейсов."
                    cherrypy.session['session_context'] = session_context
                except Exception as e:
                    print "Ошибка получения сосдей поиске кейсов. Ошибка: %s " % str(e)

                print "nbrs : %s" % nbr
                for i in nbr:
                    case = rwObjects.get_by_uuid(i[0])[0]
                    print "Кейс : %s (расстояние %s)" % (case.subject,i[1])
                    if i[1] < 0.9998:
                        cases[i[0]] = case
                        nbrs.append(i)

            # Является ли текущий пользователь экспертом для одного из узлов НЗ, к которому относиться объект
            # если являеться, то можно предоставить доступ
            show_object = False
            session = rwObjects.Session()
            leafs = rwObjects.get_ktree_for_object(session, obj.uuid)[0]
            session.close()
            for leaf in leafs.values():
                if session_context['login'] == leaf.expert:
                    show_object = True

            # Создаем список связанных объектов для показа
            linked_nodes = dict()
            for i in G.neighbors(obj.uuid):
                if i != obj.uuid:
                    try:
                        lo = rwObjects.get_by_uuid(i)[0]
                    except Exception as e:
                        return ShowError("Showbject. Операция : linked_nodes[i] = rwObjects.get_by_uuid(i)[0]. Ошибка :"
                                         "%s" % str(e))
                    try:
                        linked_nodes[lo.__tablename__]
                    except KeyError:
                        linked_nodes[lo.__tablename__] = dict()
                    linked_nodes[lo.__tablename__][lo.uuid] = lo

            print "Объект для вывода связей : %s" % obj.uuid
            print "linked_nodes : %s" % linked_nodes

            print "session_context['menu'] : %s " % session_context['menu']

            if session_context['menu'] in ['accounts', 'employee']:
                session_context['back_ref'] = "/settings/?menu=" + session_context['menu']
            if session_context['menu'] == 'settings':
                session_context['back_ref'] = "/settings"

            session_context['menu'] = "show_object"
            return tmpl.render(obj=obj, keys=obj_keys,
                               session_context=session_context, all_f=f[0], view_f=f[1],
                               neighbors=neighbors, cases=cases, nbrs=nbrs, show_object=show_object,
                               linked_nodes=linked_nodes)
コード例 #19
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    def index(self, view_type=None, date=None):

        print "Тип отображения: %s" % view_type
        print "Дата %s" % date
        v = ["", "", ""]

        if view_type == "links":
            link = 0
            v[2] = "active"
        elif view_type == "create":
            link = 1
            v[1] = "active"
        else:
            link = 1
            v[0] = "active"

        print v

        tmpl = lookup.get_template("timeline.html")
        session_context = cherrypy.session.get('session_context')
        session_context['back_ref'] = '/timeline'
        session_context['menu'] = 'timeline'
        cherrypy.session['session_context'] = session_context
        session = rwObjects.Session()
        try:
            events = session.query(rwObjects.Reference).filter(rwObjects.Reference.link == link). \
                order_by(rwObjects.desc(rwObjects.Reference.timestamp)).all()
            obj_keys = events[0].get_attrs()
            fields = events[0].get_fields()
        except IndexError:
            obj_keys = rwObjects.rw_parent().get_attrs()
            fields = rwObjects.rw_parent().get_fields()
        except Exception as e:
            return ShowError(str(e))

        actors = {}
        neighbors = G.neighbors(session_context['uuid'])

        for event in events:
            event.read(session)
            # print "Source UUID : %s" % event.source_uuid
            # print "Target UUID : %s" % event.target_uuid
            try:
                obj = rwObjects.get_by_uuid(event.source_uuid)[0]
            except Exception as e:
                print e[0]
                print e[1]
                return ShowError(str(e))
            else:
                if event.source_uuid not in actors.keys():
                    actors[event.source_uuid] = obj
                    print "Actor: %s" % actors[event.source_uuid].SHORT_VIEW_FIELDS

            try:
                obj = rwObjects.get_by_uuid(event.target_uuid)[0]
            except Exception as e:
                print e[0]
                print e[1]
                return ShowError(str(e))
            else:
                if event.target_uuid not in actors.keys():
                    actors[event.target_uuid] = obj
                    print "Actor: %s" % actors[event.target_uuid].SHORT_VIEW_FIELDS

                    # print "events[0].get_fields() : %s" % fields
                    # print "obj_keys : %s " % obj_keys
        print "All actors: %s" % actors.keys()
        print "Соседи: %s" % neighbors
        return tmpl.render(obj=events, keys=obj_keys,
                           session_context=session_context,
                           all_f=fields[0], view_f=fields[1],
                           actors=actors, view_type=v,
                           neighbors=neighbors)
コード例 #20
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    def create_new(self, **kwargs):
        data = cherrypy.request.params
        session_context = cherrypy.session.get('session_context')
        url = session_context['back_ref']

        print "Данные запроса: %s" % data

        params = dict()
        try:
            params['login'] = data['login']
            params['company_prefix'] = session_context['company_prefix']
            params['name'] = data['name']
            params['password'] = data['password']
            params['surname'] = data['surname']
            params['comp_id'] = session_context['comp_id']
            params['groups'] = data['groups']
        except KeyError as e:
            return ShowError("Функция Employee.create_new(). Ошибка KeyError: %s" % str(e))
        else:
            pass

        # Проверяем что этот параметр список, иначе делаем из одного значения список
        if not isinstance(params['groups'], list):
            params['groups'] = [params['groups']]

        """
        Проверка параметров тут.
        """
        for k in params.keys():
            if params[k] == "" or not params[k]:
                print "Параметр %s незаполнен." % k
                return ShowError("Параметр %s незаполнен." % k)

        source = rwObjects.get_by_uuid(session_context['uuid'])[0]
        print "Данные из запроса : "
        print params
        print "\nКонтекст :"
        print session_context
        print "Переадресация на show_object... ", url
        print source

        session = rwObjects.Session()

        try:
            status, obj = rwObjects.create_new_object(session, "employees", params, source)
        except Exception as e:
            return ShowError("Ошибка создания объекта. " + str(e))
        else:
            pass

        if not status[0]:
            return ShowError(str(status[0]) + str(status[1]))

        """
        Если возвращен объект, проводим привязку согласно бизнес логики.
        Если None, значит ошибка.
        """
        if obj:
            """
            Бизнес логика.
            Связываем нового пользователя с Компанией.
            """
            company = rwObjects.get_company_by_id(params['comp_id'])
            ref = rwObjects.Reference(source_uuid=company.uuid,
                                      source_type=company.__tablename__,
                                      source_id=company.id,
                                      target_uuid=obj.uuid,
                                      target_type=obj.__tablename__,
                                      target_id=obj.id,
                                      link=0)
            ref.create(session)

        session.close()
        raise cherrypy.HTTPRedirect(url)
コード例 #21
0
def outgoing_message(data):
    """
    Функция проверяет правильность заполнения всех зоголовков и формирует сообщение.
    В зависимости от указанной опции, отправляет по smtp получателю и записыает в папку sent аккаунта или записывает
    сообщение в папку draft.

    :param data: данные для формирования письма.
    :return:
    """

    try:
        account = rwObjects.get_by_uuid(data['account'])[0]
    except Exception as e:
        return [False,"Ошибка при получении данных аккаунта. Ошибка: %s" % str(e)]
    else:
        pass

    to_field = ""
    msg = email.MIMEMultipart.MIMEMultipart()
    msg['Message-ID'] = email.Utils.make_msgid()
    data['from'] = account.login
    from email.header import Header

    # Проверка параметров полученных при написании сообщения
    # Кодирование заголовков
    try:
        for f in ['to', 'cc', 'from']:
            addrs = extract_addresses(data[f])
            s = list()
            print "Поле %s" % f
            for addr in addrs.keys():
                if addr or f == 'cc':
                    s.append(email.utils.formataddr((str(email.header.make_header([(addrs[addr],'utf8')])), addr)))
                else:
                    return [False, "rwEmail.outgoing_message. Операция extract_addresses. Пустой параметр: %s"\
                            % str(f)]
                print ", ".join(s)
            data[f] = ", ".join(s)
            if f == 'to':
                to_field = ", ".join(addrs.keys())
    except Exception as e:
        return [False, "rwEmail.outgoing_message. Операция проверки параметров. Ошибка: %s" % str(e)]

    msg['From'] = data['from']
    msg['To'] = data['to']
    msg['Cc'] = data['cc']
    msg['Subject'] = email.header.Header(data['subject'], 'utf8')

    if 'references' in data.keys():
        msg['References'] = email.header.Header(data['references'],'utf8')

    data_html = data['body']
    data_plain = ''

    msg.preamble = "This is a multi-part message in MIME format."
    msg.epilogue = "End of message"
    msgAlternative = email.MIMEMultipart.MIMEMultipart('alternative')
    msg.attach(msgAlternative)
    msgText = email.MIMEText.MIMEText(data_plain, "plain", "UTF-8")
    msgAlternative.attach(msgText)
    to_attach = email.MIMEText.MIMEText(data_html, "html", "UTF-8")
    msgAlternative.attach(to_attach)

    print msg.as_string()

    if data['send_options'] == 'to_drafts':
        # Сохраняем в Черновики
        status = save_message_to(msg, "drafts", account)
        return status

    elif data['send_options'] == 'now':
        # Отправляем и сохраняем в Отправленные
        status_send = send_message_smtp(account, to_field, msg)
        if not status_send[0]:
            return status_send
        status_save = save_message_to(msg, "sent", account)
        if not status_save[0]:
            return status_save

    return [True,"OK"]
コード例 #22
0
def get_messages_for_account(account_uuid):
    """
    Функция получает и записывает в базу сообщения по указанному аккаунту.
    Используется для всех типов сообщений и каналов.
    :param account_uuid: UUID аккаунта для подключения.
    :return: Статус операции (строка)
    """

    session = rwObjects.Session()
    status = [True, "OK"]

    try:
        account = rwObjects.get_by_uuid(account_uuid)[0]
    except Exception as e:
        status = [False, "Указанный аккаунт не найден.\n" + account_uuid + str(e)]
        return status[1]
    else:
        pass

    """Получаем сообщения"""
    if account.acc_type == 'email' and account.disabled == 0:
        print "Подключаюсь к " + str(account.login) + "..."
        try:
            emails, status = rwEmail.get_emails(account)
            # print emails
        except Exception as e:
            status = [False, 'Ошибка получения сообщений.\n' + str(e)]
            print status[1]
            return status[1]
        else:
            pass
            print "Сообщения получены."

        """
        Запись сообщения в SQL и МонгоДБ
        """
        for email in emails.values():
            do = rwObjects.DynamicObject()
            email['channel_type'] = rwObjects.rwChannel_type[0]
            email['obj_type'] = do.obj_type = do.collection = 'messages'

            if 'message-id' not in email.keys():
                print "Сообщение без Message-ID. Не записано."
            elif not do.check({"message-id": email['message-id']}):
                print "----------Начало записи в Монго------------------"
                s = do.write(session, email)

                print "---------- Окончание записи в Монго------------------"

                if s[0]:
                    print "Создаем Reference на новый объект "
                    ref = rwObjects.Reference(source_uuid=account.uuid,
                                              source_type=account.__tablename__,
                                              source_id=account.id,
                                              target_uuid=do.uuid,
                                              target_type=do.__tablename__,
                                              target_id=do.id,
                                              link=1)
                    # Записываем объект
                    r_status = ref.create(session)
            else:
                print "Такое сообщение уже существует."

    else:
        print "Аккаунт %s отключен." % account_uuid

    account.last_check = datetime.now()
    session.add(account)
    session.commit()

    print "Время последней проверки : %s" % account.last_check

    session.close()

    return "OK."
コード例 #23
0
ファイル: rework_webapp.py プロジェクト: jitterxx/bmtools
    def settings(self, menu=None):
        session_context = cherrypy.session.get('session_context')
        if not menu or menu == "":
            tmpl = lookup.get_template("settings_dashboard.html")
            session_context['back_ref'] = '/'
            session_context['menu'] = "settings"
            params = cherrypy.request.headers
            cherrypy.session['session_context'] = session_context
            return tmpl.render(params=params, session_context=session_context)

        elif menu == 'company':
            tmpl = lookup.get_template("settings_dashboard.html")
            session_context['back_ref'] = '/settings'
            session_context['menu'] = "company"

        elif menu == 'employee' or menu == 'accounts':
            tmpl = lookup.get_template("employee.html")
            session = rwObjects.Session()

            # если пользователь с правами администратора, выбираем всех сотрудников
            if 'admin' in session_context['groups']:
                users = session.query(rwObjects.Employee). \
                    filter_by(comp_id=session_context['comp_id']).all()
                obj_keys = users[0].get_attrs()
                f = users[0].get_fields()
                session_context['back_ref'] = '/settings'
                session_context['menu'] = "employee"

            # если пользователь с обычными правами, только свой профиль
            else:
                users = [rwObjects.get_by_uuid(session_context['uuid'])[0]]
                obj_keys = users[0].get_attrs()
                f = users[0].get_fields()
                session_context['back_ref'] = '/settings'
                session_context['menu'] = "accounts"

            linked_objects = dict()
            for user in users:
                refs = session.query(rwObjects.Reference). \
                    filter(rwObjects.sqlalchemy.and_(rwObjects.Reference.source_uuid == user.uuid,
                                                     rwObjects.Reference.target_type == "accounts",
                                                     rwObjects.Reference.link == 0)).all()
                linked_objects[user.uuid] = []

                for ref in refs:
                    linked_objects[user.uuid].append(rwObjects.get_by_uuid(ref.target_uuid)[0])

            session.close()
            cherrypy.session['session_context'] = session_context
            return tmpl.render(obj=users, keys=obj_keys, session_context=session_context,
                               view_f=f[1], all_f=f[0], linked=linked_objects)

        elif menu == 'clients':
            tmpl = lookup.get_template("settings_dashboard.html")
            session_context['back_ref'] = '/settings?menu=clients'

        elif menu == 'ktree':
            tmpl = lookup.get_template("ktree_settings.html")
            session = rwObjects.Session()
            tree = rwObjects.KnowledgeTree()
            session_context['back_ref'] = '/settings?menu=ktree'
            session_context['menu'] = "ktree_settings"
            return tmpl.render(obj=tree, session=session,
                               session_context=session_context)
        else:
            print "меню без указания."
            tmpl = lookup.get_template("settings_dashboard.html")
            session_context['back_ref'] = '/settings'
            session_context['menu'] = "settings"
            params = cherrypy.request.headers
            return tmpl.render(params=params, session_context=session_context)
コード例 #24
0
from bs4 import BeautifulSoup
from urllib2 import urlopen
import prototype1_objects_and_orm_mappings as rwObjects


import sys
reload(sys)
sys.setdefaultencoding("utf-8")


SITE_URL = "http://toster.ru/questions/latest?page=%s"
#SITE_URL = "https://toster.ru/tag/javascript/questions?page=%s"
tags = dict()
session = rwObjects.Session()
account = rwObjects.get_by_uuid("4b0b843e-5546-11e5-a199-f46d04d35cbd")[0]

"""
Что надо сделать чтобы работало демо:
1. Создать аккаунт demo_toster
2. Привязать его к пользователю в References связью 0.
3. Создать отдельную ветку в Навигаторе Знаний внутри Сообщений, с названием Демо
4. Привязать к ней сообщения с Тостера

print "Создаем демо раздел Дерева Знаний: Тостер"
params = {'parent_id': 1, 'name': 'Тостер', 'description': 'Демонстрационные сообщения с сайта toster.ru',
          'tags': 'demo',
          'expert': account.login, 'type': 'custom'}
try:
    status, obj = rwObjects.create_new_object(session, "knowledge_tree", params, account)
except Exception as e:
コード例 #25
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,""]