# -*- encoding: utf-8 -*-
+from datamaster_modeles.models import *
from django.db import models
from django.db.models import Q
-from datamaster_modeles.models import *
-from savoirs.models import Discipline, RandomQuerySetMixin
+from djangosphinx.models import SphinxSearch
+from savoirs.models import Discipline, SEPManager, SEPSphinxQuerySet, SEPQuerySet
TYPE_SITE_CHOICES = (
('RV', 'Revue en ligne'),
('AU', 'Autre type de site'),
)
-class SiteManager(models.Manager):
+class SiteQuerySet(SEPQuerySet):
- def get_query_set(self):
- return SiteQuerySet(self.model).filter(actif=True)
+ def filter_pays(self, pays):
+ return self.filter(pays=pays)
- def search(self, text):
- return self.get_query_set().search(text)
+class SiteSphinxQuerySet(SEPSphinxQuerySet):
- def filter_region(self, region):
- return self.get_query_set().filter_region(region)
+ def __init__(self, model=None):
+ SEPSphinxQuerySet.__init__(self, model=model, index='savoirsenpartage_sites', weights=dict(titre=3))
- def filter_discipline(self, discipline):
- return self.get_query_set().filter_discipline(discipline)
+ def filter_pays(self, pays):
+ return self.filter(pays_ids=pays.id)
-class SiteQuerySet(models.query.QuerySet, RandomQuerySetMixin):
+class SiteManager(SEPManager):
- def search(self, text):
- qs = self
- q = None
- for word in text.split():
- part = (Q(titre__icontains=word) |
- Q(description__icontains=word) |
- Q(editeur__icontains=word) |
- Q(auteur__icontains=word) |
- Q(mots_cles__icontains=word) |
- Q(discipline__nom__icontains=word) |
- Q(pays__nom__icontains=word))
- if q is None:
- q = part
- else:
- q = q & part
- if q is not None:
- qs = qs.filter(q).distinct()
- return qs
+ def get_query_set(self):
+ return SiteQuerySet(self.model).filter(actif=True)
- def filter_discipline(self, discipline):
- """Ne conserve que les sites dans la discipline donnée.
-
- Si ``disicipline`` est None, ce filtre n'a aucun effet."""
- if discipline is None:
- return self
- if not isinstance(discipline, Discipline):
- discipline = Discipline.objects.get(pk=discipline)
- return self.filter(Q(discipline=discipline) |
- Q(titre__icontains=discipline.nom) |
- Q(description__icontains=discipline.nom) |
- Q(mots_cles__icontains=discipline.nom)).distinct()
+ def get_sphinx_query_set(self):
+ return SiteSphinxQuerySet(self.model)
- def filter_region(self, region):
- """Ne conserve que les sites dans la région donnée.
-
- Si ``region`` est None, ce filtre n'a aucun effet."""
- if region is None:
- return self
- if not isinstance(region, Region):
- region = Region.objects.get(pk=region)
- return self.filter(Q(pays__region=region) |
- Q(titre__icontains=region.nom) |
- Q(description__icontains=region.nom) |
- Q(mots_cles__icontains=region.nom)).distinct()
+ def filter_pays(self, pays):
+ return self.get_query_set().filter_pays(pays)
class Site(models.Model):
"""Fiche d'info d'un site web"""