title: django cms search with multiple sites?
body: <p>I've set up multiple sites within a single instance of django cms with haystack for search (with Solr). However, the search_indexes.py that I've got doesn't appear to have any effect. It's like it's just ignored and a default one is used. Why isn't my search_indexes.py taking effect?</p>
  
  <p>I've got the following:</p>
  
  <p>settings.py:</p>
  
  <pre><code>HAYSTACK_SITECONF = 'mysite.search_sites'
  </code></pre>
  
  <p>search_sites.py:</p>
  
  <pre><code>from cms.models import monkeypatch_reverse
  import haystack
  
  monkeypatch_reverse()
  haystack.autodiscover()
  </code></pre>
  
  <p>mysite/app/search_indexes.py:</p>
  
  <pre><code>from django.conf import settings
  from django.utils.translation import string_concat, ugettext_lazy
  from django.utils.html import strip_tags
  
  from haystack import indexes, site
  
  from cms.models.managers import PageManager
  from cms.models.pagemodel import Page
  from cms.models.pluginmodel import CMSPlugin
  
  def page_index_factory(lang, lang_name):
      if isinstance(lang_name, basestring):
          lang_name = ugettext_lazy(lang_name)
  
      def get_absolute_url(self):
          if 'cms.middleware.multilingual.MultilingualURLMiddleware' in settings.MIDDLEWARE_CLASSES:
              return '/%s%s' % (lang, Page.get_absolute_url(self))
          else:
              return Page.get_absolute_url(self)
  
      class Meta:
          proxy = True
          app_label = 'cms'
          if len(settings.LANGUAGES) &gt; 1:
              verbose_name = string_concat(Page._meta.verbose_name, ' (', lang_name, ')')
              verbose_name_plural = string_concat(Page._meta.verbose_name_plural, ' (', lang_name, ')')
          else:
              verbose_name = Page._meta.verbose_name
              verbose_name_plural = Page._meta.verbose_name_plural
  
      attrs = {'__module__': Page.__module__,
               'Meta': Meta,
               'objects': PageManager(),
               'get_absolute_url': get_absolute_url}
  
      _PageProxy = type("Page_%s" % lang.title() , (Page,), attrs)
  
      _PageProxy._meta.parent_attr = 'parent'
      _PageProxy._meta.left_attr = 'lft'
      _PageProxy._meta.right_attr = 'rght'
      _PageProxy._meta.tree_id_attr = 'tree_id'
  
      class _PageIndex(indexes.SearchIndex):
          site_id = indexes.IntegerField(model_attr="site__id")
          language = lang
          text = indexes.CharField(document=True, use_template=False)
          pub_date = indexes.DateTimeField(model_attr='publication_date')
          login_required = indexes.BooleanField(model_attr='login_required')
          url = indexes.CharField(stored=True, indexed=False, model_attr='get_absolute_url')
          title = indexes.CharField(stored=True, indexed=False, model_attr='get_title')
  
          def prepare(self, obj):
              self.prepared_data = super(_PageIndex, self).prepare(obj)
              plugins = CMSPlugin.objects.filter(language=lang, placeholder__in=obj.placeholders.all())
              text = ''
              for plugin in plugins:
                  instance, _ = plugin.get_plugin_instance()
                  if hasattr(instance, 'search_fields'):
                      text += ''.join(strip_tags(getattr(instance, field, '')) for field in instance.search_fields)
                  if getattr(instance, 'search_fulltext', False):
                      text += strip_tags(instance.render_plugin())
              self.prepared_data['text'] = text
              return self.prepared_data
  
          def index_queryset(self):
              qs = _PageProxy.objects.published().filter(title_set__language=lang).distinct()
              if 'publisher' in settings.INSTALLED_APPS:
                  qs = qs.filter(publisher_is_draft=True)
              return qs
  
      return _PageProxy, _PageIndex
  
  for lang_tuple in settings.LANGUAGES:
      lang, lang_name = lang_tuple
      site.register(*page_index_factory(lang, lang_name))
  </code></pre>