fix(users): support profile picture delete and dev sms fallback
This commit is contained in:
@@ -224,6 +224,21 @@ class ProfilePictureView(APIView):
|
|||||||
serializer.save()
|
serializer.save()
|
||||||
return Response(serializer.data, status=status.HTTP_200_OK)
|
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):
|
class UserListView(ListAPIView):
|
||||||
permission_classes = [IsAuthenticated]
|
permission_classes = [IsAuthenticated]
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ from django.conf import settings
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
SMS_APIKEY = settings.SMS_APIKEY
|
|
||||||
|
|
||||||
|
|
||||||
def _send_sms(receptor, pattern_code, variables: list = None):
|
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"
|
SMS_ENDPOINT = "https://api.sms.ir/v1/send/verify"
|
||||||
|
|
||||||
variables = variables or []
|
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 = {
|
payload = {
|
||||||
"mobile": receptor,
|
"mobile": receptor,
|
||||||
"templateId": str(pattern_code),
|
"templateId": str(pattern_code),
|
||||||
@@ -52,6 +50,10 @@ def _send_sms(receptor, pattern_code, variables: list = None):
|
|||||||
def send_verification_sms(mobile, code):
|
def send_verification_sms(mobile, code):
|
||||||
logger.info(f"Starting to send SMS to {mobile} with code {code}")
|
logger.info(f"Starting to send SMS to {mobile} with code {code}")
|
||||||
try:
|
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)}]
|
variables = [{"name": "OTP", "value": str(code)}]
|
||||||
response = _send_sms(mobile, 570574, variables=variables)
|
response = _send_sms(mobile, 570574, variables=variables)
|
||||||
if response and response.status_code == 200:
|
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