11import json
2+ import requests
23
34from django .http import HttpResponse , HttpResponseRedirect , HttpResponseForbidden
45from django .shortcuts import render , get_object_or_404
@@ -318,6 +319,50 @@ def filter(request, category=None, tutorial=None, minute_range=None, second_rang
318319def new_question (request ):
319320 context = {}
320321 if request .method == 'POST' :
322+ # check if user has a role
323+ user_has_role = request .user .is_authenticated and request .user .groups .exists ()
324+
325+ # only require captcha for users without a role
326+ if not user_has_role :
327+
328+ recaptcha_response = request .POST .get ('g-recaptcha-response' , '' )
329+
330+ if not recaptcha_response :
331+ messages .error (request , "Please complete the reCAPTCHA verification." )
332+ form = NewQuestionForm (request .POST )
333+ context ['form' ] = form
334+ context ['recaptcha_site_key' ] = settings .RECAPTCHA_SITE_KEY
335+ context ['require_recaptcha' ] = True
336+ return render (request , 'website/templates/new-question.html' , context )
337+
338+ # verify with google
339+ recaptcha_verification_url = "https://www.google.com/recaptcha/api/siteverify"
340+ recaptcha_data = {
341+ 'secret' : settings .RECAPTCHA_SECRET_KEY ,
342+ 'response' : recaptcha_response
343+ }
344+
345+ try :
346+ recaptcha_result = requests .post (recaptcha_verification_url , data = recaptcha_data , timeout = 5 )
347+ recaptcha_result .raise_for_status ()
348+ recaptcha_json = recaptcha_result .json ()
349+ except requests .RequestException as e :
350+ messages .error (request , "Error verifying reCAPTCHA. Please try again." )
351+ form = NewQuestionForm (request .POST )
352+ context ['form' ] = form
353+ context ['recaptcha_site_key' ] = settings .RECAPTCHA_SITE_KEY
354+ context ['require_recaptcha' ] = True
355+ return render (request , 'website/templates/new-question.html' , context )
356+
357+ # check if verification was successful
358+ if not recaptcha_json .get ('success' , False ):
359+ messages .error (request , "reCAPTCHA verification failed. Please try again." )
360+ form = NewQuestionForm (request .POST )
361+ context ['form' ] = form
362+ context ['recaptcha_site_key' ] = settings .RECAPTCHA_SITE_KEY
363+ context ['require_recaptcha' ] = True
364+ return render (request , 'website/templates/new-question.html' , context )
365+
321366 form = NewQuestionForm (request .POST )
322367 if form .is_valid ():
323368 cleaned_data = form .cleaned_data
@@ -331,35 +376,51 @@ def new_question(request):
331376 question .body = cleaned_data ['body' ]
332377 question .views = 1
333378 question .save ()
379+ # Run spam detection
380+ action = handle_spam (question , request .user )
381+
382+ if action == "AUTO_DELETE" :
383+ messages .error (request , " Your question is being marked as spam and your account has been deactivated." )
384+ user_logout (request )
385+ return HttpResponseRedirect ('/' )
386+
387+ elif action == "FLAGGED" :
388+ messages .warning (request , " Your question is pending moderator review." )
389+ # Don’t send email for flagged content
390+ return HttpResponseRedirect ('/' )
391+
392+ else : # APPROVED
393+
394+ subject = 'New Forum Question'
395+ message = f"""
396+ The following new question has been posted in the Spoken Tutorial Forum: <br>
397+ Title: <b>{ question .title } </b><br>
398+ Category: <b>{ question .category } </b><br>
399+ Tutorial: <b>{ question .tutorial } </b><br>
400+ Link: <a href="http://forums.spoken-tutorial.org/question/{ question .id } ">
401+ http://forums.spoken-tutorial.org/question/{ question .id }
402+ </a><br>
403+ Question: <b>{ question .body } </b><br>
404+ """
405+ email = EmailMultiAlternatives (
406+ subject , '' , 'forums' ,
407+ ['team@spoken-tutorial.org' , 'team@fossee.in' ],
408+ headers = {"Content-type" : "text/html;charset=iso-8859-1" }
409+ )
410+ email .attach_alternative (message , "text/html" )
411+ email .send (fail_silently = True )
412+ return HttpResponseRedirect ('/' )
334413
335- # Sending email when a new question is asked
336- subject = 'New Forum Question'
337- message = """
338- The following new question has been posted in the Spoken Tutorial Forum: <br>
339- Title: <b>{0}</b><br>
340- Category: <b>{1}</b><br>
341- Tutorial: <b>{2}</b><br>
342- Link: <a href="{3}">{3}</a><br>
343- Question: <b>{4}</b><br>
344- """ .format (
345- question .title ,
346- question .category ,
347- question .tutorial ,
348- 'http://forums.spoken-tutorial.org/question/' + str (question .id ),
349- question .body
350- )
351- email = EmailMultiAlternatives (
352- subject , '' , 'forums' ,
353- ['team@spoken-tutorial.org' , 'team@fossee.in' ],
354- headers = {"Content-type" : "text/html;charset=iso-8859-1" }
355- )
356- email .attach_alternative (message , "text/html" )
357- email .send (fail_silently = True )
358- # End of email send
414+ # If form not valid -> re-render with errors
415+ context ['form' ] = form
416+ context ['recaptcha_site_key' ] = settings .RECAPTCHA_SITE_KEY
417+ # check if user needs to complete captcha
418+ user_has_role = request .user .is_authenticated and request .user .groups .exists ()
419+ context ['require_recaptcha' ] = not user_has_role
420+ return render (request , 'website/templates/new-question.html' , context )
359421
360- return HttpResponseRedirect ('/' )
361422 else :
362- # get values from URL.
423+ # GET request -> render empty form
363424 category = request .GET .get ('category' , None )
364425 tutorial = request .GET .get ('tutorial' , None )
365426 minute_range = request .GET .get ('minute_range' , None )
@@ -368,10 +429,11 @@ def new_question(request):
368429 form = NewQuestionForm (category = category , tutorial = tutorial ,
369430 minute_range = minute_range , second_range = second_range )
370431 context ['category' ] = category
371-
372- context ['form' ] = form
373- context .update (csrf (request ))
374- return render (request , 'website/templates/new-question.html' , context )
432+ context ['recaptcha_site_key' ] = settings .RECAPTCHA_SITE_KEY
433+ # check if user needs to complete captcha
434+ user_has_role = request .user .is_authenticated and request .user .groups .exists ()
435+ context ['require_recaptcha' ] = not user_has_role
436+ return render (request , 'website/templates/new-question.html' , context )
375437
376438# Notification Section
377439
0 commit comments