Skip to content

Commit af1f542

Browse files
committed
fix(ban): Add defensive coding for forum ban API calls
1 parent c5080b7 commit af1f542

File tree

3 files changed

+22
-4
lines changed

3 files changed

+22
-4
lines changed

lms/djangoapps/discussion/rest_api/api.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -394,7 +394,7 @@ def _format_datetime(dt):
394394
"is_email_verified": request.user.is_active,
395395
"only_verified_users_can_post": ONLY_VERIFIED_USERS_CAN_POST.is_enabled(course_key),
396396
"content_creation_rate_limited": is_content_creation_rate_limited(request, course_key, increment=False),
397-
"is_user_banned": forum_api.is_user_banned(request.user, course_key),
397+
"is_user_banned": getattr(forum_api, 'is_user_banned', lambda u, c: False)(request.user, course_key),
398398
"enable_discussion_ban": ENABLE_DISCUSSION_BAN.is_enabled(course_key),
399399
}
400400

@@ -1503,7 +1503,8 @@ def create_thread(request, thread_data):
15031503
raise DiscussionBlackOutException
15041504

15051505
# Check if user is banned from discussions
1506-
if forum_api.is_user_banned(user, course_key):
1506+
is_user_banned = getattr(forum_api, 'is_user_banned', None)
1507+
if is_user_banned and is_user_banned(user, course_key):
15071508
raise PermissionDenied("You are banned from posting in this course's discussions.")
15081509

15091510
notify_all_learners = thread_data.pop("notify_all_learners", False)
@@ -1563,7 +1564,8 @@ def create_comment(request, comment_data):
15631564
raise DiscussionBlackOutException
15641565

15651566
# Check if user is banned from discussions
1566-
if forum_api.is_user_banned(request.user, course.id):
1567+
is_user_banned = getattr(forum_api, 'is_user_banned', None)
1568+
if is_user_banned and is_user_banned(request.user, course.id):
15671569
raise PermissionDenied("You are banned from posting in this course's discussions.")
15681570

15691571
# if a thread is closed; no new comments could be made to it

lms/djangoapps/discussion/rest_api/serializers.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,9 @@ def get_is_author_banned(self, obj):
298298
course_id = self.context.get("course_id")
299299

300300
if course_id:
301-
return forum_api.is_user_banned(user, course_id)
301+
is_user_banned = getattr(forum_api, 'is_user_banned', None)
302+
if is_user_banned:
303+
return is_user_banned(user, course_id)
302304
return None
303305
except (ObjectDoesNotExist, ValueError, Exception): # pylint: disable=broad-exception-caught
304306
return None

lms/djangoapps/discussion/rest_api/views.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1861,6 +1861,13 @@ def ban_user(self, request):
18611861
from forum import api as forum_api
18621862
from lms.djangoapps.discussion.rest_api.serializers import BanUserRequestSerializer
18631863

1864+
# Check if ban API is available
1865+
if not hasattr(forum_api, 'ban_user') or not hasattr(forum_api, 'is_user_banned'):
1866+
return Response(
1867+
{'error': 'Ban functionality is not available in this forum version'},
1868+
status=status.HTTP_501_NOT_IMPLEMENTED
1869+
)
1870+
18641871
serializer = BanUserRequestSerializer(data=request.data, context={'request': request})
18651872
if not serializer.is_valid():
18661873
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
@@ -2010,6 +2017,13 @@ def unban_user(self, request):
20102017
from forum import api as forum_api
20112018
from lms.djangoapps.discussion.rest_api.serializers import BanUserRequestSerializer
20122019

2020+
# Check if ban API is available
2021+
if not hasattr(forum_api, 'unban_user') or not hasattr(forum_api, 'is_user_banned'):
2022+
return Response(
2023+
{'error': 'Ban functionality is not available in this forum version'},
2024+
status=status.HTTP_501_NOT_IMPLEMENTED
2025+
)
2026+
20132027
serializer = BanUserRequestSerializer(data=request.data, context={'request': request})
20142028
if not serializer.is_valid():
20152029
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

0 commit comments

Comments
 (0)