Skip to content

Commit fbb0553

Browse files
Merge pull request #12 from rockstarr-programmerr/dev
Dev
2 parents 54ace15 + 7b99955 commit fbb0553

File tree

6 files changed

+54
-36
lines changed

6 files changed

+54
-36
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):

classroom/business/teacher/classroom.py

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import secrets
2+
import os
23

3-
from django.conf import settings
44
from django.contrib.auth import get_user_model
5+
from django.core.files.storage import default_storage
56

67
from classroom.tasks import send_temp_password_for_new_students_task
78

@@ -73,19 +74,15 @@ def resend_password_emails(classroom, email):
7374
)
7475

7576

76-
def upload_reading_exercise_image(image, request=None):
77-
path = settings.MEDIA_ROOT / 'classroom' / 'reading_exercises' / 'uploaded_images' / image.name
78-
path.parent.mkdir(parents=True, exist_ok=True)
79-
if path.exists():
80-
unique_name = path.stem + secrets.token_urlsafe(nbytes=8)
81-
path = path.parent / f'{unique_name}{path.suffix}'
77+
def upload_reading_exercise_image(image):
78+
directory = 'classroom/reading_exercises/uploaded_images'
79+
path = f'{directory}/{image.name}'
8280

83-
with open(path, 'wb+') as destination:
84-
for chunk in image.chunks():
85-
destination.write(chunk)
81+
if default_storage.exists(path):
82+
img_name, img_ext = os.path.splitext(image.name)
83+
unique_name = img_name + secrets.token_urlsafe(nbytes=8)
84+
path = f'{directory}/{unique_name}{img_ext}'
8685

87-
rpath = path.relative_to(settings.BASE_DIR)
88-
url = '/' + str(rpath).replace('\\', '/')
89-
if request:
90-
url = request.build_absolute_uri(url)
86+
default_storage.save(path, image)
87+
url = default_storage.url(path)
9188
return url

classroom/views/exercise.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,6 @@ def upload_image(self, request):
4343
serializer = self.get_serializer(data=request.data)
4444
serializer.is_valid(raise_exception=True)
4545
image = serializer.validated_data['image']
46-
image_url = business.upload_reading_exercise_image(image, request=request)
46+
image_url = business.upload_reading_exercise_image(image)
4747
serializer = self.get_serializer(instance={'image_url': image_url})
4848
return Response(serializer.data)

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)