sentence-finder/views.py

41 lines
2.6 KiB
Python
Raw Permalink Normal View History

2018-10-28 02:00:38 +01:00
# -*- coding: utf-8 -*-
"""This small application will search sentences in the database. Database has been filled previously with data from the Tatoeba project."""
from __future__ import unicode_literals
from django.shortcuts import render
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from .models import phrase
from .forms import SearchForm
# Language dictionary. Keys should be language codes (ISO 639-3) (eng for english, spa for spanish, rus for russian and so on)
# value should be the language as will be used to generate text to speech responses in the response.js library
# (English, Russian, Spanish Latin American, etc).
# Obviously, there should be phrases already loaded in the database for all of the following languages.
languages = dict(eng="English", rus="Russian", spa="Spanish Latin American")
def index(request):
""" Index method. From this method the search of sentences is processed, though if user didn't want to search anything we will show some informative page here."""
will_search = False
search_term = request.GET.get("search_term")
language = request.GET.get("language")
if search_term != None:
will_search = True
# prefill the form with search_term and language just in case these values are different than None.
# It is useful so users will see the same data in their form even when the page has been reloaded due to a submit.
# if these values are None, the form will be blank.
search_form = SearchForm(initial=dict(search_term=search_term, language=language))
if will_search == True:
# ToDo: perhaps should I look to implement an "exact" search expresion for search_term here?
posts = phrase.objects.filter(phrase__contains=search_term, language__exact=language)
paginator = Paginator(posts, 100)
# get page number from request args. If there is no page argument, then set page to 1.
page = request.GET.get('page')
if page == None: page = 1
posts = paginator.page(page)
# Add extra arguments (search_term and language) so other links will be loaded correctly in the paginator.
extra_params = ""
if search_term != None:
extra_params = "&search_term={0}&language={1}".format(search_term, language)
if will_search:
return render(request, 'sentence_finder/index.html', dict(posts=posts, search_form=search_form, extra_params=extra_params, lang=languages.get(language)))
else:
return render(request, 'sentence_finder/index.html', dict(total=phrase.objects.count(), search_form=search_form))