From b7529417794d8ea96e6ceb90e4abb2452a44ef39 Mon Sep 17 00:00:00 2001 From: Malachy Byrne Date: Thu, 13 Apr 2023 03:28:03 +0100 Subject: [PATCH] converted everything to use project server and log --- .gitignore | 1 + functions.py | 6 ++++++ funding_agency.py | 23 ++++++++++++++--------- project_server.py | 18 ++++++++++-------- researcher.py | 19 +++++++++---------- 5 files changed, 40 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index cb208b6..6e1f684 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ approved_projects/* +__pycache__/* diff --git a/functions.py b/functions.py index 10fd12c..83c52d0 100644 --- a/functions.py +++ b/functions.py @@ -1,8 +1,14 @@ import pika +import pickle + connection = pika.BlockingConnection(pika.ConnectionParameters('localhost', 5672, '/', pika.PlainCredentials("user", "password"))) channel = connection.channel() def log(data): channel.basic_publish(exchange='', routing_key='log', body=data) +def save_project(project): + channel.basic_publish(exchange='', routing_key='save_project', + body=pickle.dumps(project)) + diff --git a/funding_agency.py b/funding_agency.py index f1a4a32..ae5ebd2 100644 --- a/funding_agency.py +++ b/funding_agency.py @@ -1,6 +1,11 @@ import pika -from functions import log +import pickle + +from functions import log, save_project +from classes import * + +remaining_funds = 1000000 connection = pika.BlockingConnection(pika.ConnectionParameters('localhost', 5672, '/', pika.PlainCredentials("user", "password"))) @@ -9,23 +14,23 @@ channel = connection.channel() channel.queue_declare(queue='research_proposals') def process_proposal(ch, method, properties, body): - proposal = body.decode() - acronym, title, description, amount = proposal.split(',') - - if 200000 <= int(amount) <= 500000: + project = pickle.loads(body) + if 200000 <= project.amount <= 500000 and project.amount <= remaining_funds: channel.basic_publish(exchange='', routing_key=properties.reply_to, properties=pika.BasicProperties(correlation_id=properties.correlation_id), body="approved") - project_info=f"{acronym},{title},{description},{amount}" - channel.basic_publish(exchange='', routing_key='approved_projects', body=project_info) - log(f"{acronym} approved") + project.status = 1 + save_project(project) + log(f"{project.acronym} approved") else: channel.basic_publish(exchange='', routing_key=properties.reply_to, properties=pika.BasicProperties(correlation_id=properties.correlation_id), body="rejected") - log(f"{acronym} rejected") + project.status = 2 + save_project(project) + log(f"{project.acronym} rejected") channel.basic_consume(queue='research_proposals', on_message_callback=process_proposal, auto_ack=True) diff --git a/project_server.py b/project_server.py index 54dd80e..a8462b0 100644 --- a/project_server.py +++ b/project_server.py @@ -3,7 +3,8 @@ import pika import pickle import os -from classes import Project +from classes import Project, Transaction +from functions import log if not os.path.exists("approved_projects"): os.makedirs("approved_projects") @@ -27,16 +28,17 @@ def get_project(ch, method, properties, body): def save_project(ch, method, properties, body): - project_data = body.decode() - acronym, title, description, amount = project_data.split(',') - - project = Project(acronym, title, description, int(amount)) - filename = os.path.join("approved_projects", f"{acronym}.txt") + project = pickle.loads(body) + filename = os.path.join("approved_projects", f"{project.acronym}.txt") with open(filename, "wb+") as file: pickle.dump(project, file) -channel.basic_consume(queue='get_project', on_message_callback=get_project, auto_ack=False) +channel.basic_consume(queue='get_project', on_message_callback=get_project, auto_ack=True) channel.basic_consume(queue='save_project', on_message_callback=save_project, auto_ack=True) -channel.start_consuming() +try: + channel.start_consuming() +except KeyboardInterrupt: + channel.stop_consuming() + connection.close() diff --git a/researcher.py b/researcher.py index 25be422..97bb458 100644 --- a/researcher.py +++ b/researcher.py @@ -1,8 +1,10 @@ import pika import uuid +import pickle -from functions import log +from functions import * +from classes import * class ResearchProposal(object): @@ -15,25 +17,23 @@ class ResearchProposal(object): self.response = None self.corr_id = None - def on_response(self, ch, method, properties, body): if self.corr_id == properties.correlation_id: self.response = body - def call(self, n): + def call(self, proposal): + project = Project(proposal["acronym"], proposal["title"], + proposal["description"], int(proposal["amount"])) + save_project(project) self.response = None self.corr_id = str(uuid.uuid4()) self.channel.basic_publish(exchange='', routing_key="research_proposals", properties=pika.BasicProperties(reply_to=self.callback_queue, - correlation_id=self.corr_id, ), - body=f"{n['acronym']},{n['title']},{n['description']},{n['amount']}") + correlation_id=self.corr_id, ), + body=pickle.dumps(project)) self.connection.process_data_events(time_limit=None) return str(self.response) - - - - proposals = [ {"acronym": "PROJ1", "title": "Project 1", "description": "Description 1", "amount": "300000"}, {"acronym": "PROJ2", "title": "Project 2", "description": "Description 2", "amount": "400000"}, @@ -43,7 +43,6 @@ proposals = [ {"acronym": "PROJ6", "title": "Project 6", "description": "Description 6", "amount": "420000"} ] - for proposal in proposals: proposal_client = ResearchProposal() log(f"{proposal['acronym']} sends proposal")