diff options
-rw-r--r-- | spoken_auth/models.py | 36 | ||||
-rw-r--r-- | static/website/css/main.css | 8 | ||||
-rw-r--r-- | static/website/images/Advanced-Cpp.jpg (renamed from static/website/images/Advanced-C++.jpg) | bin | 1855 -> 1855 bytes | |||
-rw-r--r-- | static/website/images/Advanced-Cpp.png (renamed from static/website/images/Advanced-C++.png) | bin | 3972 -> 3972 bytes | |||
-rw-r--r-- | static/website/images/C-and-Cpp.jpg (renamed from static/website/images/C-and-C++.jpg) | bin | 1449 -> 1449 bytes | |||
-rw-r--r-- | static/website/templates/ajax-duration.html | 4 | ||||
-rw-r--r-- | static/website/templates/ajax-tutorials.html | 4 | ||||
-rw-r--r-- | static/website/templates/index.html | 8 | ||||
-rw-r--r-- | website/forms.py | 78 | ||||
-rw-r--r-- | website/helpers.py | 5 | ||||
-rw-r--r-- | website/models.py | 35 | ||||
-rw-r--r-- | website/templatetags/helpers.py | 11 | ||||
-rw-r--r-- | website/views.py | 74 |
13 files changed, 109 insertions, 154 deletions
diff --git a/spoken_auth/models.py b/spoken_auth/models.py index b315b2d..431330d 100644 --- a/spoken_auth/models.py +++ b/spoken_auth/models.py @@ -12,3 +12,39 @@ class Users(AbstractBaseUser): USERNAME_FIELD = 'username' class Meta: db_table = 'auth_user' + +class FossCategory(models.Model): + foss = models.CharField(unique=True, max_length = 255) + description = models.TextField() + status = models.BooleanField(max_length = 2) + created = models.DateTimeField(auto_now_add = True) + updated = models.DateTimeField(auto_now = True) + class Meta: + db_table = 'creation_fosscategory' + +class Language(models.Model): + name = models.CharField(max_length = 255, unique = True) + created = models.DateTimeField(auto_now_add = True) + updated = models.DateTimeField(auto_now = True) + class Meta: + db_table = 'creation_language' + +class TutorialDetails(models.Model): + foss = models.ForeignKey(FossCategory) + tutorial = models.CharField(max_length = 255) + order = models.IntegerField() + created = models.DateTimeField(auto_now_add = True) + updated = models.DateTimeField(auto_now = True) + + class Meta: + db_table = 'creation_tutorialdetail' + +class TutorialResources(models.Model): + id = models.IntegerField(primary_key=True) + tutorial_detail = models.ForeignKey(TutorialDetails) + language = models.ForeignKey(Language) + video = models.TextField() + status = models.PositiveSmallIntegerField(default = 0) + + class Meta: + db_table = 'creation_tutorialresource' diff --git a/static/website/css/main.css b/static/website/css/main.css index d1e7e52..9e7ed71 100644 --- a/static/website/css/main.css +++ b/static/website/css/main.css @@ -359,3 +359,11 @@ table .title a { background: #FDF5E6; transition: background 2.5s ease; } +.category-title{ + height: 100px; + text-shadow: 1px 1px 1px #000, 3px 3px 5px blue; + line-height: 100px; + text-align: center; + font-size: 22px; + overflow: hidden; +} diff --git a/static/website/images/Advanced-C++.jpg b/static/website/images/Advanced-Cpp.jpg Binary files differindex 4550d61..4550d61 100644 --- a/static/website/images/Advanced-C++.jpg +++ b/static/website/images/Advanced-Cpp.jpg diff --git a/static/website/images/Advanced-C++.png b/static/website/images/Advanced-Cpp.png Binary files differindex 5f41a18..5f41a18 100644 --- a/static/website/images/Advanced-C++.png +++ b/static/website/images/Advanced-Cpp.png diff --git a/static/website/images/C-and-C++.jpg b/static/website/images/C-and-Cpp.jpg Binary files differindex b1e972b..b1e972b 100644 --- a/static/website/images/C-and-C++.jpg +++ b/static/website/images/C-and-Cpp.jpg diff --git a/static/website/templates/ajax-duration.html b/static/website/templates/ajax-duration.html index 22fe04f..e02fcff 100644 --- a/static/website/templates/ajax-duration.html +++ b/static/website/templates/ajax-duration.html @@ -1,14 +1,14 @@ {% load count_tags %} <div> <div id="minutes"> - <option value="None">min</option> + <option value="">min</option> {% for i in minutes|inc|get_range %} <option value="{{ i }}-{{ i|inc }}">{{ i }}-{{ i|inc }} </option> {% endfor %} </div> <!-- /#minutes --> <div id="seconds"> - <option value="None">sec</option> + <option value="">sec</option> {% for i in seconds|get_range:"0,10" %} <option value="{{ i }}-{{ i|add:"10" }}">{{ i }}-{{ i|add:"10" }}</option> {% endfor %} diff --git a/static/website/templates/ajax-tutorials.html b/static/website/templates/ajax-tutorials.html index c19fe3c..62192bb 100644 --- a/static/website/templates/ajax-tutorials.html +++ b/static/website/templates/ajax-tutorials.html @@ -1,5 +1,5 @@ -<option value="None">Select a Tutorial</option> +<option value="">Select a Tutorial</option> {% for tutorial in tutorials %} - <option value="{{ tutorial.tutorial_name }}">{{ tutorial.tutorial_name }}</option> + <option value="{{ tutorial.tutorial }}">{{ tutorial.tutorial }}</option> {% endfor %} <option value="General">General</option> diff --git a/static/website/templates/index.html b/static/website/templates/index.html index 7f4a497..63890fd 100644 --- a/static/website/templates/index.html +++ b/static/website/templates/index.html @@ -10,7 +10,13 @@ {% for category in categories %} <div> <div class="thumbnail"> - <img src="{% static 'website/images/' %}{{ category }}.jpg"> + {% with file=category|get_category_image %} + {% if file %} + <img src="{% static category|get_category_image %}"> + {% else %} + <div class="category-title">{{category}}</div> + {% endif %} + {% endwith %} <div class="caption"> <small class="category"> {{ category }} diff --git a/website/forms.py b/website/forms.py index b982d54..e2e6783 100644 --- a/website/forms.py +++ b/website/forms.py @@ -1,85 +1,33 @@ from django import forms from website.models import * - -categories = ( - ("None", "Select a Category"), - ("General", "General"), - ('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'), - ('Inkscape', 'Inkscape'), - ('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'), - ('Oscad', 'Oscad'), - ('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') -) +from spoken_auth.models import TutorialDetails, TutorialResources, FossCategory +from django.db.models import Q tutorials = ( - ("None", "Select a Tutorial"), + ("", "Select a Tutorial"), ) minutes = ( - ("None", "min"), + ("", "min"), ) seconds= ( - ("None", "sec"), + ("", "sec"), ) class NewQuestionForm(forms.Form): - #fix dirty code + category = forms.ChoiceField(choices = [('', 'Select a Category'),] + list(TutorialResources.objects.filter(Q(status = 1) | Q(status = 2), language__name = 'English').values('tutorial_detail__foss__foss').order_by('tutorial_detail__foss__foss').values_list('tutorial_detail__foss__foss', 'tutorial_detail__foss__foss').distinct()), widget=forms.Select(attrs = {}), required = True, error_messages = {'required':'State field is required.'}) def __init__(self, *args, **kwargs): category = kwargs.pop('category', None) super(NewQuestionForm, self).__init__(*args, **kwargs) - self.fields['category'] = forms.CharField(widget=forms.Select(choices=categories)) - self.fields['category'].initial = category - tutorial_choices = ( - ("None", "Select a Tutorial"), + ("", "Select a Tutorial"), ) - if (category, category) in categories: - tutorials = TutorialDetails.objects.using('spoken').filter(foss_category=category) + if not category and args and 'category' in args[0] and args[0]['category']: + category = args[0]['category'] + if FossCategory.objects.filter(foss=category).exists(): + self.fields['category'].initial = category + tutorials = TutorialDetails.objects.using('spoken').filter(foss__foss=category) for tutorial in tutorials: - tutorial_choices += ((tutorial.tutorial_name, tutorial.tutorial_name),) + tutorial_choices += ((tutorial.tutorial, tutorial.tutorial),) self.fields['tutorial'] = forms.CharField(widget=forms.Select(choices=tutorial_choices)) else: self.fields['tutorial'] = forms.CharField(widget=forms.Select(choices=tutorial_choices)) diff --git a/website/helpers.py b/website/helpers.py index bf5217b..25ee1e7 100644 --- a/website/helpers.py +++ b/website/helpers.py @@ -8,11 +8,10 @@ def get_video_info(path): import subprocess import re - process = subprocess.Popen(['/usr/bin/ffmpeg', '-i', path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) + process = subprocess.Popen(['/usr/bin/avconv', '-i', path], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) stdout, stderr = process.communicate() duration_m = re.search(r"Duration:\s{1}(?P<hours>\d+?):(?P<minutes>\d+?):(?P<seconds>\d+\.\d+?)", stdout, re.DOTALL).groupdict() info_m = re.search(r": Video: (?P<codec>.*?), (?P<profile>.*?), (?P<width>.*?)x(?P<height>.*?), ", stdout, re.DOTALL).groupdict() - hours = Decimal(duration_m['hours']) minutes = Decimal(duration_m['minutes']) seconds = Decimal(duration_m['seconds']) @@ -26,8 +25,6 @@ def get_video_info(path): 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']) return info_m def prettify(string): diff --git a/website/models.py b/website/models.py index 7a845c5..727edd1 100644 --- a/website/models.py +++ b/website/models.py @@ -76,38 +76,3 @@ class Notification(models.Model): return user.username # CDEEP database created using inspectdb arg of manage.py -class TutorialDetails(models.Model): - id = models.IntegerField(primary_key=True) - foss_category = models.CharField(max_length=255L) - tutorial_name = models.CharField(max_length=600L) - tutorial_level = models.CharField(max_length=400L) - order_code = models.IntegerField() - - class Meta: - db_table = 'tutorial_details' - -class TutorialResources(models.Model): - id = models.IntegerField(primary_key=True) - tutorial_detail_id = models.IntegerField() - uid = models.IntegerField() - language = models.CharField(max_length=50L) - upload_time = models.DateTimeField() - reviewer = models.CharField(max_length=400L) - tutorial_content_id = models.IntegerField() - tutorial_outline = models.TextField() - tutorial_outline_uid = models.IntegerField() - tutorial_outline_status = models.IntegerField() - tutorial_script = models.TextField() - tutorial_script_uid = models.IntegerField() - tutorial_script_status = models.IntegerField() - tutorial_script_timed = models.TextField() - tutorial_video = models.TextField() - tutorial_video_uid = models.IntegerField() - tutorial_video_status = models.IntegerField() - tutorial_status = models.CharField(max_length=50L) - cvideo_version = models.IntegerField() - hit_count = models.BigIntegerField() - request_exception = models.TextField() - - class Meta: - db_table = 'tutorial_resources' diff --git a/website/templatetags/helpers.py b/website/templatetags/helpers.py index a0f65be..e6afc51 100644 --- a/website/templatetags/helpers.py +++ b/website/templatetags/helpers.py @@ -2,8 +2,19 @@ from django import template from website.models import Question, Answer, Notification from website.helpers import prettify +from django.conf import settings +import os.path register = template.Library() +def get_category_image(category): + base_path = settings.PROJECT_DIR + '/static/website/images/' + file_name = category.replace(' ', '-') + '.jpg' + file_path = base_path + file_name + if os.path.isfile(file_path): + return 'website/images/' + file_name + return False + +register.filter('get_category_image', get_category_image) # imported from website/helpers register.simple_tag(prettify) diff --git a/website/views.py b/website/views.py index 7e33a87..5c772ae 100644 --- a/website/views.py +++ b/website/views.py @@ -12,30 +12,20 @@ from django.core.urlresolvers import reverse from django.contrib.auth import get_user_model User = get_user_model() -from website.models import Question, Answer, Notification, TutorialDetails, TutorialResources, AnswerComment +from website.models import Question, Answer, Notification, AnswerComment +from spoken_auth.models import TutorialDetails, TutorialResources from website.forms import NewQuestionForm, AnswerQuesitionForm from website.helpers import get_video_info, prettify +from django.db.models import Count admins = ( 9, 4376, 4915, 14595, 12329, 22467, 5518, 30705 ) -categories = ( - 'Advanced-C++', 'BASH', 'Blender', - 'C-and-C++', 'CellDesigner', 'Digital-Divide', - 'Drupal', 'Firefox', 'GChemPaint', 'Geogebra', - 'GeoGebra-for-Engineering-drawing', 'GIMP', 'GNS3', - 'GSchem', 'Inkscape', 'Java', 'Java-Business-Application', - 'KiCad', 'KTouch', 'KTurtle', 'LaTeX', - 'LibreOffice-Suite-Base', 'LibreOffice-Suite-Calc', - 'LibreOffice-Suite-Draw', 'LibreOffice-Suite-Impress', - 'LibreOffice-Suite-Math', 'LibreOffice-Suite-Writer', - 'Linux', 'Netbeans', 'Ngspice', 'OpenFOAM', 'Orca', 'Oscad', - 'PERL', 'PHP-and-MySQL', 'Python', 'Python-Old-Version', - 'QCad', 'R', 'Ruby', 'Scilab', 'Selenium', - 'Single-Board-Heater-System', 'Spoken-Tutorial-Technology', - 'Step', 'Thunderbird', 'Tux-Typing', 'What-is-Spoken-Tutorial', 'Xfig' -) +categories = [] +trs = TutorialResources.objects.filter(Q(status = 1) | Q(status = 2), language__name = 'English').values('tutorial_detail__foss__foss').order_by('tutorial_detail__foss__foss').values_list('tutorial_detail__foss__foss').distinct() +for tr in trs: + categories.append(tr[0]) def home(request): questions = Question.objects.all().order_by('date_created').reverse()[:10] @@ -225,8 +215,8 @@ def new_question(request): cleaned_data = form.cleaned_data question = Question() question.uid = request.user.id - question.category = cleaned_data['category'] - question.tutorial = cleaned_data['tutorial'] + question.category = cleaned_data['category'].replace(' ', '-') + question.tutorial = cleaned_data['tutorial'].replace(' ', '-') question.minute_range = cleaned_data['minute_range'] question.second_range = cleaned_data['second_range'] question.title = cleaned_data['title'] @@ -340,7 +330,7 @@ def ajax_category(request): def ajax_tutorials(request): if request.method == 'POST': category = request.POST.get('category') - tutorials = TutorialDetails.objects.using('spoken').filter(foss_category=category) + tutorials = TutorialDetails.objects.using('spoken').filter(foss__foss=category) context = { 'tutorials': tutorials } @@ -352,15 +342,17 @@ def ajax_duration(request): category = request.POST['category'] tutorial =request.POST['tutorial'] video_detail = TutorialDetails.objects.using('spoken').get( - Q(foss_category=category), - Q(tutorial_name=tutorial) + Q(foss__foss=category), + Q(tutorial=tutorial) ) video_resource = TutorialResources.objects.using('spoken').get( Q(tutorial_detail_id=video_detail.id), - Q(language='English') + Q(language__name='English') ) - video_path = '/Sites/spoken_tutorial_org/sites/default/files/{0}'.format( - video_resource.tutorial_video + video_path = '/home/sanmugam/devel/spoken/media/videos/{0}/{1}/{2}'.format( + str(video_detail.foss_id), + str(video_detail.id), + video_resource.video ) # video_path = '/home/cheese/test-video.ogv' video_info = get_video_info(video_path) @@ -475,30 +467,22 @@ def ajax_keyword_search(request): @csrf_exempt def ajax_time_search(request): if request.method == "POST": - key = request.POST['key'] - questions = Question.objects.filter(title__icontains=key) - context = { - 'questions': questions - } - return render(request, 'website/templates/ajax-keyword-search.html', context) - -@csrf_exempt -def ajax_time_search(request): - if request.method == "POST": category = request.POST.get('category') tutorial = request.POST.get('tutorial') minute_range= request.POST.get('minute_range') second_range = request.POST.get('second_range') - - if category != 'None': - questions = Question.objects.filter(category=category) - if tutorial != 'None': - questions = questions.filter(tutorial=tutorial) - if minute_range != 'None': - questions = questions.filter(minute_range=minute_range) - if second_range != 'None': - questions = questions.filter(second_range=second_range) - + questions = None + print request.POST, "***********" + if category: + questions = Question.objects.filter(category=category.replace(' ', '-')) + print "sssssssssss", questions + if tutorial: + questions = questions.filter(tutorial=tutorial.replace(' ', '-')) + if minute_range: + questions = questions.filter(category=category.replace(' ', '-'), tutorial=tutorial.replace(' ', '-'), minute_range=minute_range) + if second_range: + questions = questions.filter(category=category.replace(' ', '-'), tutorial=tutorial.replace(' ', '-'),second_range=second_range) + print questions, "&&&&&&&&&&&" context = { 'questions': questions } |