src/p4l/search/index.py
changeset 114 93b45b4f423c
parent 113 c05567404888
child 117 0a4e7d6ebe80
equal deleted inserted replaced
113:c05567404888 114:93b45b4f423c
     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")