views.py 2.71 KB
# Create your views here.

from django.contrib.auth.decorators import login_required
from django.core.urlresolvers import reverse
from django.views.decorators.csrf import csrf_exempt
from django_datatables_view.base_datatable_view import BaseDatatableView

from common.decorators import render, ajax
from webapp.models import Expression, Meaning


@login_required
@render()
def main_page(request):
    js_vars = {
        'ajax_expressions': reverse('expressions'),
        'ajax_expression_info': reverse('expression_info')
    }
    return {'js_vars': js_vars}


@csrf_exempt
@render('expression_info.html')
@ajax(method='get', encode_result=False)
def expression_info(request, id):
    sel_expr = Expression.objects.get(id=id)
    top_expressions = Expression.objects.filter(is_catchword=True, text=sel_expr.text)
    top_meanings = [expr.meaning for expr in top_expressions]
    meanings_pks = []
    for meaning in top_meanings:
        for expr in meaning.expressions.filter(main_expression=None):
            this_expr_mngs_pks = [mng.pk for mng in Meaning.objects.filter(expressions__text=expr.text).all()]
            meanings_pks.extend(this_expr_mngs_pks)
    meanings_pks = list(set(meanings_pks))

    return {'meanings': Meaning.objects.filter(pk__in=meanings_pks).all()}


class ExpressionsJson(BaseDatatableView):
    model = Expression
    columns = ['text', 'sources', 'category', 'id']
    order_columns = ['text', 'sources', 'meaning__category']
    max_display_length = 100

    def get_initial_queryset(self):
        return Expression.objects.filter(main_expression=None, is_catchword=True)

    def render_column(self, row, column):
        if column == 'text':
            return u'{0}'.format(row.text)
        elif column == 'sources':
            return u'{0}'.format(', '.join('<a href="%s">%s</a>' % (source.url, source.name)
                                           for source in row.sources.order_by('name')))
        elif column == 'category':
            return u'{0}'.format(row.meaning.category.name)
        else:
            return super(ExpressionsJson, self).render_column(row, column)

    def filter_queryset(self, qs):
        search = self.request.GET.get(u'search[value]', None)
        if search:
            qs = qs.filter(text__icontains=search)

        expr = self.request.GET.get(u'columns[0][search][value]', None)
        if expr:
            qs = qs.filter(text__icontains=expr)

        source = self.request.GET.get(u'columns[1][search][value]', None)
        if source:
            qs = qs.filter(sources__name__icontains=source)

        category = self.request.GET.get(u'columns[2][search][value]', None)
        if category:
            qs = qs.filter(meaning__category__name__icontains=category)

        return qs