Add seed_payments management command to populate payment models with dummy data

This commit is contained in:
2025-06-29 19:17:40 +05:00
parent cb15aed94b
commit b149c86899
2 changed files with 95 additions and 0 deletions

View File

@ -0,0 +1,95 @@
# billing/management/commands/seed_billing.py
import random
from django.core.management.base import BaseCommand
from django.utils import timezone
from faker import Faker
from billing.models import (
Payment,
)
from devices.models import Device
from api.models import User
class Command(BaseCommand):
help = "Seeds payment models with dummy data."
def add_arguments(self, parser):
parser.add_argument(
"--number",
type=int,
default=10,
help="The number of payments to create.",
)
def handle(self, *args, **options):
number = options["number"]
fake = Faker()
users = User.objects.all()
if not users.exists():
self.stdout.write(
self.style.ERROR(
"No users found. Please seed users first (e.g., python manage.py seed_users)."
)
)
return
all_devices = Device.objects.all()
if not all_devices.exists():
self.stdout.write(
self.style.ERROR(
"No devices found. Please seed devices first (e.g., python manage.py seed_devices)."
)
)
return
self.stdout.write(self.style.NOTICE(f"Seeding {number} payments..."))
for _ in range(number):
random_user = random.choice(users)
num_devices_to_attach = random.randint(1, min(3, len(all_devices)))
devices_for_payment = random.sample(
list(all_devices), num_devices_to_attach
)
paid_status = fake.boolean(chance_of_getting_true=80)
paid_at_date = fake.date_time_this_year() if paid_status else None
if paid_at_date and timezone.is_naive(paid_at_date):
paid_at_date = timezone.make_aware(paid_at_date)
expires_at_date = None
if paid_at_date:
from datetime import timedelta
expires_at_date = paid_at_date + timedelta(
days=30 * fake.random_int(min=1, max=12)
)
payment_method = fake.random_element(
elements=[choice[0] for choice in Payment.PAYMENT_TYPES]
)
payment = Payment.objects.create(
number_of_months=fake.random_int(min=1, max=12),
amount=fake.pydecimal(
left_digits=4,
right_digits=2,
positive=True,
min_value=100.00,
max_value=5000.00,
),
paid=paid_status,
user=random_user,
paid_at=paid_at_date,
method=payment_method,
expires_at=expires_at_date,
updated_at=timezone.now(),
)
payment.devices.set(devices_for_payment)
self.stdout.write(self.style.SUCCESS(f"Successfully seeded {number} payments."))