summaryrefslogtreecommitdiff
path: root/website
diff options
context:
space:
mode:
authorJayaram Pai2013-12-01 13:09:49 +0530
committerJayaram Pai2013-12-01 13:09:49 +0530
commit8533d61eb93ecb4c943ec3c3b83dfef87b20a916 (patch)
tree4fa52f3c02fe1f5c50a4d386cc670faeaae6d7e4 /website
parentaf3e4d8942680a5c08492d2ed179d8e401a8bf57 (diff)
downloadspoken-tutorial-forums-8533d61eb93ecb4c943ec3c3b83dfef87b20a916.tar.gz
spoken-tutorial-forums-8533d61eb93ecb4c943ec3c3b83dfef87b20a916.tar.bz2
spoken-tutorial-forums-8533d61eb93ecb4c943ec3c3b83dfef87b20a916.zip
basic auth and new-question
Diffstat (limited to 'website')
-rw-r--r--website/forms.py71
-rw-r--r--website/helpers.py3
-rw-r--r--website/models.py8
-rw-r--r--website/templatetags/count_tags.py60
-rw-r--r--website/templatetags/sidebar_tags.py11
-rw-r--r--website/urls.py10
-rw-r--r--website/views.py96
7 files changed, 206 insertions, 53 deletions
diff --git a/website/forms.py b/website/forms.py
new file mode 100644
index 0000000..00b0cfe
--- /dev/null
+++ b/website/forms.py
@@ -0,0 +1,71 @@
+from django import forms
+
+from website.models import Question
+
+categories = (
+ ("None", "Select a Category"),
+ ('Advanced-C++', 'Advanced-C++'),
+ ('BASH', 'BASH'),
+ ('Blender', 'Blender'),
+ ('C-and-C++', 'C-and-C++'),
+ ('CellDesigner', 'CellDesigner'),
+ ('Digital-Divide', 'Digital-Divide'),
+ ('Drupal', 'Drupal'),
+ ('Firefox', 'Firefox'),
+ ('GChemPaint', 'GChemPaint'),
+ ('Geogebra', 'Geogebra'),
+ ('GeoGebra-for-Engineering-drawing', 'GeoGebra-for-Engineering-drawing'),
+ ('GIMP', 'GIMP'),
+ ('GNS3', 'GNS3'),
+ ('GSchem', 'GSchem'),
+ ('Java', 'Java'),
+ ('Java-Business-Application', 'Java-Business-Application'),
+ ('KiCad', 'KiCad'),
+ ('KTouch', 'KTouch'),
+ ('KTurtle', 'KTurtle'),
+ ('LaTeX', 'LaTeX'),
+ ('LibreOffice-Suite-Base', 'LibreOffice-Suite-Base'),
+ ('LibreOffice-Suite-Calc', 'LibreOffice-Suite-Calc'),
+ ('LibreOffice-Suite-Draw', 'LibreOffice-Suite-Draw'),
+ ('LibreOffice-Suite-Impress', 'LibreOffice-Suite-Impress'),
+ ('LibreOffice-Suite-Math', 'LibreOffice-Suite-Math'),
+ ('LibreOffice-Suite-Writer', 'LibreOffice-Suite-Writer'),
+ ('Linux', 'Linux'),
+ ('Netbeans', 'Netbeans'),
+ ('Ngspice', 'Ngspice'),
+ ('OpenFOAM', 'OpenFOAM'),
+ ('Orca', 'Orca'),
+ ('PERL', 'PERL'),
+ ('PHP-and-MySQL', 'PHP-and-MySQL'),
+ ('Python', 'Python'),
+ ('Python-Old-Version', 'Python-Old-Version'),
+ ('QCad', 'QCad'),
+ ('R', 'R'),
+ ('Ruby', 'Ruby'),
+ ('Scilab', 'Scilab'),
+ ('Selenium', 'Selenium'),
+ ('Single-Board-Heater-System', 'Single-Board-Heater-System'),
+ ('Spoken-Tutorial-Technology', 'Spoken-Tutorial-Technology'),
+ ('Step', 'Step'),
+ ('Thunderbird', 'Thunderbird'),
+ ('Tux-Typing', 'Tux-Typing'),
+ ('What-is-Spoken-Tutorial', 'What-is-Spoken-Tutorial'),
+ ('Xfig', 'Xfig')
+)
+tutorials = (
+ ("None", "Select a Tutorial"),
+)
+minutes = (
+ ("None", "min"),
+)
+seconds= (
+ ("None", "sec"),
+)
+
+class NewQuestionForm(forms.Form):
+ category = forms.CharField(widget=forms.Select(choices=categories))
+ tutorial = forms.CharField(widget=forms.Select(choices=tutorials))
+ minute_range = forms.CharField(widget=forms.Select(choices=minutes))
+ second_range = forms.CharField(widget=forms.Select(choices=seconds))
+ title = forms.CharField(max_length=200)
+ body = forms.CharField(widget=forms.Textarea())
diff --git a/website/helpers.py b/website/helpers.py
index dd37152..0d67da0 100644
--- a/website/helpers.py
+++ b/website/helpers.py
@@ -20,6 +20,9 @@ def get_video_info(path):
total += 60 * minutes
total += seconds
+ info_m['hours'] = hours
+ info_m['minutes'] = minutes
+ info_m['seconds'] = seconds
info_m['duration'] = total
info_m['width'] = int(info_m['width'])
info_m['height'] = int(info_m['height'])
diff --git a/website/models.py b/website/models.py
index 9570965..ce8d4dc 100644
--- a/website/models.py
+++ b/website/models.py
@@ -1,10 +1,14 @@
from django.db import models
from django.contrib.auth.models import User
-class Post(models.Model):
+class Question(models.Model):
user = models.ForeignKey(User)
category = models.CharField(max_length=200)
tutorial = models.CharField(max_length=200)
+ minute_start = models.IntegerField()
+ minute_end = models.IntegerField()
+ second_start = models.IntegerField()
+ second_end = models.IntegerField()
title = models.CharField(max_length=200)
body = models.TextField()
date_created = models.DateTimeField(auto_now_add=True)
@@ -12,7 +16,7 @@ class Post(models.Model):
class Reply(models.Model):
user = models.ForeignKey(User)
- post = models.ForeignKey(Post)
+ question = models.ForeignKey(Question)
title = models.CharField(max_length=200)
body = models.TextField()
date_created = models.DateTimeField(auto_now_add=True)
diff --git a/website/templatetags/count_tags.py b/website/templatetags/count_tags.py
index e4233f1..33aff7f 100644
--- a/website/templatetags/count_tags.py
+++ b/website/templatetags/count_tags.py
@@ -1,11 +1,61 @@
from django import template
-from website.models import Post, Reply
+from website.models import Question, Reply
register = template.Library()
-def category_post_count(category):
- category_post_count = Post.objects.filter(category=category).count()
- return category_post_count
-register.simple_tag(category_post_count)
+# Counts the number of questions in <category>
+def category_question_count(category):
+ category_question_count =Question.objects.filter(category=category).count()
+ return category_question_count
+register.simple_tag(category_question_count)
+# Implementing range(x) function in templates
+def get_range(value, arg=''):
+ args = arg.split(',')
+ n = len(args)
+
+ if n == 0 or arg =='':
+ # if no arguments set value as limit
+ start = 0
+ limit = value
+ step = 1
+ elif n == 1:
+ start = int(args[0])
+ limit = value
+ step = 1
+ elif n == 2:
+ start = int(args[0])
+ limit = value
+ step = int(args[1])
+ else:
+ raise TypeError('get_range() takes maximum 2 arguments, {} given'.format(n))
+
+ return range(start, limit, step)
+register.filter('get_range', get_range)
+
+# Implementing increment and decrement functions
+def inc(value, arg=1):
+ return value + int(arg)
+register.filter('inc', inc)
+
+def dec(value, arg=1):
+ return value-int(arg)
+register.filter('dec', dec)
+
+# Implementing calculator for templates
+def add(value, arg=0):
+ return value + int(arg)
+register.filter('add', add)
+
+def sub(value, arg=0):
+ return value - int(arg)
+register.filter('sub', sub)
+
+def mul(value, arg=1):
+ return value * int(arg)
+register.filter('mul', mul)
+
+def div(value, arg=1):
+ return value / int(arg)
+register.filter('div', div)
diff --git a/website/templatetags/sidebar_tags.py b/website/templatetags/sidebar_tags.py
index a7e5cc7..8b7efb9 100644
--- a/website/templatetags/sidebar_tags.py
+++ b/website/templatetags/sidebar_tags.py
@@ -1,12 +1,11 @@
from django import template
-from website.models import Post, Reply
+from website.models import Question, Reply
register = template.Library()
-def recent_posts():
- recent_posts = Post.objects.all().order_by('-id')[:5]
- return {'recent_posts': recent_posts}
-
-register.inclusion_tag('website/templates/recent_posts.html')(recent_posts)
+def recent_questions():
+ recent_questions = Question.objects.all().order_by('-id')[:5]
+ return {'recent_questions': recent_questions}
+register.inclusion_tag('website/templates/recent_questions.html')(recent_questions)
diff --git a/website/urls.py b/website/urls.py
index 29c25ea..9d1b048 100644
--- a/website/urls.py
+++ b/website/urls.py
@@ -3,7 +3,11 @@ from django.conf.urls import patterns, include, url
urlpatterns = patterns('',
url(r'^$', 'website.views.home', name='home'),
url(r'^category/(?P<category>.+)/$', 'website.views.fetch_tutorials', name='fetch_tutorials'),
- url(r'^tutorial/(?P<category>.+)/(?P<tutorial>.+)/$', 'website.views.fetch_posts', name='fetch_posts'),
- url(r'^post/(?P<post_id>\d+)$', 'website.views.get_post', name='get_post'),
- url(r'^new-post/$', 'website.views.new_post', name='new_post'),
+ url(r'^tutorial/(?P<category>.+)/(?P<tutorial>.+)/$', 'website.views.fetch_questions', name='fetch_questions'),
+ url(r'^question/(?P<question_id>\d+)$', 'website.views.get_question', name='get_question'),
+ url(r'^new-question/$', 'website.views.new_question', name='new_question'),
+
+ # Ajax helpers
+ url(r'^ajax-tutorials/$', 'website.views.ajax_tutorials', name='ajax_tutorials'),
+ url(r'^ajax-duration/$', 'website.views.ajax_duration', name='ajax_duration'),
)
diff --git a/website/views.py b/website/views.py
index 0a8f43b..c5b71af 100644
--- a/website/views.py
+++ b/website/views.py
@@ -1,9 +1,11 @@
-import math
-
from django.http import HttpResponse, HttpResponseRedirect
from django.shortcuts import render_to_response, get_object_or_404
+from django.core.context_processors import csrf
+from django.views.decorators.csrf import csrf_exempt
+from django.contrib.auth.decorators import login_required
-from website.models import Post, Reply, TutorialDetails, TutorialResources
+from website.models import Question, Reply, TutorialDetails, TutorialResources
+from website.forms import NewQuestionForm
from website.helpers import get_video_info
categories = [
@@ -37,48 +39,68 @@ def fetch_tutorials(request, category=None):
}
return render_to_response('website/templates/fetch_tutorials.html', context)
-def fetch_posts(request, category=None, tutorial=None):
- posts = Post.objects.filter(category=category).filter(tutorial=tutorial)
+def fetch_questions(request, category=None, tutorial=None):
+ questions = Question.objects.filter(category=category).filter(tutorial=tutorial)
context = {
'category': category,
'tutorial': tutorial,
- 'posts': posts
+ 'questions': questions
}
- return render_to_response('website/templates/fetch_posts.html', context)
+ return render_to_response('website/templates/fetch_questions.html', context)
-def get_post(request, post_id=None):
- post = get_object_or_404(Post, id=post_id)
- replies = post.reply_set.all()
+def get_question(request, question_id=None):
+ question = get_object_or_404(Question, id=question_id)
+ replies = question.reply_set.all()
context = {
- 'post': post,
+ 'question': question,
'replies': replies
}
- return render_to_response('website/templates/get_post.html', context)
-
-def new_post(request):
- video_info = get_video_info('/home/cheese/test-video.ogv')
- duration = math.ceil(video_info['duration']/60) #assuming the video is less than an hour
- return HttpResponse(duration)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+ return render_to_response('website/templates/get_question.html', context)
+@login_required
+def new_question(request):
+ if request.method == 'POST':
+ form = NewQuestionForm(request.POST)
+ if form.is_valid():
+ return HttpResponse("valid")
+ else:
+ form = NewQuestionForm()
+ context = {
+ 'form': form
+ }
+ context.update(csrf(request))
+ return render_to_response('website/templates/new-question.html', context)
+
+@csrf_exempt
+def ajax_tutorials(request):
+ if request.method == 'POST':
+ category = request.POST.get('category')
+ tutorials = TutorialDetails.objects.using('spoken').filter(foss_category=category)
+ context = {
+ 'tutorials': tutorials
+ }
+ return render_to_response('website/templates/ajax-tutorials.html', context)
+
+@csrf_exempt
+def ajax_duration(request):
+ if request.method == 'POST':
+ category = request.POST['category']
+ tutorial =request.POST['tutorial']
+ video_info = get_video_info('/home/cheese/test-video.ogv')
+
+ # convert minutes to 1 if less than 0
+ # convert seconds to nearest upper 10th number eg(23->30)
+ minutes = video_info['minutes']
+ seconds = video_info['seconds']
+ if minutes < 0:
+ minutes = 1
+ seconds = int(seconds - (seconds % 10 - 10))
+
+ print minutes, seconds
+ context = {
+ 'minutes': minutes,
+ 'seconds':seconds,
+ }
+ return render_to_response('website/templates/ajax-duration.html', context)