6 ''' |
6 ''' |
7 |
7 |
8 from haystack import indexes |
8 from haystack import indexes |
9 |
9 |
10 from p4l.models import Record |
10 from p4l.models import Record |
11 from p4l.utils import strip_accents |
11 from p4l.utils import strip_accents, get_labels_for_uris, safe_cache_key |
|
12 |
|
13 from django.core.cache import get_cache |
|
14 from django.conf import settings |
|
15 import logging |
|
16 |
|
17 logger = logging.getLogger(__name__) |
|
18 |
|
19 def get_organizations_label(uris): |
|
20 cache = get_cache('indexation') |
|
21 |
|
22 res = {} |
|
23 missing_uris = [] |
|
24 |
|
25 for uri in uris: |
|
26 label = cache.get(safe_cache_key(uri)) |
|
27 if label is not None: |
|
28 res[uri] = label |
|
29 else: |
|
30 missing_uris.append(uri) |
|
31 |
|
32 new_labels = get_labels_for_uris(missing_uris, settings.RDF_SCHEMES['organization'], None, True) |
|
33 for k,v in new_labels.iteritems(): |
|
34 cache.set(safe_cache_key(k),v) |
|
35 res[k] = v |
|
36 |
|
37 return res |
12 |
38 |
13 |
39 |
14 class RecordIndex(indexes.SearchIndex, indexes.Indexable): |
40 class RecordIndex(indexes.SearchIndex, indexes.Indexable): |
15 |
41 |
16 text = indexes.CharField(document=True, use_template=True, stored=False) |
42 text = indexes.CharField(document=True, use_template=True, stored=False) |
17 identifier = indexes.CharField(model_attr="identifier", stored=True) |
43 identifier = indexes.CharField(model_attr="identifier", stored=True) |
18 titles = indexes.MultiValueField(model_attr="get_titles", stored=False) |
44 titles = indexes.MultiValueField(model_attr="get_titles", stored=False) |
19 titles_src = indexes.MultiValueField(model_attr="get_titles", stored=True, indexed=False) |
45 titles_src = indexes.MultiValueField(model_attr="get_titles", stored=True, indexed=False) |
20 authors = indexes.MultiValueField(model_attr="get_authors", stored=False) |
46 authors = indexes.MultiValueField(model_attr="all_authors", stored=False) |
21 |
47 |
22 years = indexes.MultiValueField(model_attr="get_imprints_years", indexed=False, stored=True) |
48 years = indexes.MultiValueField(model_attr="get_imprints_years", indexed=False, stored=True) |
23 |
49 |
|
50 def prepare(self, obj): |
|
51 authors = obj.get_authors() + get_organizations_label(obj.get_corporate_authors()).values() |
|
52 obj.all_authors = [strip_accents(unicode(v)) for v in authors] |
|
53 return indexes.SearchIndex.prepare(self, obj) |
|
54 |
24 def prepare_titles(self, obj): |
55 def prepare_titles(self, obj): |
25 return [strip_accents(v) for v in obj.get_titles()] |
56 return [strip_accents(v) for v in obj.get_titles()] |
26 |
|
27 def prepare_authors(self, obj): |
|
28 return [strip_accents(v) for v in obj.get_authors()] |
|
29 |
57 |
30 def get_model(self): |
58 def get_model(self): |
31 return Record |
59 return Record |
32 |
60 |
33 def get_updated_field(self): |
61 def get_updated_field(self): |
34 return "modification_date" |
62 return "modification_date" |
35 |
63 |
36 def index_queryset(self, using=None): |
64 def index_queryset(self, using=None): |
37 return Record.objects.using(using).all().prefetch_related("imprints","authors", "titles") |
65 return Record.objects.using(using).all().prefetch_related("imprints","authors", "titles", "corporateAuthors") |