Bugfix: code non-migré lorsqu'on a fait hériter Chercheur de Personne.
[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
116db1fd
EMS
4from datamaster_modeles.models import *
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
116db1fd 20class SiteManager(models.Manager):
878de341 21
116db1fd 22 def get_query_set(self):
c59dba82 23 return SiteQuerySet(self.model).filter(actif=True)
878de341 24
116db1fd
EMS
25 def search(self, text):
26 return self.get_query_set().search(text)
878de341 27
116db1fd
EMS
28 def filter_region(self, region):
29 return self.get_query_set().filter_region(region)
c1b134f8 30
116db1fd
EMS
31 def filter_discipline(self, discipline):
32 return self.get_query_set().filter_discipline(discipline)
c1b134f8 33
116db1fd 34class SiteQuerySet(models.query.QuerySet, RandomQuerySetMixin):
878de341 35
116db1fd
EMS
36 def search(self, text):
37 qs = self
38 q = None
39 for word in text.split():
40 part = (Q(titre__icontains=word) |
41 Q(description__icontains=word) |
42 Q(editeur__icontains=word) |
43 Q(auteur__icontains=word) |
44 Q(mots_cles__icontains=word) |
45 Q(discipline__nom__icontains=word) |
46 Q(pays__nom__icontains=word))
47 if q is None:
48 q = part
49 else:
50 q = q & part
51 if q is not None:
52 qs = qs.filter(q).distinct()
53 return qs
878de341 54
116db1fd
EMS
55 def filter_discipline(self, discipline):
56 """Ne conserve que les sites dans la discipline donnée.
57
58 Si ``disicipline`` est None, ce filtre n'a aucun effet."""
59 if discipline is None:
60 return self
61 if not isinstance(discipline, Discipline):
62 discipline = Discipline.objects.get(pk=discipline)
63 return self.filter(Q(discipline=discipline) |
64 Q(titre__icontains=discipline.nom) |
65 Q(description__icontains=discipline.nom) |
0418e5a2 66 Q(mots_cles__icontains=discipline.nom)).distinct()
bae03b7b 67
116db1fd
EMS
68 def filter_region(self, region):
69 """Ne conserve que les sites dans la région donnée.
70
71 Si ``region`` est None, ce filtre n'a aucun effet."""
72 if region is None:
73 return self
74 if not isinstance(region, Region):
75 region = Region.objects.get(pk=region)
76 return self.filter(Q(pays__region=region) |
77 Q(titre__icontains=region.nom) |
78 Q(description__icontains=region.nom) |
79 Q(mots_cles__icontains=region.nom)).distinct()
bae03b7b 80
01a9197e 81class Site(models.Model):
82 """Fiche d'info d'un site web"""
f810842d 83 url = models.URLField(verify_exists=False) # dc:identifier (dc:source?)
a5f76eb4 84 titre = models.CharField(max_length=255, verbose_name='titre') # dc.title
e7d36875 85 description = models.TextField(null=True, blank=True)
a5f76eb4
EMS
86 editeur = models.CharField(max_length=255, null=True, blank=True, verbose_name='éditeur') # dc.publisher : organisation resp
87 auteur = models.CharField(max_length=255, null=True, blank=True, verbose_name='auteur') # dc.creator : nom, prénom
03e081cb
AJ
88
89 #auf_partenaire = models.BooleanField() # dc.contributor
90
e7d36875
AJ
91 date_publication = models.DateField(null=True, blank=True) # dc.date : date de publication
92 type = models.CharField(max_length=2, null=True, blank=True, choices=TYPE_SITE_CHOICES,
01a9197e 93 verbose_name = 'Type de site') # dc.type
03e081cb
AJ
94 discipline = models.ManyToManyField(Discipline, blank=True)
95 thematique = models.ManyToManyField(Thematique, blank=True)
96
e7d36875 97 mots_cles = models.TextField(verbose_name='Mots-clés', null=True, blank=True) # dc:subject # indexation libre
01a9197e 98
99 # source # dc:source (dc:relation?)
a5f76eb4
EMS
100 pays = models.ForeignKey(Pays, null = True, blank=True, db_column='pays', to_field='code', verbose_name = 'pays')
101 regions = models.ManyToManyField(Region, blank=True, related_name="sites", verbose_name='régions')
01a9197e 102
103 # meta
41d30718 104 actif = models.BooleanField(default=True)
03e081cb 105 date_maj = models.DateField(auto_now=True)
878de341
EMS
106
107 # Manager
108 objects = SiteManager()
c59dba82 109 all_objects = models.Manager()
6e001443 110
111 def __unicode__(self):
c08cba47 112 return "%s" % (self.titre)
54ab837c
AJ
113
114 def type_display(self):
115 for t in TYPE_SITE_CHOICES:
116 if self.type == t[0]:
117 return t[1]
118 return "-"
119
264a3210
EMS
120 def assigner_regions(self, regions):
121 self.regions.add(*regions)
122
123 def assigner_disciplines(self, disciplines):
124 self.discipline.add(*disciplines)