Added colour to logging for all services. Added check on withdrawals to

ensure project was approved. Made researchers request withdrawals.
This commit is contained in:
Malachy Byrne 2023-04-13 23:31:07 +01:00
parent 41adade9fc
commit 1a67ae90dc
Signed by: malmal200
GPG Key ID: EC21443030A655D9
5 changed files with 48 additions and 14 deletions

5
colours.py Normal file
View File

@ -0,0 +1,5 @@
RESET = "\033[0m"
ERROR = "\033[91m"
OK = "\033[92m"
WARN = "\033[93m"
INFO = "\033[96m"

View File

@ -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)

View File

@ -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):

View File

@ -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)

View File

@ -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"),