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
CommitLineData
01a9197e 1# -*- encoding: utf-8 -*-
2from django.db import models
878de341 3from django.db.models import Q
03e081cb
AJ
4from datamaster_modeles.models import *
5from savoirs.models import Discipline
01a9197e 6
7TYPE_SITE_CHOICES = (
8 ('RV', 'Revue en ligne'),
9 ('BB', 'Bibliothèque en ligne'),
00755d9b 10 ('FD', 'Fonds documentaire'),
01a9197e 11 ('AR', 'Archive ouverte'),
12 ('CO', 'Cours en ligne'),
00755d9b
AJ
13 ('RE', 'Repertoire de ressource'),
14 ('SA', 'Site associatif'),
15 ('SC', 'Site culturel'),
16 ('SI', 'Site d\'information'),
01a9197e 17 ('AU', 'Autre type de site'),
18 )
19
878de341
EMS
20class 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
28class SiteQuerySet(models.query.QuerySet):
29
30 def search(self, text):
31 qs = self
0b1ddc11 32 q = None
878de341 33 for word in text.split():
0b1ddc11
EMS
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
3c23982e
EMS
46 if q is not None:
47 qs = qs.filter(q).distinct()
878de341
EMS
48 return qs
49
01a9197e 50class Site(models.Model):
51 """Fiche d'info d'un site web"""
f810842d 52 url = models.URLField(verify_exists=False) # dc:identifier (dc:source?)
03e081cb 53 titre = models.CharField(max_length=255, verbose_name='Titre') # dc.title
e7d36875
AJ
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
03e081cb
AJ
57
58 #auf_partenaire = models.BooleanField() # dc.contributor
59
e7d36875
AJ
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,
01a9197e 62 verbose_name = 'Type de site') # dc.type
03e081cb
AJ
63 discipline = models.ManyToManyField(Discipline, blank=True)
64 thematique = models.ManyToManyField(Thematique, blank=True)
65
e7d36875 66 mots_cles = models.TextField(verbose_name='Mots-clés', null=True, blank=True) # dc:subject # indexation libre
01a9197e 67
68 # source # dc:source (dc:relation?)
e7d36875 69 pays = models.ForeignKey(Pays, null = True, blank=True, db_column='pays', to_field='code', verbose_name = 'Pays')
01a9197e 70
71 # meta
72 actif = models.BooleanField()
03e081cb 73 date_maj = models.DateField(auto_now=True)
878de341
EMS
74
75 # Manager
76 objects = SiteManager()
6e001443 77
78 def __unicode__(self):
c08cba47 79 return "%s" % (self.titre)
54ab837c
AJ
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