Что для этого нужно сделать:
1. расширить аппу Oscar "Dashboard". Как это сделать: http://django-oscar.readthedocs.io/en/latest/topics/customisation.html#fork-the-oscar-app
-2. переопределить в этой аппе класс ProductCreateUpdateView, метод forms_valid(). Этот метод отвечает за сохранение нового продукта. В этом методе, после сохранения продукта, нужно найти картинки, которые к нему прицеплены, асинхронно выгрузить на Amazon S3 и подменить ссылки в БД.
+2. переопределить в этой аппе класс ProductCreateUpdateView, метод forms\_valid(). Этот метод отвечает за сохранение нового продукта. В этом методе, после сохранения продукта, нужно найти картинки, которые к нему прицеплены, асинхронно выгрузить на Amazon S3 и подменить ссылки в БД.
3. На всякий случай - вот самый простой способ запустить какую-то функцию асинхронно:
def blocking_func(arg1, arg2):
- print('some blocking stuff')
+ print('some blocking stuff')
thread1 = threading.Thread(target=blocking_func, args=('aaa', 'bbb'))
никакого Celery и пр. заводить не надо, пока что достаточно такого примитивного способа.
-4. Структуру объектов "продукт" и "изображение продукта" можно найти в аппе Oscar "Catalogue" http://prnt.sc/cyq609 . Это должно помочь понять, какие поля БД нужно подменять.
+4. Структуру объектов "продукт" и "изображение продукта" можно найти в аппе Oscar "Catalogue" http://prnt.sc/cyq609 . Это должно помочь понять, какие поля БД нужно подменять.
+5. То же самое нужно проделать с картинками категорий, а не продуктов. За сохранение и обновление категорий отвечают CategoryCreateView и CategoryUpdateView, нужно просто переопределить их form\_valid().
+6. Быстрые сниппеты для работы с Amazon:
+session = boto3.Session(
+ aws_access_key_id='---',
+ aws_secret_access_key='---',
+s3 = session.resource('s3')
+# проверка, есть ли у юзера права на все buckets
+for bucket in s3.buckets.all():
+bucket = s3.Bucket('getmybotoscar')
+# проверка, есть ли у юзера права на считывание всех файлов из нужного бакета
+for obj in bucket.objects.all():
+# пример фильтров по файлам
+for obj in bucket.objects.filter(Prefix='Dev/').all():
+# проверка, может ли юзер класть файлы в этот бакет
+data = open('create_auth_msgs.py', 'rb')
+bucket.put_object(Key='test.py', Body=data)
+# проверка, может ли он считывать файлы из этого бакета
+obj = s3.Object(bucket_name='getmybotoscar', key='test.py')
+data = response['Body'].read()