119 lines
4.5 KiB
Python
119 lines
4.5 KiB
Python
# <your_app>/management/commands/seed_dealership.py
|
||
import json, random, string, decimal
|
||
from django.core.management.base import BaseCommand
|
||
from django.test import Client
|
||
from django.contrib.auth import get_user_model
|
||
from plans.models import Order, PlanPricing, AbstractOrder, UserPlan, BillingInfo,Plan
|
||
from inventory.tasks import create_user_dealer
|
||
from inventory import models # adjust import to your app
|
||
from django_q.tasks import async_task
|
||
|
||
User = get_user_model()
|
||
|
||
class Command(BaseCommand):
|
||
help = "Seed a full dealership via the real signup & downstream views"
|
||
|
||
def add_arguments(self, parser):
|
||
parser.add_argument('--count', type=int, default=1, help='Number of dealers to seed')
|
||
|
||
def handle(self, *args, **opts):
|
||
count = opts['count']
|
||
client = Client() # lives inside management command
|
||
|
||
for n in range(5, 7):
|
||
self.stdout.write(f"🚗 Seeding dealer #{n}")
|
||
self._create_dealer(client, n)
|
||
# self._create_cars(client, n)
|
||
# self._create_customers_and_sales(client, n)
|
||
self.stdout.write(self.style.SUCCESS(f"✅ Dealer #{n} ready"))
|
||
|
||
# ----------------------------------------------------------
|
||
# 1. Sign-up via the real view
|
||
# ----------------------------------------------------------
|
||
def _create_dealer(self, client, n):
|
||
payload = {
|
||
"email": f"dealer{n}@example.com",
|
||
"password": "Password123",
|
||
"confirm_password": "Password123",
|
||
"name": f"Dealer #{n}",
|
||
"arabic_name": f"تاجر {n}",
|
||
"phone_number": "+96651234567",
|
||
"crn": f"CRN{n}000",
|
||
"vrn": f"VRN{n}000",
|
||
"address": f"Street {n}, Riyadh",
|
||
}
|
||
|
||
dealer = create_user_dealer(payload['email'], payload['password'], payload['name'], payload['arabic_name'], payload['phone_number'], payload['crn'], payload['vrn'], payload['address'])
|
||
user = dealer.user
|
||
self._assign_random_plan(user)
|
||
self._services(dealer)
|
||
|
||
# resp = client.post(
|
||
# "/en/signup/", # adjust URL if necessary
|
||
# data=json.dumps(payload),
|
||
# content_type="application/json",
|
||
# )
|
||
# if resp.status_code != 200:
|
||
# raise Exception(f"Signup failed: {resp.content}")
|
||
|
||
# # Log in
|
||
client.login(email=payload["email"], password=payload["password"])
|
||
|
||
return payload["email"]
|
||
|
||
def _assign_random_plan(self,user):
|
||
"""
|
||
Pick a random Plan and create + initialize a UserPlan for the user.
|
||
"""
|
||
plans = Plan.objects.all()
|
||
if not plans.exists():
|
||
raise ValueError("No plans found – please create at least one Plan record.")
|
||
|
||
plan = random.choice(plans)
|
||
|
||
user_plan, created = UserPlan.objects.get_or_create(
|
||
user=user,
|
||
defaults={'plan': plan, 'active': True}
|
||
)
|
||
if created:
|
||
user_plan.initialize()
|
||
return user_plan
|
||
|
||
def _services(self,dealer):
|
||
additional_services = [
|
||
{
|
||
"name": "Vehicle registration transfer assistance",
|
||
"arabic_name": "مساعدة في نقل ملكية السيارة",
|
||
"price": decimal.Decimal(random.randrange(100, 1000)),
|
||
"description": "This is service 1",
|
||
},
|
||
{
|
||
"name": "Paperwork collection",
|
||
"arabic_name": "جمع الأوراق",
|
||
"price": decimal.Decimal(random.randrange(100, 1000)),
|
||
"description": "This is service 2",
|
||
},
|
||
{
|
||
"name": "Inspection and test drives",
|
||
"arabic_name": "فحص وقيادة تجريبية",
|
||
"price": decimal.Decimal(random.randrange(100, 1000)),
|
||
"description": "This is service 3",
|
||
},
|
||
{
|
||
"name": "Shipping and transportation",
|
||
"arabic_name": "شحن ونقل",
|
||
"price": decimal.Decimal(random.randrange(100, 1000)),
|
||
"description": "This is service 4",
|
||
},
|
||
]
|
||
|
||
for additional_service in additional_services:
|
||
models.AdditionalServices.objects.create(
|
||
name=additional_service["name"],
|
||
arabic_name=additional_service["arabic_name"],
|
||
price=additional_service["price"],
|
||
description=additional_service["description"],
|
||
dealer=dealer,
|
||
uom="Unit"
|
||
)
|