Commit 73e166b66a0d63373b564a22f6aff9a906c51ebf

Authored by Luan
1 parent 8f51e017

Changing users' search indexes

Showing 1 changed file with 43 additions and 6 deletions   Show diff stats
src/accounts/search_indexes.py
1 1 # -*- coding: utf-8 -*-
2 2  
3 3 from haystack import indexes
  4 +from django.db.models import Count
4 5  
  6 +from proxy.models import Revision, Ticket, Wiki
5 7 from .models import User
6 8  
7 9  
8 10 class UserIndex(indexes.SearchIndex, indexes.Indexable):
9 11 # common fields
10   - text = indexes.CharField(document=True, use_template=True)
11   - url = indexes.CharField(model_attr='get_absolute_url')
  12 + text = indexes.CharField(document=True, use_template=True, stored=False)
  13 + url = indexes.CharField(model_attr='get_absolute_url', indexed=False)
12 14 title = indexes.CharField(model_attr='get_full_name')
13 15 description = indexes.CharField(null=True)
14 16 type = indexes.CharField()
15 17 icon_name = indexes.CharField()
16 18  
17 19 # extra fields
18   - username = indexes.CharField(model_attr='username')
  20 + username = indexes.CharField(model_attr='username', stored=False)
19 21 name = indexes.CharField(model_attr='get_full_name')
20   - email = indexes.CharField(model_attr='email')
  22 + email = indexes.CharField(model_attr='email', stored=False)
21 23 institution = indexes.CharField(model_attr='institution', null=True)
22 24 role = indexes.CharField(model_attr='role', null=True)
23   - google_talk = indexes.CharField(model_attr='google_talk', null=True)
24   - webpage = indexes.CharField(model_attr='webpage', null=True)
  25 + google_talk = indexes.CharField(model_attr='google_talk', null=True,
  26 + stored=False)
  27 + webpage = indexes.CharField(model_attr='webpage', null=True, stored=False)
  28 + message_count = indexes.IntegerField(stored=False)
  29 + changeset_count = indexes.IntegerField(stored=False)
  30 + ticket_count = indexes.IntegerField(stored=False)
  31 + wiki_count = indexes.IntegerField(stored=False)
  32 + contribution_count = indexes.IntegerField(stored=False)
25 33  
26 34 def get_model(self):
27 35 return User
... ... @@ -29,6 +37,23 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable):
29 37 def get_updated_field(self):
30 38 return 'date_joined'
31 39  
  40 + def prepare(self, obj):
  41 + prepared_data = super(UserIndex, self).prepare(obj)
  42 +
  43 + message_count = self.prepared_data['message_count']
  44 + changeset_count = self.prepared_data['changeset_count']
  45 + ticket_count = self.prepared_data['ticket_count']
  46 + wiki_count = self.prepared_data['wiki_count']
  47 +
  48 + prepared_data['contribution_count'] = sum((
  49 + message_count,
  50 + changeset_count,
  51 + ticket_count,
  52 + wiki_count
  53 + ))
  54 +
  55 + return prepared_data
  56 +
32 57 def prepare_description(self, obj):
33 58 return u'{}\n{}\n{}\n{}'.format(
34 59 obj.institution, obj.role, obj.username, obj.get_full_name()
... ... @@ -40,5 +65,17 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable):
40 65 def prepare_type(self, obj):
41 66 return u'user'
42 67  
  68 + def prepare_message_count(self, obj):
  69 + return obj.emails.aggregate(Count('message'))['message__count']
  70 +
  71 + def prepare_changeset_count(self, obj):
  72 + return Revision.objects.filter(author=obj.username).count()
  73 +
  74 + def prepare_ticket_count(self, obj):
  75 + return Ticket.objects.filter(author=obj.username).count()
  76 +
  77 + def prepare_wiki_count(self, obj):
  78 + return Wiki.objects.filter(author=obj.username).count()
  79 +
43 80 def index_queryset(self, using=None):
44 81 return self.get_model().objects.filter(is_active=True)
... ...