diff --git a/colours.py b/colours.py new file mode 100644 index 0000000..61c77d7 --- /dev/null +++ b/colours.py @@ -0,0 +1,5 @@ +RESET = "\033[0m" +ERROR = "\033[91m" +OK = "\033[92m" +WARN = "\033[93m" +INFO = "\033[96m" diff --git a/funding_agency.py b/funding_agency.py index ae5ebd2..f9a7946 100644 --- a/funding_agency.py +++ b/funding_agency.py @@ -4,6 +4,7 @@ import pickle from functions import log, save_project from classes import * +import colours remaining_funds = 1000000 @@ -14,15 +15,17 @@ channel = connection.channel() channel.queue_declare(queue='research_proposals') def process_proposal(ch, method, properties, body): + global remaining_funds project = pickle.loads(body) if 200000 <= project.amount <= 500000 and project.amount <= remaining_funds: + remaining_funds -= project.amount channel.basic_publish(exchange='', routing_key=properties.reply_to, properties=pika.BasicProperties(correlation_id=properties.correlation_id), body="approved") project.status = 1 save_project(project) - log(f"{project.acronym} approved") + log(f"project {colours.INFO}{project.acronym} {colours.OK}approved{colours.RESET}, {colours.INFO}{remaining_funds}{colours.RESET} remaining") else: channel.basic_publish(exchange='', routing_key=properties.reply_to, @@ -30,7 +33,7 @@ def process_proposal(ch, method, properties, body): body="rejected") project.status = 2 save_project(project) - log(f"{project.acronym} rejected") + log(f"project {colours.INFO}{project.acronym} {colours.ERROR}rejected{colours.RESET}, {colours.INFO}{remaining_funds}{colours.RESET} remaining") 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 d21ff14..782c822 100644 --- a/project_server.py +++ b/project_server.py @@ -4,7 +4,6 @@ import pickle import os from classes import Project, Transaction -from functions import log if not os.path.exists("approved_projects"): os.makedirs("approved_projects") @@ -24,8 +23,6 @@ def get_project(ch, method, properties, body): routing_key=properties.reply_to, properties=pika.BasicProperties(correlation_id=properties.correlation_id), body=project) - log(f"Replying to {properties.reply_to}") - log(f"got project {project_id}") def save_project(ch, method, properties, body): diff --git a/researcher.py b/researcher.py index 97bb458..8de33e3 100644 --- a/researcher.py +++ b/researcher.py @@ -6,7 +6,7 @@ import pickle from functions import * from classes import * -class ResearchProposal(object): +class Researcher(object): def __init__(self): self.connection = pika.BlockingConnection(pika.ConnectionParameters('localhost', 5672, '/', pika.PlainCredentials("user", "password"))) @@ -34,6 +34,10 @@ class ResearchProposal(object): self.connection.process_data_events(time_limit=None) return str(self.response) + def withdraw(self, withdrawal): + self.channel.basic_publish(exchange='', routing_key='withdraw_funds', + body=f"{withdrawal['acronym']},{withdrawal['name']},{withdrawal['amount']}") + proposals = [ {"acronym": "PROJ1", "title": "Project 1", "description": "Description 1", "amount": "300000"}, {"acronym": "PROJ2", "title": "Project 2", "description": "Description 2", "amount": "400000"}, @@ -43,8 +47,25 @@ proposals = [ {"acronym": "PROJ6", "title": "Project 6", "description": "Description 6", "amount": "420000"} ] +withdrawals = [ + {"acronym": "PROJ1", "name": "Johnathan", "amount": 150000}, + {"acronym": "PROJ2", "name": "Joseph", "amount": 200000}, + {"acronym": "PROJ3", "name": "Jotaro", "amount": 100000}, + {"acronym": "PROJ4", "name": "Josuke", "amount": 100000}, + {"acronym": "PROJ5", "name": "Giorno", "amount": 250000}, + {"acronym": "PROJ6", "name": "Jolyne", "amount": 430000}, + {"acronym": "PROJ1", "name": "Johnathan", "amount": 100000}, + {"acronym": "PROJ2", "name": "Joseph", "amount": 180000}, + {"acronym": "PROJ3", "name": "Jotaro", "amount": 160000}, + {"acronym": "PROJ4", "name": "Josuke", "amount": 150000}, + {"acronym": "PROJ5", "name": "Giorno", "amount": 450000}, + {"acronym": "PROJ6", "name": "Jolyne", "amount": 100000} +] + for proposal in proposals: - proposal_client = ResearchProposal() - log(f"{proposal['acronym']} sends proposal") + proposal_client = Researcher() response = proposal_client.call(proposal) - log(f"{proposal['acronym']} got {response}") + +for withdrawal in withdrawals: + client = Researcher() + client.withdraw(withdrawal) diff --git a/university.py b/university.py index 2eb335c..4168463 100644 --- a/university.py +++ b/university.py @@ -5,6 +5,7 @@ import pickle from functions import log, save_project from classes import * +import colours class University: def __init__(self): @@ -17,6 +18,8 @@ class University: self.channel.basic_consume(queue="withdraw_funds", on_message_callback=self.withdraw_funds, auto_ack=True) self.response = None self.corr_id = None + self.name = None + self.amount = None def receive_response(self, ch, method, properties, body): self.response = body @@ -24,15 +27,20 @@ class University: transaction = Transaction(self.name, int(self.amount)) project.history.append(transaction) project.amount -= int(self.amount) - if project.amount >= 0: - save_project(project) - log(f"{self.name} withdrew {self.amount} from {project.acronym}. {project.amount} remaining") + if project.status == 1: + if project.amount >= 0: + save_project(project) + log(f"{colours.INFO}{self.name}{colours.RESET} withdrew {colours.OK}{self.amount}{colours.RESET} from {colours.INFO}{project.acronym}{colours.RESET}. {colours.INFO}{project.amount}{colours.RESET} remaining") + else: + log(f"{colours.INFO}{self.name}{colours.RESET} attempted to withdraw {colours.ERROR}{self.amount}{colours.RESET} from {colours.INFO}{project.acronym}{colours.RESET} but there was only {colours.ERROR}{project.amount + int(self.amount)}{colours.RESET} remaining") else: - log(f"{self.name} attempter to withdraw {self.amount} from {project.acronym} but there was only {project.amount + int(self.amount)} remaining") + log(f"{colours.INFO}{self.name}{colours.RESET} attempted to withdraw from {colours.WARN}{project.acronym}{colours.RESET} but the project was not approved") def withdraw_funds(self, ch, method, properties, body): body = body.decode() - proj_id, self.name, self.amount = body.split(',') + proj_id, name, amount = body.split(',') + self.name = name + self.amount = amount self.channel.basic_publish(exchange='', routing_key='get_project', properties=pika.BasicProperties(reply_to="university_project"),