Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add user profile pictures #2253

Merged
merged 26 commits into from
Sep 23, 2024
Merged
Changes from 1 commit
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
927f288
new profile pic feature
UdaySagar-Git Jun 7, 2024
e038343
Merge branch 'develop' into profile-pic
UdaySagar-Git Jun 7, 2024
c30735b
bug fix
UdaySagar-Git Jun 7, 2024
348351c
Merge branch 'profile-pic' of https://github.com/UdaySagar-Git/care i…
UdaySagar-Git Jun 7, 2024
fc4c573
removes new bucket
UdaySagar-Git Jul 9, 2024
4fb9910
fix bug
UdaySagar-Git Jul 9, 2024
1f408c6
checks for write permissions
UdaySagar-Git Jul 9, 2024
8f5020c
Merge branch 'develop' into profile-pic
UdaySagar-Git Aug 15, 2024
0057a6a
lint fix
UdaySagar-Git Aug 15, 2024
39bee6c
adds permission checks
UdaySagar-Git Aug 18, 2024
e2d7aa5
Merge branch 'develop' into profile-pic
UdaySagar-Git Sep 17, 2024
54bcf29
Merge branch 'develop' into profile-pic
UdaySagar-Git Sep 20, 2024
aaa48e2
Merge branch 'develop' into profile-pic
sainak Sep 21, 2024
9e83dc0
refactor cover image upload logic
sainak Sep 21, 2024
d6f4baf
update perms and cleanup
sainak Sep 21, 2024
8ef37b8
update migrations
sainak Sep 21, 2024
a95a80a
Merge remote-tracking branch 'origin/develop' into profile-pic
sainak Sep 21, 2024
2191cdb
add tests
sainak Sep 21, 2024
69de284
cleanup parsers
sainak Sep 21, 2024
ec87341
lint fix
sainak Sep 21, 2024
db5926c
optimize unique key generation
sainak Sep 21, 2024
237258e
delete images from s3 with delete operation
sainak Sep 21, 2024
8a8b533
fix tests
sainak Sep 21, 2024
777bffc
fix
sainak Sep 22, 2024
4caf143
Merge remote-tracking branch 'origin/develop' into profile-pic
sainak Sep 22, 2024
8dd0f6a
Merge branch 'develop' into profile-pic
vigneshhari Sep 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add tests
sainak committed Sep 21, 2024

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature.
commit 2191cdb4222b1ba594ab1402abf14670c9de588d
12 changes: 6 additions & 6 deletions care/users/api/viewsets/users.py
Original file line number Diff line number Diff line change
@@ -401,14 +401,14 @@ def check_availability(self, request, username):
return Response(status=status.HTTP_409_CONFLICT)
return Response(status=status.HTTP_200_OK)

def has_profile_image_write_permission(self, user, request):
return user.is_superuser or (user.id == request.user.id)
def has_profile_image_write_permission(self, request, user):
return request.user.is_superuser or (user.id == request.user.id)

@extend_schema(tags=["users"])
@action(detail=True, methods=["POST"], permission_classes=[IsAuthenticated])
def profile_picture(self, request, username):
def profile_picture(self, request, *args, **kwargs):
user = self.get_object()
if not self.has_profile_image_write_permission(user, request):
if not self.has_profile_image_write_permission(request, user):
return Response(status=status.HTTP_403_FORBIDDEN)
serializer = self.get_serializer(user, data=request.data)
serializer.is_valid(raise_exception=True)
@@ -417,9 +417,9 @@ def profile_picture(self, request, username):

@extend_schema(tags=["users"])
@profile_picture.mapping.delete
def profile_picture_delete(self, *args, **kwargs):
def profile_picture_delete(self, request, *args, **kwargs):
user = self.get_object()
if not self.has_profile_image_write_permission(user, self.request):
if not self.has_profile_image_write_permission(request, user):
return Response(status=status.HTTP_403_FORBIDDEN)
user.profile_picture_url = None
user.save()
68 changes: 68 additions & 0 deletions care/users/tests/test_api.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
import io
from datetime import date, timedelta

from django.core.files.uploadedfile import SimpleUploadedFile
from django.utils import timezone
from PIL import Image
from rest_framework import status
from rest_framework.test import APITestCase

@@ -293,3 +296,68 @@ def test_home_facility_filter(self):
self.assertIn(
self.user_5.username, {r["username"] for r in res_data_json["results"]}
)


class TestUserProfilePicture(TestUtils, APITestCase):
@classmethod
def setUpTestData(cls) -> None:
cls.state = cls.create_state()
cls.district = cls.create_district(cls.state)
cls.super_user = cls.create_super_user("su", cls.district)
cls.user = cls.create_user("staff1", cls.district)

def get_base_url(self) -> str:
return f"/api/v1/users/{self.user.username}/profile_picture/"

def get_payload(self) -> dict:
image = Image.new("RGB", (400, 400))
file = io.BytesIO()
image.save(file, format="JPEG")
test_file = SimpleUploadedFile("test.jpg", file.getvalue(), "image/jpeg")
test_file.size = 2000
return {"profile_picture": test_file}

def test_user_can_upload_profile_picture(self):
image = Image.new("RGB", (400, 400))
file = io.BytesIO()
image.save(file, format="JPEG")
test_file = SimpleUploadedFile("test.jpg", file.getvalue(), "image/jpeg")
test_file.size = 2000
response = self.client.post(
self.get_base_url(), self.get_payload(), format="multipart"
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertIsNotNone(
User.objects.get(username=self.user.username).profile_picture_url
)

def test_user_can_delete_profile_picture(self):
self.user.profile_picture_url = "image.jpg"
self.user.save(update_fields=["profile_picture_url"])

response = self.client.delete(self.get_base_url())
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
self.assertIsNone(
User.objects.get(username=self.user.username).profile_picture_url
)

def test_superuser_can_upload_profile_picture(self):
self.client.force_authenticate(self.super_user)
response = self.client.post(
self.get_base_url(), self.get_payload(), format="multipart"
)
self.assertEqual(response.status_code, status.HTTP_200_OK)
self.assertIsNotNone(
User.objects.get(username=self.user.username).profile_picture_url
)

def test_superuser_can_delete_profile_picture(self):
self.user.profile_picture_url = "image.jpg"
self.user.save(update_fields=["profile_picture_url"])

self.client.force_authenticate(self.super_user)
response = self.client.delete(self.get_base_url())
self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT)
self.assertIsNone(
User.objects.get(username=self.user.username).profile_picture_url
)