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 # -*- coding: utf-8 -*- 1 # -*- coding: utf-8 -*-
2 2
3 from haystack import indexes 3 from haystack import indexes
  4 +from django.db.models import Count
4 5
  6 +from proxy.models import Revision, Ticket, Wiki
5 from .models import User 7 from .models import User
6 8
7 9
8 class UserIndex(indexes.SearchIndex, indexes.Indexable): 10 class UserIndex(indexes.SearchIndex, indexes.Indexable):
9 # common fields 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 title = indexes.CharField(model_attr='get_full_name') 14 title = indexes.CharField(model_attr='get_full_name')
13 description = indexes.CharField(null=True) 15 description = indexes.CharField(null=True)
14 type = indexes.CharField() 16 type = indexes.CharField()
15 icon_name = indexes.CharField() 17 icon_name = indexes.CharField()
16 18
17 # extra fields 19 # extra fields
18 - username = indexes.CharField(model_attr='username') 20 + username = indexes.CharField(model_attr='username', stored=False)
19 name = indexes.CharField(model_attr='get_full_name') 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 institution = indexes.CharField(model_attr='institution', null=True) 23 institution = indexes.CharField(model_attr='institution', null=True)
22 role = indexes.CharField(model_attr='role', null=True) 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 def get_model(self): 34 def get_model(self):
27 return User 35 return User
@@ -29,6 +37,23 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable): @@ -29,6 +37,23 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable):
29 def get_updated_field(self): 37 def get_updated_field(self):
30 return 'date_joined' 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 def prepare_description(self, obj): 57 def prepare_description(self, obj):
33 return u'{}\n{}\n{}\n{}'.format( 58 return u'{}\n{}\n{}\n{}'.format(
34 obj.institution, obj.role, obj.username, obj.get_full_name() 59 obj.institution, obj.role, obj.username, obj.get_full_name()
@@ -40,5 +65,17 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable): @@ -40,5 +65,17 @@ class UserIndex(indexes.SearchIndex, indexes.Indexable):
40 def prepare_type(self, obj): 65 def prepare_type(self, obj):
41 return u'user' 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 def index_queryset(self, using=None): 80 def index_queryset(self, using=None):
44 return self.get_model().objects.filter(is_active=True) 81 return self.get_model().objects.filter(is_active=True)