From 6d68446a9c8ec3bce2c8a98827d1c82a96e44348 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 2499571..401dd0c 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") )