Skip to content

Commit 853308d

Browse files
Modified/Corrected
1 parent eb6f00d commit 853308d

7 files changed

Lines changed: 90 additions & 122 deletions

File tree

.env.example

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
DB='forums'
2+
DB_USER='root'
3+
DB_PASSWORD= '1234'
4+
SPOKEN_DB='13thJune'
5+
6+
SECRET_KEY=''
7+
VIDEO_PATH=''
8+
DEBUG=True
9+
TEMPLATE_DEBUG=True

forums/settings.py

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -114,16 +114,16 @@
114114
'HOST': '',
115115
'PORT': '', # Set to empty string for default.
116116
},
117-
#'cdeep': {
118-
# 'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
119-
# 'NAME': 'CDEEP', # Or path to database file if using sqlite3.
120-
# # The following settings are not used with sqlite3:
121-
# 'USER': os.getenv("DB_USER"),
122-
# 'PASSWORD': os.getenv("DB_PASSWORD"),
123-
# # Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
124-
# 'HOST': '',
125-
# 'PORT': '', # Set to empty string for default.
126-
#},
117+
'cdeep': {
118+
'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
119+
'NAME': 'CDEEP', # Or path to database file if using sqlite3.
120+
# The following settings are not used with sqlite3:
121+
'USER': os.getenv("DB_USER"),
122+
'PASSWORD': os.getenv("DB_PASSWORD"),
123+
# Empty for localhost through domain sockets or '127.0.0.1' for localhost through TCP.
124+
'HOST': '',
125+
'PORT': '', # Set to empty string for default.
126+
},
127127
}
128128

129129
# Password validation

forums/views.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.http import HttpResponseRedirect, HttpResponse
22
from django.contrib.auth import login, logout
3-
from django.shortcuts import render
3+
from django.shortcuts import render_to_response
44
from django.template.context_processors import csrf
55

66
from forums.forms import UserLoginForm
@@ -29,7 +29,7 @@ def user_login(request):
2929
'resetpasssucs': resetpasssucs
3030
}
3131
context.update(csrf(request))
32-
return render(request,'forums/templates/user-login.html', context)
32+
return render_to_response('forums/templates/user-login.html', context)
3333
else:
3434
return HttpResponseRedirect('/')
3535

@@ -49,7 +49,7 @@ def updatepassword(request):
4949
confirm = request.POST['confirm_new_password']
5050
if new_password == "" or confirm == "":
5151
context['empty'] = True
52-
return render(request,"update-password.html", context)
52+
return render_to_response("update-password.html", context)
5353
if new_password == confirm:
5454
user.set_password(new_password)
5555
user.save()
@@ -61,14 +61,14 @@ def updatepassword(request):
6161
return HttpResponseRedirect('/')
6262
else:
6363
context['no_match'] = True
64-
return render(request,"forums/templates/update-password.html", context)
64+
return render_to_response("forums/templates/update-password.html", context)
6565
else:
66-
return render(request,"forums/templates/update-password.html", context)
66+
return render_to_response("forums/templates/update-password.html", context)
6767
else:
6868
form = UserLoginForm()
6969
context['form'] = form
7070
context['for_update_password'] = True
71-
return render(request,'website/templates/index.html', context)
71+
return render_to_response('website/templates/index.html', context)
7272

7373
def robots_txt(request):
7474
with open('robots.txt', 'r') as f:

static/website/js/thread-user.js

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,30 +6,6 @@ bkLib.onDomLoaded(function() {
66
questionNicEditor.setPanel('questionNicPanel');
77
questionNicEditor.addInstance('questionInstance');
88
});
9-
function getCookie(name) {
10-
let cookieValue = null;
11-
if (document.cookie && document.cookie !== '') {
12-
const cookies = document.cookie.split(';');
13-
for (let i = 0; i < cookies.length; i++) {
14-
const cookie = cookies[i].trim();
15-
if (cookie.substring(0, name.length + 1) === (name + '=')) {
16-
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
17-
break;
18-
}
19-
}
20-
}
21-
return cookieValue;
22-
}
23-
const csrftoken = getCookie('csrftoken');
24-
25-
$.ajaxSetup({
26-
beforeSend: function(xhr, settings) {
27-
if (!/^(GET|HEAD|OPTIONS|TRACE)$/i.test(settings.type) && !this.crossDomain) {
28-
xhr.setRequestHeader("X-CSRFToken", csrftoken);
29-
}
30-
}
31-
});
32-
339

3410
$(document).ready(function() {
3511
/*

website/forms.py

Lines changed: 30 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -8,34 +8,13 @@
88
minutes = ()
99
seconds = ()
1010

11-
# Pre-fetch FOSS ids shown on homepage
12-
foss_ids = list(
13-
FossCategory.objects.using('spoken')
14-
.filter(show_on_homepage=1)
15-
.values_list('id', flat=True) # get ids only
16-
)
17-
1811

1912
class NewQuestionForm(forms.Form):
20-
category = forms.ChoiceField(
21-
choices=[('', 'Select a Category')] +
22-
list(
23-
TutorialResources.objects.using('spoken')
24-
.filter(
25-
Q(status__in=[1, 2]), # cleaner than Q(status=1)|Q(status=2)
26-
language_id=22, # use id instead of name
27-
tutorial_detail__foss_id__in=foss_ids
28-
)
29-
.values('tutorial_detail__foss__foss')
30-
.order_by('tutorial_detail__foss__foss')
31-
.values_list('tutorial_detail__foss__foss', 'tutorial_detail__foss__foss')
32-
.distinct()
33-
),
34-
widget=forms.Select(attrs={}),
35-
required=True,
36-
error_messages={'required': 'State field is required.'}
37-
)
38-
13+
category = forms.ChoiceField(choices=[('', 'Select a Category'), ] + list(TutorialResources.objects.filter(
14+
Q(status=1) | Q(status=2), language__name='English',tutorial_detail__foss__show_on_homepage=1).values('tutorial_detail__foss__foss').order_by(
15+
'tutorial_detail__foss__foss').values_list('tutorial_detail__foss__foss',
16+
'tutorial_detail__foss__foss').distinct()),
17+
widget=forms.Select(attrs={}), required=True, error_messages={'required': 'State field is required.'})
3918
title = forms.CharField(max_length=200)
4019
body = forms.CharField(widget=forms.Textarea())
4120

@@ -45,43 +24,49 @@ def __init__(self, *args, **kwargs):
4524

4625
select_min = kwargs.pop('minute_range', None)
4726
select_sec = kwargs.pop('second_range', None)
48-
4927
super(NewQuestionForm, self).__init__(*args, **kwargs)
50-
51-
tutorial_choices = (("Select a Tutorial", "Select a Tutorial"),)
52-
53-
# Set minutes & seconds
54-
if select_min is None and select_sec is None:
55-
minutes = ((select_min, select_min),)
56-
seconds = ((select_sec, select_sec),)
28+
tutorial_choices = (
29+
("Select a Tutorial", "Select a Tutorial"),
30+
)
31+
# check minute_range, secpnd_range coming from spoken website
32+
# user clicks on post question link through website
33+
if (select_min is None and select_sec is None):
34+
minutes = (
35+
(select_min, select_min),
36+
)
37+
seconds = (
38+
(select_sec, select_sec),
39+
)
5740
else:
58-
minutes = (("", "min"),)
59-
seconds = (("", "sec"),)
41+
minutes = (
42+
("", "min"),
43+
)
44+
seconds = (
45+
("", "sec"),
46+
)
6047

61-
# Handle category logic
6248
if not category and args and 'category' in args[0] and args[0]['category']:
6349
category = args[0]['category']
64-
65-
if FossCategory.objects.using('spoken').filter(foss=category).exists():
50+
if FossCategory.objects.filter(foss=category).exists():
6651
self.fields['category'].initial = category
6752
tutorials = TutorialDetails.objects.using('spoken').filter(foss__foss=category)
6853
for tutorial in tutorials:
6954
tutorial_choices += ((tutorial.tutorial, tutorial.tutorial),)
70-
7155
self.fields['tutorial'] = forms.CharField(widget=forms.Select(choices=tutorial_choices))
72-
7356
if TutorialDetails.objects.using('spoken').filter(tutorial=selecttutorial).exists():
7457
self.fields['tutorial'].initial = selecttutorial
7558

76-
self.fields['minute_range'] = forms.CharField(widget=forms.Select(choices=minutes))
77-
self.fields['second_range'] = forms.CharField(widget=forms.Select(choices=seconds))
59+
self.fields['minute_range'] = forms.CharField(widget=forms.Select(choices=minutes))
60+
self.fields['second_range'] = forms.CharField(widget=forms.Select(choices=seconds))
61+
else:
62+
self.fields['minute_range'] = forms.CharField(widget=forms.Select(choices=minutes))
63+
self.fields['second_range'] = forms.CharField(widget=forms.Select(choices=seconds))
7864
else:
7965
self.fields['tutorial'] = forms.CharField(widget=forms.Select(choices=tutorial_choices))
8066
self.fields['minute_range'] = forms.CharField(widget=forms.Select(choices=minutes))
8167
self.fields['second_range'] = forms.CharField(widget=forms.Select(choices=seconds))
8268

8369

84-
8570
class AnswerQuesitionForm(forms.Form):
8671
question = forms.IntegerField(widget=forms.HiddenInput())
87-
body = forms.CharField(widget=forms.Textarea())
72+
body = forms.CharField(widget=forms.Textarea())

website/helpers.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from typing import Dict, List, Tuple, Optional
66
from website.models import Question, User
77
from nltk.corpus import stopwords
8+
from nltk.tokenize import word_tokenize
89
from website.templatetags.permission_tags import can_edit, can_hide_delete
910
from sklearn.metrics.pairwise import cosine_similarity
1011
from django.conf import settings
@@ -65,13 +66,11 @@ def pre_process(text):
6566
return text
6667

6768
def clean_user_data(text):
68-
from nltk.tokenize import word_tokenize
6969
words = word_tokenize(pre_process(text.lower()))
7070
clean_list = [w for w in words if not w in sw]
7171
return clean_list
7272

7373
def get_similar_questions(user_ques,question):
74-
from nltk.tokenize import word_tokenize
7574
total = []
7675
l1 = []
7776
l2 = []

website/views.py

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,7 @@
1212
from website.models import Question, Answer, Notification, AnswerComment
1313
from spoken_auth.models import TutorialDetails, TutorialResources
1414
from website.forms import NewQuestionForm, AnswerQuesitionForm
15-
from website.helpers import (
16-
get_video_info,
17-
prettify,
18-
clean_user_data,
19-
get_similar_questions,
20-
SpamQuestionDetector,
21-
handle_spam
22-
)
23-
15+
from website.helpers import get_video_info, prettify,clean_user_data, get_similar_questions, SpamQuestionDetector, handle_spam
2416
from django.conf import settings
2517
from website.templatetags.permission_tags import can_edit, can_hide_delete
2618
from spoken_auth.models import FossCategory
@@ -76,32 +68,39 @@ def home(request):
7668

7769

7870
def questions(request):
79-
context = {}
80-
if request.method == 'POST':
81-
form = NewQuestionForm(request.POST)
82-
if form.is_valid():
83-
cleaned_data = form.cleaned_data
84-
question = Question(
85-
uid=request.user.id,
86-
category=cleaned_data['category'].replace(' ', '-'),
87-
tutorial=cleaned_data['tutorial'].replace(' ', '-'),
88-
minute_range=cleaned_data['minute_range'],
89-
second_range=cleaned_data['second_range'],
90-
title=cleaned_data['title'],
91-
body=cleaned_data['body'],
92-
views=1,
93-
)
94-
question.save()
95-
96-
action = handle_spam(question, request.user, delete_on_high=True)
71+
questions = Question.objects.filter(status=1).order_by('category', 'tutorial')
72+
questions = questions.annotate(total_answers=Count('answer'))
73+
74+
raw_get_data = request.GET.get('o', None)
75+
76+
header = {
77+
1: SortableHeader('category', True, 'Foss'),
78+
2: SortableHeader('tutorial', True, 'Tutorial Name'),
79+
3: SortableHeader('minute_range', True, 'Mins'),
80+
4: SortableHeader('second_range', True, 'Secs'),
81+
5: SortableHeader('title', True, 'Title'),
82+
6: SortableHeader('date_created', True, 'Date'),
83+
7: SortableHeader('views', True, 'Views'),
84+
8: SortableHeader('total_answers', 'True', 'Answers'),
85+
9: SortableHeader('username', False, 'User')
86+
}
9787

98-
if action == 'AUTO_DELETE':
99-
# inform the user, stop further processing (email etc.)
100-
messages.error(request, "Your question was removed because it looks like spam.")
101-
return HttpResponseRedirect('/') # or another page
102-
elif action == 'FLAGGED':
103-
messages.warning(request, "Your question is pending moderator review.")
104-
return render(request, 'website/templates/questions.html', context)
88+
tmp_recs = get_sorted_list(request, questions, header, raw_get_data)
89+
ordering = get_field_index(raw_get_data)
90+
paginator = Paginator(tmp_recs, 20)
91+
page = request.GET.get('page')
92+
try:
93+
questions = paginator.page(page)
94+
except PageNotAnInteger:
95+
questions = paginator.page(1)
96+
except EmptyPage:
97+
questions = paginator.page(paginator.num_pages)
98+
context = {
99+
'questions': questions,
100+
'header': header,
101+
'ordering': ordering
102+
}
103+
return render(request, 'website/templates/questions.html', context)
105104

106105

107106
def hidden_questions(request):
@@ -627,7 +626,7 @@ def ajax_delete_question(request):
627626
if can_edit(user=request.user, obj=question) or can_hide_delete(user=request.user, obj=question):
628627
question.delete()
629628
result = True
630-
return HttpResponse(json.dumps(result), content_type='application/json')
629+
return HttpResponse(json.dumps(result), mimetype='application/json')
631630

632631

633632
@login_required

0 commit comments

Comments
 (0)