first commit
This commit is contained in:
63
portfolio/management/commands/create_fake_portfolios.py
Normal file
63
portfolio/management/commands/create_fake_portfolios.py
Normal file
@@ -0,0 +1,63 @@
|
||||
import random
|
||||
import io
|
||||
from django.core.management.base import BaseCommand
|
||||
from django.core.files.base import ContentFile
|
||||
from faker import Faker
|
||||
from PIL import Image, ImageDraw
|
||||
from portfolio.models import Portfolio, Category
|
||||
|
||||
class Command(BaseCommand):
|
||||
help = 'Creates fake portfolio items with images using existing categories'
|
||||
|
||||
def generate_image(self, width, height, format='PNG'):
|
||||
"""Generates a random image."""
|
||||
color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
|
||||
image = Image.new('RGB', (width, height), color)
|
||||
draw = ImageDraw.Draw(image)
|
||||
|
||||
# Draw some random shapes
|
||||
for _ in range(10):
|
||||
shape_color = (random.randint(0, 255), random.randint(0, 255), random.randint(0, 255))
|
||||
x1 = random.randint(0, width)
|
||||
y1 = random.randint(0, height)
|
||||
x2 = random.randint(0, width)
|
||||
y2 = random.randint(0, height)
|
||||
# Ensure coordinates are in the correct order (x0, y0, x1, y1)
|
||||
draw.rectangle(
|
||||
[min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)],
|
||||
fill=shape_color,
|
||||
outline=None
|
||||
)
|
||||
|
||||
img_io = io.BytesIO()
|
||||
image.save(img_io, format=format)
|
||||
return ContentFile(img_io.getvalue(), name=f'fake_image.{format.lower()}')
|
||||
|
||||
def handle(self, *args, **options):
|
||||
fake = Faker()
|
||||
|
||||
# Fetch existing categories
|
||||
categories = list(Category.objects.all())
|
||||
|
||||
if not categories:
|
||||
self.stdout.write(self.style.WARNING('No categories found. Please create some categories first.'))
|
||||
return
|
||||
|
||||
self.stdout.write(f'Found {len(categories)} categories. Creating portfolios...')
|
||||
|
||||
for i in range(20):
|
||||
portfolio = Portfolio(
|
||||
url=fake.url(),
|
||||
is_active=True,
|
||||
)
|
||||
# Portfolio image: 640x481 (saving as PNG, model might convert to avif)
|
||||
image_content = self.generate_image(640, 481, 'PNG')
|
||||
portfolio.image.save(f'port_{i}.png', image_content, save=False)
|
||||
portfolio.save()
|
||||
|
||||
# Assign random existing categories
|
||||
# Ensure we don't try to sample more categories than exist
|
||||
num_categories = min(len(categories), random.randint(1, 3))
|
||||
portfolio.categories.set(random.sample(categories, k=num_categories))
|
||||
|
||||
self.stdout.write(self.style.SUCCESS('Successfully created fake portfolio items with images using existing categories.'))
|
||||
Reference in New Issue
Block a user