def answer_couter_proposal(self, new_price): gr = Graph() if self.accept_couterproposal(new_price.toPython()): gr = build_message(gr, ACL.agree, sender=self.uri) logging.info('Sending counter-proposal for ' + str(new_price)) return gr else: logging.info('Rejecting counter-proposal for ' + str(new_price)) gr = build_message(Graph(), ACL.reject, sender=self.uri) return gr
def proposal(self, due_date, weight, city): delivery_date = datetime.datetime.now() + datetime.timedelta(days=5) if due_date < delivery_date: self.reset() return build_message(Graph(), ACL.refuse, sender=self.uri) gr = Graph() gr.bind('ecsdi', ECSDI) oferta = ECSDI.Oferta_transporte preu = weight * self.random_seed self.last_price = preu gr.add((oferta, ECSDI.Precio_envio, Literal(preu))) gr.add((oferta, ECSDI.Entrega, Literal(dateToMillis(delivery_date)))) gr = build_message(gr, ACL.propose, sender=self.uri, content=oferta) logging.info('Sending proposal for ' + str(preu)) return gr
def iniciarConnexioAmbPlataforma(): conGraph = Graph() conGraph.bind('req', REQ) con_obj = agn['recomanacio'] conGraph.add((con_obj, RDF.type, REQ.PeticioIniciarConnexio)) conGraph.add((con_obj, REQ.iniciar, Literal(True))) missatgeEnviament = build_message(conGraph,perf=ACL.request, sender=Client.uri, msgcnt=0, receiver=PlataformaAgent.uri, content=con_obj) response = send_message(missatgeEnviament, PlataformaAgent.address)
def obtenirFeedback(): print("Esperant temps per enviar feedback") sleep(20) print("Ha passat el temps, preparant peticio feedback...") feedGraph = Graph() feedGraph.bind('req', REQ) feed_obj = agn['feedback'] feedGraph.add((feed_obj, RDF.type, REQ.PeticioFeedback)) feedGraph.add((feed_obj, REQ.obtenirFeedcack, Literal(True))) missatgeFeedback = build_message(feedGraph, perf=ACL.request, sender=PlataformaAgent.uri, msgcnt=0, receiver=Client.uri, content=feed_obj) response = send_message(missatgeFeedback, Client.address) print("Rebem resposta feedback del client") query = """ SELECT ?marca ?puntuacio WHERE { ?a REQ:marca ?marca . ?a REQ:puntuacio ?puntuacio . } """ qres = response.query(query, initNs={'REQ': REQ}) marca = '' puntuacio = 1 print("Guardant el feedback per millorar recomanacions...") for row in qres: marca = marca + str(row['marca']) puntuacio = int(row['puntuacio']) print("Marca:", marca) print("Puntuacio: ", puntuacio) feedback = {} with open('registreFeedback.txt') as json_file: feedback = json.load(json_file) print('El feedback guardat es:', feedback) feedback[marca] = int(feedback[marca]) + puntuacio with open('registreFeedback.txt', 'w') as outfile: json.dump(feedback, outfile)
def enviarRecomenacio(connexioClientIniciada): print('Intent de connexio: ', connexioClientIniciada.value) if connexioClientIniciada.value > 0: marca = obtenirRecomenacio() producteRec = obtenirProducteRandom(marca) recGraph = Graph() recGraph.bind('req', REQ) rec_obj = agn['recomanacio'] recGraph.add((rec_obj, RDF.type, REQ.PeticioRecomanacio)) recGraph.add((rec_obj, REQ.prod, Literal(producteRec))) missatgeEnviament = build_message(recGraph, perf=ACL.request, sender=PlataformaAgent.uri, msgcnt=0, receiver=Client.uri, content=rec_obj) response = send_message(missatgeEnviament, Client.address) threading.Timer(80.0, enviarRecomenacio, args=(connexioClientIniciada, )).start()
def register_message(gmess): """ Envia un mensaje como una performativa FIPA acl :param gmess: :return: """ global mss_cnt servuriprof = URIRef('http://agentes.com/agente1profile') gmess.bind('owlsp', OWLSProfile) gmess.bind('owlss', OWLSService) gmess.add((servuri, RDF.type, OWLSService.Service)) gmess.add((servuriprof, RDF.type, OWLSProfile.Profile)) gmess.add((servuri, OWLSService.presents, servuriprof)) gmess.add((servuri, OWLSProfile.serviceName, Literal(agentname))) gmess.bind('foaf', FOAF) gmess.add((servuri, FOAF.name, Literal(agentname))) gr = build_message(gmess, perf= ACL.request, address=ra_address, sender= servuri) mss_cnt += 1 return gr
def comunicacion(): """ Entrypoint de comunicacion """ print('entrypoint comunicacion') global dsgraph global mss_cnt def GetTransports(): #----------- STUB VERSION -----------# transports = Graph() #transports.bind('foaf', FOAF) transports.bind('via', VIA) transport = VIA.transport + '_transport' + str(mss_cnt) transports.add((transport, RDF.type, VIA.Transport)) # Municipi origen i desti del transport localitzacio = VIA.Localitzacio + '_localitzacio' + str(mss_cnt) municipi = VIA.Municipi + '_municipi' + str(mss_cnt) transports.add((localitzacio, RDF.type, VIA.Localitzacio)) transports.add((localitzacio, VIA.Municipi, municipi)) transports.add( (municipi, VIA.Nom, Literal('NOM MUNICIPI ' + str(mss_cnt)))) # Data anada i tornada del transport temps = VIA.Temps + '_temps' + str(mss_cnt) data = VIA.Data + '_data' + str(mss_cnt) transports.add((temps, RDF.type, VIA.Temps)) transports.add((temps, VIA.Data, data)) transports.add((data, VIA.Data, Literal('DATA ' + str(mss_cnt)))) # preu del transport preu = VIA.Preu + '_preu' + str(mss_cnt) transports.add((preu, RDF.type, VIA.Preu)) transports.add( (preu, VIA.Import, Literal('IMPORT PREU ' + str(mss_cnt)))) # tipus de seient del transport seient = VIA.Tipus_seient + '_seient' + str(mss_cnt) transports.add((seient, RDF.type, VIA.Tipus_seient)) transports.add((seient, VIA.Nom, Literal('convencional'))) # transport dummy de capacitat 10 transport1 = VIA.Transport + 'transport' + str(mss_cnt) transports.add((transport, VIA.Transport, transport1)) transports.add( (transport1, VIA.Nom, Literal("Transport 1 " + str(mss_cnt)))) transports.add((transport1, VIA.Capacitat, Literal("10"))) transports.add((transport1, VIA.MitjaTransport, Literal('AVIO'))) transports.add((transport1, VIA.val, preu)) transports.add((transport1, VIA.data_anada, data)) transports.add((transport1, VIA.data_tornada, data)) transports.add((transport1, VIA.origen, municipi)) transports.add((transport1, VIA.desti, municipi)) transports.add((transport1, VIA.ofereix_seients, seient)) # transport dummy de capacitat 20 transport2 = VIA.Transport + 'transport' + str(mss_cnt) transports.add((transport, VIA.Transport, transport2)) transports.add( (transport2, VIA.Nom, Literal("Transport 2 " + str(mss_cnt)))) transports.add((transport2, VIA.Capacitat, Literal("20"))) transports.add((transport2, VIA.MitjaTransport, Literal('AVIO'))) transports.add((transport2, VIA.val, preu)) transports.add((transport2, VIA.data_anada, data)) transports.add((transport2, VIA.data_tornada, data)) transports.add((transport2, VIA.origen, municipi)) transports.add((transport2, VIA.desti, municipi)) transports.add((transport2, VIA.ofereix_seients, seient)) return transports # crear graf amb el missatge que rebem message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) # FIPA ACL message? if msgdic is None: # NO: responem "not understood" print('you did not send anything') gr = build_message(Graph(), ACL['not-understood'], sender=AgentTransport.uri, msgcnt=mss_cnt) else: # SI: mirem que demana # Performativa perf = msgdic['performative'] if perf != ACL.request: print('did not receive an acl request') # Si no es un request, respondemos que no hemos entendido el mensaje gr = build_message(Graph(), ACL['not-understood'], sender=AgentTransport.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) # TODO preguntar com va aixo if accion == DEM.Consultar_transports: #comparar que sigui del tipus d'accio que volem print('getting transports') graph_content = GetTransports() gr = build_message(graph_content, ACL['inform'], sender=AgentTransport.uri, msgcnt=mss_cnt, content=VIA.Transport) else: print('wrong action') gr = build_message(Graph(), ACL['not-understood'], sender=AgentTransport.uri, msgcnt=mss_cnt) mss_cnt += 1 return gr.serialize(format='xml')
def comunicacion(): """ Entrypoint de comunicacion """ def addMarca(): content = msgdic['content'] properties_obj = gm.value(subject=content, predicate=REQ.Properties) nombre = gm.value(subject=properties_obj, predicate=REQ.Nombre) g = Graph() g.parse("./Ontologies/product.owl", format="xml") g.add((PrOntRes[nombre], RDF.type, PrOnt.Marca)) g.add((PrOntRes[nombre], PrOntPr.nombre, nombre)) ofile = open('./Ontologies/product.owl', "w") encoding = 'iso-8859-1' ofile.write(str(g.serialize(), encoding)) ofile.close() return g def addProducte(): global mss_cnt content = msgdic['content'] properties_obj = gm.value(subject=content, predicate=REQ.Properties) nombre = gm.value(subject=properties_obj, predicate=REQ.Nombre) precio = gm.value(subject=properties_obj, predicate=REQ.Precio) peso = gm.value(subject=properties_obj, predicate=REQ.Peso) marca = gm.value(subject=properties_obj, predicate=REQ.Marca) categoria = gm.value(subject=properties_obj, predicate=REQ.Categoria) g = Graph() g.parse("./Ontologies/product.owl", format="xml") g.add((PrOntRes[nombre], RDF.type, PrOnt[categoria])) g.add((PrOntRes[nombre], PrOntPr['nombre'], nombre)) g.add((PrOntRes[nombre], PrOntPr['precio'], precio)) g.add((PrOntRes[nombre], PrOntPr['peso'], peso)) g.add((PrOntRes[nombre], PrOntPr['esExterno'], Literal(1))) g.add((PrOntRes[nombre], PrOntPr['tieneMarca'], PrOntRes[marca])) g.add((PrOntRes[marca], RDF.type, PrOnt.Marca)) g.add((PrOntRes[marca], PrOntPr.nombre, marca)) ofile = open('./Ontologies/product.owl', "w") encoding = 'iso-8859-1' ofile.write(str(g.serialize(), encoding)) ofile.close() g = Graph() g.parse("./Ontologies/centresProd.owl", format="xml") g.add( (CenOntRes[nombre], RDF.type, CenOnt['Producte_CentreLogistic1'])) g.add((CenOntRes[nombre], CenOntPr['nombre'], nombre)) g.add((CenOntRes[nombre], CenOntPr['nombreCentreLogistic'], Literal('cl1'))) g.add((CenOntRes[nombre], CenOntPr['stock'], Literal(5))) ofile = open('./Ontologies/centresProd.owl', "w") encoding = 'iso-8859-1' ofile.write(str(g.serialize(), encoding)) ofile.close() gresult = Graph() gresult.bind('req', REQ) cerca_obj = agn['cerca'] xsddatatypes = {'s': XSD.string, 'i': XSD.int, 'f': XSD.float} result_properties = { 'Marca': 's', 'Precio': 'i', 'Peso': 'f', 'Categoria': 's', 'Nombre': 's' } for prop in result_properties: if result_properties[prop] in ['s', 'i', 'f']: gresult.add((REQ[prop], RDF.type, OWL.DatatypeProperty)) gresult.add((REQ[prop], RDFS.range, xsddatatypes[result_properties[prop]])) else: gresult.add((REQ[prop], RDF.type, OWL.ObjectProperty)) gresult.add( (REQ[prop], RDFS.range, REQ[result_properties[prop]])) gresult.add((REQ.Result, RDF.type, OWL.Class)) result_obj = REQ[nombre] gresult.add((result_obj, RDF.type, REQ.Result)) gresult.add((result_obj, REQ['Nombre'], nombre)) gresult.add((result_obj, REQ['Precio'], precio)) gresult.add((result_obj, REQ['Peso'], peso)) gresult.add((result_obj, REQ['esExterno'], Literal(1))) gresult.add((result_obj, REQ['Marca'], marca)) return gresult global dsgraph global mss_cnt message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) #Mirem si es un msg FIPA ACL if not msgdic: #Si no ho es, responem not understood logger.info('Msg no es FIPA ACL') gr = build_message(Graph(), ACL['not-understood'], sender=AgentVenedorExtern.uri, msgcnt=mss_cnt) else: #Si ho es obtenim la performativa if msgdic['performative'] != ACL.request: #No es un request, not understood logger.info('Msg no es una request') gr = build_message(Graph(), ACL['not-understood'], sender=AgentVenedorExtern.uri, msgcnt=mss_cnt) else: #Mirem tipus request content = msgdic['content'] action = gm.value(subject=content, predicate=RDF.type) #placeholder if action == REQ.AfegirProducteExtern: logger.info('Processem la peticio') gr = addProducte() elif action == REQ.AfegirMarca: gr = addMarca() elif action == REQ.rebreDiners: content = msgdic['content'] diners = gm.value(subject=content, predicate=REQ.diners) print("Hem rebut diners: ", diners) gr = build_message(Graph(), ACL['inform-done'], sender=AgentVenedorExtern.uri, msgcnt=mss_cnt) else: logger.info('Es una request que no entenem') gr = build_message(Graph(), ACL['not-understood'], sender=AgentVenedorExtern.uri, msgcnt=mss_cnt) mss_cnt += 1 return gr.serialize(format='xml')
var_filtre = input("Aquest camp es obligatori: ") content.add((product_obj, REQ.Peso, Literal(float(var_filtre)))) var_filtre = input("Introdueix marca del producte: ") while (var_filtre == ""): var_filtre = input("Aquest camp es obligatori: ") content.add((product_obj, REQ.Marca, Literal(var_filtre))) var_filtre = input("Introdueix categoria del producte: ") while (var_filtre == ""): var_filtre = input("Aquest camp es obligatori: ") content.add((product_obj, REQ.Categoria, Literal(var_filtre))) g = Graph() #construim el missatge com una req al agent cercador g = build_message(content, perf=ACL.request, sender=Client.uri, msgcnt=0, receiver=AgentVenedorExtern.uri, content=cerca_obj) #enviem el msg response = send_message(g, AgentVenedorExtern.address) print("Producte afegit correctament") if (var_input == "2"): content = Graph() content.bind('req', REQ) cerca_obj = agn['producte'] product_obj = REQ.Properties + '_properties' content.add((cerca_obj, RDF.type, REQ.AfegirMarca)) content.add((cerca_obj, REQ.Properties, product_obj))
def agentbehavior1(q, fileno, consolaEnUs): """ Un comportamiento del agente :return: """ sys.stdin = os.fdopen(fileno) iniciarConnexioAmbPlataforma() print("Instruccions disponibles") print("1 - Buscar un producte") print("2 - Comprar un producte") print("3 - Modificar localitzacio client (Predefinida: 42.2, 2.19)") print("4 - Devolucio de un producte") print("5 - Eliminar registres de compra, cerca i feedback") letters = string.ascii_lowercase latClient = 42.2 longClient = 2.19 while True: while consolaEnUs.value > 0: asd = 0 var_input = input("Introdueix instruccio: ") while(var_input != "1" and var_input != "2" and var_input != "3" and var_input != "4" and var_input != "5"): print ("Instruccio desconeguda") var_input = input("Introdueix instruccio: ") if (var_input == "1"): content = Graph() content.bind('req', REQ) cerca_obj = agn['cerca'] filters_obj = REQ.Filters + '_filters' content.add((cerca_obj, RDF.type, REQ.PeticioCerca)) content.add((cerca_obj, REQ.Filters, filters_obj)) print("Introdueix els filtres desitjats, apreta enter sense escriure res per no filtrar (Tambe pots escrire un '-' per no filtrar)") var_filtre = input("Introdueix categoria del producte: ") if (var_filtre != "" and var_filtre != "-"): content.add((filters_obj, REQ.Categoria, Literal(var_filtre))) var_filtre = input("Introdueix nom del producte: ") if (var_filtre != "" and var_filtre != "-"): content.add((filters_obj, REQ.Nombre, Literal(var_filtre))) var_filtre = input("Introdueix preu maxim del producte: ") if (var_filtre != "" and var_filtre != "-"): content.add((filters_obj, REQ.Precio, Literal(int(var_filtre)))) var_filtre = input("Introdueix marca del producte: ") if (var_filtre != "" and var_filtre != "-"): content.add((filters_obj, REQ.TieneMarca, Literal(var_filtre))) ofile = open('request.owl', "w") encoding = 'iso-8859-1' ofile.write(str(content.serialize(), encoding)) ofile.close() g = Graph() #construim el missatge com una req al agent cercador g = build_message(content, perf=ACL.request, sender=Client.uri, msgcnt=0, receiver=AgentCercador.uri, content=cerca_obj) #enviem el msg response = send_message(g, AgentCercador.address) #mirem que hem rebut query = """ SELECT ?nombre ?precio ?marca ?categoria WHERE { ?a REQ:Nombre ?nombre . ?a REQ:Precio ?precio . ?a REQ:Marca ?marca . ?a REQ:Categoria ?categoria . } """ qres = response.query(query, initNs = {'REQ': REQ}) for row in qres: print("-------------------------------------------") print("Nom: " + row['nombre']) print("Preu:" + row['precio']) print("Marca: " + row['marca']) print("Categoria: " + row['categoria']) #ho guardem ofile = open('output.owl', "w") encoding = 'iso-8859-1' ofile.write(str(response.serialize(), encoding)) ofile.close() if (var_input == "2"): idCompra = ''.join(random.choice(letters) for i in range(32)) print("Introdueix el nom del producte i la quantitat que vols comprar") #enviar peticio compra contentPeticioCompra = Graph() contentPeticioCompra.bind('req', REQ) compra_obj = agn['compra'] contentPeticioCompra.add((compra_obj, RDF.type, REQ.PeticioCompra)) var_nomP = input("Introdueix el nom del producte: ") if (var_nomP != ""): contentPeticioCompra.add((compra_obj, REQ.NombreProducte, Literal(str(var_nomP)))) var_Q = input("Introdueix quantitat del producte (0-5): ") if (var_Q != ""): contentPeticioCompra.add((compra_obj, REQ.QuantitatProducte, Literal(int(var_Q)))) contentPeticioCompra.add((compra_obj, REQ.LatitudClient, Literal(float(latClient)))) contentPeticioCompra.add((compra_obj, REQ.LongitudClient, Literal(float(longClient)))) contentPeticioCompra.add((compra_obj, REQ.idCompra, Literal(str(idCompra)))) messageCompra = Graph() messageCompra = build_message(contentPeticioCompra, perf=ACL.request, sender=Client.uri, msgcnt=0, receiver=PlataformaAgent.uri, content=compra_obj) print('EnviemPeticioCompra') response = send_message(messageCompra, PlataformaAgent.address) query = """ SELECT ?resposta WHERE { ?a REQ:resposta ?resposta } """ qres = response.query(query, initNs = {'REQ': REQ}) respostaCL = "" for row in qres: respostaCL = str(row['resposta']) print(respostaCL) if var_input == "3": print("Introdueix la latitud i longitud usant punts i no comes (ex: 40.4555).") var_lat = input("Introdueix la latitud: ") if var_lat != "": latClient = float(var_lat) var_long = input("Introdueix la longitud: ") if var_long != "": longClient = float(var_long) if var_input == "4": idC = "" dies = 0 print("Introdueix el id de compra, rao de devolucio i quants dies fa que et va arribar el producte") var_id = input("Introduir el id de compra:") if var_id != "": idC = var_id var_dies = input("Si la rao de devolucio es un producte defectuos o equivocat, introdueix un 0. Si la rao es que el producte no satisà les vostres espectatives, introdueix el numero de dies que fa des de que us va arribar el producte.") if var_dies != "": dies = var_dies contentDevolucio = Graph() contentDevolucio.bind('req', REQ) dev_obj = agn['devolucio'] contentDevolucio.add((dev_obj, RDF.type, REQ.PeticioDevolucio)) contentDevolucio.add((dev_obj, REQ.idCompra, Literal(str(idC)))) contentDevolucio.add((dev_obj, REQ.dies, Literal(dies))) messagePeticio = Graph() messagePeticio = build_message(contentDevolucio, perf=ACL.request, sender=Client.uri, msgcnt=0, receiver=PlataformaAgent.uri, content=dev_obj) print('EnviemPeticioDevolucio') response = send_message(messagePeticio, PlataformaAgent.address) query = """ SELECT ?respostaDev WHERE { ?a REQ:respostaDev ?respostaDev . } """ qres = response.query(query, initNs = {'REQ': REQ}) for row in qres: print(row['respostaDev']) if var_input == "5": eliminarRegistres() pass
def comunicacion(): """ Entrypoint de comunicacion """ def cercaTransports(): resultat = Graph() resultat.bind('via', VIA) contingut = Graph() global ciutat_origen restriccions_transport = gm.value( subject=content, predicate=DEM.Restriccions_transports) DataF = gm.value(subject=restriccions_transport, predicate=DEM.Data_final) DataIni = gm.value(subject=restriccions_transport, predicate=DEM.Data_inici) ciutat_desti = gm.value(subject=restriccions_transport, predicate=DEM.Desti) NPers = gm.value(subject=restriccions_transport, predicate=DEM.NumPersones) ciutat_origen = gm.value(subject=restriccions_transport, predicate=DEM.Origen) Preu = gm.value(subject=restriccions_transport, predicate=DEM.Preu) contingut.parse('../../Ontologies/Viatge-RDF.owl', format='xml') res_Anada = contingut.query(f""" SELECT ?nm ?mitja ?c ?preu ?se WHERE {{ ?t rdf:type via:Transport . ?t via:Nom ?nm . ?t via:MitjaTransport ?mitja . ?t via:Capacitat ?c . ?t via:val ?p . ?t via:data_anada ?da . ?t via:ofereix_seients ?s . ?s via:Nom ?se . ?da via:Data "{DataIni}" . ?t via:data_tornada ?dt . ?dt via:Data "{DataF}" . ?p via:Import ?preu . ?t via:origen ?ciu . ?ciu via:Nom "{ciutat_origen}" . ?t via:desti ?ciu1 . ?ciu1 via:Nom "{ciutat_desti}" . }}""", initNs={"via": VIA}) for row in res_Anada: if (int(NPers) <= int(row[2])): preuTotal = int(NPers) * int(row[3]) * 2 if (preuTotal <= Preu): Transports = VIA.Transport + "_" + row[0] resultat.add((Transports, RDF.type, VIA.Transport)) resultat.add((Transports, VIA.Nom, Literal(row[0]))) resultat.add((Transports, VIA.Capacitat, Literal(row[2]))) resultat.add( (Transports, VIA.MitjaTransport, Literal(row[1]))) resultat.add((Transports, VIA.Preu, Literal(preuTotal))) resultat.add( (Transports, VIA.Tipus_seient, Literal(row[4]))) resultat.add( (Transports, VIA.Data + "_anada", Literal(DataIni))) resultat.add( (Transports, VIA.Data + "_tornada", Literal(DataF))) resultat.add((Transports, VIA.Nom + "_origen", Literal(ciutat_origen))) resultat.add((Transports, VIA.Nom + "_desti", Literal(ciutat_desti))) return resultat global dsgraph global mss_cnt # crear graf amb el missatge que rebem message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) # FIPA ACL message? if msgdic is None: # NO: responem "not understood" gr = build_message(Graph(), ACL['not-understood'], sender=AgentTransport.uri, msgcnt=mss_cnt) else: # SI: mirem que demana # 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=AgentTransport.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'] action = gm.value( subject=content, predicate=RDF.type) # TODO preguntar com va aixo if action == DEM.Consultar_transports: #comparar que sigui del tipus d'accio que volem graf_resposta = cercaTransports() gr = build_message(graf_resposta, ACL['inform'], sender=AgentTransport.uri, msgcnt=mss_cnt, content=VIA.Viatge) else: gr = build_message(Graph(), ACL['not-understood'], sender=AgentTransport.uri, msgcnt=mss_cnt) mss_cnt += 1 return gr.serialize(format='xml')
def comunicacion(): """ Entrypoint de comunicacion """ global dsgraph global mss_cnt message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) #Mirem si es un msg FIPA ACL if not msgdic: #Si no ho es, responem not understood logger.info('Msg no es FIPA ACL') gr = build_message(Graph(), ACL['not-understood'], sender=PlataformaAgent.uri, msgcnt=mss_cnt) else: #Si ho es obtenim la performativa if msgdic['performative'] != ACL.request: #No es un request, not understood logger.info('Msg no es una request') gr = build_message(Graph(), ACL['not-understood'], sender=PlataformaAgent.uri, msgcnt=mss_cnt) else: #Mirem tipus request content = msgdic['content'] action = gm.value(subject=content, predicate=RDF.type) print('La action es:', action) print('La action hauria de ser:', REQ.PeticioCompra) #placeholder if action == REQ.PeticioCompra: logger.info('Processem la compra') #agafar el nom del producte i la quantitat, i la localitzacio del client content = msgdic['content'] nombreProd = gm.value(subject=content, predicate=REQ.NombreProducte) quant = gm.value(subject=content, predicate=REQ.QuantitatProducte) latClient = gm.value(subject=content, predicate=REQ.LatitudClient) longClient = gm.value(subject=content, predicate=REQ.LongitudClient) idCompra = gm.value(subject=content, predicate=REQ.idCompra) #cercar el millor centre logistic que tingui aquest producte cl = buscarCentreLogistic(nombreProd, quant, latClient, longClient) resCL = crearRespostaPeticioCompra(cl) if cl is None: logger.info('No hi ha aquest producte en ningun centre') print('No hi ha aquest producte en ningun centre') resGraph = Graph() resGraph.bind('req', REQ) res_obj = agn['factura'] resGraph.add( (res_obj, RDF.type, REQ.ConfirmacioAmbResposta)) resGraph.add((res_obj, REQ.resposta, Literal(resCL))) gr = build_message(resGraph, ACL['inform-done'], sender=PlataformaAgent.uri, msgcnt=mss_cnt) return gr.serialize(format='xml') else: print('El millor centre logistic es:', cl) #cl sera el reciever del message #fer peticio enviament a centre logistic actualitzarStock(cl, nombreProd) envGraph = Graph() envGraph.bind('req', REQ) env_obj = agn['delegarEnviament'] pes = buscarPesProducte(nombreProd) envGraph.add((env_obj, RDF.type, REQ.PeticioEnviament)) envGraph.add((env_obj, REQ.prod, nombreProd)) envGraph.add((env_obj, REQ.pes, pes)) envGraph.add((env_obj, REQ.idCompra, idCompra)) envGraph.add((env_obj, REQ.quant, quant)) missatgeEnviament = Graph() centreReciever = None if str(cl) == 'cl1': centreReciever = CentroLogistico1 elif str(cl) == 'cl2': centreReciever = CentroLogistico2 elif str(cl) == 'cl3': centreReciever = CentroLogistico3 elif str(cl) == 'cl4': centreReciever = CentroLogistico4 elif str(cl) == 'cl5': centreReciever = CentroLogistico5 #per ara enviarem sempre al mateix centre (segona entrega) #centreReciever = CentroLogistico3 print('\n') print('PREPAREM PER DELEGAR ENVIAMENT') print('\n') missatgeEnviament = build_message(envGraph, perf=ACL.request, sender=PlataformaAgent.uri, msgcnt=0, receiver=centreReciever.uri, content=env_obj) response = send_message(missatgeEnviament, centreReciever.address) resGraph = Graph() resGraph.bind('req', REQ) res_obj = agn['factura'] resGraph.add((res_obj, RDF.type, REQ.ConfirmacioAmbResposta)) resGraph.add((res_obj, REQ.resposta, Literal(resCL))) gr = build_message(resGraph, ACL['inform-done'], sender=PlataformaAgent.uri, msgcnt=mss_cnt) return gr.serialize(format='xml') elif action == REQ.IniciarEnviament: content = msgdic['content'] #response = gm.value(subject=content, predicate=REQ.PreuEnviament) print('\n') print('REBEM PREU ENVIAMENT') print('\n') nomE = gm.value(subject=content, predicate=REQ.NomEmpresa) preuEnv = gm.value(subject=content, predicate=REQ.Preu) idCompra = gm.value(subject=content, predicate=REQ.idCompra) nombreProd = gm.value(subject=content, predicate=REQ.NomProd) quant = gm.value(subject=content, predicate=REQ.quant) print('El preu enviament es:', preuEnv) print('El nom empresa es:', nomE) print('El idCompra es:', idCompra) print('El nom prod es:', nombreProd) print('La quant del producte es:', quant) preuProducte = buscarPreuProducte(nombreProd) print('El preu producte es:', preuProducte) preuProducte = Literal(int(preuProducte) * int(quant)) preuTot = Literal( float(preuEnv) + int(preuProducte * int(quant))) print('Registrant compra...') registrarCompra(idCompra, nombreProd, preuTot) print('Preparant factura...') contentFactura = Graph() contentFactura.bind('req', REQ) factura_obj = agn['factura'] contentFactura.add( (factura_obj, RDF.type, REQ.ConfirmacioAmbFactura)) contentFactura.add((factura_obj, REQ.nomP, nombreProd)) contentFactura.add( (factura_obj, REQ.preuEnviament, Literal(preuEnv))) contentFactura.add((factura_obj, REQ.preuProd, preuProducte)) contentFactura.add((factura_obj, REQ.preuTotal, preuTot)) contentFactura.add((factura_obj, REQ.nomEmpresa, nomE)) #El centre logistic hauria de passar el idCompra!!!!!!!!!!!!!! contentFactura.add( (factura_obj, REQ.idCompra, Literal(idCompra))) print('Factura creada') missatgeFactura = build_message(contentFactura, perf=ACL.request, sender=PlataformaAgent.uri, msgcnt=0, receiver=Client.uri, content=factura_obj) response = send_message(missatgeFactura, Client.address) print("Cridar obtenir feedback...") obtenirFeedback() gr = build_message(Graph(), ACL['inform-done'], sender=PlataformaAgent.uri, msgcnt=mss_cnt) elif action == REQ.PeticioDevolucio: content = msgdic['content'] idCompra = gm.value(subject=content, predicate=REQ.idCompra) dies = gm.value(subject=content, predicate=REQ.dies) print("SENSE TRANSFORMACIO: ", dies) print("AMB TRANSFORMACIO: ", int(dies)) resposta = "" print("Preparat per gestionar peticio devolucio") if int(dies) >= 0 and int(dies) <= 15: preu = cercarCompra(idCompra) print("Compra cercada") if preu < 0.0: resposta = "NO es possible procedir amb la devolució ja que no existeix un registre d'aquesta compra" else: eliminarRegistreCerca(idCompra) preu = str(preu) resposta = "Peticio ACCEPTADA. L'empresa transportista recollirà el producte en el mateix lloc que l'entrega en un plaç màxim de 3 dies. Es procedirà a fer un reembolsament de " + preu recGraph = Graph() recGraph.bind('req', REQ) rec_obj = agn['recomanacio'] recGraph.add((rec_obj, RDF.type, REQ.PeticioTransferenciaAClient)) recGraph.add((rec_obj, REQ.diners, Literal(preu))) print("Preparant comunicacio amb Tresorer...") missatgeEnviament = build_message( recGraph, perf=ACL.request, sender=PlataformaAgent.uri, msgcnt=0, receiver=AgentTesorer.uri, content=rec_obj) response = send_message(missatgeEnviament, AgentTesorer.address) else: resposta = "NO es possible procedir amb la devolució, el període màxim per a la devolució és de 15 dies." contentDev = Graph() contentDev.bind('req', REQ) devo_obj = agn['dev'] contentDev.add((devo_obj, RDF.type, REQ.RespostaDevolucio)) contentDev.add((devo_obj, REQ.respostaDev, Literal(resposta))) print('Resposta devolucio preparada per enviar') gr = build_message(contentDev, ACL['inform-done'], sender=PlataformaAgent.uri, msgcnt=mss_cnt) elif action == REQ.PeticioIniciarConnexio: iniC = gm.value(subject=content, predicate=REQ.iniciar) # global connexiolientIniciada if iniC: connexioClientIniciada.value = 1 print('ESTAT DE CONNEXIO: ', connexioClientIniciada.value) gr = build_message(Graph(), ACL['inform-done'], sender=PlataformaAgent.uri, msgcnt=mss_cnt) elif action == REQ.rebreDiners: content = msgdic['content'] diners = gm.value(subject=content, predicate=REQ.diners) print("Hem rebut diners: ", diners) gr = build_message(Graph(), ACL['inform-done'], sender=PlataformaAgent.uri, msgcnt=mss_cnt) else: logger.info('Es una request que no entenem') gr = build_message(Graph(), ACL['not-understood'], sender=PlataformaAgent.uri, msgcnt=mss_cnt) mss_cnt += 1 return gr.serialize(format='xml')
def comunicacion(): """ Entrypoint de comunicacion """ def getProductes(): global mss_cnt #Obtenir parametres de cerca (filtre + keyword) content = msgdic['content'] print(content) filters_obj = gm.value(subject=content, predicate=REQ.Filters) print(filters_obj) categoria_filter = gm.value(subject=filters_obj, predicate=REQ.Categoria) nombre_filter = gm.value(subject=filters_obj, predicate=REQ.Nombre) precio_filter = gm.value(subject=filters_obj, predicate=REQ.Precio) marca_filter = gm.value(subject=filters_obj, predicate=REQ.TieneMarca) g=Graph() g.parse("./Ontologies/product.owl", format="xml") query = """ SELECT ?nombre ?precio ?nombreMarca ?categoria WHERE { ?a rdf:type ?categoria . ?a PrOntPr:nombre ?nombre . ?a PrOntPr:precio ?precio . ?a PrOntPr:tieneMarca ?b . ?b PrOntPr:nombre ?nombreMarca . } """ qres = g.query(query, initNs = {'PrOnt': PrOnt, 'PrOntPr': PrOntPr, 'PrOntRes' : PrOntRes}) gresult = Graph() gresult.bind('req', REQ) cerca_obj = agn['cerca'] xsddatatypes = {'s': XSD.string, 'i': XSD.int, 'f': XSD.float} result_properties = {'Marca': 's', 'Precio': 'i', 'Peso': 'f', 'Categoria': 's', 'Nombre': 's'} for prop in result_properties: if result_properties[prop] in ['s', 'i', 'f']: gresult.add((REQ[prop], RDF.type, OWL.DatatypeProperty)) gresult.add((REQ[prop], RDFS.range, xsddatatypes[result_properties[prop]])) else: gresult.add((REQ[prop], RDF.type, OWL.ObjectProperty)) gresult.add((REQ[prop], RDFS.range, REQ[result_properties[prop]])) gresult.add((REQ.Result, RDF.type, OWL.Class)) for row in qres: result_obj = REQ[row['nombre']] count = 0 i = 0 while(i < 4): product_pr = row[i] if (i == 0): if (nombre_filter != None): if (nombre_filter.lower() in product_pr.lower()): count += 1 else: count += 1 if (i == 1): if (precio_filter != None): if (product_pr <= precio_filter): count += 1 else: count += 1 if (i == 2): if (marca_filter != None): if (marca_filter.lower() in product_pr.lower()): count += 1 else: count += 1 if (i == 3): if (categoria_filter != None): categoriaURI = urlparse(row['categoria']).path categoria = PurePosixPath(categoriaURI).parts[2] if (categoria_filter.lower() in categoria.lower()): count += 1 else: count += 1 i += 1 if (count == 4): #print(row[0], row[1], row[2], row[3]) #t = term.URIRef(PrOntPr.nombre + "_" + row[0]) #gresult.add((cerca_obj, REQ.Results, result_obj)) gresult.add((result_obj, RDF.type, REQ.Result)) gresult.add((result_obj, REQ['Nombre'], row[0])) gresult.add((result_obj, REQ['Precio'], row[1])) gresult.add((result_obj, REQ['Marca'], row[2])) gresult.add((result_obj, REQ['Categoria'], Literal(PurePosixPath(urlparse(row[3]).path).parts[2]))) registrarCerca(row[0], row[2]) return gresult global dsgraph global mss_cnt message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) #Mirem si es un msg FIPA ACL if not msgdic: #Si no ho es, responem not understood logger.info('Msg no es FIPA ACL') gr = build_message(Graph(), ACL['not-understood'], sender=AgentCercador.uri, msgcnt=mss_cnt) else: #Si ho es obtenim la performativa if msgdic['performative'] != ACL.request: #No es un request, not understood logger.info('Msg no es una request') gr = build_message(Graph(), ACL['not-understood'], sender=AgentCercador.uri, msgcnt=mss_cnt) else: #Mirem tipus request content = msgdic['content'] action = gm.value(subject=content, predicate=RDF.type) #placeholder if action == REQ.PeticioCerca: logger.info('Processem la cerca') gr = getProductes() else: logger.info('Es una request que no entenem') gr = build_message(Graph(), ACL['not-understood'], sender=AgentCercador.uri, msgcnt=mss_cnt) mss_cnt += 1 return gr.serialize(format='xml')
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) #Mirem si es un msg FIPA ACL if not msgdic: #Si no ho es, responem not understood logger.info('Msg no es FIPA ACL') gr = build_message(Graph(), ACL['not-understood'], sender=AgentTesorer.uri, msgcnt=mss_cnt) else: #Si ho es obtenim la performativa if msgdic['performative'] != ACL.request: #No es un request, not understood logger.info('Msg no es una request') gr = build_message(Graph(), ACL['not-understood'], sender=AgentTesorer.uri, msgcnt=mss_cnt) else: #Mirem tipus request content = msgdic['content'] action = gm.value(subject=content, predicate=RDF.type) if action == REQ.PeticioTransferenciaAPlataforma: content = msgdic['content'] diners = gm.value(subject=content, predicate=REQ.diners) compte = gm.value(subject=content, predicate=REQ.compte) nombreProd = gm.value(subject=content, predicate=REQ.np) esExtern = esProducteExtern(nombreProd) if esExtern == False: print("El client paga a la plataforma ", diners, " usant el compte ", compte) conGraph = Graph() conGraph.bind('req', REQ) con_obj = agn['transferencia'] conGraph.add((con_obj, RDF.type, REQ.rebreDiners)) conGraph.add((con_obj, REQ.diners, Literal(diners))) conGraph.add((con_obj, REQ.compte, Literal(compte))) missatgeEnviament = build_message(conGraph,perf=ACL.request, sender=AgentTesorer.uri, msgcnt=0, receiver=PlataformaAgent.uri, content=con_obj) response = send_message(missatgeEnviament, PlataformaAgent.address) else: print("El client paga al agent extern") tGraph = Graph() tGraph.bind('req', REQ) t_obj = agn['transferencia'] tGraph.add((t_obj, RDF.type, REQ.rebreDiners)) tGraph.add((t_obj, REQ.diners, Literal(diners))) tGraph.add((t_obj, REQ.compte, Literal(compte))) missatgeEnviament2 = build_message(tGraph,perf=ACL.request, sender=AgentTesorer.uri, msgcnt=0, receiver=AgentVenedorExtern.uri, content=t_obj) response = send_message(missatgeEnviament2, AgentVenedorExtern.address) gr = build_message(Graph(), ACL['inform-done'], sender=AgentTesorer.uri, msgcnt=mss_cnt) elif action == REQ.PeticioTransferenciaAClient: content = msgdic['content'] diners = gm.value(subject=content, predicate=REQ.diners) print("La plataforma retorna al client els diners:", diners) transGraph = Graph() transGraph.bind('req', REQ) trans_obj = agn['transferencia2'] transGraph.add((trans_obj, RDF.type, REQ.rebreDiners)) transGraph.add((trans_obj, REQ.diners, Literal(diners))) print("Preparat per enviar a client") missatgeEnviament2 = build_message(transGraph,perf=ACL.request, sender=AgentTesorer.uri, msgcnt=0, receiver=Client.uri, content=trans_obj) response = send_message(missatgeEnviament2, Client.address) gr = build_message(Graph(), ACL['inform-done'], sender=AgentTesorer.uri, msgcnt=mss_cnt) else: logger.info('Es una request que no entenem') gr = build_message(Graph(), ACL['not-understood'], sender=AgentTesorer.uri, msgcnt=mss_cnt) mss_cnt += 1 return gr.serialize(format='xml') pass
content_graph.add( (pref_transport_obj, DEM.Tipus_seient, Literal(tipus_seient))) content_graph.add( (pref_allotjament_obj, DEM.Localitzacio, Literal(localitzacio))) content_graph.add( (pref_allotjament_obj, DEM.Tipus_estada, Literal(tipus_estada))) content_graph.add((pref_obj, DEM.Tipus_activitat, Literal(tipus_activitats))) content_graph.add((pref_obj, DEM.Preu, Literal(activities_budget))) gr = Graph() # building an ACL message gr = build_message(content_graph, perf=ACL.request, sender=Client.uri, msgcnt=0, receiver=AgentePlanificador.uri, content=viatge_obj) # sending the message to the agent res = send_message(gr, AgentePlanificador.address) # decoding the ACL return message viatge = res.value(predicate=RDF.type, object=VIA.Viatge) # print transport info: transport = res.value(predicate=RDF.type, object=VIA.Transport) # objecte transport nom_transport = res.value(subject=transport, predicate=VIA.Nom) # nom del transport
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) #Mirem si es un msg FIPA ACL if not msgdic: #Si no ho es, responem not understood logger.info('Msg no es FIPA ACL') gr = build_message(Graph(), ACL['not-understood'], sender=EmpresaTransportista.uri, msgcnt=mss_cnt) else: #Si ho es obtenim la performativa if msgdic['performative'] != ACL.request: #No es un request, not understood logger.info('Msg no es una request') gr = build_message(Graph(), ACL['not-understood'], sender=EmpresaTransportista.uri, msgcnt=mss_cnt) else: #Mirem tipus request content = msgdic['content'] action = gm.value(subject=content, predicate=RDF.type) print('La action es:', action) print('La action hauria de ser:', REQ.PeticioEmpresa) if action == REQ.PeticioEmpresa: logger.info('Es demana preu') print( '------------------------Rebem peticio------------------------' ) #obté pes, ciutat desti i plaç màxim d'entrega per ara HARDCODED pes = gm.value(subject=content, predicate=REQ.QuantProductes) #pes = 2 ciutatDesti = 'Barcelona' diaMaxim = '15/10/2021' #conjuntEmpreses = ['empresa_1', 'empresa_2', 'empresa_3', 'empresa_4', 'empresa_5'] conjuntEmpreses = [] conjuntEmpreses.append( str(gm.value(subject=content, predicate=REQ.CJE1))) conjuntEmpreses.append( str(gm.value(subject=content, predicate=REQ.CJE2))) conjuntEmpreses.append( str(gm.value(subject=content, predicate=REQ.CJE3))) conjuntEmpreses.append( str(gm.value(subject=content, predicate=REQ.CJE4))) conjuntEmpreses.append( str(gm.value(subject=content, predicate=REQ.CJE5))) gResposta = Graph() gResposta.bind('req', REQ) resposta_empresa = agn['resposta'] xsddatatypes = {'s': XSD.string, 'i': XSD.int, 'f': XSD.float} result_properties = {'Nombre': 's', 'Precio': 'f'} print('HOLA1') for prop in result_properties: if result_properties[prop] in ['s', 'i', 'f']: gResposta.add( (REQ[prop], RDF.type, OWL.DatatypeProperty)) gResposta.add((REQ[prop], RDFS.range, xsddatatypes[result_properties[prop]])) else: gResposta.add( (REQ[prop], RDF.type, OWL.ObjectProperty)) gResposta.add((REQ[prop], RDFS.range, REQ[result_properties[prop]])) gResposta.add((REQ.RespostaEmpresa, RDF.type, OWL.Class)) print('HOLA2') print('Conjunt empreses:', conjuntEmpreses) print('Tamany empreses:', len(conjuntEmpreses)) for i in range(0, len(conjuntEmpreses)): result_obj = REQ[conjuntEmpreses[i]] print('Estic dins: ', i) preu = float(pes) * random.uniform(limR[0], limR[1]) print('PES CALCULAT') gResposta.add((result_obj, RDF.type, REQ.RespostaEmpresa)) print('Estic a dins del bucle:', conjuntEmpreses[i]) gResposta.add((result_obj, REQ['Nombre'], Literal(conjuntEmpreses[i]))) print('Estic a dins del bucle2:', conjuntEmpreses[i]) gResposta.add((result_obj, REQ['Precio'], Literal(preu))) print(preu) # for row in conjuntEmpreses: # print('Estic dins bucle:', row) # preu = pes * random.uniform(limR[0], limR[1]) # gResposta.add((resposta_empresa, RDF.type, REQ.RespostaEmpresa)) # gResposta.add((resposta_empresa, REQ['Nombre'], row)) # gResposta.add((resposta_empresa, REQ['Precio'], preu)) print( '------------------------Preparat per retornar resposta------------------------' ) gr = build_message(gResposta, ACL['inform-done'], sender=EmpresaTransportista.uri, msgcnt=mss_cnt) elif action == REQ.EmpresaGuanyadora: print( '------------------------Rebem Resposta Millor Empresa------------------------' ) empresaEscollida = gm.value(subject=content, predicate=REQ.NomEmpresa) print('La empresa escollida és: ', empresaEscollida) gr = build_message(Graph(), ACL['inform-done'], sender=EmpresaTransportista.uri, msgcnt=mss_cnt) else: logger.info('Es una request que no entenem') gr = build_message(Graph(), ACL['not-understood'], sender=EmpresaTransportista.uri, msgcnt=mss_cnt) mss_cnt += 1 return gr.serialize(format='xml') pass
def comunicacion(): """ Entrypoint de comunicacion """ global dsgraph global mss_cnt global i def buscaActivitats(): global i activitats = Graph() activitats.bind('via', VIA) contingut = Graph() ciutat = gm.value(subject=content, predicate=DEM.Ciutat) cost_max = gm.value(subject=content, predicate=DEM.Cost) data_act = gm.value(subject=content, predicate=DEM.Data_activitat) franja = gm.value(subject=content, predicate=DEM.Horari) tipus_activitat = gm.value(subject=content, predicate=DEM.Tipus_activitat) if (Literal(tipus_activitat).eq('LUDICA')): tipus_activitat = "Ludica" elif (Literal(tipus_activitat).eq('CULTURAL')): tipus_activitat = "Cultural" else: tipus_activitat = "Festiva" contingut.parse('../../Ontologies/Viatge-RDF.owl', format='xml') for x in range (3): res = contingut.query(f""" SELECT ?nm ?id ?preu ?dat ?franja ?ciu ?rec WHERE {{ ?a rdf:type via:{tipus_activitat} . ?a via:val ?p . ?p via:Import ?preu . FILTER (?preu <= {cost_max}) . ?a via:se_celebra_de ?franja . ?franja via:Nom "{franja}" . ?a via:se_celebra_el ?dat . ?dat via:Data "{data_act}" . ?a via:se_celebra_a ?rec . ?rec via:es_troba_a ?ciu . ?ciu via:Nom "{ciutat}" . ?a via:Nom ?nm . ?a via:IDAct ?id . }} LIMIT 1 """, initNs={"via":VIA}) if (len(res) == 0): if (Literal(tipus_activitat).eq('Ludica')): tipus_activitat = "Cultural" elif (Literal(tipus_activitat).eq('Cultural')): tipus_activitat = "Festiva" else: tipus_activitat = "Ludica" else: break if (len(res) == 0): print("BUIT------------------------------------------") for row in res: Activitat= VIA.Activitat + "_" + tipus_activitat + str(i) i += 1 activitats.add((Activitat, RDF.type, VIA.Activitat)) activitats.add((Activitat, VIA.Nom , Literal(row[0]))) activitats.add((Activitat, VIA.IDAct, Literal(row[1]))) activitats.add((Activitat, VIA.Preu, Literal(row[2]))) activitats.add((Activitat, VIA.Data, Literal(row[3]))) activitats.add((Activitat, VIA.Nom + "_Franja", Literal(row[4]))) activitats.add((Activitat, VIA.Nom + "_Ciutat", Literal(row[5]))) activitats.add((Activitat, VIA.Nom + "_Recinte", Literal(row[6]))) return activitats # crear graf amb el missatge que rebem message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) gr = Graph() # FIPA ACL message? if msgdic is None: # NO: responem "not understood" print('msg dic is empty') gr = build_message(Graph(), ACL['not-understood'], sender=AgentActivitats.uri, msgcnt=mss_cnt) else: # SI: mirem que demana # Performativa perf = msgdic['performative'] if perf != ACL.request: # Si no es un request, respondemos que no hemos entendido el mensaje print('not an acl request') gr = build_message(Graph(), ACL['not-understood'], sender=AgentActivitats.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) if accion == DEM.Demanar_activitat : #comparar que sigui del tipus d'accio que volem graph_content = buscaActivitats() gr = build_message(graph_content, ACL['inform'], sender=AgentActivitats.uri, msgcnt=mss_cnt, content = VIA.Activitat) else: print('action not understood') gr = build_message(Graph(), ACL['not-understood'], sender=AgentActivitats.uri, msgcnt=mss_cnt) mss_cnt += 1 return gr.serialize(format='xml')
def comunicacion(): """ Entrypoint de comunicacion """ def cercaHotels(): resultat = Graph() resultat.bind('via', VIA) contingut = Graph() obj_restriccions = gm.value(subject=content, predicate=DEM.Restriccions_hotels) ciutat = gm.value(subject=obj_restriccions, predicate=DEM.Ciutat) dataI = gm.value(subject=obj_restriccions, predicate=DEM.Data_inici) dataF = gm.value(subject=obj_restriccions, predicate=DEM.Data_final) NumPer = gm.value(subject=obj_restriccions, predicate=DEM.NumPersones) preuAllot = gm.value(subject=obj_restriccions, predicate=DEM.Preu) data_ini = stringToDate(dataI) data_fi = stringToDate(dataF) contingut.parse('../../Ontologies/Viatge-RDF.owl', format='xml') res = contingut.query(f""" SELECT ?nm ?c ?ta ?preu ?sit ?t ?testn ?ppn WHERE {{ ?a rdf:type via:Allotjament . ?a via:Nom ?nm . ?a via:Capacitat ?c . ?a via:TipusAllotjament ?ta . ?a via:val ?p . ?p via:Import ?preu . ?a via:es_troba_a ?ciu . ?ciu via:Nom "{ciutat}" . ?a via:se_situa_a ?s . ?s via:Nom ?sit . ?a via:te_habitacions ?th . ?th via:Nom ?t . ?a via:ofereix ?test . ?test via:Nom ?testn . ?a via:es_popular ?pp . ?pp via:Nom ?ppn . }}""", initNs={"via": VIA}) dies = data_fi - data_ini for row in res: if (int(row[1]) >= int(NumPer)): print(row[3]) preuTotal = int(NumPer) * int(row[3]) * (dies.days) print(preuTotal) if (preuTotal <= preuAllot): Allotjaments = VIA.Allotjament + "_" + row[0] resultat.add((Allotjaments, RDF.type, VIA.Allotjament)) resultat.add((Allotjaments, VIA.Nom, Literal(row[0]))) resultat.add( (Allotjaments, VIA.Capacitat, Literal(row[1]))) resultat.add( (Allotjaments, VIA.TipusAllotjament, Literal(row[2]))) resultat.add((Allotjaments, VIA.Preu, Literal(preuTotal))) resultat.add( (Allotjaments, VIA.Nom + "_Situacio", Literal(row[4]))) resultat.add((Allotjaments, VIA.Nom + "_TipusHabitacio", Literal(row[5]))) resultat.add((Allotjaments, VIA.Nom + "_TipusEstada", Literal(row[6]))) resultat.add((Allotjaments, VIA.Nom + "_Popularitat", Literal(row[7]))) resultat.add( (Allotjaments, VIA.Data + "_anada", Literal(dataI))) resultat.add( (Allotjaments, VIA.Data + "_tornada", Literal(dataF))) return resultat global dsgraph global mss_cnt # crear graf amb el missatge que rebem message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) # FIPA ACL message? if msgdic is None: # NO: responem "not understood" i un graph de contingut buit gr = build_message(Graph(), ACL['not-understood'], sender=AgentAllotjament.uri, msgcnt=mss_cnt) else: # SI: mirem que demana # Performativa perf = msgdic['performative'] if perf != ACL.request: # SI NO ENS FAN UN REQUEST gr = build_message(Graph(), ACL['not-understood'], sender=AgentAllotjament.uri, msgcnt=mss_cnt) else: # AQUI HI ARRIBEM QUAN HEM ENTES EL MISSATGE I ES DEL TIPUS QUE VOLIEM # Averiguamos el tipo de la accion if 'content' in msgdic: content = msgdic['content'] action = gm.value(subject=content, predicate=RDF.type) if action == DEM.Consultar_hotels: #comparar que sigui del tipus d'accio que volem graf_resposta = cercaHotels() gr = build_message(graf_resposta, ACL['inform'], sender=AgentAllotjament.uri, msgcnt=mss_cnt, content=VIA.Viatge) else: gr = build_message(Graph(), ACL['not-understood'], sender=AgentAllotjament.uri, msgcnt=mss_cnt) mss_cnt += 1 return gr.serialize(format='xml')
def comunicacion(): """ Entrypoint de comunicacion """ global dsgraph global mss_cnt def getAllotjaments(): #----------- STUB VERSION -----------# allotjaments = Graph() #allotjaments.bind('foaf', FOAF) allotjaments.bind('via', VIA) allotjament = VIA.allotjament + '_allotjament' + str(mss_cnt) allotjaments.add((allotjament, RDF.type, VIA.Allotjament)) # localització de l'allotjament localitzacio = VIA.Localitzacio + '_localitzacio' + str(mss_cnt) allotjaments.add((localitzacio, RDF.type, VIA.Localitzacio)) allotjaments.add((localitzacio, VIA.Nom, Literal('NOM LOCALITZACIO ' + str(mss_cnt)))) allotjaments.add((allotjament, VIA.es_troba_a, localitzacio)) # popularitat de l'allotjament popularitat = VIA.Popularitat + '_popularitat' + str(mss_cnt) allotjaments.add((popularitat, RDF.type, VIA.Popularitat)) allotjaments.add((popularitat, VIA.Nom, Literal('NOM POPULARITAT ' + str(mss_cnt)))) allotjaments.add((allotjament, VIA.es_popular, popularitat)) # preu de l'allotjament preu = VIA.Preu + '_preu' + str(mss_cnt) allotjaments.add((preu, RDF.type, VIA.Preu)) allotjaments.add((preu, VIA.Import, Literal('IMPORT PREU ' + str(mss_cnt)))) allotjaments.add((allotjament, VIA.val, preu)) # situacio de l'allotjament situacio = VIA.Situacio + '_situacio' + str(mss_cnt) allotjaments.add((situacio, RDF.type, VIA.Situacio)) allotjaments.add((situacio, VIA.Nom, Literal('NOM SITUACIO ' + str(mss_cnt)))) allotjaments.add((allotjament, VIA.es_troba_a, situacio)) # tipus d'estada de l'allotjament estada = VIA.Tipus_estada + '_estada' + str(mss_cnt) allotjaments.add((estada, RDF.type, VIA.Tipus_estada)) allotjaments.add((estada, VIA.Nom, Literal('NOM TIPUS ESTADA ' + str(mss_cnt)))) allotjaments.add((allotjament, VIA.ofereix, estada)) # tipus d'habitacio de l'allotjament habitacio = VIA.Tipus_habitacio + '_habitacio' + str(mss_cnt) allotjaments.add((habitacio, RDF.type, VIA.Tipus_habitacio)) allotjaments.add((habitacio, VIA.Nom, Literal('NOM TIPUS HABITACIO ' + str(mss_cnt)))) allotjaments.add((allotjament, VIA.te_habitacions, habitacio)) # allotjament dummy de capacitat 10 allotjament1 = VIA.Allotjament + 'allotjament1' + str(mss_cnt) allotjaments.add((allotjament, VIA.Allotjament, allotjament1)) allotjaments.add((allotjament1, VIA.Nom, Literal("Apartament 1 " + str(mss_cnt)))) allotjaments.add((allotjament1, VIA.Capacitat, Literal("10 " + str(mss_cnt)))) # allotjament dummy de capacitat 20 allotjament2 = VIA.Allotjament + 'allotjament2' + str(mss_cnt) allotjaments.add((allotjament, VIA.Allotjament, allotjament2)) allotjaments.add((allotjament2, VIA.Nom, Literal("Apartament 2 " + str(mss_cnt)))) allotjaments.add((allotjament2, VIA.Capacitat, Literal("20 " + str(mss_cnt)))) return allotjaments # crear graf amb el missatge que rebem message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) gr = Graph() # FIPA ACL message? if msgdic is None: # NO: responem "not understood" i un graph de contingut buit gr = build_message(Graph(), ACL['not-understood'], sender=AgentAllotjament.uri, msgcnt=mss_cnt) else: # SI: mirem que demana # 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=AgentAllotjament.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) if accion == DEM.Consultar_hotels: #comparar que sigui del tipus d'accio que volem graph_content = getAllotjaments() gr = build_message(graph_content, ACL['inform'], sender=AgentAllotjament.uri, msgcnt=mss_cnt, content = VIA.Allotjament) else: gr = build_message(Graph(), ACL['not-understood'], sender=AgentAllotjament.uri, msgcnt=mss_cnt) mss_cnt += 1 return gr.serialize(format='xml')
def comunicacion(): """ Entrypoint de comunicacion """ global dsgraph global mss_cnt message = request.args['content'] gm = Graph() gm.parse(data=message) msgdic = get_message_properties(gm) #Mirem si es un msg FIPA ACL if not msgdic: #Si no ho es, responem not understood logger.info('Msg no es FIPA ACL') gr = build_message(Graph(), ACL['not-understood'], sender=Client.uri, msgcnt=mss_cnt) else: #Si ho es obtenim la performativa if msgdic['performative'] != ACL.request: #No es un request, not understood logger.info('Msg no es una request') gr = build_message(Graph(), ACL['not-understood'], sender=Client.uri, msgcnt=mss_cnt) else: #Mirem tipus request content = msgdic['content'] action = gm.value(subject=content, predicate=RDF.type) print('-------------------La action es:', action) # print('La action hauria de ser:', REQ.PeticioCompra) #placeholder if action == REQ.ConfirmacioAmbFactura: content = msgdic['content'] print('-------------------FACTURA--------------------') nombreProd = gm.value(subject=content, predicate=REQ.nomP) preuProd = gm.value(subject=content, predicate=REQ.preuProd) preuEnv = gm.value(subject=content, predicate=REQ.preuEnviament) preuTotal = gm.value(subject=content, predicate=REQ.preuTotal) nomEmpresa = gm.value(subject=content, predicate=REQ.nomEmpresa) idCompra = gm.value(subject=content, predicate=REQ.idCompra) print('NomProducte:',nombreProd) print('PreuEnviament:',preuEnv) print('PreuProducte:',preuProd) print('PreuTotal:',preuTotal) print('NomEmpresa:',nomEmpresa) print('idCompra:', idCompra) print('FinalitzemPeticioCompra') print("Proces pagament") consolaEnUs.value = 1 compte = "" compte = input("Introdueix el teu compte") while compte == "": compte = input("Introdueix un compte vàlid") consolaEnUs.value = 0 conGraph = Graph() conGraph.bind('req', REQ) con_obj = agn['transferencia'] conGraph.add((con_obj, RDF.type, REQ.PeticioTransferenciaAPlataforma)) conGraph.add((con_obj, REQ.diners, Literal(preuTotal))) conGraph.add((con_obj, REQ.compte, Literal(compte))) conGraph.add((con_obj, REQ.np, Literal(nombreProd))) missatgeEnviament = build_message(conGraph,perf=ACL.request, sender=Client.uri, msgcnt=0, receiver=AgentTesorer.uri, content=con_obj) response = send_message(missatgeEnviament, AgentTesorer.address) gr = build_message(Graph(), ACL['inform-done'], sender=PlataformaAgent.uri, msgcnt=mss_cnt) elif action == REQ.PeticioRecomanacio: content = msgdic['content'] consolaEnUs.value = 1 print('-------------------RECOMANACIO--------------------') nombreProd = gm.value(subject=content, predicate=REQ.prod) print("Potser t'interessa el producte " + str(nombreProd)) consolaEnUs.value = 0 gr = build_message(Graph(), ACL['inform-done'], sender=Client.uri, msgcnt=mss_cnt) elif action == REQ.PeticioFeedback: content = msgdic['content'] pucObtenirFeedback = gm.value(subject=content, predicate=REQ.obtenirFeedcack) pucObtenirFeedback = bool(pucObtenirFeedback) if pucObtenirFeedback == True: print('-------------------FEEDBACK D\'USUARI--------------------') print("p - Phone") print("v - Blender") print("c - Computer") consolaEnUs.value = 1 var_marca = input("Introdueix la categoria que has comprat recentment") while var_marca != "p" and var_marca != "v" and var_marca != "c": var_marca = input("No es una marca. Introdueix una marca:") var_puntuacio = input("Introdueix una valoracio s, a, b") while var_puntuacio != "s" and var_puntuacio != "a" and var_puntuacio != "b": var_puntuacio = input("Valor invalid: Introdueix la puntuacio una altre vegada:") consolaEnUs.value = 0 if var_marca == "p": var_marca = "Phone" elif var_marca == "v": var_marca = "Blender" else: var_marca = "Computer" punts = 0 if var_puntuacio == "s": punts = 10 elif var_puntuacio == "a": punts = 5 else: punts = 0 contentFeed = Graph() contentFeed.bind('req', REQ) feed_obj = agn['feed'] contentFeed.add((feed_obj, RDF.type, REQ.RespostaFeedback)) contentFeed.add((feed_obj, REQ.marca, Literal(var_marca))) contentFeed.add((feed_obj, REQ.puntuacio, Literal(punts))) gr = build_message(contentFeed, ACL['inform-done'], sender=PlataformaAgent.uri, msgcnt=mss_cnt) elif action == REQ.rebreDiners: content = msgdic['content'] diners = gm.value(subject=content, predicate=REQ.diners) print("Hem rebut diners: ", diners) gr = build_message(Graph(), ACL['inform-done'], sender=Client.uri, msgcnt=mss_cnt) else: logger.info('Es una request que no entenem') gr = build_message(Graph(), ACL['not-understood'], sender=Client.uri, msgcnt=mss_cnt) # return gr.serialize(format='xml') mss_cnt += 1 return gr.serialize(format='xml')