From 2298e4e75c966f4d6377a2d18873366694b8cd47 Mon Sep 17 00:00:00 2001 From: Hostea dashboard Date: Sun, 4 Sep 2022 14:31:28 +0530 Subject: [PATCH] fix: don't send emails to VMs that were requested but not created SUMMARY dash.models.Instance is created upon request and infrastructure.models.InstanceCreated when the instance is created. Using data from InstanceCreated to send invoices should solve this issue. --- .../management/commands/generate_invoice.py | 11 ++++-- billing/tests.py | 38 +++++++++++++++++++ 2 files changed, 45 insertions(+), 4 deletions(-) diff --git a/billing/management/commands/generate_invoice.py b/billing/management/commands/generate_invoice.py index 76983e4..f5b76d5 100644 --- a/billing/management/commands/generate_invoice.py +++ b/billing/management/commands/generate_invoice.py @@ -22,6 +22,7 @@ from oauth2_provider.generators import generate_client_id, generate_client_secre from accounts.utils import gen_secret from dash.models import Instance +from infrastructure.models import InstanceCreated from billing.utils import generate_invoice, payment_fullfilled Application = get_application_model() @@ -33,10 +34,12 @@ class Command(BaseCommand): def handle(self, *args, **options): instances = Instance.objects.all() if instances: - for instance in Instance.objects.all(): + for paid_instance in InstanceCreated.objects.all(): self.stdout.write(f"Found instance: {instance}") - if not payment_fullfilled(instance=instance): - self.stdout.write(f"Payment not fulfilled for instance: {instance}") - payment = generate_invoice(instance=instance) + if not payment_fullfilled(instance=paid_instance.instance): + self.stdout.write( + f"Payment not fulfilled for instance: {paid_instance.instance}" + ) + payment = generate_invoice(instance=paid_instance.instance) else: self.stdout.write("No instances available") diff --git a/billing/tests.py b/billing/tests.py index 071764a..af09094 100644 --- a/billing/tests.py +++ b/billing/tests.py @@ -148,6 +148,44 @@ class GenerateInvoiceCommand(TestCase): register_util(t=self, username=self.username) create_configurations(t=self) + @override_settings( + HOSTEA=infra_custom_config( + test_name="test_dont_send_invoices_to_not_created_vms" + ) + ) + def test_dont_send_invoices_to_not_created_vms(self): + + c = Client() + login_util(self, c, "accounts.home") + + instance_name = "test_dont_send_invoices_to_not_created_vms" + + payload = {"name": instance_name, "configuration": self.instance_config[0].name} + + resp = c.post(reverse("dash.instances.new"), payload) + self.assertEqual(resp.status_code, 302) + self.assertEqual( + resp.headers["location"], + reverse("billing.invoice.generate", args=(instance_name,)), + ) + + stdout = StringIO() + stderr = StringIO() + + instance = Instance.objects.get(name=instance_name) + self.assertEqual(payment_fullfilled(instance=instance), False) + prev_len = len(mail.outbox) + + # username exists + call_command( + "generate_invoice", + stdout=stdout, + stderr=stderr, + ) + out = stdout.getvalue() + print(out) + self.assertEqual(instance_name not in out, True) + @override_settings( HOSTEA=infra_custom_config(test_name="test_generate_invoice_cmd") )