68 lines
3.3 KiB
Python
68 lines
3.3 KiB
Python
import boto3
|
|
from django.conf import settings
|
|
from django.core.management.base import BaseCommand
|
|
|
|
from establishment.models import EstablishmentSubType
|
|
from gallery.models import Image
|
|
|
|
|
|
class Command(BaseCommand):
|
|
help = """
|
|
Fill establishment type by index names.
|
|
Steps:
|
|
1 Upload default images into s3 bucket
|
|
2 Run command ./manage.py fill_artisan_default_image
|
|
"""
|
|
|
|
def add_arguments(self, parser):
|
|
parser.add_argument(
|
|
'--template_image_folder_name',
|
|
help='Template image folder in Amazon S3 bucket'
|
|
)
|
|
|
|
def handle(self, *args, **kwargs):
|
|
not_updated = 0
|
|
template_image_folder_name = kwargs.get('template_image_folder_name')
|
|
if (template_image_folder_name and
|
|
hasattr(settings, 'AWS_ACCESS_KEY_ID') and
|
|
hasattr(settings, 'AWS_SECRET_ACCESS_KEY') and
|
|
hasattr(settings, 'AWS_STORAGE_BUCKET_NAME')):
|
|
to_update = []
|
|
s3 = boto3.resource('s3')
|
|
s3_bucket = s3.Bucket(settings.AWS_STORAGE_BUCKET_NAME)
|
|
|
|
for object_summary in s3_bucket.objects.filter(Prefix=f'media/{template_image_folder_name}/'):
|
|
uri_path = object_summary.key
|
|
filename = uri_path.split('/')[-1:][0]
|
|
if filename:
|
|
artisan_index_slice = filename.split('.')[:-1][0] \
|
|
.split('_')[2:]
|
|
if len(artisan_index_slice) > 1:
|
|
artisan_index_name = '_'.join(artisan_index_slice)
|
|
else:
|
|
artisan_index_name = artisan_index_slice[0]
|
|
|
|
attachment_suffix_url = f'{template_image_folder_name}/{filename}'
|
|
|
|
# check artisan in db
|
|
artisan_qs = EstablishmentSubType.objects.filter(index_name__iexact=artisan_index_name,
|
|
establishment_type__index_name__iexact='artisan')
|
|
if artisan_qs.exists():
|
|
artisan = artisan_qs.first()
|
|
image, created = Image.objects.get_or_create(image=attachment_suffix_url,
|
|
defaults={
|
|
'image': attachment_suffix_url,
|
|
'orientation': Image.HORIZONTAL,
|
|
'title': f'{artisan.__str__()} '
|
|
f'{artisan.id} - '
|
|
f'{attachment_suffix_url}'})
|
|
if created:
|
|
# update artisan instance
|
|
artisan.default_image = image
|
|
to_update.append(artisan)
|
|
else:
|
|
not_updated += 1
|
|
|
|
EstablishmentSubType.objects.bulk_update(to_update, ['default_image', ])
|
|
self.stdout.write(self.style.WARNING(f'Updated {len(to_update)} objects.'))
|
|
self.stdout.write(self.style.WARNING(f'Not updated {not_updated} objects.')) |