diff --git a/apps/users/api/views.py b/apps/users/api/views.py index cc3ead8..dffdb36 100644 --- a/apps/users/api/views.py +++ b/apps/users/api/views.py @@ -224,6 +224,21 @@ class ProfilePictureView(APIView): serializer.save() return Response(serializer.data, status=status.HTTP_200_OK) + @extend_schema( + responses=UserProfilePictureSerializer, + operation_id="users_profile_picture_self_delete", + ) + def delete(self, request): + request.user.profile_picture.delete(save=False) + request.user.profile_picture = None + request.user.save(update_fields=["profile_picture", "updated_at"]) + + serializer = UserProfilePictureSerializer( + instance=request.user, + context={"request": request}, + ) + return Response(serializer.data, status=status.HTTP_200_OK) + class UserListView(ListAPIView): permission_classes = [IsAuthenticated] @@ -268,4 +283,4 @@ class UserSearchAPIView(APIView): ) serializer = UserSearchSerializer(user, context={"request": request}) - return Response(serializer.data, status=status.HTTP_200_OK) \ No newline at end of file + return Response(serializer.data, status=status.HTTP_200_OK) diff --git a/apps/users/tasks.py b/apps/users/tasks.py index 7c99b21..5bcb1d9 100644 --- a/apps/users/tasks.py +++ b/apps/users/tasks.py @@ -6,8 +6,6 @@ from django.conf import settings logger = logging.getLogger(__name__) -SMS_APIKEY = settings.SMS_APIKEY - def _send_sms(receptor, pattern_code, variables: list = None): """ @@ -16,7 +14,7 @@ def _send_sms(receptor, pattern_code, variables: list = None): SMS_ENDPOINT = "https://api.sms.ir/v1/send/verify" variables = variables or [] - headers = {"Content-Type": "application/json", "Accept": "text/plain", "x-api-key": SMS_APIKEY} + headers = {"Content-Type": "application/json", "Accept": "text/plain", "x-api-key": settings.SMS_APIKEY} payload = { "mobile": receptor, "templateId": str(pattern_code), @@ -52,6 +50,10 @@ def _send_sms(receptor, pattern_code, variables: list = None): def send_verification_sms(mobile, code): logger.info(f"Starting to send SMS to {mobile} with code {code}") try: + if not settings.SMS_APIKEY: + logger.info("SMS_APIKEY is not configured. Skipping real SMS delivery for %s with code %s", mobile, code) + return {"mobile": mobile, "code": str(code), "sent": False} + variables = [{"name": "OTP", "value": str(code)}] response = _send_sms(mobile, 570574, variables=variables) if response and response.status_code == 200: diff --git a/apps/users/tests/test_profile_picture_api.py b/apps/users/tests/test_profile_picture_api.py new file mode 100644 index 0000000..87a5663 --- /dev/null +++ b/apps/users/tests/test_profile_picture_api.py @@ -0,0 +1,18 @@ +from rest_framework import status +from rest_framework.test import APIClient + +from apps.users.models import User + + +def test_profile_picture_delete_returns_profile_payload(db): + user = User.objects.create_user(mobile="09120000000", password="secret123") + client = APIClient() + client.force_authenticate(user=user) + + response = client.delete("/api/users/profile/picture/") + + assert response.status_code == status.HTTP_200_OK + assert response.data["profile_picture"] is None + + user.refresh_from_db() + assert not user.profile_picture diff --git a/apps/users/tests/test_tasks.py b/apps/users/tests/test_tasks.py new file mode 100644 index 0000000..0827959 --- /dev/null +++ b/apps/users/tests/test_tasks.py @@ -0,0 +1,13 @@ +from apps.users.tasks import send_verification_sms + + +def test_send_verification_sms_skips_real_delivery_without_api_key(settings): + settings.SMS_APIKEY = "" + + result = send_verification_sms("09123456789", "12345") + + assert result == { + "mobile": "09123456789", + "code": "12345", + "sent": False, + }