fix(users): support profile picture delete and dev sms fallback

This commit is contained in:
2026-04-24 22:20:13 +03:30
parent 7cae494892
commit a44995017b
4 changed files with 52 additions and 4 deletions

View File

@@ -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)
return Response(serializer.data, status=status.HTTP_200_OK)

View File

@@ -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:

View File

@@ -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

View File

@@ -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,
}