64 lines
2.5 KiB
Python
64 lines
2.5 KiB
Python
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.'))
|