diff --git a/src/proxy/search_indexes.py b/src/proxy/search_indexes.py index 81061a4..8b831ca 100644 --- a/src/proxy/search_indexes.py +++ b/src/proxy/search_indexes.py @@ -7,25 +7,12 @@ from datetime import datetime from django.db.models import Q from haystack import indexes +from search.base_indexes import BaseIndex from .models import Ticket, Wiki, Revision -class WikiIndex(indexes.SearchIndex, indexes.Indexable): - # common fields - text = indexes.CharField(document=True, use_template=True, stored=False) - url = indexes.CharField(model_attr='get_absolute_url', indexed=False) +class WikiIndex(BaseIndex, indexes.Indexable): title = indexes.CharField(model_attr='name') - description = indexes.CharField(null=True) - author = indexes.CharField(null=True) - author_url = indexes.CharField(null=True, indexed=False) - created = indexes.DateTimeField(model_attr='created', null=True) - modified = indexes.DateTimeField(model_attr='modified', null=True) - type = indexes.CharField() - icon_name = indexes.CharField(indexed=False) - author_and_username = indexes.CharField(null=True, stored=False) - hits = indexes.IntegerField() - - # trac extra fields collaborators = indexes.CharField( model_attr='collaborators', null=True, @@ -35,41 +22,6 @@ class WikiIndex(indexes.SearchIndex, indexes.Indexable): def get_model(self): return Wiki - def get_updated_field(self): - return 'modified' - - def prepare(self, obj): - data = super(WikiIndex, self).prepare(obj) - if obj.hits <= 10: - data['boost'] = 1 - else: - data['boost'] = math.log(obj.hits) - return data - - def prepare_hits(self, obj): - return obj.hits - - def prepare_author(self, obj): - author = obj.get_author() - if author: - return author.get_full_name() - return obj.author - - def prepare_author_and_username(self, obj): - author = obj.get_author() - if not author: - return obj.author - return u'{}\n{}'.format( - author.get_full_name(), - author.username, - ) - - def prepare_author_url(self, obj): - author = obj.get_author() - if author: - return author.get_absolute_url() - return None - def prepare_description(self, obj): return u'{}\n{}'.format(obj.wiki_text, obj.collaborators) @@ -80,23 +32,8 @@ class WikiIndex(indexes.SearchIndex, indexes.Indexable): return u'wiki' -class TicketIndex(indexes.SearchIndex, indexes.Indexable): - # common fields - text = indexes.CharField(document=True, use_template=True, stored=False) - url = indexes.CharField(model_attr='get_absolute_url', indexed=False) - title = indexes.CharField() - description = indexes.CharField(null=True) - author = indexes.CharField(null=True) - author_url = indexes.CharField(null=True, indexed=False) - created = indexes.DateTimeField(model_attr='created', null=True) - modified = indexes.DateTimeField(model_attr='modified', null=True) - type = indexes.CharField() - icon_name = indexes.CharField(indexed=False) +class TicketIndex(BaseIndex, indexes.Indexable): tag = indexes.CharField(model_attr='status', null=True) - author_and_username = indexes.CharField(null=True, stored=False) - hits = indexes.IntegerField() - - # trac extra fields milestone = indexes.CharField(model_attr='milestone', null=True) component = indexes.CharField(model_attr='component', null=True) severity = indexes.CharField(model_attr='severity', null=True) @@ -111,41 +48,6 @@ class TicketIndex(indexes.SearchIndex, indexes.Indexable): def get_model(self): return Ticket - def get_updated_field(self): - return 'modified' - - def prepare(self, obj): - data = super(TicketIndex, self).prepare(obj) - if obj.hits <= 10: - data['boost'] = 1 - else: - data['boost'] = math.log(obj.hits) - return data - - def prepare_hits(self, obj): - return obj.hits - - def prepare_author(self, obj): - author = obj.get_author() - if author: - return author.get_full_name() - return obj.author - - def prepare_author_and_username(self, obj): - author = obj.get_author() - if not author: - return obj.author - return u'{}\n{}'.format( - author.get_full_name(), - author.username, - ) - - def prepare_author_url(self, obj): - author = obj.get_author() - if author: - return author.get_absolute_url() - return None - def prepare_description(self, obj): return u'{}\n{}\n{}\n{}\n{}\n{}\n{}'.format( obj.description, obj.milestone, obj.component, obj.severity, @@ -162,22 +64,9 @@ class TicketIndex(indexes.SearchIndex, indexes.Indexable): return 'ticket' -class RevisionIndex(indexes.SearchIndex, indexes.Indexable): - # common fields - text = indexes.CharField(document=True, use_template=True, stored=False) - url = indexes.CharField(model_attr='get_absolute_url', indexed=False) - title = indexes.CharField() +class RevisionIndex(BaseIndex, indexes.Indexable): description = indexes.CharField(model_attr='message', null=True) - author = indexes.CharField(null=True) - author_url = indexes.CharField(null=True, indexed=False) - created = indexes.DateTimeField(model_attr='created', null=True) modified = indexes.DateTimeField(model_attr='created', null=True) - type = indexes.CharField() - icon_name = indexes.CharField(indexed=False) - author_and_username = indexes.CharField(null=True, stored=False) - hits = indexes.IntegerField() - - # trac extra fields repository_name = indexes.CharField( model_attr='repository_name', stored=False @@ -189,37 +78,11 @@ class RevisionIndex(indexes.SearchIndex, indexes.Indexable): def get_updated_field(self): return 'created' - def prepare(self, obj): - data = super(RevisionIndex, self).prepare(obj) + def get_boost(self, obj, data): if obj.hits <= 10: data['boost'] = 0.8 else: data['boost'] = math.log(obj.hits) * 0.8 - return data - - def prepare_hits(self, obj): - return obj.hits - - def prepare_author(self, obj): - author = obj.get_author() - if author: - return author.get_full_name() - return obj.author - - def prepare_author_and_username(self, obj): - author = obj.get_author() - if not author: - return obj.author - return u'{}\n{}'.format( - author.get_full_name(), - author.username, - ) - - def prepare_author_url(self, obj): - author = obj.get_author() - if author: - return author.get_absolute_url() - return None def prepare_icon_name(self, obj): return u'align-right' diff --git a/src/search/base_indexes.py b/src/search/base_indexes.py new file mode 100644 index 0000000..0e533d2 --- /dev/null +++ b/src/search/base_indexes.py @@ -0,0 +1,55 @@ +# -*- coding: utf-8 -*- + +import math + +from haystack import indexes + + +class BaseIndex(indexes.SearchIndex): + text = indexes.CharField(document=True, use_template=True, stored=False) + url = indexes.CharField(model_attr='get_absolute_url', indexed=False) + title = indexes.CharField() + description = indexes.CharField(null=True) + author = indexes.CharField(null=True) + author_url = indexes.CharField(null=True, indexed=False) + created = indexes.DateTimeField(model_attr='created', null=True) + modified = indexes.DateTimeField(model_attr='modified', null=True) + type = indexes.CharField() + icon_name = indexes.CharField(indexed=False) + author_and_username = indexes.CharField(null=True, stored=False) + hits = indexes.IntegerField(model_attr='hits') + + def get_updated_field(self): + return 'modified' + + def get_boost(self, obj, data): + if obj.hits <= 10: + data['boost'] = 1 + else: + data['boost'] = math.log(obj.hits) + + def prepare(self, obj): + data = super(BaseIndex, self).prepare(obj) + self.get_boost(obj, data) + return data + + def prepare_author(self, obj): + author = obj.get_author() + if author: + return author.get_full_name() + return obj.author + + def prepare_author_and_username(self, obj): + author = obj.get_author() + if not author: + return obj.author + return u'{}\n{}'.format( + author.get_full_name(), + author.username, + ) + + def prepare_author_url(self, obj): + author = obj.get_author() + if author: + return author.get_absolute_url() + return None diff --git a/src/super_archives/search_indexes.py b/src/super_archives/search_indexes.py index 2ad8f61..67df634 100644 --- a/src/super_archives/search_indexes.py +++ b/src/super_archives/search_indexes.py @@ -4,17 +4,11 @@ import math from haystack import indexes +from search.base_indexes import BaseIndex from .models import Thread -class ThreadIndex(indexes.SearchIndex, indexes.Indexable): - # common fields - text = indexes.CharField(document=True, use_template=True, stored=False) - url = indexes.CharField( - model_attr='get_absolute_url', - null=True, - indexed=False - ) +class ThreadIndex(BaseIndex, indexes.Indexable): title = indexes.CharField(model_attr='latest_message__subject_clean') description = indexes.CharField(use_template=True) latest_description = indexes.CharField( @@ -25,19 +19,12 @@ class ThreadIndex(indexes.SearchIndex, indexes.Indexable): modified = indexes.DateTimeField( model_attr='latest_message__received_time' ) - author = indexes.CharField(null=True) - author_url = indexes.CharField(null=True, indexed=False) - type = indexes.CharField() - icon_name = indexes.CharField(indexed=False) tag = indexes.CharField(model_attr='mailinglist__name') collaborators = indexes.CharField(use_template=True, stored=False) - - author_and_username = indexes.CharField(null=True, stored=False) mailinglist_url = indexes.CharField( model_attr='mailinglist__get_absolute_url', indexed=False, ) - hits = indexes.IntegerField() def get_model(self): return Thread @@ -45,17 +32,6 @@ class ThreadIndex(indexes.SearchIndex, indexes.Indexable): def get_updated_field(self): return 'latest_message__received_time' - def prepare(self, obj): - data = super(ThreadIndex, self).prepare(obj) - if obj.hits <= 10: - data['boost'] = 1 - else: - data['boost'] = math.log(obj.hits) - return data - - def prepare_hits(self, obj): - return obj.hits - def prepare_author(self, obj): return obj.message_set.first().from_address.get_full_name() -- libgit2 0.21.2