Skip to content

Commit

Permalink
Merge pull request #233 from antaliadom-team/feature/preview_recreate
Browse files Browse the repository at this point in the history
Feature/preview recreate
  • Loading branch information
spaut33 committed May 21, 2023
2 parents db52099 + 5078aea commit d09961a
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 2 deletions.
7 changes: 7 additions & 0 deletions catalog/admin.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.conf import settings
from django.contrib import admin
from django.core.management import call_command
from django.db import models
from django.utils.html import format_html

Expand Down Expand Up @@ -197,6 +198,7 @@ class RealEstateAdmin(admin.ModelAdmin):
list_filter = ('status', 'location', 'property_type') # 'owner'
readonly_fields = ('date_added',)
inlines = (ImageInline,)
actions = ['regenerate_previews']

class Media:
js = ('admin/js/admin_period_visibility.js',)
Expand All @@ -212,6 +214,11 @@ def price_with_currency(self, obj):
return f'{obj.price}{obj.currency}'
return f'{obj.price}{obj.currency} в {obj.period.lower()}'

def regenerate_previews(self, request, queryset):
call_command('recreate_previews')

Check warning on line 218 in catalog/admin.py

View check run for this annotation

Codecov / codecov/patch

catalog/admin.py#L218

Added line #L218 was not covered by tests

regenerate_previews.short_description = 'Пересоздать превью фотографий'


@admin.register(Favorite)
class FavoriteAdmin(admin.ModelAdmin):
Expand Down
6 changes: 4 additions & 2 deletions catalog/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -235,7 +235,8 @@ class Meta:
verbose_name_plural = 'Фотографии'
ordering = ('-id',)

def thumbnail_generator(self, infile, outfile, image_size):
@staticmethod
def thumbnail_generator(infile, outfile, image_size):
"""Генерирует изображения в требуемых размерах."""
with PillowImage.open(infile) as im:
im.thumbnail(image_size)
Expand All @@ -248,7 +249,8 @@ def thumbnail_generator(self, infile, outfile, image_size):
im, image_size, PillowImage.Resampling.LANCZOS, 0.5
).save(outfile, quality=95)

def filename_generator(self, filepath, size):
@staticmethod
def filename_generator(filepath, size):
"""Генерирует имя для каждого размера изображения."""
width, height = size
name, extension = os.path.splitext(filepath)
Expand Down
45 changes: 45 additions & 0 deletions core/management/commands/recreate_previews.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
from django.conf import settings
from django.core.management import BaseCommand

from catalog.models import Image


class Command(BaseCommand):
help = 'Regenerate previews for all real estate pictures.'

def handle(self, *args, **kwargs):
"""Regenerate previews for all real estate pictures."""

all_images = Image.objects.all()
self.stdout.write('Deleting existing previews...')
for image in all_images:
try:
image.delete_thumbnails()
except FileNotFoundError:
all_images.pop(image)
continue
self.stdout.write('Generating new previews...')
for image in all_images:
for size in settings.PREVIEW_SIZES:
try:
Image.thumbnail_generator(
infile=image.image.path,
outfile=image.filename_generator(
image.image.path, size
),
image_size=size,
)
except FileNotFoundError:
self.stdout.write(
self.style.WARNING(
f'Photo of the object #id:{image.real_estate.id} '
'found in the DB but file '
f'...{image.image.path[-30:]} not found... '
'skipping'
)
)
except Exception as error:
self.stdout.write(self.style.ERROR(error))
self.stdout.write(
self.style.SUCCESS('Previews regenerated successfully.')
)

0 comments on commit d09961a

Please sign in to comment.