Sites AUF + Amélioration de la performance de la recherche.
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / sitotheque / models.py
1 # -*- encoding: utf-8 -*-
2 from django.db import models
3 from django.db.models import Q
4 from datamaster_modeles.models import *
5 from savoirs.models import Discipline
6
7 TYPE_SITE_CHOICES = (
8 ('RV', 'Revue en ligne'),
9 ('BB', 'Bibliothèque en ligne'),
10 ('FD', 'Fonds documentaire'),
11 ('AR', 'Archive ouverte'),
12 ('CO', 'Cours en ligne'),
13 ('RE', 'Repertoire de ressource'),
14 ('SA', 'Site associatif'),
15 ('SC', 'Site culturel'),
16 ('SI', 'Site d\'information'),
17 ('AU', 'Autre type de site'),
18 )
19
20 class SiteManager(models.Manager):
21
22 def get_query_set(self):
23 return SiteQuerySet(self.model)
24
25 def search(self, text):
26 return self.get_query_set().search(text)
27
28 class SiteQuerySet(models.query.QuerySet):
29
30 def search(self, text):
31 qs = self
32 q = None
33 for word in text.split():
34 part = (Q(titre__icontains=word) |
35 Q(description__icontains=word) |
36 Q(editeur__icontains=word) |
37 Q(auteur__icontains=word) |
38 Q(mots_cles__icontains=word) |
39 Q(discipline__nom__icontains=word) |
40 Q(pays__nom__icontains=word) |
41 Q(pays__region__nom__icontains=word))
42 if q is None:
43 q = part
44 else:
45 q = q & part
46 qs = qs.filter(q).distinct()
47 return qs
48
49 class Site(models.Model):
50 """Fiche d'info d'un site web"""
51 url = models.URLField(verify_exists=False) # dc:identifier (dc:source?)
52 titre = models.CharField(max_length=255, verbose_name='Titre') # dc.title
53 description = models.TextField(null=True, blank=True)
54 editeur = models.CharField(max_length=255, null=True, blank=True, verbose_name='Éditeur') # dc.publisher : organisation resp
55 auteur = models.CharField(max_length=255, null=True, blank=True, verbose_name='Auteur') # dc.creator : nom, prénom
56
57 #auf_partenaire = models.BooleanField() # dc.contributor
58
59 date_publication = models.DateField(null=True, blank=True) # dc.date : date de publication
60 type = models.CharField(max_length=2, null=True, blank=True, choices=TYPE_SITE_CHOICES,
61 verbose_name = 'Type de site') # dc.type
62 discipline = models.ManyToManyField(Discipline, blank=True)
63 thematique = models.ManyToManyField(Thematique, blank=True)
64
65 mots_cles = models.TextField(verbose_name='Mots-clés', null=True, blank=True) # dc:subject # indexation libre
66
67 # source # dc:source (dc:relation?)
68 pays = models.ForeignKey(Pays, null = True, blank=True, db_column='pays', to_field='code', verbose_name = 'Pays')
69
70 # meta
71 actif = models.BooleanField()
72 date_maj = models.DateField(auto_now=True)
73
74 # Manager
75 objects = SiteManager()
76
77 def __unicode__(self):
78 return "%s" % (self.titre)
79
80 def type_display(self):
81 for t in TYPE_SITE_CHOICES:
82 if self.type == t[0]:
83 return t[1]
84 return "-"
85