Skip to content

Commit b56c7ee

Browse files
validate img size
1 parent 6c55e61 commit b56c7ee

File tree

3 files changed

+41
-5
lines changed

3 files changed

+41
-5
lines changed

account/serializers.py

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.conf import settings
22
from django.contrib.auth import get_user_model
3+
from django.contrib.auth.password_validation import validate_password
34
from django.utils.translation import gettext as _
45
from rest_framework import serializers
56

@@ -27,12 +28,16 @@ def validate(self, attrs):
2728
return attrs
2829

2930
def validate_avatar(self, img):
31+
if not img:
32+
return img
33+
3034
size = img.size / 1e6 # bytes to megabytes
3135
if size > settings.MAX_UPLOAD_SIZE_MEGABYTES:
3236
raise serializers.ValidationError(
3337
_('File size must not exceed %dMB.') % settings.MAX_UPLOAD_SIZE_MEGABYTES,
3438
code='exceed_max_upload_size'
3539
)
40+
3641
return img
3742

3843

@@ -44,7 +49,7 @@ class Meta(UserSerializer.Meta):
4449
'password', 'avatar', 'avatar_thumbnail',
4550
]
4651
extra_kwargs = {
47-
'password': {'write_only': True},
52+
'password': {'write_only': True, 'validators': [validate_password]},
4853
'avatar_thumbnail': {'read_only': True},
4954
'name': {'required': False},
5055
'phone_number': {'required': False},
@@ -54,3 +59,8 @@ class Meta(UserSerializer.Meta):
5459

5560
class MeSerializer(UserSerializer):
5661
pass
62+
63+
64+
class ChangePasswordSerializer(serializers.Serializer):
65+
current_password = serializers.CharField(write_only=True)
66+
new_password = serializers.CharField(write_only=True, validators=[validate_password])

account/views.py

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
from django.contrib.auth import get_user_model
2-
from django.db.models import Q
32
from django.utils.decorators import classonlymethod, method_decorator
3+
from django.utils.translation import gettext as _
44
from django.views.decorators.debug import sensitive_post_parameters
55
from rest_framework import mixins
66
from rest_framework.decorators import action
7+
from rest_framework.exceptions import PermissionDenied
78
from rest_framework.generics import get_object_or_404
89
from rest_framework.permissions import AllowAny
910
from rest_framework.response import Response
1011
from rest_framework.viewsets import GenericViewSet
1112

1213
from account import business
13-
from account.managers import UserTypes
14-
from account.serializers import (MeSerializer, RegisterTeacherSerializer,
15-
UserSerializer)
14+
from account.serializers import (ChangePasswordSerializer, MeSerializer,
15+
RegisterTeacherSerializer, UserSerializer)
1616

1717
User = get_user_model()
1818

@@ -66,6 +66,28 @@ def register_teacher(self, request):
6666
serializer = self.get_serializer(instance=teacher)
6767
return Response(serializer.data)
6868

69+
@action(
70+
detail=False, methods=['POST'],
71+
url_path='change-password',
72+
serializer_class=ChangePasswordSerializer,
73+
)
74+
def change_password(self, request):
75+
"""
76+
Change logged-in user's password, return 403 if `current_password` is not correct.
77+
"""
78+
serializer = self.get_serializer(data=request.data)
79+
serializer.is_valid(raise_exception=True)
80+
current_password = serializer.validated_data['current_password']
81+
new_password = serializer.validated_data['new_password']
82+
83+
user = self.request.user
84+
if not user.check_password(current_password):
85+
raise PermissionDenied(_('Wrong password.'))
86+
87+
user.set_password(new_password)
88+
user.save()
89+
return Response()
90+
6991

7092
class MeViewSet(mixins.ListModelMixin,
7193
mixins.RetrieveModelMixin,

classroom/serializers/exercise.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,14 @@ class ReadingExerciseUploadImgSerializer(serializers.Serializer):
6666
image_url = serializers.URLField(read_only=True)
6767

6868
def validate_image(self, image):
69+
if not image:
70+
return image
71+
6972
size = image.size / 1e6 # bytes to megabytes
7073
if size > settings.MAX_UPLOAD_SIZE_MEGABYTES:
7174
raise serializers.ValidationError(
7275
_('File size must not exceed %dMB.') % settings.MAX_UPLOAD_SIZE_MEGABYTES,
7376
code='exceed_max_upload_size'
7477
)
78+
7579
return image

0 commit comments

Comments
 (0)