#!/usr/bin/env python # -*- coding: utf-8 -*- # # Copyright 2009 Zuza Software Foundation # # This file is part of Pootle. # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program; if not, see . """Helper methods for search functionality.""" from django.utils.translation import ugettext_lazy as _ from django import forms from django.utils.safestring import mark_safe from pootle_app.models.search import Search class SearchForm(forms.Form): text = forms.CharField(widget=forms.TextInput(attrs={'size':'15'})) def as_p(self): return mark_safe('%(text)s' % { 'title': self.initial['title'], 'for_label': self['text'].auto_id, 'text': self['text'].as_widget() }) def as_hidden(self): return mark_safe(''.join(field.as_hidden() for field in self)) class AdvancedSearchForm(forms.Form): source = forms.BooleanField(label=_('Source Text'), required=False, initial=True) target = forms.BooleanField(label=_('Target Text'), required=False, initial=True) notes = forms.BooleanField(label=_('Comments'), required=False, initial= False) locations = forms.BooleanField(label=_('Locations'), required=False, initial=False) def as_hidden(self): """Brain dead Django mungles rendering of checkboxes if initial values are routed via as_hidden check http://code.djangoproject.com/ticket/9336 for more info""" def field_hidden(field): if field.data: return '' % (field.name, field.name) else: return '' return mark_safe(''.join(field_hidden(field) for field in self)) # TBD: Init the search forms from a SearchState object? def get_search_form(request, search_text=None): search_form = None advanced_search_form = None if request.method == 'POST': search_form = SearchForm(data=request.POST, initial={'title': _('Search'), 'text': search_text or ''}) if not search_form.is_valid(): search_form = None advanced_search_form = AdvancedSearchForm(data=request.POST) if not advanced_search_form.is_valid(): advanced_search_form = None if search_form is None or advanced_search_form is None: search_form = SearchForm(initial={'title': _('Search'), 'text': search_text or ''}) advanced_search_form = AdvancedSearchForm() return { 'search_form': SearchForm(data=request.POST, initial={'title': _('Search'), 'text': search_text or ''}), 'advanced_search_form': advanced_search_form, 'advanced_search_title': _('Advanced Search'), } def search_from_request(request): def get_list(request, name): try: return request.GET[name].split(',') except KeyError: return [] def as_search_field_list(form): if form.is_bound and form.is_valid(): return [key for key in form.cleaned_data if form.cleaned_data[key]] search = get_search_form(request) kwargs = {} kwargs['match_names'] = get_list(request, 'match_names') #FIXME: use cleaned_data kwargs['search_text'] = search['search_form']['text'].data kwargs['search_fields'] = as_search_field_list(search['advanced_search_form']) kwargs['translation_project'] = request.translation_project return Search(**kwargs)