src/iconolab/search_indexes/forms.py
author durandn
Wed, 12 Oct 2016 13:30:13 +0200
changeset 225 6b304e2c6af4
parent 151 797460904f77
child 227 b67ea0d6c621
permissions -rw-r--r--
reworked search design and search pagination #39
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
106
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
     1
from django import forms
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
     2
from haystack.forms import SearchForm
225
6b304e2c6af4 reworked search design and search pagination #39
durandn
parents: 151
diff changeset
     3
from iconolab.models import Item, Annotation
106
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
     4
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
     5
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
     6
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
     7
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
     8
class IconolabSearchForm(SearchForm):
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
     9
124
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    10
	model_type = forms.ChoiceField(required=False, choices=(("images","Image"), ("annotations","Annotation")) )
106
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    11
	
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    12
	def __init__(self, *args, **kwargs):
124
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    13
		self.collection_name = kwargs.pop("collection_name")
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    14
		selected_model_type =  kwargs.pop("model_type", None)
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    15
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    16
		if selected_model_type is not None: 
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    17
			data = kwargs.get("data", None)
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    18
			if data:
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    19
				data = data.copy()
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    20
				data["model_type"] = selected_model_type
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    21
				kwargs['data'] = data
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    22
106
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    23
		super(IconolabSearchForm, self).__init__(*args, **kwargs)
124
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    24
	
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    25
	def no_query_found(self):
148
5d2cd51c6951 fixing js build
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 124
diff changeset
    26
		# load all
5d2cd51c6951 fixing js build
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 124
diff changeset
    27
		selected_type = self.cleaned_data.get("model_type")
5d2cd51c6951 fixing js build
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 124
diff changeset
    28
		qs = self.get_model_type_queryset(self.searchqueryset, selected_type).load_all()
5d2cd51c6951 fixing js build
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 124
diff changeset
    29
		return qs
106
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    30
124
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    31
	def get_model_type_queryset(self, qs, model_type):
106
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    32
		
124
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    33
		if model_type == 'images':
225
6b304e2c6af4 reworked search design and search pagination #39
durandn
parents: 151
diff changeset
    34
			qs = qs.models(Item).load_all_queryset(Item, Item.objects.select_related('collection', 'metadatas'))
124
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    35
		if model_type == 'annotations':
225
6b304e2c6af4 reworked search design and search pagination #39
durandn
parents: 151
diff changeset
    36
			qs = qs.models(Annotation).load_all_queryset(Annotation, Annotation.objects.select_related('image', 'image__item', 'image__item__collection', 'stats', 'current_revision', 'author'))
124
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    37
		
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    38
		if self.collection_name is not None:
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    39
			qs = qs.filter(collection = self.collection_name)
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    40
106
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    41
		return qs
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    42
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    43
	def search(self):
124
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    44
		selected_type = self.cleaned_data.get("model_type")
106
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    45
		qs = super(IconolabSearchForm, self).search()
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    46
		if qs.count() == 0:
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    47
			return qs
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    48
		else:
124
e5267573edd8 search engine
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents: 116
diff changeset
    49
			qs = self.get_model_type_queryset(qs, selected_type).load_all()
106
233bda6f2865 iconolab search
Harris Baptiste <harris.baptiste@iri.centrepompidou.fr>
parents:
diff changeset
    50
		return qs