Filtrage permanent des disciplines et des régions.
[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 4from datamaster_modeles.models import *
15261361 5from savoirs.models import Discipline, RandomQuerySetMixin
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
15261361 28class SiteQuerySet(models.query.QuerySet, RandomQuerySetMixin):
878de341
EMS
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) |
ad0600bc 40 Q(pays__nom__icontains=word))
0b1ddc11
EMS
41 if q is None:
42 q = part
43 else:
44 q = q & part
3c23982e
EMS
45 if q is not None:
46 qs = qs.filter(q).distinct()
878de341
EMS
47 return qs
48
bae03b7b
EMS
49 def filter_discipline(self, discipline):
50 """Ne conserve que les sites dans la discipline donnée.
51
52 Si ``disicipline`` est None, ce filtre n'a aucun effet."""
53 return self.filter(discipline=discipline) if discipline is not None else self
54
55 def filter_region(self, region):
56 """Ne conserve que les sites dans la région donnée.
57
58 Si ``region`` est None, ce filtre n'a aucun effet."""
59 return self.filter(Q(regions=region) | Q(pays__region=region)) if region is not None else self
60
01a9197e 61class Site(models.Model):
62 """Fiche d'info d'un site web"""
f810842d 63 url = models.URLField(verify_exists=False) # dc:identifier (dc:source?)
a5f76eb4 64 titre = models.CharField(max_length=255, verbose_name='titre') # dc.title
e7d36875 65 description = models.TextField(null=True, blank=True)
a5f76eb4
EMS
66 editeur = models.CharField(max_length=255, null=True, blank=True, verbose_name='éditeur') # dc.publisher : organisation resp
67 auteur = models.CharField(max_length=255, null=True, blank=True, verbose_name='auteur') # dc.creator : nom, prénom
03e081cb
AJ
68
69 #auf_partenaire = models.BooleanField() # dc.contributor
70
e7d36875
AJ
71 date_publication = models.DateField(null=True, blank=True) # dc.date : date de publication
72 type = models.CharField(max_length=2, null=True, blank=True, choices=TYPE_SITE_CHOICES,
01a9197e 73 verbose_name = 'Type de site') # dc.type
03e081cb
AJ
74 discipline = models.ManyToManyField(Discipline, blank=True)
75 thematique = models.ManyToManyField(Thematique, blank=True)
76
e7d36875 77 mots_cles = models.TextField(verbose_name='Mots-clés', null=True, blank=True) # dc:subject # indexation libre
01a9197e 78
79 # source # dc:source (dc:relation?)
a5f76eb4
EMS
80 pays = models.ForeignKey(Pays, null = True, blank=True, db_column='pays', to_field='code', verbose_name = 'pays')
81 regions = models.ManyToManyField(Region, blank=True, related_name="sites", verbose_name='régions')
01a9197e 82
83 # meta
84 actif = models.BooleanField()
03e081cb 85 date_maj = models.DateField(auto_now=True)
878de341
EMS
86
87 # Manager
88 objects = SiteManager()
6e001443 89
90 def __unicode__(self):
c08cba47 91 return "%s" % (self.titre)
54ab837c
AJ
92
93 def type_display(self):
94 for t in TYPE_SITE_CHOICES:
95 if self.type == t[0]:
96 return t[1]
97 return "-"
98
264a3210
EMS
99 def assigner_regions(self, regions):
100 self.regions.add(*regions)
101
102 def assigner_disciplines(self, disciplines):
103 self.discipline.add(*disciplines)