Bugfix: la recherche plantait quand on ne lui donnait pas de texte à chercher.
[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 if q is not None:
47 qs = qs.filter(q).distinct()
48 return qs
49
50 class Site(models.Model):
51 """Fiche d'info d'un site web"""
52 url = models.URLField(verify_exists=False) # dc:identifier (dc:source?)
53 titre = models.CharField(max_length=255, verbose_name='Titre') # dc.title
54 description = models.TextField(null=True, blank=True)
55 editeur = models.CharField(max_length=255, null=True, blank=True, verbose_name='Éditeur') # dc.publisher : organisation resp
56 auteur = models.CharField(max_length=255, null=True, blank=True, verbose_name='Auteur') # dc.creator : nom, prénom
57
58 #auf_partenaire = models.BooleanField() # dc.contributor
59
60 date_publication = models.DateField(null=True, blank=True) # dc.date : date de publication
61 type = models.CharField(max_length=2, null=True, blank=True, choices=TYPE_SITE_CHOICES,
62 verbose_name = 'Type de site') # dc.type
63 discipline = models.ManyToManyField(Discipline, blank=True)
64 thematique = models.ManyToManyField(Thematique, blank=True)
65
66 mots_cles = models.TextField(verbose_name='Mots-clés', null=True, blank=True) # dc:subject # indexation libre
67
68 # source # dc:source (dc:relation?)
69 pays = models.ForeignKey(Pays, null = True, blank=True, db_column='pays', to_field='code', verbose_name = 'Pays')
70
71 # meta
72 actif = models.BooleanField()
73 date_maj = models.DateField(auto_now=True)
74
75 # Manager
76 objects = SiteManager()
77
78 def __unicode__(self):
79 return "%s" % (self.titre)
80
81 def type_display(self):
82 for t in TYPE_SITE_CHOICES:
83 if self.type == t[0]:
84 return t[1]
85 return "-"
86