示例#1
0
def comunicacion():
    """
    Communication Entrypoint
    """

    global dsGraph
    logger.info('Aviso a Tienda Externa de Compra Realizada')

    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    gr = None

    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(),
                           ACL['not-understood'],
                           sender=AgenteExternoTiendaExterna.uri,
                           msgcnt=get_count())
    else:
        # El AgenteNegociadorTiendasExternas nos informa de que ha habido una compra de uno de nuestros productos
        if msgdic['performative'] != ACL.inform:
            gr = build_message(Graph(),
                               ACL['not-understood'],
                               sender=AgenteExternoTiendaExterna.uri,
                               msgcnt=get_count())
        else:
            procesarCompra()
示例#2
0
def comunicacion():
    message = request.args['content'] #cogo el contenido enviado
    grafo = Graph()
    grafo.parse(data=message)
    message_properties = get_message_properties(grafo)
    resultado_comunicacion = None

    if message_properties is None:
        # Respondemos que no hemos entendido el mensaje
        resultado_comunicacion = build_message(Graph(), ACL['not-understood'],
                                              sender=AgenteCL.uri, msgcnt=get_message_count())
    else:
        # Obtenemos la performativa
        if message_properties['performative'] != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            resultado_comunicacion = build_message(Graph(), ACL['not-understood'],
                                                  sender=AgenteCL.uri, msgcnt=get_message_count())
        else:
            #Extraemos el contenido que ha de ser una accion de la ontologia 
            contenido = message_properties['content']

            accion = grafo.value(subject=contenido, predicate=RDF.type)
            logger.info("La accion es: " + accion)
            # Si la acción es de tipo iniciar_venta empezamos
            if accion == ECSDIAmazon.Encargo_envio:
                resultado_comunicacion = gestionarEncargo(contenido, grafo)
                
    serialize = resultado_comunicacion.serialize(format='xml')

    return serialize, 200
示例#3
0
  def directory_search(self, DirectoryAgent, type):
    global mss_cnt
    logging.info('Buscamos en el servicio de registro')

    gmess = Graph()

    gmess.bind('foaf', FOAF)
    gmess.bind('dso', DSO)
    reg_obj = agn[self.name + '-search']
    gmess.add((reg_obj, RDF.type, DSO.Search))
    gmess.add((reg_obj, DSO.AgentType, type))

    msg = build_message(gmess, perf=ACL.request,
                        sender=self.uri,
                        receiver=DirectoryAgent.uri,
                        content=reg_obj,
                        msgcnt=mss_cnt)
    gr = send_message(msg, DirectoryAgent.address)
    mss_cnt += 1
    logging.info('Recibimos informacion del agente')    
    content = get_message_properties(gr)['content']
    address = gr.value(subject=content, predicate=DSO.Address)
    uri = gr.value(subject=content, predicate=DSO.Uri)
    name = gr.value(subject=content, predicate=DSO.Name)
    return Agent(name, uri, address, None)
def communication():
    message = request.args['content'] #cogo el contenido enviado
    grafo = Graph()
    grafo.parse(data=message)
    # logger.info('--Envian una comunicacion')
    message_properties = get_message_properties(grafo)

    resultado_comunicacion = None

    if message_properties is None:
        # Respondemos que no hemos entendido el mensaje
        resultado_comunicacion = build_message(Graph(), ACL['not-understood'],
                                              sender=AgenteGestorDeVentas.uri, msgcnt=get_message_count())
    else:
        # Obtenemos la performativa
        if message_properties['performative'] != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            resultado_comunicacion = build_message(Graph(), ACL['not-understood'],
                                                  sender=AgenteGestorDeVentas.uri, msgcnt=get_message_count())
        else:
            #Extraemos el contenido que ha de ser una accion de la ontologia 
            contenido = message_properties['content']
            accion = grafo.value(subject=contenido, predicate=RDF.type)
            logger.info("La accion es: " + accion)
            # Si la acción es de tipo iniciar_venta empezamos
            if accion == ECSDIAmazon.Iniciar_venta:
                for item in grafo.subjects(RDF.type, ACL.FipaAclMessage):
                        grafo.remove((item, None, None))
                resultado_comunicacion = vender_productos(contenido, grafo)
                
    logger.info('Antes de serializar la respuesta')
    serialize = resultado_comunicacion.serialize(format='xml')

    return serialize, 200
def comunicacion():
    logger.info("Peticion recibida")
    global mss_cnt
    global dsgraph

    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    gr = None

    if msgdic is None:
        gr = build_message(Graph(), ACL['not-understood'], sender=AgenteDevoluciones.uri, msgcnt=get_count())

    else:
        if msgdic['performative'] != ACL.request:
            gr = build_message(Graph(), ACL['not-understood'], sender=AgenteDevoluciones.uri, msgcnt=get_count())

        else:
            content = msgdic['content']
            accion = gm.value(subject=content, predicate=RDF.type)

            if accion == ECSDI.Devolver_producto:
                logger.info("Peticion de retorno")
                if gm.value(subject=accion, predicate=RDF.type) == ECSDI.Devolucion_insatisfaccion and fuera_plazo(gm, content):  # si se ha comprado hace mas de 15 dias, rechazado
                    gr = build_message(Graph(), ACL['refuse'], sender=AgenteDevoluciones.uri, msgcnt=get_count())
                else:
                    comprasbd = open("../data/productos_pedidos.owl")
                    gcomp = Graph()
                    gcomp.parse(comprasbd, format='turtle')
                    compras = gm.subjects(predicate=RDF.type, object=ECSDI.Compra)
                    pesototal = 0.0
                    logger.info("fuera")
                    for compra in compras:
                        logger.info("dentro")
                        productos = gcomp.objects(subject=compra, predicate=ECSDI.Productos)
                        for prod in productos:
                            gcomp.remove((compra, ECSDI.Productos, prod))
                            peso = gcomp.value(subject=prod, predicate=ECSDI.Peso)
                            logger.info(peso)
                            pesototal += peso.toPython()
                        gcomp.remove((compra,RDF.type, ECSDI.Compra))
                    comprasbd.close()
                    gcomp.serialize(destination='../data/productos_pedidos.owl', format='turtle')

                    gr = Graph()
                    gr.add((content, RDF.type, ECSDI.Devolver_producto))
                    gr.add((content, ECSDI.Peso_lote, Literal(pesototal)))

                    centroLogistico = get_agent_info(agn.AgenteCentroLogistico, AgenteDirectorio, AgenteDevoluciones, get_count())

                    gr = send_message(build_message(gr, perf=ACL.request, sender=AgenteDevoluciones.uri, receiver=centroLogistico.uri, msgcnt=get_count(), content=content), centroLogistico.address)

            else:
                gr = build_message(Graph(), ACL['not-understood'], sender=AgenteDevoluciones.uri, msgcnt=get_count())

    logger.info('Respondemos a la peticion')
    return gr.serialize(format='xml')
def comunicacion():
    req = Graph()
    req.parse(data=request.args['content'])
    message_properties = get_message_properties(req)
    content = message_properties['content']
    accion = str(req.value(subject=content, predicate=RDF.type))
    logging.info('Accion: ' + accion)
    if accion == 'Empezar_Envio_Compra':
        return empezar_envio_compra(req, content)
def comunicacion():
    """
    Entrypoint de comunicacion del agente
    Simplementet retorna un objeto fijo que representa una
    respuesta a una busqueda de hotel

    Asumimos que se reciben siempre acciones que se refieren a lo que puede hacer
    el agente (buscar con ciertas restricciones, reservar)
    Las acciones se mandan siempre con un Request
    Prodriamos resolver las busquedas usando una performativa de Query-ref
    """
    global dsgraph
    global mss_cnt

    #Extraemos el mensaje y creamos un grafo con el
    message= request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    # Comprobamos que sea un mensaje FIPA ACL
    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(), ACL['not-understood'], sender=InfoAgent.uri, msgcnt=mss_cnt)
    else:
        # Obtenemos la performativa
        perf = msgdic['performative']

        if perf != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            gr = build_message(Graph(), ACL['not-understood'], sender=InfoAgent.uri, msgcnt=mss_cnt)
        else:
            #Extraemos el objeto del contenido que ha de ser una accion de la ontologia de acciones del agente
            # de registro

            # Averiguamos el tipo de la accion
            if 'content' in msgdic:
                content = msgdic['content']
                accion = gm.value(subject=content, predicate= RDF.type)

            # Aqui realizariamos lo que pide la accion
            paq = paquet["vacances"]
            actTypes = gm.value(subject= paq, predicate= paquet.act_types)
            destination = gm.value(subject= paq, predicate= paquet.desti)

            ga = buscar_activitats(destination, actTypes)
            # Por ahora simplemente retornamos un Inform-done
            gr = build_message(ga,
                               ACL['inform-done'],
                               sender=InfoAgent.uri,
                               msgcnt=mss_cnt,
                               receiver=msgdic['sender'],)
    mss_cnt += 1
    return gr.serialize(format='xml')
示例#8
0
def comunicacion():
    logger.info("Peticion recibida")
    global mss_cnt
    global dsgraph

    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    gr = None

    if msgdic is None:
        gr = build_message(Graph(), ACL['not-understood'], sender=AgenteBuscador.uri, msgcnt=get_count())

    else:
        if msgdic['performative'] != ACL.request:
            gr = build_message(Graph(), ACL['not-understood'], sender=AgenteBuscador.uri, msgcnt=get_count())

        else:
            content = msgdic['content']
            accion = gm.value(subject=content, predicate=RDF.type)

            if accion == ECSDI.Buscar:
                restricciones = gm.objects(content, ECSDI.Restringe)
                restricciones_dict = {}
                for restriccion in restricciones:
                    if gm.value(subject=restriccion, predicate=RDF.type) == ECSDI.Restriccion_Marca:
                        marca = gm.value(subject=restriccion, predicate=ECSDI.Marca)
                        logger.info("Marca: "+marca)
                        restricciones_dict['marca'] = marca
                    elif gm.value(subject=restriccion, predicate=RDF.type) == ECSDI.Restriccion_Modelo:
                        modelo = gm.value(subject=restriccion, predicate=ECSDI.Modelo)
                        logger.info('Modelo: ' + modelo)
                        restricciones_dict['modelo'] = modelo
                    elif gm.value(subject=restriccion, predicate=RDF.type) == ECSDI.Restriccion_Precio:
                        precio_max = gm.value(subject=restriccion, predicate=ECSDI.Precio_max)
                        precio_min = gm.value(subject=restriccion, predicate=ECSDI.Precio_min)
                        if precio_min:
                            logger.info('Precio minimo: ' + precio_min)
                            restricciones_dict['precio_min'] = precio_min
                            logger.info(restricciones_dict['precio_min'])
                        if precio_max:
                            logger.info('Precio maximo: ' + precio_max)
                            restricciones_dict['precio_max'] = precio_max

                gr = buscarProductos(**restricciones_dict)
                gr = build_message(gr, perf=ACL['inform-done'], sender=AgenteBuscador.uri, msgcnt=get_count(), receiver=msgdic['sender'])

            else:
                gr = build_message(Graph(), ACL['not-understood'], sender=AgenteBuscador.uri, msgcnt=get_count())

    logger.info('Respondemos a la peticion')
    return gr.serialize(format='xml')
示例#9
0
def comunicacion():
    """
    Entrypoint de comunicacion del agente
    Simplemente retorna un objeto fijo que representa una
    respuesta a una busqueda de hotel
    Asumimos que se reciben siempre acciones que se refieren a lo que puede hacer
    el agente (buscar con ciertas restricciones, reservar)
    Las acciones se mandan siempre con un Request
    Prodriamos resolver las busquedas usando una performativa de Query-ref
    """
    global dsgraph
    global mss_cnt

    logger.info('Peticion de informacion recibida')

    # Extraemos el mensaje y creamos un grafo con el
    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    # Comprobamos que sea un mensaje FIPA ACL
    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(),
                           ACL['not-understood'],
                           sender=AgentDevoluciones.uri,
                           msgcnt=mss_cnt)
    else:
        # Obtenemos la performativa
        perf = msgdic['performative']

        if perf != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            gr = build_message(Graph(),
                               ACL['not-understood'],
                               sender=AgentDevoluciones.uri,
                               msgcnt=mss_cnt)
        else:
            # Extraemos el objeto del contenido que ha de ser una accion de la ontologia de acciones del agente
            # de registro

            # Averiguamos el tipo de la accion
            content = msgdic['content']
            accion = gm.value(subject=content, predicate=RDF.type)

            if accion == ONT.ProductoDevuelto:
                gr = contactarCobrador(gm)

    mss_cnt += 1

    logger.info('Respondemos a la peticion')

    return gr.serialize(format='xml')
def comm():
    req = Graph()
    req.parse(data=request.args['content'])
    message_properties = get_message_properties(req)
    content = message_properties['content']
    accion = str(req.value(subject=content, predicate=RDF.type))
    logging.info('Accion: ' + accion)
    if accion == 'EnvioTiendaExterna':
        return notificarEnvio(req, content)
    elif accion == 'NotificarCobro':
        return notificarCobro(req, content)
示例#11
0
def realizarPedido():
    global gcarrito
    dicreq = request.form
    nombre = request.form.get("nombre")
    email = request.form.get("email")
    ciudad = request.form.get("ciudad")
    tarjeta = request.form.get("tarjeta")
    direccion = request.form.get("direccion")
    urgencia = request.form.get("urgencia")
    print("urgencia " + urgencia)

    gc = cargar_grafo_turtle(AgentUtil.Agents.path_clientes)
    gc.add((ECSDI['Cliente' + email], ECSDI.nombre, Literal(nombre)))
    gc.add((ECSDI['Cliente' + email], ECSDI.email, Literal(email)))
    gc.add((ECSDI['Cliente' + email], ECSDI.localizacion, Literal(ciudad)))
    gc.add((ECSDI['Cliente' + email], ECSDI.tarjeta, Literal(tarjeta)))
    gc.add((ECSDI['Cliente' + email], ECSDI.direccion, Literal(direccion)))
    guardar_grafo_turtle(gc, AgentUtil.Agents.path_clientes)
    gm = Graph()
    gm.bind('ecsdi', ECSDI)
    content = ECSDI['ordenCompra']
    gm.add((content, ECSDI.email, Literal(email)))
    gm.add((content, ECSDI.urgencia, Literal(urgencia)))

    gm += gcarrito

    msg = build_message(gm, perf=ACL.request,
                        sender=AgentUtil.Agents.AgenteUsuario.uri,
                        receiver=AgentUtil.Agents.AgenteDistribuidorBultos.uri,
                        content=content)
    # graf amb tots els productes relacionats amb el criteri de busqueda
    gr = send_message(msg, AgentUtil.Agents.AgenteDistribuidorBultos.address)

    msgdic = get_message_properties(gr)
    perf = msgdic['performative']
    if (perf == ACL.agree):
        mensaje = "Su pedido ha sido recibido correctamente!"

    else:
        mensaje = "Ha habido un error al enviar el pedido!"


    # gcarrito = cargarCarrito()

    # Realizar pedido contactar con agente distribuidor bultos

    gcarrito = Graph()


    # guardarCarrito(gcarrito)

    return render_template('mensajePedidoEnviado.html', mensaje=mensaje)
示例#12
0
def comunicacion():
    """
    Entrypoint de comunicacion
    """
    global dsgraph
    global mss_cnt

    # Extraemos el mensaje y creamos un grafo con el
    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)
    msgdic = get_message_properties(gm)
    mss_cnt += 1
    # Comprobamos que sea un mensaje FIPA ACL
    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(),
                           ACL['not-understood'],
                           sender=AgenteVendedorExterno.uri,
                           msgcnt=mss_cnt)

    else:
        # Obtenemos la performativa
        perf = msgdic['performative']
        if perf != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            gr = build_message(Graph(),
                               ACL['not-understood'],
                               sender=AgenteVendedorExterno.uri,
                               msgcnt=mss_cnt)

        else:
            # Extraemos el objeto del contenido que ha de ser una accion de la ontologia de acciones del agente
            # de registro
            # Averiguamos el tipo de la accion
            if 'content' in msgdic:
                content = msgdic['content']
                accion = gm.value(subject=content, predicate=RDF.type)
                # Aqui realizariamos lo que pide la accion

                gr = build_message(Graph(),
                                   ACL['not-understood'],
                                   sender=AgenteVendedorExterno.uri,
                                   msgcnt=mss_cnt)

            else:
                gr = build_message(Graph(),
                                   ACL['not-understood'],
                                   sender=AgenteVendedorExterno.uri,
                                   msgcnt=mss_cnt)

    return gr.serialize(format='xml')
示例#13
0
def comunicacion():
    """
    Entrypoint de comunicacion
    """
    global dsgraph
    global mss_cnt

    # Extraemos el mensaje y creamos un grafo con el
    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)
    msgdic = get_message_properties(gm)

    # Comprobamos que sea un mensaje FIPA ACL
    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(), ACL['not-understood'], sender=AgenteAlmacen.uri, msgcnt=mss_cnt)
    else:
        # Obtenemos la performativa
        perf = msgdic['performative']
        if perf != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            gr = build_message(Graph(), ACL['not-understood'], sender=AgenteAlmacen.uri, msgcnt=mss_cnt)
        else:
            # Extraemos el objeto del contenido que ha de ser una accion de la ontologia de acciones del agente
            # de registro
            # Averiguamos el tipo de la accion
            if 'content' in msgdic:
                content = msgdic['content']
                accion = gm.value(subject=content, predicate=RDF.type)
                # Aqui realizariamos lo que pide la accion
                if accion == AM2.Realiza_envio:
                    logger.info('Realizando el envio')

                    products = Graph()
                    for s in gm.subjects(RDF.type,AM2["Producto"]):
                        products += gm.triples((s,None,None))

                    # for s,p,o in products:
                    #     print("Procesando productos: %s | %s | %s"%(s,p,o))

                    negociaEnvio()
                    time.sleep(10) #Hacemos que tarde un tiempo en procesar antes de confirmar el envio
                    gr = confirmaEnvio(msgdic)
                else:
                    gr = build_message(Graph(), ACL['not-understood'], sender=AgenteAlmacen.uri, msgcnt=mss_cnt)
            else:
                gr = build_message(Graph(), ACL['not-understood'], sender=AgenteAlmacen.uri, msgcnt=mss_cnt)

    mss_cnt += 1
    logger.info('Confirmamos que se ha relizado el envio')
    return gr.serialize(format='xml')
示例#14
0
def comunicacion():
    req = Graph()
    req.parse(data=request.args['content'])
    message_properties = get_message_properties(req)
    content = message_properties['content']
    accion = str(req.value(subject=content, predicate=RDF.type))
    logging.info('Accion: ' + accion)
    if accion == 'Negociar':
        return negociar(req, content)
    elif accion == 'Contraoferta':
        return contraoferta(req, content)
    elif accion == 'Transportar':
        return transportar(req, content)
def comunicacion():
    """
    Entrypoint de comunicacion
    """
    req = Graph()
    req.parse(data=request.args['content'])
    message_properties = get_message_properties(req)
    content = message_properties['content']
    accion = str(req.value(subject=content, predicate=RDF.type))
    logging.info('Accion: ' + accion)
    if accion == 'Devolver':
        return devolver(req, content)
    elif accion == 'Buscar_Productos_Usuario':
        return buscar_productos_usuario(req, content)
示例#16
0
def devolverCompras(request):
    global mss_cnt
    global username
    # for id in request.form.getlist('comprasToReturn'):
    #     print("Ids: %s"%id)

    gmess = Graph()
    # Creamos el sujeto -> contenido del mensaje
    sj_contenido = agn[AgenteCliente.name + '-Peticion_devolucion-' +
                       str(mss_cnt)]
    # le damos un tipo
    gmess.add((sj_contenido, RDF.type, AM2.Peticion_devolucion))
    gmess.add((sj_contenido, AM2.username, Literal(username)))

    compras = Graph()
    compraProductos = open('../datos/compras')
    compras.parse(compraProductos, format='turtle')

    # misCompras = Graph()

    # for compra in compras.subjects(AM2.username,Literal(username)):
    #     misCompras += compras.triples((compra,None,None))

    for id in request.form.getlist('comprasToReturn'):
        # print("Ids: %s"%id)
        sj_nombre = AM2[id]  #creamos una instancia con nombre Modelo1..2.
        gmess.add((sj_nombre, RDF.type,
                   AM2['Compra']))  # indicamos que es de tipo Modelo
        gmess += compras.triples((AM2[id], None, None))

        # gmess.add((sj_contenido, AM2.Compras, URIRef(sj_nombre)))

    agenteDevolucion = directory_search_agent(DSO.AgenteDevoluciones,
                                              AgenteCliente, DirectoryAgent,
                                              mss_cnt)[0]
    msg = build_message(gmess,
                        perf=ACL.request,
                        sender=AgenteCliente.uri,
                        receiver=agenteDevolucion.uri,
                        content=sj_contenido,
                        msgcnt=mss_cnt)
    # print("devolverCompras BUILD")
    gr = send_message(msg, agenteDevolucion.address)
    # print("devolverCompras SENT")
    mss_cnt += 1
    msgdic = get_message_properties(gr)
    content = msgdic['content']
    resultadoDevolucion = gr.value(subject=content,
                                   predicate=AM2.resultadoDevolucion)
    return resultadoDevolucion
def comunicacion():
    """
    Entrypoint de comunicacion
    """
    req = Graph()
    req.parse(data=request.args['content'])
    message_properties = get_message_properties(req)
    content = message_properties['content']
    accion = str(req.value(subject=content, predicate=RDF.type))
    logging.info('Accion: ' + accion)
    if accion == 'Buscar_Productos':
        return buscar_productos(req, content)
    elif accion == 'Comprar':
        return comprar(req, content)
    elif accion == 'Informar_Envio_Iniciado':
        return informar_envio_iniciado(req, content)
示例#18
0
def comunicacion():
    """
    Entrypoint de comunicacion
    """
    req = Graph()
    req.parse(data=request.args['content'])
    message_properties = get_message_properties(req)
    content = message_properties['content']
    accion = str(req.value(subject=content, predicate=RDF.type))
    logging.info('Accion: ' + accion)
    if accion == 'Pedir_Feedback':
        return pedir_feedback(req, content)
    elif accion == 'Enviar_Feedback':
        return enviar_feedback(req, content)
    elif accion == 'Recibir_Recomendaciones':
        return recomendaciones(req, content)
def comunicacion():
    global dsgraph
    global mss_cnt

    req = Graph()
    req.parse(data=request.args['content'])
    message_properties = get_message_properties(req)
    content = message_properties['content']
    accion = str(req.value(subject=content, predicate=RDF.type))
    logging.info('Accion: ' + accion)
    if accion == 'CobrarP':
        return cobrarP(req, content)
    elif accion == 'Pagar':
        return pagar(req, content)
    elif accion == 'PagarTiendaExterna':
        return pagarTiendaExterna(req, content)
示例#20
0
def comunicacion():
    """
    Entrypoint de comunicacion
    """
    global dsGraph
    logger.info('Peticion de nuevo producto externo recivida')

    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    gr = None

    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(),
                           ACL['not-understood'],
                           sender=AgenteNegociadorTiendasExternas.uri,
                           msgcnt=get_count())
    else:
        # Llega una metodologia
        if msgdic['performative'] == ACL.inform:
            content = msgdic['content']

            metodologiaDePago = gm.value(subject=content,
                                         predicate=ECSDI.Metodologia_de_pago)
            tiendaExterna = msgdic['sender']

            gr = añadirMetodologiaDePago(tiendaExterna, metodologiaDePago)

        # Una tienda externa quiere añadir un producto a nuestra tienda
        elif msgdic['performative'] == ACL.request:

            tiendaOrigen = msgdic['sender']

            anadirProductosTiendaExterna(gm, tiendaOrigen)

            gr = build_message(Graph(),
                               perf=ACL['inform'],
                               sender=AgenteNegociadorTiendasExternas.uri,
                               msgcnt=get_count(),
                               receiver=tiendaOrigen)
    logger.info('Respondemos a la peticion')

    return gr.serialize(format='xml'), 200
示例#21
0
def communication():
    """
    Communication Entrypoint
    """

    logger.info('Peticion de informacion recibida')
    global dsGraph

    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    gr = None

    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(), ACL['not-understood'], sender=PlannerAgent.uri, msgcnt=get_count())
    else:
        # Obtenemos la performativa
        if msgdic['performative'] != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            gr = build_message(Graph(),
                               ACL['not-understood'],
                               sender=DirectoryAgent.uri,
                               msgcnt=get_count())
        else:
            # Extraemos el objeto del contenido que ha de ser una accion de la ontologia
            # de registro
            content = msgdic['content']
            # Averiguamos el tipo de la accion
            accion = gm.value(subject=content, predicate=RDF.type)

            if accion == ECSDI.peticion_de_plan:

                logger.info("Estoy en else")
                logger.info(accion)




    logger.info('Respondemos a la peticion')

    serialize = gr.serialize(format='xml')
    return serialize, 200
def comunicacion():
    """
    Entrypoint de comunicacion
    """
    global mss_cnt
    logging.info("ARRIBA?")
    req = Graph()
    req.parse(data=request.args['content'])
    message_properties = get_message_properties(req)
    content = message_properties['content']
    accion = str(req.value(subject=content, predicate=RDF.type))
    logging.info('Accion: ' + accion)
    if accion == 'Enviar_Peticion':
        return recibir_peticion(req, content)
    elif accion == 'EnviarProdTiendaExterna':
        return notificar_envio_tienda_externa(req, content)
    elif accion == 'NotificarCobro':
        return notificar_cobro(req, content)
示例#23
0
def comunicacion():
    """
    Entrypoint de comunicacion del agente
    """
    global dsgraph
    global mss_cnt
    #Extraemos el mensaje y creamos un grafo con el
    message= request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    # Comprobamos que sea un mensaje FIPA ACL
    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(), ACL['not-understood'],AgentSistemanfoAgent.uri, msgcnt=mss_cnt)
    else:
        # Obtenemos la performativa
        perf = msgdic['performative']

        if perf != ACL.request:

            # Si no es un request, respondemos que no hemos entendido el mensaje
            gr = build_message(Graph(), ACL['not-understood'],AgentSistemanfoAgent.uri, msgcnt=mss_cnt)
        else:
            #Extraemos el objeto del contenido que ha de ser una accion de la ontologia de acciones del agente
            # de registro
            # Averiguamos el tipo de la accion
            if 'content' in msgdic:
                content = msgdic['content']
                accion = gm.value(subject=content, predicate= RDF.type)

            # Aqui realizariamos lo que pide la accion
            gp = crear_paquet(gm)
            # Por ahora simplemente retornamos un Inform-done
            gr = build_message(gp,
                               ACL['inform-done'],
                               sender=AgentSistema.uri,
                               msgcnt=mss_cnt,
                               receiver=msgdic['sender'],)
    mss_cnt += 1
    return gr.serialize(format='xml')
示例#24
0
def comunicacion():
    """
    Entrypoint de comunicacion
    """
    logger.info('Peticion de plan recibida')
    global dsGraph

    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    gr = None

    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(), ACL['not-understood'], sender=AgenteAlojamiento.uri, msgcnt=get_count())
    else:
        # Obtenemos la performativa
        if msgdic['performative'] != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            gr = build_message(Graph(),
                               ACL['not-understood'],
                               sender=DirectoryAgent.uri,
                               msgcnt=get_count())
        else:
            # Extraemos el objeto del contenido que ha de ser una accion de la ontologia
            # de registro
            content = msgdic['content']
            # Averiguamos el tipo de la accion
            accion = gm.value(subject=content, predicate=RDF.type)

            # Accion de busqueda
            if accion == ECSDI.Peticion_Alojamiento:
                gr = findHoteles()
                logger.info('Api usada')

    serialize = gr.serialize(format='xml')
    logger.info("bye bye")
    return serialize, 200
def comunicacion():
    global ultimo_informe_recibido
    message = request.args['content'] #cogo el contenido enviado
    grafo = Graph()
    logger.info('--Envian una comunicacion')
    grafo.parse(data=message)
    logger.info('--Envian una comunicacion')
    message_properties = get_message_properties(grafo)

    resultado_comunicacion = None

    if message_properties is None:
        #respondemos que no hemos entendido el mensaje
        resultado_comunicacion = build_message(Graph(), ACL['not-understood'],
                                              sender=AgenteUsuario.uri, msgcnt=get_message_count())
    else:
        #obtenemos la performativa
        if message_properties['performative'] != ACL.request:
            #Si no es un request, respondemos que no hemos entendido el mensaje
            resultado_comunicacion = build_message(Graph(), ACL['not-understood'],
                                                  sender=AgenteUsuario.uri, msgcnt=get_message_count())
        else:
            #Extraemos el contenido que ha de ser una accion de la ontologia
            contenido = message_properties['content']
            accion = grafo.value(subject=contenido, predicate=RDF.type)
            logger.info("La accion es: " + accion)
            #si la acción es de tipo tranferencia empezamos
            if accion == ECSDIAmazon.Informar:
                logger.info("Ya apunto de finalizar")
                # thread = Thread(target=enviarVenta, args=(contenido,grafo))
                # thread.start()
                ultimo_informe_recibido = grafo
                graf = Graph()
                mensaje = ECSDIAmazon["Respuesta"+ str(get_message_count())]
                graf.add((mensaje,RDF.type, ECSDIAmazon.Respuesta))
                graf.add((mensaje,ECSDIAmazon.Mensaje,Literal("OK",datatype=XSD.string)))
                resultado_comunicacion = graf
            
    logger.info("Antes de serializar la respuesta")
    serialize = resultado_comunicacion.serialize(format="xml")
    return serialize, 200
def communication():
    message = request.args['content']  #cogo el contenido enviado
    grafo = Graph()
    logger.info('--Envian una comunicacion')
    grafo.parse(data=message)
    logger.info('--Envian una comunicacion')
    message_properties = get_message_properties(grafo)

    resultado_comunicacion = None

    if message_properties is None:
        # Respondemos que no hemos entendido el mensaje
        resultado_comunicacion = build_message(
            Graph(),
            ACL['not-understood'],
            sender=AgenteGestorDeProductos.uri,
            msgcnt=get_message_count())
    else:
        # Obtenemos la performativa
        if message_properties['performative'] != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            resultado_comunicacion = build_message(Graph(),
                                                   ACL['not-understood'],
                                                   sender=DirectoryAgent.uri,
                                                   msgcnt=get_message_count())
        else:
            # Extraemos el contenido que ha de ser una accion de la ontologia definida en Protege
            contenido = message_properties['content']
            accion = grafo.value(subject=contenido, predicate=RDF.type)
            logger.info("La accion es: " + accion)
            # Si la acción es de tipo busqueda  empezamos
            if accion == ECSDIAmazon.Buscar_productos:
                resultado_comunicacion = buscar_productos(contenido, grafo)
            elif accion == ECSDIAmazon.Anadir_producto:
                resultado_comunicacion = anadir_producto(grafo)

    logger.info('Antes de serializar la respuesta')
    serialize = resultado_comunicacion

    return serialize, 200
示例#27
0
def hoteles():
    """
        calls to /browsequotes/v1.0/{country}/{currency}/{locale}/{originPlace}/{destinationPlace}/{outboundPartialDate}/{inboundPartialDate}
        :return:
        """
    global dsGraph

    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    gr = Graph

    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(), ACL['not-understood'], sender=AgenteObtenedorAlojamiento.uri, msgcnt=get_count())
    else:
        # Obtenemos la performativa
        if msgdic['performative'] != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            gr = build_message(Graph(),
                               ACL['not-understood'],
                               sender=DirectoryAgent.uri,
                               msgcnt=get_count())
        else:
            content = msgdic['content']
            # Averiguamos el tipo de la accion
            accion = gm.value(subject=content, predicate=RDF.type)

            if accion == "peticion_de_alojamiento":
                outbounddate = request.args["fechaSalida"]
                inbounddate = request.args["fechaVuelta"]
                respuesta = arrayalojamientos[random.randint(0, len(arrayalojamientos)-1)]
                return respuesta
            return 0    #lol
示例#28
0
def communication():
    message = request.args['content']  #cogo el contenido enviado
    grafo = Graph()
    grafo.parse(data=message)
    message_properties = get_message_properties(grafo)

    resultado_comunicacion = None

    if message_properties is None:
        #respondemos que no hemos entendido el mensaje
        resultado_comunicacion = build_message(Graph(),
                                               ACL['not-understood'],
                                               sender=AgenteFinanciero.uri,
                                               msgcnt=get_message_count())
    else:
        #obtenemos la performativa
        if message_properties['performative'] != ACL.request:
            #Si no es un request, respondemos que no hemos entendido el mensaje
            resultado_comunicacion = build_message(Graph(),
                                                   ACL['not-understood'],
                                                   sender=AgenteFinanciero.uri,
                                                   msgcnt=get_message_count())
        else:
            #Extraemos el contenido que ha de ser una accion de la ontologia
            contenido = message_properties['content']
            accion = grafo.value(subject=contenido, predicate=RDF.type)
            #si la acción es de tipo tranferencia empezamos
            if accion == ECSDIAmazon.Transferencia_cobrar:
                resultado_comunicacion = realizar_transferencia(
                    contenido, grafo, True)
            elif accion == ECSDIAmazon.Tranferencia_pago:
                resultado_comunicacion = realizar_transferencia(
                    contenido, grafo, False)

    serialize = resultado_comunicacion.serialize(format="xml")
    return serialize, 200
def comunicacion():
    """
    Entrypoint de comunicacion del agente
    Simplementet retorna un objeto fijo que representa una
    respuesta a una busqueda de hotel

    Asumimos que se reciben siempre acciones que se refieren a lo que puede hacer
    el agente (buscar con ciertas restricciones, reservar)
    Las acciones se mandan siempre con un Request
    Prodriamos resolver las busquedas usando una performativa de Query-ref
    """
    global dsgraph
    global mss_cnt

    # Variables globales con los parametros de busqueda de actividades
    # Realmente creo que podrian ser locales...
    global location
    global activity
    global radius
    global tipo

    #logger.info('Peticion de informacion recibida')
    print 'INFO AgentBuscador=> Peticion de informacion recibida\n'

    # Extraemos el mensaje y creamos un grafo con el
    message = request.args['content']
    print "INFO AgentBuscador => Mensaje extraído\n"
    # VERBOSE
    print message
    print '\n\n'

    # Grafo en el que volcamos el contenido de la request
    gm = Graph()
    gm.parse(data=message)

    # Damos por supuesto que el sujeto es una peticion de actividad
    # En general habra que comprobar de que tipo es la peticion y hacer casos,
    # aunque creo que podemos poner todas las peticiones en un mosmo grafo
    # con diferentes sujetos (peticiones)

    # Propiedades del mensaje
    msgdic = get_message_properties(gm)
    # VERBOSE
    #print msgdic
    #print '\n\n'

    # Creo la lista de tipos con UN SOLO tipo
    # Habra que generalizar esto para mas de un tipo (o no)
    # Si lo hacemos, el planificador me tendra que pasar una list como parametro
    # VERBOSE
    #print "Lista append:"
    #print lista
    hotel = myns_pet.hotel
    busqueda = myns_pet.busqueda
    originCit = gm.value(subject= busqueda, predicate= myns_par.originCity)
    destinationCit = gm.value(subject= busqueda, predicate= myns_par.destinationCity)
    
    originVuelo="PRG"
    if str(originCit) == "Barcelona":
        originVuelo="BCN"
    elif str(originCit) == "Amsterdam":
        originVuelo="AMS"
    elif str(originCit) == "London":
        originVuelo="LON"
    elif str(originCit) == "Roma":
        originVuelo="ROM"
    elif str(originCit) == "Paris":
        originVuelo="PAR"

    destinationVuelo="BCN"
    destinationCountry="Spain"
    if str(destinationCit) == "Amsterdam":
        destinationVuelo="AMS"
        destinationCountry="Holland"
    elif str(destinationCit) == "London":
        destinationVuelo="LON"
        destinationCountry="United Kingdom"
    elif str(destinationCit) == "Roma":
        destinationVuelo="ROM"
        destinationCountry="Italy"
    elif str(destinationCit) == "Praha":
        destinationVuelo="PRG"
        destinationCountry="Czech Republic"
    elif str(destinationCit) == "Paris":
        destinationVuelo="PAR"
        destinationCountry="France"

    # Buscamos actividades en el metodo de AgentActividades
    print "INFO AgentBuscador => Looking for activities (in AgentActividades)..."

    actividadesInt = gm.triples((None, myns_atr.tipo, None))
    gactividades = Graph()

    for s,p, o in actividadesInt:
        print o
        gactividades += buscar_actividades(destinationCity=destinationCit, 
            destinationCountry= destinationCountry, types= [o])

    print "INFO AgentBuscador => Activities found"
    #VERBOSE
    #Imprimimos el grafo de resultados para ver que pinta tiene
    #Realmente solo queremos devolverlo al planificador
    # for s, p, o in gactividades:
    #     print 's: ' + s
    #     print 'p: ' + p
    #     print 'o: ' + o
    #     print '\n'

    print "Buscamos hoteles"    
    

    departureDat=gm.value(subject= busqueda, predicate= myns_par.departureDate)

    returnDat=gm.value(subject= busqueda, predicate= myns_par.returnDate)

    propertyCategor=gm.value(subject= busqueda, predicate= myns_par.propertyCategory)

    print "INFO AgentBuscador => Looking for hotels (in AgentHotel)..."
    ghoteles = buscar_hoteles(destinationCity = destinationCit,
                                destinationCountry = destinationCountry,
                               arrivalDate = departureDat,
                               departureDate = returnDat,
                               propertyCategory = propertyCategor)
    
    # Buscamos vuelos

    print "INFO AgentBuscador => Looking for flights (in AgentFlightsGoogle)..."
    maxPric=gm.value(subject= busqueda, predicate= myns_par.maxPrice)

    gvuelos = Graph()
    gvuelos = buscar_vuelos(origin=originVuelo, 
                            destination=destinationVuelo,
                            departureDate= departureDat, 
                            returnDate=returnDat,
                            maxPrice=maxPric)

    # Juntamos los tres grafos en una respuesta
    grespuesta = Graph()
    grespuesta = gvuelos + ghoteles + gactividades

    res_obj= agn['Buscador-responde']
    # Comprobamos que sea un mensaje FIPA ACL
    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(), ACL['not-understood'], sender=AgenteBuscador.uri, msgcnt=mss_cnt)
        print 'INFO AgentBuscador => El mensaje no era un FIPA ACL'
    else:
        # Obtenemos la performativa
        perf = msgdic['performative']

        if perf != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            print "INFO AgentBuscador => No es una request FIPA ACL\n"
            gr = build_message(Graph(), ACL['not-understood'], sender=AgenteBuscador.uri, msgcnt=mss_cnt)
        else:
            # Extraemos el objeto del contenido que ha de ser una accion de la ontologia de acciones del agente
            # de registro

            # Averiguamos el tipo de la accion
            if 'content' in msgdic:
                content = msgdic['content']
                accion = gm.value(subject=content, predicate=RDF.type)

            # Aqui realizariamos lo que pide la accion
            # Retornamos un Inform-done con el grafo del resultado de la busqueda (grespuesta)
            gr = build_message(grespuesta,
                ACL['inform-done'],
                sender=AgenteBuscador.uri,
                msgcnt=mss_cnt,
                receiver=msgdic['sender'], 
                content=res_obj
                )

        mss_cnt += 1

    print 'INFO AgentBuscador => Respondemos a la peticion de busqueda'
    return gr.serialize(format='xml')
def comunicacion():
    """
    Entrypoint de comunicacion
    """
    global dsgraph
    global mss_cnt

    print 'Peticion de informacion recibida\n'

    # Extraemos el mensaje y creamos un grafo con el
    message = request.args['content']
    print "Mensaje extraído\n"
    # VERBOSE
    print message
    print "\n\n"
    gm = Graph()
    gm.parse(data=message)
    print 'Grafo creado con el mensaje'

    msgdic = get_message_properties(gm)
    
    # Comprobamos que sea un mensaje FIPA ACL
    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(), ACL['not-understood'], sender=AgentePlanificador.uri, msgcnt=mss_cnt)
        print 'El mensaje no era un FIPA ACL'
    else:
        # Obtenemos la performativa
        perf = msgdic['performative']

        if perf != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            gr = build_message(Graph(), ACL['not-understood'], sender=AgentePlanificador.uri, msgcnt=mss_cnt)
        else:
            # Extraemos el objeto del contenido que ha de ser una accion de la ontologia de acciones del agente
            # de registro
            # Averiguamos el tipo de la accion
            # if 'content' in msgdic:
            #     content = msgdic['content']
            #     accion = gm.value(subject=content, predicate=RDF.type)

            # Apartir de aqui tenemos que obtener parametro desde dialog y luego comunicar con buscador
            ########################################################### 
            # Parsear los parametros de Dialog
            print "Parsear los parametros de Dialog"
            #############################################################
            peticion = myns_pet["Dialogador-pide-paquete"]
            parametros = gm.triples((peticion, None, None))
            # VERBOSE
            print "Parametros: "
            print parametros
            
            actv = myns_pet.actividad

            ########################################################### 
            # Comunicar con buscador
            print "Los parametros recibidos"
            #############################################################
            # departureDate="2015-08-20"
            # returnDate="2015-08-30"
            # maxPrice=500
            # originCity="Amsterdam"
            # destinationCity="Barcelona"
            # propertyCategory=1


            originCity = gm.value(subject= peticion, predicate= myns_atr.originCity)
            #gmess.add((actv, myns_atr.lugar, origin))
            # VERBOSE
            print "originCity: "
            print originCity

            departureDate = gm.value(subject= peticion, predicate= myns_atr.departureDate)
            #gmess.add((actv, myns_atr.lugar, departureDate))
            # VERBOSE
            print "departureDate: "
            print departureDate

            returnDate = gm.value(subject= peticion, predicate= myns_atr.returnDate)
            #gmess.add((actv, myns_atr.lugar, returnDate))
            # VERBOSE
            print "returnDate: "
            print returnDate

            maxPrice = float(gm.value(subject= peticion, predicate= myns_atr.maxPrice))
            #gmess.add((actv, myns_atr.lugar, maxPrice))
            # VERBOSE
            print "maxPrice: "
            print maxPrice

            propertyCategory = gm.value(subject= peticion, predicate= myns_atr.propertyCategory)
            #gmess.add((actv, myns_atr.lugar, numberOfStars))
            # VERBOSE
            print "propertyCategory: "
            print propertyCategory
            
            actividades = []
            actividadesInt = gm.triples((None, myns_atr.tipo, None))

            for s,p, o in actividadesInt:
                actividades.append(o)

            activity= gm.value(subject= peticion, predicate= myns_atr.activities)
            print "activity: "
            print activity
            actividades.append(activity)
            


            destinationCity=gm.value(subject= peticion, predicate= myns_atr.destinationCity)
            print "destinationCity: "
            print destinationCity

            # Graph para buscador
            gmess = Graph()
            gmess.bind('myns_pet', myns_pet)
            gmess.bind('myns_atr', myns_atr)

            ########################################################### 
            # Comunicar con buscador
            # print "Los parametros hardcoreado"
            #############################################################

            
            # actividades= [types.TYPE_MOVIE_THEATER, types.TYPE_CASINO, types.TYPE_MUSEUM]


            # departureDate="2015-08-20"
            # returnDate="2015-08-30"
            # maxPrice=500
            # originCity="Amsterdam"
            # destinationCity="Barcelona"
            # propertyCategory=1

            print departureDate

            ########################################################### 
            # Mejorar preferencia de busqueda
            print "Mejorar preferencia de busqueda"
            #############################################################

            ########################################################### 
            # Comunicar con buscador
            print "Iniciar la comunicaion con buscador"
            #############################################################
            
            # Hago bind de las ontologias que voy a usar en el grafo
            # Estas ontologias estan definidas arriba (abajo de los imports)
            # Son las de peticiones y atributos (para los predicados de la tripleta)

            # Sujeto de la tripleta: http://my.namespace.org/peticiones/actividad
            # O sea, el mensaje sera una peticion de actividad
            # El buscador tendra que ver que tipo de peticion es
            ########################################################### 
            # Comunicar con buscador
            print "Añadir parametros de actividad"
            #############################################################
            # Paso los parametros de busqueda de actividad en el grafo
            busqueda = myns_pet.busqueda
            i = 0
            for a in actividades:
                i+= 1
                actv = "actividad" + str(i)
                gmess.add((busqueda, myns_par.actividad, myns_act.actv))
                gmess.add((myns_act.actv, myns_atr.tipo, Literal(a)))
            
            i+= 1
            actv = "actividad" + str(i)
            gmess.add((busqueda, myns_par.actividad, myns_act.actv))
            gmess.add((myns_act.actv, myns_atr.tipo, Literal('restaurant')))
            
            ########################################################### 
            # Comunicar con buscador
            print "Añadir parametros de vuelo"
            #############################################################
            
            gmess.add((busqueda, myns_par.departureDate, Literal(departureDate)))
            gmess.add((busqueda, myns_par.returnDate, Literal(returnDate)))          
            gmess.add((busqueda, myns_par.maxPrice, Literal(maxPrice/3))) 

            ########################################################### 
            # Comunicar con buscador
            print "Añadir parametros de hotel"
            #############################################################
            hotel = myns_pet.hotel
            gmess.add((busqueda, myns_par.originCity, Literal(originCity)))
            gmess.add((busqueda, myns_par.destinationCity, Literal(destinationCity)))      
            gmess.add((busqueda, myns_par.propertyCategory, Literal(propertyCategory))) 

            # Uri asociada al mensaje sera: http://www.agentes.org#Planificador-pide-actividades
            res_obj= agn['Planificador-pide-datos']

            # Construyo el grafo y lo mando (ver los metodos send_message y build_message
            # en ACLMessages para entender mejor los parametros)
            print "INFO AgentePlanificador=> Sending request to AgenteBuscador\n"
            gr = send_message(build_message(gmess, 
                               perf=ACL.request, 
                               sender=AgentePlanificador.uri, 
                               receiver=AgenteBuscador.uri,
                               content=res_obj,
                               msgcnt=mss_cnt 
                               ),
                AgenteBuscador.address)
            print "Respuesta de busqueda recibida\n"
            
            # for s, p, o in grep:
            #     print 's: ' + s
            #     print 'p: ' + p
            #     print 'o: ' + o.encode('utf-8')
            #     print '\n'
            

            ########################################################### 
            # Calcular paquete
            print "Calcular paquete"
            #############################################################   

            grep = Graph()
            ########################################################### 
            # Calcular paquete
            print "Calcular Vuelos"
            #############################################################    
            gvuelo = Graph()
            for s,p,o in gr.triples((None, myns_atr.esUn, myns.viaje)):
                gvuelo += gr.triples((s, None, None) )

            gvueloid = gvuelo.query("""
                        PREFIX myns_atr: <http://my.namespace.org/atributos/>
                        SELECT DISTINCT ?a ?cuesta
                        WHERE{
                            ?a myns_atr:cuesta ?cuesta .
                            FILTER(str(?cuesta) != "")
                        }
                        ORDER BY (?cuesta)
                        LIMIT 1
                """)

            Aid = []
            cuestaVuelo = 0
            for s, c in gvueloid:
                print s
                Aid.append(s)
                cuestaVuelo = float(c[3:])

            maxPrice -= cuestaVuelo
            grep += gvuelo.triples((Aid[0], None, None))
            idgo = gr.value(subject= Aid[0], predicate= myns_atr.ida)
            idback = gr.value(subject= Aid[0], predicate= myns_atr.vuelta)

            grep += gr.triples((idgo,None, None))
            grep += gr.triples((idback, None, None))

            ########################################################### 
            # Calcular paquete
            print "Calcular Hotel"
            #############################################################    
            ghotel = Graph()
            for s,p,o in gr.triples((None, myns_atr.esUn, myns.hotel)):
                ghotel += gr.triples((s, None, None) )
            ghotelid = ghotel.query("""
                        PREFIX myns_atr: <http://my.namespace.org/atributos/>
                        SELECT DISTINCT ?a ?cuesta
                        WHERE{
                            ?a myns_atr:rating ?ratin .
                            ?a myns_atr:cuesta ?cuesta .
                            FILTER(str(?ratin) != "" && str(?cuesta) != "")
                            
                        }
                        ORDER BY DESC(?ratin) ?cuesta
                        LIMIT 1
                """)
            Aid = []
            cuestaHotel = 0
            for s, c in ghotelid:
                Aid.append(s)
                cuestaHotel = float(c)
            maxPrice -= cuestaHotel

            grep += ghotel.triples((Aid[0], None, None))


            #Actividades 
            ########################################################### 
            # Calcular paquete
            print "Calcular Actividades"
            #############################################################    
            gactividad = Graph()       
            for s,p,o in gr.triples((None, myns_atr.esUn, myns.actividad)):
                gactividad += gr.triples((s, None, None) )

            grestaurante = gactividad.query("""
                        PREFIX myns_atr: <http://my.namespace.org/atributos/>
                        SELECT DISTINCT ?a ?ratin ?tip
                        WHERE{
                            ?a myns_atr:rating ?ratin .
                            ?a myns_atr:tipo ?tip
                            FILTER(?tip = "restaurant")
                        }
                        ORDER BY DESC(?ratin)
                """)
            restaurant = []
            for g, r, t in grestaurante:
                restaurant.append(g)
            
            gnight = gactividad.query("""
                        PREFIX myns_atr: <http://my.namespace.org/atributos/>
                        SELECT DISTINCT ?a ?ratin ?tip
                        WHERE{
                            ?a myns_atr:rating ?ratin .
                            ?a myns_atr:tipo ?tip
                            FILTER
                                (?tip = "night_club" || 
                                 ?tip = "bar" ||
                                 ?tip = "casino"
                                 )
                        }
                        ORDER BY DESC(?ratin)
                """)
            
            night = []
            for g, r, t in gnight:
                night.append(g)
            print len(night)
            gday = gactividad.query("""
                        PREFIX myns_atr: <http://my.namespace.org/atributos/>
                        SELECT DISTINCT ?a ?ratin ?tip
                        WHERE{
                            ?a myns_atr:rating ?ratin .
                            ?a myns_atr:tipo ?tip
                        }
                        ORDER BY DESC(?ratin)
                """)
            daylist = []
            for g, r, t in gday:
                daylist.append(g)

            ########################################################### 
            # Escoger Actividades
            print "Escoger Actividades"
            #############################################################   
            day = datetime.strptime(departureDate, '%Y-%m-%d')
            cday = 0
            cnight = 0
            cres = 0
            rd = datetime.strptime(returnDate, '%Y-%m-%d')

            while day <= rd:
               # cada dia
                grfdata = myns_data.day

                if len(daylist) != 0:
                    # manana
                    grep.add((grfdata, myns_data.manana, daylist[cday%len(daylist)]))


                    grep += gactividad.triples((daylist[cday%len(daylist)], None, None))
                    
                    cday += 1;


                    grep.add((grfdata, myns_data.tarde, daylist[cday%len(daylist)]))

                    grep += gactividad.triples((daylist[cday%len(daylist)], None, None))
                    
                    cday += 1;

                # comida
                grep.add((grfdata, myns_data.comida, restaurant[cres%len(restaurant)]))

                grep += gactividad.triples((restaurant[cres%len(restaurant)], None, None))
                
                cres += 1;       
                # cena

                grep.add((grfdata, myns_data.cena, restaurant[cres%len(restaurant)]))

                grep += gactividad.triples((restaurant[cres%len(restaurant)], None, None))
                
                cres += 1;       
                # noche
                if len(night) != 0:
                    grep.add((grfdata, myns_data.noche, night[cnight%len(night)]))

                    grep += gactividad.triples((night[cnight%len(night)], None, None))
                    
                    cnight += 1;

                day = day + timedelta(days=1)


    ########################################################### 
    # Construir mensage de repuesta
    print "Construir mensage de repuesta"
    #############################################################
    # for s, p, o in grep:
    #     print 's: ' + s
    #     print 'p: ' + p
    #     print 'o: ' + o.encode('utf-8')
    #     print '\n'
    
    mss_cnt += 1

    print 'Respondemos a la peticion\n'
    ########################################################### 
    # Construir mensage de repuesta
    print "Retornar repuesta"
    #############################################################
    return grep.serialize(format='xml')
示例#31
0
def comunicacion():
    """
    Entrypoint de comunicacion
    """
    global dsgraph
    global mss_cnt

    # Extraemos el mensaje y creamos un grafo con el
    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    # Comprobamos que sea un mensaje FIPA ACL
    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(),
                           ACL['not-understood'],
                           sender=AgenteLogistico.uri,
                           msgcnt=mss_cnt)
    else:
        # Obtenemos la performativa
        perf = msgdic['performative']
        if perf != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            gr = build_message(Graph(),
                               ACL['not-understood'],
                               sender=AgenteLogistico.uri,
                               msgcnt=mss_cnt)
        else:
            # Extraemos el objeto del contenido que ha de ser una accion de la ontologia de acciones del agente
            # de registro
            # Averiguamos el tipo de la accion
            if 'content' in msgdic:
                content = msgdic['content']
                accion = gm.value(subject=content, predicate=RDF.type)
                # Aqui realizariamos lo que pide la accion

                if accion == AM2.Solicitud_envio:
                    logger.info("Petición de envio recibida")
                    productsInternos = Graph()
                    productsExternos = Graph()
                    # Productos recibidos
                    hayExterno = False
                    hayInterno = False
                    for s in gm.subjects(RDF.type, AM2["Producto"]):
                        tipoEnvio = gm.value(s, AM2.TipoEnvio)
                        if str(tipoEnvio) == 'Interno':
                            hayInterno = True
                            productsInternos += gm.triples((s, None, None))
                        else:
                            hayExterno = True
                            productsExternos += gm.triples((s, None, None))

                    if hayExterno and not hayInterno:
                        gr = confirmaEnvio(msgdic, productsExternos)
                        colaAvisarAgenteVendedorExterno(productsExternos)
                    else:
                        gmess = Graph()
                        sj_contenido = MSG[AgenteLogistico.name +
                                           '-Realiza_envio-' + str(mss_cnt)]
                        gmess.add((sj_contenido, RDF.type, AM2.Realiza_envio))
                        gmess += productsInternos
                        agenteAlmacen = directory_search_agent(
                            DSO.AgenteAlmacen, AgenteLogistico, DirectoryAgent,
                            mss_cnt)[0]
                        grm = build_message(gmess,
                                            perf=ACL.request,
                                            sender=AgenteLogistico.uri,
                                            receiver=agenteAlmacen.uri,
                                            content=sj_contenido,
                                            msgcnt=mss_cnt)
                        gr = send_message(grm, agenteAlmacen.address)
                        logger.info(
                            'Se ha informado al almacen que debe realizar envio'
                        )
                        if hayExterno:
                            gmess2 = Graph()
                            sj_contenido = MSG[
                                AgenteLogistico.name +
                                '-Confirmacion_envio_externo_interno-' +
                                str(mss_cnt)]
                            gmess2.add(
                                (sj_contenido, RDF.type,
                                 AM2.Confirmacion_envio_externo_interno))
                            gr = build_message(gmess2,
                                               ACL['inform-done'],
                                               sender=AgenteLogistico.uri,
                                               msgcnt=mss_cnt,
                                               content=sj_contenido,
                                               receiver=msgdic['sender'])
                            colaAvisarAgenteVendedorExterno(productsExternos)
                else:
                    gr = build_message(Graph(),
                                       ACL['not-understood'],
                                       sender=AgenteLogistico.uri,
                                       msgcnt=mss_cnt)
            else:
                gr = build_message(Graph(),
                                   ACL['not-understood'],
                                   sender=AgenteLogistico.uri,
                                   msgcnt=mss_cnt)

    mss_cnt += 1
    logger.info('Respondemos a la solicitud de envio')
    return gr.serialize(format='xml')
def register():
    """
    Entry point del agente que recibe los mensajes de registro
    La respuesta es enviada al retornar la funcion,
    no hay necesidad de enviar el mensaje explicitamente

    Asumimos una version simplificada del protocolo FIPA-request
    en la que no enviamos el mesaje Agree cuando vamos a responder

    :return:
    """

    def process_register():
        # Si la hay extraemos el nombre del agente (FOAF.Name), el URI del agente
        # su direccion y su tipo

        logger.info('Peticion de registro')

        agn_add = gm.value(subject=content, predicate=DSO.Address)
        agn_name = gm.value(subject=content, predicate=FOAF.Name)
        agn_uri = gm.value(subject=content, predicate=DSO.Uri)
        agn_type = gm.value(subject=content, predicate=DSO.AgentType)

        # Añadimos la informacion en el grafo de registro vinculandola a la URI
        # del agente y registrandola como tipo FOAF.Agent
        dsgraph.add((agn_uri, RDF.type, FOAF.Agent))
        dsgraph.add((agn_uri, FOAF.name, agn_name))
        dsgraph.add((agn_uri, DSO.Address, agn_add))
        dsgraph.add((agn_uri, DSO.AgentType, agn_type))

        # Generamos un mensaje de respuesta
        return build_message(Graph(),
            ACL.confirm,
            sender=DirectoryAgent.uri,
            receiver=agn_uri,
            msgcnt=mss_cnt)

    def process_search():
        # Asumimos que hay una accion de busqueda que puede tener
        # diferentes parametros en funcion de si se busca un tipo de agente
        # o un agente concreto por URI o nombre
        # Podriamos resolver esto tambien con un query-ref y enviar un objeto de
        # registro con variables y constantes

        # Solo consideramos cuando Search indica el tipo de agente
        # Buscamos una coincidencia exacta
        # Retornamos el primero de la lista de posibilidades

        logger.info('Peticion de busqueda')

        agn_type = gm.value(subject=content, predicate=DSO.AgentType)
        rsearch = dsgraph.triples((None, DSO.AgentType, agn_type))
        if rsearch is not None:
            agn_uri = rsearch.next()[0]
            agn_add = dsgraph.value(subject=agn_uri, predicate=DSO.Address)
            gr = Graph()
            gr.bind('dso', DSO)
            rsp_obj = agn['Directory-response']
            gr.add((rsp_obj, DSO.Address, agn_add))
            gr.add((rsp_obj, DSO.Uri, agn_uri))
            return build_message(gr,
                                 ACL.inform,
                                 sender=DirectoryAgent.uri,
                                 msgcnt=mss_cnt,
                                 receiver=agn_uri,
                                 content=rsp_obj)
        else:
            # Si no encontramos nada retornamos un inform sin contenido
            return build_message(Graph(),
                ACL.inform,
                sender=DirectoryAgent.uri,
                msgcnt=mss_cnt)

    global dsgraph
    global mss_cnt
    # Extraemos el mensaje y creamos un grafo con él
    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    # Comprobamos que sea un mensaje FIPA ACL
    if not msgdic:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(),
            ACL['not-understood'],
            sender=DirectoryAgent.uri,
            msgcnt=mss_cnt)
    else:
        # Obtenemos la performativa
        if msgdic['performative'] != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            gr = build_message(Graph(),
                ACL['not-understood'],
                sender=DirectoryAgent.uri,
                msgcnt=mss_cnt)
        else:
            # Extraemos el objeto del contenido que ha de ser una accion de la ontologia
            # de registro
            content = msgdic['content']
            # Averiguamos el tipo de la accion
            accion = gm.value(subject=content, predicate=RDF.type)

            # Accion de registro
            if accion == DSO.Register:
                gr = process_register()
            # Accion de busqueda
            elif accion == DSO.Search:
                gr = process_search()
            # No habia ninguna accion en el mensaje
            else:
                gr = build_message(Graph(),
                        ACL['not-understood'],
                        sender=DirectoryAgent.uri,
                        msgcnt=mss_cnt)
    mss_cnt += 1
    return gr.serialize(format='xml')
示例#33
0
def comunicacion():
    """
    Entrypoint de comunicacion
    """
    global dsgraph
    global mss_cnt

    message = request.args['content']
    print("requestargs")
    print(request.args['content'])
    gm = Graph()
    gm.parse(data=message)
    gr = None
    gcopia = gm

    msgdic = get_message_properties(gm)
    if msgdic is None:
        gr = build_message(
            Graph(),
            ACL['not-understood'],
            sender=AgentUtil.Agents.AgenteDistribuidorBultos.uri,
            msgcnt=mss_cnt)
    else:
        perf = msgdic['performative']
        if perf == ACL.request:
            if 'content' in msgdic:
                content = msgdic['content']
                email = gcopia.value(subject=content, predicate=ECSDI.email)
                gcopia.remove((content, ECSDI.email, None))
                urgencia = gcopia.value(subject=content,
                                        predicate=ECSDI.urgencia)
                gcopia.remove((content, ECSDI.urgencia, None))
                print("busqueda: " + email)

                for (su, pd, ob) in gcopia:
                    print("sujeto " + su)
                    print("predicado " + pd)
                    print("objeto " + ob)

                codigoPedido = random.randint(0, 999999999999)
                gclientes = cargar_grafo_turtle(AgentUtil.Agents.path_clientes)
                # sujetoCliente = gclientes.subjects(predicate=ECSDI.email, object=email)

                # print("----------------------------------")
                # print(sujetoCliente)
                # print(ECSDI.sujetoCliente)
                # print(ECSDI[sujetoCliente])
                # print(ECSDI['Cliente'+email])
                # print("----------------------------------")

                gpedidos = cargar_grafo_turtle(AgentUtil.Agents.path_pedidos)
                gpedidos.add((ECSDI['Pedido' + str(codigoPedido)], RDF.type,
                              Literal('Pedido')))
                gpedidos.add(
                    (ECSDI['Pedido' + str(codigoPedido)], ECSDI.codigo,
                     Literal(codigoPedido)))
                gpedidos.add(
                    (ECSDI['Pedido' + str(codigoPedido)], ECSDI.estado,
                     Literal(1)))
                gpedidos.add(
                    (ECSDI['Pedido' + str(codigoPedido)], ECSDI.prioridad,
                     Literal(urgencia)))

                for item in gclientes.subjects(predicate=ECSDI.email,
                                               object=email):
                    gpedidos.add((ECSDI['Pedido' + str(codigoPedido)],
                                  ECSDI.realizada_por, URIRef(item)))
                    ciudad = gclientes.value(subject=item,
                                             predicate=ECSDI.localizacion)

                gcentrosLogisticos = cargar_grafo_turtle(
                    AgentUtil.Agents.path_centrosLogisticos)
                # ciudad = gclientes.value(subject=sujetoCliente, predicate=ECSDI.localizacion)
                print("ciudad " + ciudad)
                # sujetoCentro = gcentrosLogisticos.subjects(predicate=ECSDI.localizacion, object=ciudad)

                gbultos = Graph()
                gbultos.bind('ecsdi', ECSDI)
                # if not sujetoCentro is None:
                for item1 in gcentrosLogisticos.subjects(
                        predicate=ECSDI.localizacion, object=ciudad):
                    print("he entrado en item 1")
                    l = []
                    for producto in gcopia.subjects(
                            predicate=RDF.type,
                            object=Literal('ProductoPropio')):
                        print("he entrado en for1 producto")
                        if (item1, ECSDI.dispone_de,
                                producto) in gcentrosLogisticos:
                            print("he entrado en anadir producto")
                            l.append(producto)
                            gcopia.remove((producto, None, None))
                    for producto in gcopia.subjects(
                            predicate=RDF.type,
                            object=Literal('ProductoAjenoEnvio')):
                        if (item1, ECSDI.dispone_de,
                                producto) in gcentrosLogisticos:
                            l.append(producto)
                            gcopia.remove((producto, None, None))
                    if not len(l) == 0:
                        print("he entrado en not len 0 1")
                        codigoBulto = random.randint(0, 999999999999)
                        gbultos.add(
                            (ECSDI['Bulto' + str(codigoBulto)], RDF.type,
                             Literal('BultoEnvio')))
                        gbultos.add(
                            (ECSDI['Bulto' + str(codigoBulto)], ECSDI.codigo,
                             Literal(codigoBulto)))
                        gbultos.add(
                            (ECSDI['Bulto' + str(codigoBulto)], ECSDI.estado,
                             Literal(1)))
                        gbultos.add((ECSDI['Bulto' + str(codigoBulto)],
                                     ECSDI.asignado_a, URIRef(item1)))
                        for producto in l:
                            gbultos.add(
                                (ECSDI['Bulto' + str(codigoBulto)],
                                 ECSDI.compuesto_por, URIRef(producto)))
                    gcentrosLogisticos.remove((item1, None, None))
                for centro in gcentrosLogisticos.subjects(
                        predicate=RDF.type, object=Literal('CentroLogistico')):
                    l = []
                    for producto in gcopia.subjects(
                            predicate=RDF.type,
                            object=Literal('ProductoPropio')):
                        if (centro, ECSDI.dispone_de,
                                producto) in gcentrosLogisticos:
                            l.append(producto)
                            gcopia.remove((producto, None, None))
                    for producto in gcopia.subjects(
                            predicate=RDF.type,
                            object=Literal('ProductoAjenoEnvio')):
                        if (centro, ECSDI.dispone_de,
                                producto) in gcentrosLogisticos:
                            l.append(producto)
                            gcopia.remove((producto, None, None))
                    if not len(l) == 0:
                        print("he entrado en not len 0 2")
                        codigoBulto = random.randint(0, 999999999999)
                        gbultos.add(
                            (ECSDI['Bulto' + str(codigoBulto)], RDF.type,
                             Literal('BultoEnvio')))
                        gbultos.add(
                            (ECSDI['Bulto' + str(codigoBulto)], ECSDI.codigo,
                             Literal(codigoBulto)))
                        gbultos.add(
                            (ECSDI['Bulto' + str(codigoBulto)], ECSDI.estado,
                             Literal(1)))
                        gbultos.add((ECSDI['Bulto' + str(codigoBulto)],
                                     ECSDI.asignado_a, URIRef(centro)))
                        for producto in l:
                            gbultos.add(
                                (ECSDI['Bulto' + str(codigoBulto)],
                                 ECSDI.compuesto_por, URIRef(producto)))

                for item2 in gbultos.subjects(predicate=RDF.type,
                                              object=Literal('BultoEnvio')):
                    gpedidos.add((ECSDI['Pedido' + str(codigoPedido)],
                                  ECSDI.compuesto_de, URIRef(item2)))

                # gpedidos.add((ECSDI['Pedido' + str(codigoPedido)], ECSDI.realizada_por, URIRef(str(sujetoCliente))))
                guardar_grafo_turtle(gpedidos, AgentUtil.Agents.path_pedidos)
                gbultosTotales = cargar_grafo_turtle(
                    AgentUtil.Agents.path_bultos)
                gbultosTotales += gbultos
                guardar_grafo_turtle(gbultosTotales,
                                     AgentUtil.Agents.path_bultos)

                gr = build_message(
                    Graph(),
                    ACL.agree,
                    sender=AgentUtil.Agents.AgenteDistribuidorBultos.uri)
            else:
                gr = build_message(
                    Graph(),
                    ACL['not-understood'],
                    sender=AgentUtil.Agents.AgenteDistribuidorBultos.uri,
                    msgcnt=mss_cnt)
    print("grafo")
    print(gr)
    # for sujeto in gr.subjects(predicate=ECSDI.tipo, object=Literal(criterios)):
    #     print("dentro chivato")
    #     variable = gr.value(subject=sujeto, predicate=ECSDI.nombre)
    #     print(variable)
    return gr.serialize(format='xml')
示例#34
0
def comunicacion():
    """
    Entrypoint de comunicacion del agente
    Simplemente retorna un objeto fijo que representa una
    respuesta a una busqueda de actividades

    Asumimos que se reciben siempre acciones que se refieren a lo que puede hacer
    el agente (buscar con ciertas restricciones, reservar)
    Las acciones se mandan siempre con un Request
    Prodriamos resolver las busquedas usando una performativa de Query-ref
    """
    global dsgraph
    global mss_cnt

    logger.info('Peticion de informacion recibida')

    # Extraemos el mensaje y creamos un grafo con el
    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    # Comprobamos que sea un mensaje FIPA ACL
    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(),
                           ACL['not-understood'],
                           sender=TravelServiceAgent.uri,
                           msgcnt=mss_cnt)
    else:
        # Obtenemos la performativa
        perf = msgdic['performative']

        if perf != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            gr = build_message(Graph(),
                               ACL['not-understood'],
                               sender=TravelServiceAgent.uri,
                               msgcnt=mss_cnt)
        else:
            # Extraemos el objeto del contenido que ha de ser una accion de la ontologia de acciones del agente
            # de registro
            # Averiguamos el tipo de la accion
            respuesta = Graph()
            if 'content' in msgdic:
                content = msgdic['content']
                accion = gm.value(subject=content, predicate=RDF.type)
                if accion == ECSDI.VIAJE:
                    c = gm.value(subject=content, predicate=ECSDI.City)
                    cultural = gm.value(subject=content,
                                        predicate=ECSDI.Cultural)
                    festivas = gm.value(subject=content,
                                        predicate=ECSDI.Festiva)
                    ludicas = gm.value(subject=content, predicate=ECSDI.Ludica)

                    solution = solver(c, cultural, festivas, ludicas)
                    for value in solution:
                        clave = value
                        valor = solution[value]
                        reg_obj = ECSDI[TravelServiceAgent.name + '-response' +
                                        value]
                        respuesta.add((reg_obj, RDF.type, ECSDI.ACTIVITY))
                        respuesta.add((reg_obj, ECSDI.Nombre,
                                       Literal(clave, datatype=XSD.string)))
                        respuesta.add((reg_obj, ECSDI.Tipo,
                                       Literal(valor, datatype=XSD.string)))
                    gr = build_message(
                        respuesta,
                        ACL['inform'],
                        sender=TravelServiceAgent.uri,
                        msgcnt=mss_cnt,
                        receiver=msgdic['sender'],
                    )
            else:
                gr = build_message(
                    Graph(),
                    ACL['inform'],
                    sender=TravelServiceAgent.uri,
                    msgcnt=mss_cnt,
                    receiver=msgdic['sender'],
                )

    logger.info('Respondemos a la peticion')
    mss_cnt += 1
    return gr.serialize(format='xml')
示例#35
0
def register():
    """
    Entry point del agente que recibe los mensajes de registro
    La respuesta es enviada al retornar la funcion,
    no hay necesidad de enviar el mensaje explicitamente

    Asumimos una version simplificada del protocolo FIPA-request
    en la que no enviamos el mesaje Agree cuando vamos a responder

    :return:
    """
    def process_register():
        # Si la hay extraemos el nombre del agente (FOAF.name), el URI del agente
        # su direccion y su tipo

        logger.info('Peticion de registro')
        directory[FOAF.name] = (DSO.AgentType, DSO.Uri,
                                time.strftime('%Y-%m-%d %H:%M'))
        agn_add = gm.value(subject=content, predicate=DSO.Address)
        agn_name = gm.value(subject=content, predicate=FOAF.name)
        agn_uri = gm.value(subject=content, predicate=DSO.Uri)
        agn_type = gm.value(subject=content, predicate=DSO.AgentType)

        # Añadimos la informacion en el grafo de registro vinculandola a la URI
        # del agente y registrandola como tipo FOAF.Agent
        dsgraph.add((agn_uri, RDF.type, FOAF.Agent))
        dsgraph.add((agn_uri, FOAF.name, agn_name))
        dsgraph.add((agn_uri, DSO.Address, agn_add))
        dsgraph.add((agn_uri, DSO.AgentType, agn_type))

        # Generamos un mensaje de respuesta
        return build_message(Graph(),
                             ACL.confirm,
                             sender=DirectoryAgent.uri,
                             receiver=agn_uri,
                             msgcnt=mss_cnt)

    def process_search():
        # Asumimos que hay una accion de busqueda que puede tener
        # diferentes parametros en funcion de si se busca un tipo de agente
        # o un agente concreto por URI o nombre
        # Podriamos resolver esto tambien con un query-ref y enviar un objeto de
        # registro con variables y constantes

        # Solo consideramos cuando Search indica el tipo de agente
        # Buscamos una coincidencia exacta
        # Retornamos el primero de la lista de posibilidades

        logger.info('Peticion de busqueda')

        agn_type = gm.value(subject=content, predicate=DSO.AgentType)
        rsearch = dsgraph.triples((None, DSO.AgentType, agn_type))
        if rsearch is not None:
            agn_uri = next(rsearch)[0]
            agn_add = dsgraph.value(subject=agn_uri, predicate=DSO.Address)
            agn_name = dsgraph.value(subject=agn_uri, predicate=FOAF.name)
            gr = Graph()
            gr.bind('dso', DSO)
            rsp_obj = agn['Directory-response']
            gr.add((rsp_obj, DSO.Address, agn_add))
            gr.add((rsp_obj, DSO.Uri, agn_uri))
            gr.add((rsp_obj, DSO.Name, agn_name))
            return build_message(gr,
                                 ACL.inform,
                                 sender=DirectoryAgent.uri,
                                 msgcnt=mss_cnt,
                                 receiver=agn_uri,
                                 content=rsp_obj)
        else:
            # Si no encontramos nada retornamos un inform sin contenido
            return build_message(Graph(),
                                 ACL.inform,
                                 sender=DirectoryAgent.uri,
                                 msgcnt=mss_cnt)

    global dsgraph
    global mss_cnt
    # Extraemos el mensaje y creamos un grafo con él
    message = request.args['content']
    gm = Graph()
    gm.parse(data=message)

    msgdic = get_message_properties(gm)

    # Comprobamos que sea un mensaje FIPA ACL
    if not msgdic:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(),
                           ACL['not-understood'],
                           sender=DirectoryAgent.uri,
                           msgcnt=mss_cnt)
    else:
        # Obtenemos la performativa
        if msgdic['performative'] != ACL.request:
            # Si no es un request, respondemos que no hemos entendido el mensaje
            gr = build_message(Graph(),
                               ACL['not-understood'],
                               sender=DirectoryAgent.uri,
                               msgcnt=mss_cnt)
        else:
            # Extraemos el objeto del contenido que ha de ser una accion de la ontologia
            # de registro
            content = msgdic['content']
            # Averiguamos el tipo de la accion
            accion = gm.value(subject=content, predicate=RDF.type)

            # Accion de registro
            if accion == DSO.Register:
                gr = process_register()
            # Accion de busqueda
            elif accion == DSO.Search:
                gr = process_search()
            # No habia ninguna accion en el mensaje
            else:
                gr = build_message(Graph(),
                                   ACL['not-understood'],
                                   sender=DirectoryAgent.uri,
                                   msgcnt=mss_cnt)
    mss_cnt += 1
    return gr.serialize(format='xml')