Skip to content

Commit a6c9b4d

Browse files
committed
PR feedback
1 parent 24509ec commit a6c9b4d

6 files changed

Lines changed: 42 additions & 9 deletions

File tree

core/validators.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,5 +46,8 @@ def __call__(self, value):
4646
# 1 MB max file size
4747
max_file_size_validator = MaxFileSizeValidator(max_size=1 * 1024 * 1024)
4848

49+
# 5 MB max file size, for downscalable images
50+
downscale_image_file_size_validator = MaxFileSizeValidator(max_size=5 * 1024 * 1024)
51+
4952
# 50 MB allowed for certain large files - to be used on staff-only fields
5053
large_file_max_size_validator = MaxFileSizeValidator(max_size=50 * 1024 * 1024)

templates/v3/user_profile_edit.html

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -523,8 +523,10 @@
523523
avatar = null;
524524
}
525525

526-
if(avatarInput.files.length > 0) formData.append('profile_image', avatarInput.files[0])
527-
else if(avatarInputNew.files.length > 0) formData.append('profile_image', avatarInputNew.files[0])
526+
if(!avatarDelete.checked) {
527+
if(avatarInput.files.length > 0) formData.append('profile_image', avatarInput.files[0])
528+
else if(avatarInputNew.files.length > 0) formData.append('profile_image', avatarInputNew.files[0])
529+
}
528530
formData.append('delete_profile_image', avatarDelete.checked)
529531

530532
this.saving = true;

users/forms.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
from allauth.account.forms import ResetPasswordKeyForm, SignupForm
99

1010
from .models import Preferences
11+
from core.validators import max_file_size_validator
1112
from news.models import NEWS_MODELS
1213
from news.acl import can_approve
1314

@@ -131,7 +132,11 @@ class CustomClearableFileInput(forms.ClearableFileInput):
131132

132133

133134
class UserProfilePhotoForm(forms.ModelForm):
134-
profile_image = forms.FileField(widget=CustomClearableFileInput, required=False)
135+
profile_image = forms.FileField(
136+
widget=CustomClearableFileInput,
137+
required=False,
138+
validators=[max_file_size_validator],
139+
)
135140

136141
class Meta:
137142
model = User

users/models.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@
2222

2323
from core.validators import (
2424
image_validator,
25-
max_file_size_validator,
2625
large_file_max_size_validator,
2726
)
2827
from core.templatetags.custom_static import large_static
@@ -209,7 +208,7 @@ class User(BaseUser):
209208
upload_to="profile-images",
210209
null=True,
211210
blank=True,
212-
validators=[image_validator, max_file_size_validator],
211+
validators=[image_validator],
213212
)
214213
image_thumbnail = ImageSpecField(
215214
source="profile_image",

users/serializers.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
import re
2+
import os
3+
import uuid
24
from urllib.parse import urlparse
35

6+
from django.conf import settings
47
from rest_framework import serializers
58

9+
from core.validators import downscale_image_file_size_validator
10+
from news.utils import downsize_uploaded_image
11+
612
from .forms import SLACK_PROFILE_URL_PREFIX, V3ProfileLinkChoices
713
from .models import User
814

@@ -56,6 +62,9 @@ class CurrentUserSerializer(serializers.ModelSerializer):
5662
"""
5763
User serializer for the currently logged in user
5864
"""
65+
profile_image = serializers.ImageField(
66+
validators=[downscale_image_file_size_validator]
67+
)
5968

6069
def validate_profile_links(self, value):
6170
if not isinstance(value, dict):
@@ -85,6 +94,23 @@ def validate_profile_links(self, value):
8594
raise serializers.ValidationError(field_errors)
8695
return value
8796

97+
def validate_profile_image(self, value):
98+
file_name = value.name
99+
root, ext = os.path.splitext(file_name)
100+
value.name = str(uuid.uuid4()) + ext
101+
if value.size > settings.DOWNSCALE_IMAGE_THRESHOLD:
102+
return downsize_uploaded_image(value)
103+
return value
104+
105+
def validate(self, data):
106+
user = self.instance
107+
if not user.can_update_image and "profile_image" in data:
108+
raise serializers.ValidationError(
109+
"You do not have permission to update your profile photo."
110+
)
111+
112+
return super().validate(data)
113+
88114
class Meta:
89115
model = User
90116
fields = (

users/views.py

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ class CurrentUserAPIView(generics.RetrieveUpdateAPIView):
7979
serializer_class = CurrentUserSerializer
8080
permission_classes = [IsAuthenticated]
8181

82-
def perform_update(self, serializer):
82+
def perform_update(self, serializer: CurrentUserSerializer):
8383
instance = serializer.save()
8484
if self.request.POST.get("delete_profile_image", "").lower() == "true":
8585
instance.profile_image.delete()
@@ -549,9 +549,7 @@ def update_profile(self, form, request):
549549
messages.error(request, f"{error}")
550550

551551
def dispatch(self, request, *args, **kwargs):
552-
if request.GET.get("edit", "").lower() == "true" and isinstance(
553-
request.user, AnonymousUser
554-
):
552+
if isinstance(request.user, AnonymousUser):
555553
return HttpResponseRedirect(reverse_lazy("account_login"))
556554
return super().dispatch(request, *args, **kwargs)
557555

0 commit comments

Comments
 (0)