52 lines
1.6 KiB
Python
52 lines
1.6 KiB
Python
|
from django.db import models
|
||
|
|
||
|
from imagekit.processors import ResizeToFit
|
||
|
from imagekit.models import ProcessedImageField
|
||
|
from pdf2image import convert_from_path
|
||
|
from PIL import Image
|
||
|
|
||
|
|
||
|
class ImageUpload(models.Model):
|
||
|
title = models.CharField(max_length=100)
|
||
|
slug = models.SlugField(unique=True)
|
||
|
file = ProcessedImageField(
|
||
|
upload_to='images',
|
||
|
processors=[ResizeToFit(width=1115, upscale=False)],
|
||
|
)
|
||
|
|
||
|
|
||
|
class PdfUpload(models.Model):
|
||
|
title = models.CharField(max_length=100)
|
||
|
slug = models.SlugField(unique=True)
|
||
|
file = models.FileField(upload_to='pdfs')
|
||
|
|
||
|
def __str__(self):
|
||
|
return self.title
|
||
|
|
||
|
def save(self, *args, **kwargs):
|
||
|
super(PdfUpload, self).save(*args, **kwargs)
|
||
|
if getattr(self, '_file_changed', True):
|
||
|
self.generate_png()
|
||
|
|
||
|
def generate_png(self):
|
||
|
images = convert_from_path(self.file.path, dpi=150)
|
||
|
widths, heights = zip(*(i.size for i in images))
|
||
|
total_height = sum(heights)
|
||
|
max_width = max(widths)
|
||
|
new_image = Image.new('RGB', (max_width, total_height))
|
||
|
y_offset = 0
|
||
|
for image in images:
|
||
|
new_image.paste(image, (0, y_offset))
|
||
|
y_offset += image.size[1]
|
||
|
new_image.save(self.file.path + '.png')
|
||
|
|
||
|
|
||
|
class OtherUpload(models.Model):
|
||
|
title = models.CharField(max_length=100)
|
||
|
slug = models.SlugField(unique=True)
|
||
|
file = models.FileField(upload_to='other')
|
||
|
extension = models.CharField(
|
||
|
max_length=10,
|
||
|
help_text='Human-readable file extension (e.g., epub, docx, etc)'
|
||
|
)
|