Skip to content

Commit 533b236

Browse files
change file storage to AWS S3
1 parent 795ba9b commit 533b236

File tree

4 files changed

+42
-21
lines changed

4 files changed

+42
-21
lines changed

account/models.py

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,6 @@
77
from account.managers import (CustomUserManager, StudentManager,
88
TeacherManager, UserTypes)
99

10-
AVATAR_WIDTH = 256
11-
AVATAR_HEIGHT = 256
12-
AVATAR_THUMBNAIL_WIDTH = 64
13-
AVATAR_THUMBNAIL_HEIGHT = 64
14-
1510

1611
class User(AbstractUser):
1712
Types = UserTypes
@@ -59,21 +54,6 @@ class User(AbstractUser):
5954
def __str__(self):
6055
return f'{self.name} ({self.email}) - {self.get_user_type_display()}'
6156

62-
def save(self, *args, **kwargs):
63-
super().save(*args, **kwargs)
64-
self._make_thumbnail(self.avatar, AVATAR_WIDTH, AVATAR_HEIGHT)
65-
self._make_thumbnail(self.avatar_thumbnail, AVATAR_THUMBNAIL_WIDTH, AVATAR_THUMBNAIL_HEIGHT)
66-
67-
@staticmethod
68-
def _make_thumbnail(image, width, height):
69-
if image and (
70-
image.width > width or
71-
image.height > height
72-
):
73-
with Image.open(image.path) as f:
74-
f.thumbnail((width, height))
75-
f.save(image.path)
76-
7757
def is_teacher(self):
7858
return self.user_type == self.Types.TEACHER
7959

account/serializers.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
import io
2+
13
from django.conf import settings
24
from django.contrib.auth import get_user_model
35
from django.contrib.auth.password_validation import validate_password
6+
from django.core.files.images import ImageFile
47
from django.utils.translation import gettext as _
8+
from PIL import Image
59
from rest_framework import serializers
610

711
User = get_user_model()
@@ -26,7 +30,12 @@ class Meta:
2630
def validate(self, attrs):
2731
attrs = super().validate(attrs)
2832
if 'avatar' in attrs:
29-
attrs['avatar_thumbnail'] = attrs['avatar']
33+
avatar = attrs['avatar']
34+
if avatar:
35+
attrs['avatar'] = self._make_thumbnail(avatar, 256, 256)
36+
attrs['avatar_thumbnail'] = self._make_thumbnail(avatar, 64, 64)
37+
else:
38+
attrs['avatar_thumbnail'] = avatar # When remove avatar, also remove avatar_thumbnail
3039
return attrs
3140

3241
def validate_avatar(self, img):
@@ -42,6 +51,17 @@ def validate_avatar(self, img):
4251

4352
return img
4453

54+
@staticmethod
55+
def _make_thumbnail(image, width, height):
56+
thumb = Image.open(image)
57+
thumb.thumbnail((width, height))
58+
59+
buffer = io.BytesIO()
60+
thumb.save(buffer, format=thumb.format)
61+
62+
data = ImageFile(buffer, name=image.name)
63+
return data
64+
4565

4666
class RegisterTeacherSerializer(UserSerializer):
4767
class Meta(UserSerializer.Meta):

keep_learning/settings.py

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,13 @@
5858
CELERY_BROKER_URL=(str, 'amqp://kl_user:kl_password@localhost:5672/kl_vhost'),
5959
WEB_LOGIN_URL=(str, 'http://localhost:8080/login'),
6060
WEB_RESET_PASSWORD_URL=(str, 'http://localhost:8080/new-password'),
61+
DEFAULT_FILE_STORAGE=(str, 'django.core.files.storage.FileSystemStorage'),
62+
63+
AWS_S3_ACCESS_KEY_ID=(str, ''),
64+
AWS_S3_SECRET_ACCESS_KEY=(str, ''),
65+
AWS_STORAGE_BUCKET_NAME=(str, ''),
66+
AWS_S3_REGION_NAME=(str, ''),
67+
AWS_S3_FILE_OVERWRITE=(bool, False),
6168
)
6269
# reading .env file
6370
env_file = str(BASE_DIR / '.env')
@@ -285,3 +292,11 @@
285292
WEB_RESET_PASSWORD_URL = env('WEB_RESET_PASSWORD_URL')
286293

287294
MAX_UPLOAD_SIZE_MEGABYTES = 10
295+
296+
DEFAULT_FILE_STORAGE = env('DEFAULT_FILE_STORAGE')
297+
298+
AWS_S3_ACCESS_KEY_ID = env('AWS_S3_ACCESS_KEY_ID')
299+
AWS_S3_SECRET_ACCESS_KEY = env('AWS_S3_SECRET_ACCESS_KEY')
300+
AWS_STORAGE_BUCKET_NAME = env('AWS_STORAGE_BUCKET_NAME')
301+
AWS_S3_REGION_NAME = env('AWS_S3_REGION_NAME')
302+
AWS_S3_FILE_OVERWRITE = env('AWS_S3_FILE_OVERWRITE')

requirements.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
amqp==5.0.6
22
asgiref==3.4.1
33
billiard==3.6.4.0
4+
boto3==1.18.64
5+
botocore==1.21.64
46
celery==5.1.2
57
click==7.1.2
68
click-didyoumean==0.3.0
@@ -11,16 +13,20 @@ django-cors-headers==3.9.0
1113
django-crispy-forms==1.13.0
1214
django-environ==0.7.0
1315
django-filter==21.1
16+
django-storages==1.12.2
1417
djangorestframework==3.12.4
1518
djangorestframework-simplejwt==4.8.0
19+
jmespath==0.10.0
1620
kombu==5.1.0
1721
Markdown==3.3.4
1822
Pillow==8.3.2
1923
prompt-toolkit==3.0.20
2024
PyJWT==2.1.0
2125
python-dateutil==2.8.2
2226
pytz==2021.3
27+
s3transfer==0.5.0
2328
six==1.16.0
2429
sqlparse==0.4.2
30+
urllib3==1.26.7
2531
vine==5.0.0
2632
wcwidth==0.2.5

0 commit comments

Comments
 (0)