Beispiel #1
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)

    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(),
                           ACL['not-understood'],
                           sender=QualifierAgent.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.todo_accion:
                # TODO Tratar accion deseada
                return

            # No habia ninguna accion en el mensaje
            else:
                gr = build_message(Graph(),
                                   ACL['not-understood'],
                                   sender=DirectoryAgent.uri,
                                   msgcnt=get_count())

    logger.info('Respondemos a la peticion')

    return gr.serialize(format='xml')
def comunicacion():
    """
    Entrypoint de comunicacion del agente
    """

    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=ExternalTransportAgent2.uri,
                           msgcnt=mss_cnt)
    else:
        if msgdic['performative'] == ACL['accept-proposal']:
            logger.info('YEAH! Our offer has been acccepted! :D')
            return build_message(
                Graph(), perf=ACL.inform,
                sender=ExternalTransportAgent2.uri).serialize()

        if msgdic['performative'] == ACL['reject-proposal']:
            logger.info('Our offer has been rejected!')
            ExternalTransportAgent2.reset()
            return build_message(
                Graph(), perf=ACL.inform,
                sender=ExternalTransportAgent2.uri).serialize()

        if msgdic['performative'] == ACL['counter-proposal']:
            logger.info('Ask for counter proposal!')
            return counterproposal(gm, msgdic['content']).serialize()

        if msgdic['performative'] == ACL['call-for-proposal']:
            logger.info('Ask for proposal!')
            return proposal(gm, msgdic['content']).serialize()

        else:
            # Extraemos el objeto del contenido que ha de ser una accion de la ontologia
            # de registro
            return build_message(
                Graph(),
                ACL['not-understood'],
                sender=ExternalTransportAgent2.uri).serialize()

    return
def addProducto(request):
    nombreProducto = request.form['nombreProducto']
    tarjeta = request.form['tarjeta']
    descripcion = request.form['descripcionProducto']
    peso = request.form['peso']
    numeroUnidades = request.form['numeroUnidades']
    precio = request.form['precio']
    desdeCentros = False
    if len(request.form.getlist('lugarEnvio')) > 0 and request.form.getlist('lugarEnvio')[0] == 'envio':
        desdeCentros = True
    logger.info("Haciendo petición de agregar producto")
    sujeto = ECSDI["PeticionAgregarProducto" + str(getMessageCount())]
    graph = Graph()
    graph.add((sujeto, RDF.type, ECSDI.PeticionAgregarProducto))
    graph.add((sujeto, ECSDI.Nombre, Literal(nombreProducto, datatype=XSD.string)))
    graph.add((sujeto, ECSDI.Precio, Literal(precio, datatype=XSD.float)))
    graph.add((sujeto, ECSDI.Descripcion, Literal(descripcion, datatype=XSD.string)))
    graph.add((sujeto, ECSDI.Tarjeta, Literal(tarjeta, datatype=XSD.string)))
    graph.add((sujeto, ECSDI.DesdeCentros, Literal(desdeCentros, datatype=XSD.boolean)))
    graph.add((sujeto, ECSDI.UnidadesEnStock, Literal(numeroUnidades, datatype=XSD.int)))
    graph.add((sujeto, ECSDI.Peso, Literal(peso, datatype=XSD.float)))
    # Obtenemos la información del gestor externo
    agente = getAgentInfo(agn.GestorExterno, DirectoryAgent, VendedorPersonalAgent, getMessageCount())
    # Enviamos petición de agregar producto al gestor externo
    logger.info("Enviando petición de agregar producto")
    grafoBusqueda = send_message(
        build_message(graph, perf=ACL.request, sender=VendedorPersonalAgent.uri, receiver=agente.uri,
                      msgcnt=getMessageCount(),
                      content=sujeto), agente.address)
    logger.info("Enviada petición de agregar producto")
    return render_template('procesandoArticulo.html')
    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))

        logger.info('Registrado agente: ' + agn_name + ' - tipus:' + agn_type)

        # Generamos un mensaje de respuesta
        return build_message(Graph(),
                             ACL.confirm,
                             sender=DirectoryAgent.uri,
                             receiver=agn_uri,
                             msgcnt=mss_cnt)
def acceptOffer(offer):
    resp = send_message(
        build_message(Graph(),
                      ACL['accept-proposal'],
                      sender=TransportDealerAgent.uri), offer.address)
    msg = get_message_properties(resp)
    return msg['performative'] == ACL.inform
def browser_retorna():
    global compres
    if request.method == 'GET':
        logger.info('Mostramos las compras realizadas')
        count, counts = get_all_sells()
        return render_template('retorna.html', compres=compres, count=count, sizes=counts)
    else:
        logger.info('Empezamos el proceso de devolucion')
        sells_checked = []
        for item in request.form.getlist("checkbox"):
            sells_checked.append(compres[int(item)][0])

        logger.info("Creando la peticion de compra")
        g = Graph()
        content = ECSDI['Peticion_retorno_' + str(get_count())]
        g.add((content, RDF.type, ECSDI.Peticion_retorno))
        for item in sells_checked:
            g.add((content, ECSDI.CompraRetornada, URIRef(item)))

        seller = get_agent_info(agn.SellerAgent, DirectoryAgent, UserPersonalAgent, get_count())

        send_message(
            build_message(g, perf=ACL.request, sender=UserPersonalAgent.uri, receiver=seller.uri,
                          msgcnt=get_count(),
                          content=content), seller.address)

        return render_template('endRetorna.html')
Beispiel #7
0
def sendProducts(gr):
    logger.info('Enviamos los productos')

    content = ECSDI['Enviar_lot' + str(get_count())]
    gr.add((content, RDF.type, ECSDI.Enviar_lot))

    subjectLoteProducto = ECSDI['Lote_producto' +
                                str(random.randint(1, sys.float_info.max))]
    gr.add((subjectLoteProducto, RDF.type, ECSDI.Lote_producto))
    gr.add(
        (subjectLoteProducto, ECSDI.Prioridad, Literal(1,
                                                       datatype=XSD.integer)))

    for item in gr.subjects(RDF.type, ECSDI.Producto):
        gr.add((subjectLoteProducto, ECSDI.productos, URIRef(item)))

    gr.add((content, ECSDI.a_enviar, URIRef(subjectLoteProducto)))

    logistic = get_agent_info(agn.LogisticHubAgent, DirectoryAgent,
                              ProductsAgent, get_count())

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

    return gr
Beispiel #8
0
def requestAvailability(graph):
    logger.info('Comprobamos disponibilidad')
    content = ECSDI['Pedir_disponibilidad' + str(get_count())]

    graph.add((content, RDF.type, ECSDI.Pedir_disponibilidad))

    subjectExiste = ECSDI['Existencia_' + str(get_count())]
    graph.add((subjectExiste, RDF.type, ECSDI.Existencia))
    graph.add((subjectExiste, ECSDI.Cantidad, Literal(1,
                                                      datatype=XSD.integer)))

    for item in graph.subjects(RDF.type, ECSDI.Producto):
        graph.add((subjectExiste, ECSDI.Tiene, URIRef(item)))

    graph.add((content, ECSDI.Existe, URIRef(subjectExiste)))

    logistic = get_agent_info(agn.LogisticHubAgent, DirectoryAgent,
                              ProductsAgent, get_count())

    send_message(
        build_message(graph,
                      perf=ACL.request,
                      sender=ProductsAgent.uri,
                      receiver=logistic.uri,
                      msgcnt=get_count(),
                      content=content), logistic.address)
Beispiel #9
0
def browser_retorna():
    global compres
    if request.method == 'GET':
        logger.info('Mostramos las compras realizadas')
        count, counts = get_all_sells()
        return render_template('retorna.html',
                               compres=compres,
                               count=count,
                               sizes=counts)
    else:
        logger.info('Empezamos el proceso de devolucion')
        sells_checked = []
        for item in request.form.getlist("checkbox"):
            sells_checked.append(compres[int(item)][0])

        logger.info("Creando la peticion de compra")
        g = Graph()
        content = ECSDI['Peticion_retorno_' + str(get_count())]
        g.add((content, RDF.type, ECSDI.Peticion_retorno))
        for item in sells_checked:
            g.add((content, ECSDI.CompraRetornada, URIRef(item)))

        seller = get_agent_info(agn.SellerAgent, DirectoryAgent,
                                UserPersonalAgent, get_count())

        send_message(
            build_message(g,
                          perf=ACL.request,
                          sender=UserPersonalAgent.uri,
                          receiver=seller.uri,
                          msgcnt=get_count(),
                          content=content), seller.address)

        return render_template('endRetorna.html')
    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))

        logger.info('Registrado agente: ' + agn_name + ' - tipus:' + agn_type)

        # Generamos un mensaje de respuesta
        return build_message(Graph(),
                             ACL.confirm,
                             sender=DirectoryAgent.uri,
                             receiver=agn_uri,
                             msgcnt=mss_cnt)
Beispiel #11
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)

    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(), ACL['not-understood'], sender=QualifierAgent.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.todo_accion:
                # TODO Tratar accion deseada
                return

            # No habia ninguna accion en el mensaje
            else:
                gr = build_message(Graph(),
                                   ACL['not-understood'],
                                   sender=DirectoryAgent.uri,
                                   msgcnt=get_count())

    logger.info('Respondemos a la peticion')

    return gr.serialize(format='xml')
Beispiel #12
0
    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))
        gr = Graph()
        gr.bind('dso', DSO)
        bag = BNode()
        gr.add((bag, RDF.type, RDF.Bag))
        i = 0
        for agn_uri in rsearch:
            agn_add = dsgraph.value(subject=agn_uri[0], predicate=DSO.Address)
            agn_name = dsgraph.value(subject=agn_uri[0], predicate=FOAF.name)

            rsp_obj = agn['Directory-response' + str(i)]
            gr.add((rsp_obj, DSO.Address, agn_add))
            gr.add((rsp_obj, DSO.Uri, agn_uri[0]))
            gr.add((rsp_obj, FOAF.name, agn_name))
            gr.add((bag,
                    URIRef(u'http://www.w3.org/1999/02/22-rdf-syntax-ns#_' +
                           str(i)), rsp_obj))
            i += 1
            logger.info("Agente encontrado: " + agn_name)

        if rsearch is not None:
            return build_message(gr,
                                 ACL.inform,
                                 sender=DirectoryAgent.uri,
                                 msgcnt=mss_cnt,
                                 content=bag)
        else:
            # Si no encontramos nada retornamos un inform sin contenido
            return build_message(Graph(),
                                 ACL.inform,
                                 sender=DirectoryAgent.uri,
                                 msgcnt=mss_cnt)
Beispiel #13
0
def browser_registrarProducto():
    """
    Permite la comunicacion con el agente via un navegador
    via un formulario
    """
    if request.method == 'GET':
        return render_template('registerProduct.html')
    else:
        marca = request.form['marca']
        nom = request.form['nom']
        model = request.form['model']
        preu = request.form['preu']
        peso = request.form['peso']
        vendido = 0

        # Content of the message
        content = ECSDI['Registra_productes_' + str(get_count())]

        # Graph creation
        gr = Graph()
        gr.add((content, RDF.type, ECSDI.Registra_productes))

        # Anadir nuevo producto externo al grafo

        subjectProd = ECSDI['Producto_externo_' +
                            str(random.randint(1, sys.float_info.max))]

        gr.add((subjectProd, RDF.type, ECSDI.Producto_externo))
        gr.add((subjectProd, ECSDI.Nombre, Literal(nom, datatype=XSD.string)))
        gr.add((subjectProd, ECSDI.Marca, Literal(marca, datatype=XSD.string)))
        gr.add((subjectProd, ECSDI.Modelo, Literal(model,
                                                   datatype=XSD.string)))
        gr.add((subjectProd, ECSDI.Precio, Literal(preu, datatype=XSD.float)))
        gr.add((subjectProd, ECSDI.Peso, Literal(peso, datatype=XSD.float)))
        gr.add((subjectProd, ECSDI.Vendido, Literal(vendido)))

        gr.add((content, ECSDI.producto, subjectProd))

        productsag = get_agent_info(agn.ProductsAgent, DirectoryAgent,
                                    ExternalSellerPersonalAgent, get_count())

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

        res = {
            'marca': request.form['marca'],
            'nom': request.form['nom'],
            'model': request.form['model'],
            'preu': request.form['preu'],
            'peso': request.form['peso']
        }

        return render_template('endRegister.html', product=res)
    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))
        gr = Graph()
        gr.bind('dso', DSO)
        bag = BNode()
        gr.add((bag, RDF.type, RDF.Bag))
        i = 0
        for agn_uri in rsearch:
            agn_add = dsgraph.value(subject=agn_uri[0], predicate=DSO.Address)
            agn_name = dsgraph.value(subject=agn_uri[0], predicate=FOAF.name)

            rsp_obj = agn['Directory-response' + str(i)]
            gr.add((rsp_obj, DSO.Address, agn_add))
            gr.add((rsp_obj, DSO.Uri, agn_uri[0]))
            gr.add((rsp_obj, FOAF.name, agn_name))
            gr.add((bag, URIRef(u'http://www.w3.org/1999/02/22-rdf-syntax-ns#_' + str(i)), rsp_obj))
            i += 1
            logger.info("Agente encontrado: " + agn_name)

        if rsearch is not None:
            return build_message(gr,
                                 ACL.inform,
                                 sender=DirectoryAgent.uri,
                                 msgcnt=mss_cnt,
                                 content=bag)
        else:
            # Si no encontramos nada retornamos un inform sin contenido
            return build_message(Graph(),
                                 ACL.inform,
                                 sender=DirectoryAgent.uri,
                                 msgcnt=mss_cnt)
def comunicacion():
    """
    Entrypoint de comunicacion del agente
    """

    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=ExternalTransportAgent1.uri,
                           msgcnt=mss_cnt)
    else:
        if msgdic['performative'] == ACL['accept-proposal']:
            logger.info('YEAH! Our offer has been acccepted! :D')
            return build_message(Graph(), perf=ACL.inform, sender=ExternalTransportAgent1.uri).serialize()

        if msgdic['performative'] == ACL['reject-proposal']:
            logger.info('Our offer has been rejected!')
            ExternalTransportAgent1.reset()
            return build_message(Graph(), perf=ACL.inform, sender=ExternalTransportAgent1.uri).serialize()

        if msgdic['performative'] == ACL['counter-proposal']:
            return counterproposal(gm, msgdic['content']).serialize()

        if msgdic['performative'] == ACL['call-for-proposal']:
            logger.info('Ask for proposal!')
            return proposal(gm, msgdic['content']).serialize()


        else:
            # Extraemos el objeto del contenido que ha de ser una accion de la ontologia
            # de registro
            return build_message(Graph(),
                                 ACL['not-understood'],
                                 sender=ExternalTransportAgent1.uri).serialize()

    return
Beispiel #16
0
def payDelivery(sell_url):
    content = ECSDI['Peticion_transferencia_' + str(get_count())]
    graph = Graph()
    graph.add((content, RDF.type, ECSDI.Peticion_transferencia))
    graph.add((content, ECSDI.idCompra, URIRef(sell_url)))

    bank = get_agent_info(agn.BankAgent, DirectoryAgent, FinancialAgent, get_count())

    gr = send_message(
        build_message(graph, perf=ACL.request, sender=FinancialAgent.uri, receiver=bank.uri,
                      msgcnt=get_count(),
                      content=content), bank.address)
    return gr
    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)
            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, FOAF.name, agn_name))
            logger.info("Agente encontrado: " + 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)
Beispiel #18
0
def returnSell(gm, sell):
    logger.info('Nos comunicamos con el ProductsAgent')
    content = ECSDI['Recoger_venta_' + str(get_count())]

    gm.add((content, RDF.type, ECSDI.Recoger_venta))
    for item in sell:
        gm.add((content, ECSDI.compra_a_retornar, URIRef(item)))

    logistic = get_agent_info(agn.LogisticHubAgent, DirectoryAgent, FinancialAgent, get_count())

    gr = send_message(
        build_message(gm, perf=ACL.request, sender=FinancialAgent.uri, receiver=logistic.uri,
                      msgcnt=get_count(),
                      content=content), logistic.address)
    return gr
Beispiel #19
0
def sendSell(gm, sell):
    logger.info('Nos comunicamos con el ProductsAgent')
    content = ECSDI['Enviar_venta_' + str(get_count())]

    gm.add((content, RDF.type, ECSDI.Enviar_venta))
    gm.add((content, ECSDI.identificador_Compra, URIRef(sell)))

    products = get_agent_info(agn.ProductsAgent, DirectoryAgent, FinancialAgent, get_count())

    gr = send_message(
        build_message(gm, perf=ACL.request, sender=FinancialAgent.uri, receiver=products.uri,
                      msgcnt=get_count(),
                      content=content), products.address)

    return gr
def browser_registrarProducto():
    """
    Permite la comunicacion con el agente via un navegador
    via un formulario
    """
    if request.method == 'GET':
        return render_template('registerProduct.html')
    else:
        marca = request.form['marca']
        nom = request.form['nom']
        model = request.form['model']
        preu = request.form['preu']
        peso = request.form['peso']
        vendido = 0

        # Content of the message
        content = ECSDI['Registra_productes_' + str(get_count())]

        # Graph creation
        gr = Graph()
        gr.add((content, RDF.type, ECSDI.Registra_productes))

        # Anadir nuevo producto externo al grafo

        subjectProd = ECSDI['Producto_externo_' + str(random.randint(1, sys.float_info.max))]

        gr.add((subjectProd, RDF.type, ECSDI.Producto_externo))
        gr.add((subjectProd, ECSDI.Nombre, Literal(nom, datatype=XSD.string)))
        gr.add((subjectProd, ECSDI.Marca, Literal(marca, datatype=XSD.string)))
        gr.add((subjectProd, ECSDI.Modelo, Literal(model, datatype=XSD.string)))
        gr.add((subjectProd, ECSDI.Precio, Literal(preu, datatype=XSD.float)))
        gr.add((subjectProd, ECSDI.Peso, Literal(peso, datatype=XSD.float)))
        gr.add((subjectProd, ECSDI.Vendido, Literal(vendido)))

        gr.add((content, ECSDI.producto, subjectProd))

        productsag = get_agent_info(agn.ProductsAgent, DirectoryAgent, ExternalSellerPersonalAgent, get_count())

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

        res = {'marca': request.form['marca'], 'nom': request.form['nom'], 'model': request.form['model'],
               'preu': request.form['preu'], 'peso': request.form['peso']}

        return render_template('endRegister.html', product=res)
def counter_offer(offer):
    logger.info('Asking counter-offer to ' + offer.address)
    gr = Graph()
    subject = ECSDI['contra-oferta']
    gr.add((subject, RDF.type, ECSDI.Contraoferta))
    new_price = offer.price - 2
    gr.add((subject, ECSDI.Precio_envio, Literal(new_price)))
    resp = send_message(build_message(gr, ACL['counter-proposal'], content=subject, sender=TransportDealerAgent.uri),
                        offer.address)
    msg = get_message_properties(resp)
    if 'performative' not in msg or msg['performative'] == ACL.refuse:
        logger.warn('An agent rejected us :(')
        return None
    elif msg['performative'] == ACL.agree:
        return Offer(address=offer.address, price=new_price)
    else:
        logger.error('I can\'t understand:(')
        return None
def requestOffer(agent, peso, fecha, destino):
    gr = Graph()
    subject = ECSDI['peticion-oferta']
    gr.add((subject, RDF.type, ECSDI.Pedir_oferta_transporte))
    gr.add((subject, ECSDI.Destino, Literal(destino)))
    gr.add((subject, ECSDI.Plazo_maximo_entrega, Literal(fecha)))
    gr.add((subject, ECSDI.Peso_envio, Literal(peso)))
    resp = send_message(build_message(gr, ACL['call-for-proposal'], content=subject, receiver=agent.uri,
                                      sender=TransportDealerAgent.uri), agent.address)
    msg = get_message_properties(resp)
    if 'performative' not in msg or msg['performative'] == ACL.refuse:
        logger.warn('An agent rejected us :(')
        return None
    elif msg['performative'] == ACL.propose:
        precio = resp.value(msg['content'], ECSDI.Precio_envio)
        return Offer(address=agent.address, price=precio.toPython())
    logger.error('I can\'t understand:(')
    return None
def requestTransport(date, peso):
    logger.info('Pedimos el transporte')

    # Content of the message
    content = ECSDI['Peticiona_transport_' + str(get_count())]

    # Graph creation
    gr = Graph()
    gr.add((content, RDF.type, ECSDI.Peticiona_transport))

    # Anadir fecha y peso
    gr.add((content, ECSDI.Fecha, Literal(date, datatype=XSD.float)))
    gr.add((content, ECSDI.Peso_envio, Literal(peso, datatype=XSD.float)))

    TransportAg = get_agent_info(agn.TransportDealerAgent, DirectoryAgent, LogisticHubAgent, get_count())

    gr = send_message(
        build_message(gr, perf=ACL.request, sender=LogisticHubAgent.uri, receiver=TransportAg.uri,
                      msgcnt=get_count(),
                      content=content), TransportAg.address)
def counter_offer(offer):
    logger.info('Asking counter-offer to ' + offer.address)
    gr = Graph()
    subject = ECSDI['contra-oferta']
    gr.add((subject, RDF.type, ECSDI.Contraoferta))
    new_price = offer.price - 2
    gr.add((subject, ECSDI.Precio_envio, Literal(new_price)))
    resp = send_message(
        build_message(gr,
                      ACL['counter-proposal'],
                      content=subject,
                      sender=TransportDealerAgent.uri), offer.address)
    msg = get_message_properties(resp)
    if 'performative' not in msg or msg['performative'] == ACL.refuse:
        logger.warn('An agent rejected us :(')
        return None
    elif msg['performative'] == ACL.agree:
        return Offer(address=offer.address, price=new_price)
    else:
        logger.error('I can\'t understand:(')
        return None
def requestOffer(agent, peso, fecha, destino):
    gr = Graph()
    subject = ECSDI['peticion-oferta']
    gr.add((subject, RDF.type, ECSDI.Pedir_oferta_transporte))
    gr.add((subject, ECSDI.Destino, Literal(destino)))
    gr.add((subject, ECSDI.Plazo_maximo_entrega, Literal(fecha)))
    gr.add((subject, ECSDI.Peso_envio, Literal(peso)))
    resp = send_message(
        build_message(gr,
                      ACL['call-for-proposal'],
                      content=subject,
                      receiver=agent.uri,
                      sender=TransportDealerAgent.uri), agent.address)
    msg = get_message_properties(resp)
    if 'performative' not in msg or msg['performative'] == ACL.refuse:
        logger.warn('An agent rejected us :(')
        return None
    elif msg['performative'] == ACL.propose:
        precio = resp.value(msg['content'], ECSDI.Precio_envio)
        return Offer(address=agent.address, price=precio.toPython())
    logger.error('I can\'t understand:(')
    return None
Beispiel #26
0
def requestTransport(date, peso):
    logger.info('Pedimos el transporte')

    # Content of the message
    content = ECSDI['Peticiona_transport_' + str(get_count())]

    # Graph creation
    gr = Graph()
    gr.add((content, RDF.type, ECSDI.Peticiona_transport))

    # Anadir fecha y peso
    gr.add((content, ECSDI.Fecha, Literal(date, datatype=XSD.float)))
    gr.add((content, ECSDI.Peso_envio, Literal(peso, datatype=XSD.float)))

    TransportAg = get_agent_info(agn.TransportDealerAgent, DirectoryAgent,
                                 LogisticHubAgent, get_count())

    gr = send_message(
        build_message(gr,
                      perf=ACL.request,
                      sender=LogisticHubAgent.uri,
                      receiver=TransportAg.uri,
                      msgcnt=get_count(),
                      content=content), TransportAg.address)
Beispiel #27
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)

    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(),
                           ACL['not-understood'],
                           sender=BankAgent.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:
            # 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=BankAgent.uri,
                                   msgcnt=get_count())
            else:
                # Extraemos el objeto del contenido que ha de ser una accion de la ontologia de acciones del agente
                # de registro
                content = msgdic['content']
                # Averiguamos el tipo de la accion
                accion = gm.value(subject=content, predicate=RDF.type)

                # Accion de transferencia
                if accion == ECSDI.Peticion_transferencia:
                    # Content of the message
                    for item in gm.subjects(RDF.type, ACL.FipaAclMessage):
                        gm.remove((item, None, None))
                    gr = gm
                    logger.info('Se acepta la transferencia')

                # No habia ninguna accion en el mensaje
                else:
                    gr = build_message(Graph(),
                                       ACL['not-understood'],
                                       sender=DirectoryAgent.uri,
                                       msgcnt=get_count())

    logger.info('Respondemos a la peticion')

    return gr.serialize(format='xml'), 200
Beispiel #28
0
def communication():
    global dsgraph
    gr = None

    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=ProductsAgent.uri,
                           msgcnt=get_count())
    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=ProductsAgent.uri,
                               msgcnt=get_count())
        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)

            # Aqui realizariamos lo que pide la accion

            if accion == ECSDI.Registra_productes:
                gr = recordExternalProduct(gm)

            elif accion == ECSDI.Enviar_venta:
                logger.info("Recibe comunicación del FinancialAgent")

                products = obtainProducts(gm)
                requestAvailability(products)

                products = obtainProducts(gm)
                gr = sendProducts(products)

            # No habia ninguna accion en el mensaje
            else:
                gr = build_message(Graph(),
                                   ACL['not-understood'],
                                   sender=DirectoryAgent.uri,
                                   msgcnt=get_count())

    logger.info('Respondemos a la peticion')

    return gr.serialize(format='xml'), 200
def browser_cerca():
    """
    Permite la comunicacion con el agente via un navegador
    via un formulario
    """

    global product_list
    if request.method == 'GET':
        return render_template('cerca.html', products=None)
    elif request.method == 'POST':
        # Peticio de cerca
        if request.form['submit'] == 'Cerca':
            logger.info("Enviando peticion de busqueda")

            # Content of the message
            contentResult = ECSDI['Cerca_productes_' + str(get_count())]

            # Graph creation
            gr = Graph()
            gr.add((contentResult, RDF.type, ECSDI.Cerca_productes))

            # Add restriccio nom
            nom = request.form['nom']
            if nom:
                # Subject nom
                subject_nom = ECSDI['RestriccioNom' + str(get_count())]
                gr.add((subject_nom, RDF.type, ECSDI.RestriccioNom))
                gr.add((subject_nom, ECSDI.Nom, Literal(nom, datatype=XSD.string)))
                # Add restriccio to content
                gr.add((contentResult, ECSDI.Restringe, URIRef(subject_nom)))
            marca = request.form['marca']
            if marca:
                subject_marca = ECSDI['Restriccion_Marca_' + str(get_count())]
                gr.add((subject_marca, RDF.type, ECSDI.Restriccion_Marca))
                gr.add((subject_marca, ECSDI.Marca, Literal(marca, datatype=XSD.string)))
                gr.add((contentResult, ECSDI.Restringe, URIRef(subject_marca)))
            min_price = request.form['min_price']
            max_price = request.form['max_price']

            if min_price or max_price:
                subject_preus = ECSDI['Restriccion_Preus_' + str(get_count())]
                gr.add((subject_preus, RDF.type, ECSDI.Rango_precio))
                if min_price:
                    gr.add((subject_preus, ECSDI.Precio_min, Literal(min_price)))
                if max_price:
                    gr.add((subject_preus, ECSDI.Precio_max, Literal(max_price)))
                gr.add((contentResult, ECSDI.Restringe, URIRef(subject_preus)))

            seller = get_agent_info(agn.SellerAgent, DirectoryAgent, UserPersonalAgent, get_count())

            gr2 = send_message(
                build_message(gr, perf=ACL.request, sender=UserPersonalAgent.uri, receiver=seller.uri,
                              msgcnt=get_count(),
                              content=contentResult), seller.address)

            index = 0
            subject_pos = {}
            product_list = []
            for s, p, o in gr2:
                if s not in subject_pos:
                    subject_pos[s] = index
                    product_list.append({})
                    index += 1
                if s in subject_pos:
                    subject_dict = product_list[subject_pos[s]]
                    if p == RDF.type:
                        subject_dict['url'] = s
                    elif p == ECSDI.Marca:
                        subject_dict['marca'] = o
                    elif p == ECSDI.Modelo:
                        subject_dict['modelo'] = o
                    elif p == ECSDI.Precio:
                        subject_dict['precio'] = o
                    elif p == ECSDI.Nombre:
                        subject_dict['nombre'] = o
                    elif p == ECSDI.Peso:
                        subject_dict['peso'] = o
                    product_list[subject_pos[s]] = subject_dict

            return render_template('cerca.html', products=product_list)

        # --------------------------------------------------------------------------------------------------------------

        # Peticio de compra
        elif request.form['submit'] == 'Comprar':
            products_checked = []
            for item in request.form.getlist("checkbox"):
                item_checked = []
                item_map = product_list[int(item)]
                item_checked.append(item_map['marca'])
                item_checked.append(item_map['modelo'])
                item_checked.append(item_map['nombre'])
                item_checked.append(item_map['precio'])
                item_checked.append(item_map['url'])
                item_checked.append(item_map['peso'])
                products_checked.append(item_checked)

            logger.info("Creando la peticion de compra")

            # Content of the message
            content = ECSDI['Peticion_compra_' + str(get_count())]

            # Graph creation
            gr = Graph()
            gr.add((content, RDF.type, ECSDI.Peticion_compra))

            # Asignar prioridad a la peticion (asignamos el contador de mensaje)
            gr.add((content, ECSDI.Prioridad, Literal(get_count(), datatype=XSD.integer)))

            # Creacion de la ciudad (por ahora Barcelona) --------------------------------------------------------------
            subject_ciudad = ECSDI['Ciudad_' + str(random.randint(1, sys.float_info.max))]

            gr.add((subject_ciudad, RDF.type, ECSDI.Ciudad))
            gr.add((subject_ciudad, ECSDI.Nombre, Literal(41.398373, datatype=XSD.float)))
            gr.add((subject_ciudad, ECSDI.Latitud, Literal(2.188247, datatype=XSD.float)))
            gr.add((subject_ciudad, ECSDI.Longitud, Literal('Barcelona', datatype=XSD.string)))

            # Creacion del sobre (Compra) ------------------------------------------------------------------------------
            subject_sobre = ECSDI['Compra_' + str(random.randint(1, sys.float_info.max))]
            gr.add((subject_sobre, RDF.type, ECSDI.Compra))

            gr.add((subject_sobre, ECSDI.Pagat, Literal(0, datatype=XSD.integer)))
            gr.add((subject_sobre, ECSDI.Enviar_a, URIRef(subject_ciudad)))

            total_price = 0.0

            for item in products_checked:
                total_price += float(item[3])
                # Creacion del producto --------------------------------------------------------------------------------
                subject_producto = item[4]
                gr.add((subject_producto, RDF.type, ECSDI.Producto))
                gr.add((subject_producto, ECSDI.Marca, Literal(item[0], datatype=XSD.string)))
                gr.add((subject_producto, ECSDI.Modelo, Literal(item[1], datatype=XSD.string)))
                gr.add((subject_producto, ECSDI.Nombre, Literal(item[2], datatype=XSD.string)))
                gr.add((subject_producto, ECSDI.Precio, Literal(item[3], datatype=XSD.float)))
                gr.add((subject_producto, ECSDI.Peso, Literal(item[5], datatype=XSD.float)))
                gr.add((subject_sobre, ECSDI.Productos, URIRef(subject_producto)))

            gr.add((subject_sobre, ECSDI.Precio_total, Literal(total_price, datatype=XSD.float)))

            gr.add((content, ECSDI.Sobre, URIRef(subject_sobre)))

            seller = get_agent_info(agn.SellerAgent, DirectoryAgent, UserPersonalAgent, get_count())

            answer = send_message(
                build_message(gr, perf=ACL.request, sender=UserPersonalAgent.uri, receiver=seller.uri,
                              msgcnt=get_count(),
                              content=content), seller.address)

            products_matrix = []
            for item in answer.subjects(RDF.type, ECSDI.Producto):
                product = [answer.value(subject=item, predicate=ECSDI.Marca),
                           answer.value(subject=item, predicate=ECSDI.Modelo),
                           answer.value(subject=item, predicate=ECSDI.Nombre),
                           answer.value(subject=item, predicate=ECSDI.Precio)]
                products_matrix.append(product)

            return render_template('endSell.html', products=products_matrix)
Beispiel #30
0
def browser_cerca():
    """
    Permite la comunicacion con el agente via un navegador
    via un formulario
    """

    global product_list
    if request.method == 'GET':
        return render_template('cerca.html', products=None)
    elif request.method == 'POST':
        # Peticio de cerca
        if request.form['submit'] == 'Cerca':
            logger.info("Enviando peticion de busqueda")

            # Content of the message
            contentResult = ECSDI['Cerca_productes_' + str(get_count())]

            # Graph creation
            gr = Graph()
            gr.add((contentResult, RDF.type, ECSDI.Cerca_productes))

            # Add restriccio nom
            nom = request.form['nom']
            if nom:
                # Subject nom
                subject_nom = ECSDI['RestriccioNom' + str(get_count())]
                gr.add((subject_nom, RDF.type, ECSDI.RestriccioNom))
                gr.add(
                    (subject_nom, ECSDI.Nom, Literal(nom,
                                                     datatype=XSD.string)))
                # Add restriccio to content
                gr.add((contentResult, ECSDI.Restringe, URIRef(subject_nom)))
            marca = request.form['marca']
            if marca:
                subject_marca = ECSDI['Restriccion_Marca_' + str(get_count())]
                gr.add((subject_marca, RDF.type, ECSDI.Restriccion_Marca))
                gr.add((subject_marca, ECSDI.Marca,
                        Literal(marca, datatype=XSD.string)))
                gr.add((contentResult, ECSDI.Restringe, URIRef(subject_marca)))
            min_price = request.form['min_price']
            max_price = request.form['max_price']

            if min_price or max_price:
                subject_preus = ECSDI['Restriccion_Preus_' + str(get_count())]
                gr.add((subject_preus, RDF.type, ECSDI.Rango_precio))
                if min_price:
                    gr.add(
                        (subject_preus, ECSDI.Precio_min, Literal(min_price)))
                if max_price:
                    gr.add(
                        (subject_preus, ECSDI.Precio_max, Literal(max_price)))
                gr.add((contentResult, ECSDI.Restringe, URIRef(subject_preus)))

            seller = get_agent_info(agn.SellerAgent, DirectoryAgent,
                                    UserPersonalAgent, get_count())

            gr2 = send_message(
                build_message(gr,
                              perf=ACL.request,
                              sender=UserPersonalAgent.uri,
                              receiver=seller.uri,
                              msgcnt=get_count(),
                              content=contentResult), seller.address)

            index = 0
            subject_pos = {}
            product_list = []
            for s, p, o in gr2:
                if s not in subject_pos:
                    subject_pos[s] = index
                    product_list.append({})
                    index += 1
                if s in subject_pos:
                    subject_dict = product_list[subject_pos[s]]
                    if p == RDF.type:
                        subject_dict['url'] = s
                    elif p == ECSDI.Marca:
                        subject_dict['marca'] = o
                    elif p == ECSDI.Modelo:
                        subject_dict['modelo'] = o
                    elif p == ECSDI.Precio:
                        subject_dict['precio'] = o
                    elif p == ECSDI.Nombre:
                        subject_dict['nombre'] = o
                    elif p == ECSDI.Peso:
                        subject_dict['peso'] = o
                    product_list[subject_pos[s]] = subject_dict

            return render_template('cerca.html', products=product_list)

        # --------------------------------------------------------------------------------------------------------------

        # Peticio de compra
        elif request.form['submit'] == 'Comprar':
            products_checked = []
            for item in request.form.getlist("checkbox"):
                item_checked = []
                item_map = product_list[int(item)]
                item_checked.append(item_map['marca'])
                item_checked.append(item_map['modelo'])
                item_checked.append(item_map['nombre'])
                item_checked.append(item_map['precio'])
                item_checked.append(item_map['url'])
                item_checked.append(item_map['peso'])
                products_checked.append(item_checked)

            logger.info("Creando la peticion de compra")

            # Content of the message
            content = ECSDI['Peticion_compra_' + str(get_count())]

            # Graph creation
            gr = Graph()
            gr.add((content, RDF.type, ECSDI.Peticion_compra))

            # Asignar prioridad a la peticion (asignamos el contador de mensaje)
            gr.add((content, ECSDI.Prioridad,
                    Literal(get_count(), datatype=XSD.integer)))

            # Creacion de la ciudad (por ahora Barcelona) --------------------------------------------------------------
            subject_ciudad = ECSDI['Ciudad_' +
                                   str(random.randint(1, sys.float_info.max))]

            gr.add((subject_ciudad, RDF.type, ECSDI.Ciudad))
            gr.add((subject_ciudad, ECSDI.Nombre,
                    Literal(41.398373, datatype=XSD.float)))
            gr.add((subject_ciudad, ECSDI.Latitud,
                    Literal(2.188247, datatype=XSD.float)))
            gr.add((subject_ciudad, ECSDI.Longitud,
                    Literal('Barcelona', datatype=XSD.string)))

            # Creacion del sobre (Compra) ------------------------------------------------------------------------------
            subject_sobre = ECSDI['Compra_' +
                                  str(random.randint(1, sys.float_info.max))]
            gr.add((subject_sobre, RDF.type, ECSDI.Compra))

            gr.add((subject_sobre, ECSDI.Pagat, Literal(0,
                                                        datatype=XSD.integer)))
            gr.add((subject_sobre, ECSDI.Enviar_a, URIRef(subject_ciudad)))

            total_price = 0.0

            for item in products_checked:
                total_price += float(item[3])
                # Creacion del producto --------------------------------------------------------------------------------
                subject_producto = item[4]
                gr.add((subject_producto, RDF.type, ECSDI.Producto))
                gr.add((subject_producto, ECSDI.Marca,
                        Literal(item[0], datatype=XSD.string)))
                gr.add((subject_producto, ECSDI.Modelo,
                        Literal(item[1], datatype=XSD.string)))
                gr.add((subject_producto, ECSDI.Nombre,
                        Literal(item[2], datatype=XSD.string)))
                gr.add((subject_producto, ECSDI.Precio,
                        Literal(item[3], datatype=XSD.float)))
                gr.add((subject_producto, ECSDI.Peso,
                        Literal(item[5], datatype=XSD.float)))
                gr.add(
                    (subject_sobre, ECSDI.Productos, URIRef(subject_producto)))

            gr.add((subject_sobre, ECSDI.Precio_total,
                    Literal(total_price, datatype=XSD.float)))

            gr.add((content, ECSDI.Sobre, URIRef(subject_sobre)))

            seller = get_agent_info(agn.SellerAgent, DirectoryAgent,
                                    UserPersonalAgent, get_count())

            answer = send_message(
                build_message(gr,
                              perf=ACL.request,
                              sender=UserPersonalAgent.uri,
                              receiver=seller.uri,
                              msgcnt=get_count(),
                              content=content), seller.address)

            products_matrix = []
            for item in answer.subjects(RDF.type, ECSDI.Producto):
                product = [
                    answer.value(subject=item, predicate=ECSDI.Marca),
                    answer.value(subject=item, predicate=ECSDI.Modelo),
                    answer.value(subject=item, predicate=ECSDI.Nombre),
                    answer.value(subject=item, predicate=ECSDI.Precio)
                ]
                products_matrix.append(product)

            return render_template('endSell.html', products=products_matrix)
def rejectOffer(offer):
    resp = send_message(build_message(Graph(), ACL['reject-proposal'], sender=TransportDealerAgent.uri),
                        offer.address)
    msg = get_message_properties(resp)
def acceptOffer(offer):
    resp = send_message(build_message(Graph(), ACL['accept-proposal'], sender=TransportDealerAgent.uri),
                        offer.address)
    msg = get_message_properties(resp)
    return msg['performative'] == ACL.inform
Beispiel #33
0
def communication():
    """
    Communication Entrypoint
    """

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

    gr = None

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

    msgdic = get_message_properties(gm)

    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(),
                           ACL['not-understood'],
                           sender=LogisticHubAgent.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 disponibilidad
            if accion == ECSDI.Pedir_disponibilidad:
                gm.remove((content, None, None))
                for item in gm.subjects(RDF.type, ACL.FipaAclMessage):
                    gm.remove((item, None, None))
                gr = gm
                logger.info('Productos disponibles')

            elif accion == ECSDI.Enviar_lot:
                logger.info('Se envia el lote de productos')
                gm.remove((content, None, None))
                for item in gm.subjects(RDF.type, ACL.FipaAclMessage):
                    gm.remove((item, None, None))
                for item in gm.subjects(RDF.type, ECSDI.Existencia):
                    gm.remove((item, None, None))
                for item in gm.subjects(RDF.type, ECSDI.Pedir_disponibilidad):
                    gm.remove((item, None, None))

                date = dateToMillis(datetime.datetime.utcnow() +
                                    datetime.timedelta(days=9))
                urlSend = writeSends(gm, date)

                peso = obtainTotalWeight(urlSend)
                requestTransport(date, peso)

                gr = prepareSellResponse(urlSend)

            elif accion == ECSDI.Recoger_venta:
                logger.info('Rep la venda a retornar del financial agent')

                date = dateToMillis(datetime.datetime.utcnow() +
                                    datetime.timedelta(days=9))

                for item in gm.objects(subject=content,
                                       predicate=ECSDI.compra_a_retornar):
                    peso = createSend(item, date)
                    requestTransport(date, peso)
                    removeSell(item)

                gr = Graph()

            # No habia ninguna accion en el mensaje
            else:
                gr = build_message(Graph(),
                                   ACL['not-understood'],
                                   sender=DirectoryAgent.uri,
                                   msgcnt=get_count())

    logger.info('Respondemos a la peticion')

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

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

    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=FinancialAgent.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 enviar venta
            if accion == ECSDI.Vull_comprar:
                gm.remove((content, None, None))
                for item in gm.subjects(RDF.type, ACL.FipaAclMessage):
                    gm.remove((item, None, None))

                sell = None
                for item in gm.subjects(RDF.type, ECSDI.Compra):
                    sell = item

                registerSells(gm)
                payDelivery(sell)

                deliverReceipt(sell)
                gr = sendSell(gm, sell)

            # Accion de retorno
            elif accion == ECSDI.Peticion_retorno:

                for item in gm.subjects(RDF.type, ACL.FipaAclMessage):
                    gm.remove((item, None, None))

                sell = []
                for item in gm.objects(subject=content, predicate=ECSDI.CompraRetornada):
                    sell.append(item)
                for item in sell:
                    payDelivery(item)

                gm.remove((content, None, None))
                gr = returnSell(gm, sell)

            # Ninguna accion a realizar
            else:
                gr = build_message(Graph(),
                                   ACL['not-understood'],
                                   sender=DirectoryAgent.uri,
                                   msgcnt=get_count())

    logger.info('Respondemos a la peticion')

    return gr.serialize(format='xml'), 200
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))

        logger.info('Registrado agente: ' + agn_name + ' - tipus:' + 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)
            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, FOAF.name, agn_name))
            logger.info("Agente encontrado: " + 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')
def rejectOffer(offer):
    resp = send_message(
        build_message(Graph(),
                      ACL['reject-proposal'],
                      sender=TransportDealerAgent.uri), offer.address)
    msg = get_message_properties(resp)
def communication():
    """
    Communication Entrypoint
    """

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

    gr = None

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

    msgdic = get_message_properties(gm)

    if msgdic is None:
        # Si no es, respondemos que no hemos entendido el mensaje
        gr = build_message(Graph(), ACL['not-understood'], sender=LogisticHubAgent.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 disponibilidad
            if accion == ECSDI.Pedir_disponibilidad:
                gm.remove((content, None, None))
                for item in gm.subjects(RDF.type, ACL.FipaAclMessage):
                    gm.remove((item, None, None))
                gr = gm
                logger.info('Productos disponibles')

            elif accion == ECSDI.Enviar_lot:
                logger.info('Se envia el lote de productos')
                gm.remove((content, None, None))
                for item in gm.subjects(RDF.type, ACL.FipaAclMessage):
                    gm.remove((item, None, None))
                for item in gm.subjects(RDF.type, ECSDI.Existencia):
                    gm.remove((item, None, None))
                for item in gm.subjects(RDF.type, ECSDI.Pedir_disponibilidad):
                    gm.remove((item, None, None))

                date = dateToMillis(datetime.datetime.utcnow() + datetime.timedelta(days=9))
                urlSend = writeSends(gm, date)

                peso = obtainTotalWeight(urlSend)
                requestTransport(date, peso)

                gr = prepareSellResponse(urlSend)

            elif accion == ECSDI.Recoger_venta:
                logger.info('Rep la venda a retornar del financial agent')

                date = dateToMillis(datetime.datetime.utcnow() + datetime.timedelta(days=9))

                for item in gm.objects(subject=content, predicate=ECSDI.compra_a_retornar):
                    peso = createSend(item, date)
                    requestTransport(date, peso)
                    removeSell(item)

                gr = Graph()

            # No habia ninguna accion en el mensaje
            else:
                gr = build_message(Graph(),
                                   ACL['not-understood'],
                                   sender=DirectoryAgent.uri,
                                   msgcnt=get_count())

    logger.info('Respondemos a la peticion')

    return gr.serialize(format='xml'), 200
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))

        logger.info('Registrado agente: ' + agn_name + ' - tipus:' + 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))
        gr = Graph()
        gr.bind('dso', DSO)
        bag = BNode()
        gr.add((bag, RDF.type, RDF.Bag))
        i = 0
        for agn_uri in rsearch:
            agn_add = dsgraph.value(subject=agn_uri[0], predicate=DSO.Address)
            agn_name = dsgraph.value(subject=agn_uri[0], predicate=FOAF.name)

            rsp_obj = agn['Directory-response' + str(i)]
            gr.add((rsp_obj, DSO.Address, agn_add))
            gr.add((rsp_obj, DSO.Uri, agn_uri[0]))
            gr.add((rsp_obj, FOAF.name, agn_name))
            gr.add((bag, URIRef(u'http://www.w3.org/1999/02/22-rdf-syntax-ns#_' + str(i)), rsp_obj))
            i += 1
            logger.info("Agente encontrado: " + agn_name)

        if rsearch is not None:
            return build_message(gr,
                                 ACL.inform,
                                 sender=DirectoryAgent.uri,
                                 msgcnt=mss_cnt,
                                 content=bag)
        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')