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)
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 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
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)
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)
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)
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 не может быть вызван для других объектов.")
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 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 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
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)
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])
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 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()
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)
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)
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 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)
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)
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)
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"]
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."
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)
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:
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,""]