| author | durandn |
| Wed, 12 Oct 2016 13:30:13 +0200 | |
| changeset 225 | 6b304e2c6af4 |
| parent 151 | 797460904f77 |
| child 227 | b67ea0d6c621 |
| permissions | -rw-r--r-- |
|
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 | 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 | 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 | 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 |