fix(users): support profile picture delete and dev sms fallback
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
18
apps/users/tests/test_profile_picture_api.py
Normal file
18
apps/users/tests/test_profile_picture_api.py
Normal 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
|
||||
13
apps/users/tests/test_tasks.py
Normal file
13
apps/users/tests/test_tasks.py
Normal 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,
|
||||
}
|
||||
Reference in New Issue
Block a user