Bugfix: les sélecteurs de région et de discipline étaient brisés lorsqu'on les
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / sitotheque / models.py
CommitLineData
01a9197e 1# -*- encoding: utf-8 -*-
fdcf5874 2from django.core.urlresolvers import reverse
01a9197e 3from django.db import models
878de341 4from django.db.models import Q
39a63232 5from djangosphinx.models import SphinxSearch
fdcf5874
EMS
6
7from datamaster_modeles.models import *
8from savoirs.models import Discipline, SEPManager, SEPSphinxQuerySet, SEPQuerySet, Search
01a9197e 9
10TYPE_SITE_CHOICES = (
11 ('RV', 'Revue en ligne'),
12 ('BB', 'Bibliothèque en ligne'),
00755d9b 13 ('FD', 'Fonds documentaire'),
01a9197e 14 ('AR', 'Archive ouverte'),
15 ('CO', 'Cours en ligne'),
00755d9b
AJ
16 ('RE', 'Repertoire de ressource'),
17 ('SA', 'Site associatif'),
18 ('SC', 'Site culturel'),
19 ('SI', 'Site d\'information'),
01a9197e 20 ('AU', 'Autre type de site'),
fdcf5874 21)
01a9197e 22
39a63232 23class SiteQuerySet(SEPQuerySet):
878de341 24
39a63232
EMS
25 def filter_pays(self, pays):
26 return self.filter(pays=pays)
878de341 27
39a63232 28class SiteSphinxQuerySet(SEPSphinxQuerySet):
878de341 29
39a63232
EMS
30 def __init__(self, model=None):
31 SEPSphinxQuerySet.__init__(self, model=model, index='savoirsenpartage_sites', weights=dict(titre=3))
c1b134f8 32
39a63232
EMS
33 def filter_pays(self, pays):
34 return self.filter(pays_ids=pays.id)
c1b134f8 35
39a63232 36class SiteManager(SEPManager):
878de341 37
39a63232
EMS
38 def get_query_set(self):
39 return SiteQuerySet(self.model).filter(actif=True)
878de341 40
39a63232
EMS
41 def get_sphinx_query_set(self):
42 return SiteSphinxQuerySet(self.model)
bae03b7b 43
39a63232
EMS
44 def filter_pays(self, pays):
45 return self.get_query_set().filter_pays(pays)
bae03b7b 46
01a9197e 47class Site(models.Model):
48 """Fiche d'info d'un site web"""
f810842d 49 url = models.URLField(verify_exists=False) # dc:identifier (dc:source?)
a5f76eb4 50 titre = models.CharField(max_length=255, verbose_name='titre') # dc.title
e7d36875 51 description = models.TextField(null=True, blank=True)
a5f76eb4
EMS
52 editeur = models.CharField(max_length=255, null=True, blank=True, verbose_name='éditeur') # dc.publisher : organisation resp
53 auteur = models.CharField(max_length=255, null=True, blank=True, verbose_name='auteur') # dc.creator : nom, prénom
03e081cb
AJ
54
55 #auf_partenaire = models.BooleanField() # dc.contributor
56
e7d36875
AJ
57 date_publication = models.DateField(null=True, blank=True) # dc.date : date de publication
58 type = models.CharField(max_length=2, null=True, blank=True, choices=TYPE_SITE_CHOICES,
01a9197e 59 verbose_name = 'Type de site') # dc.type
03e081cb
AJ
60 discipline = models.ManyToManyField(Discipline, blank=True)
61 thematique = models.ManyToManyField(Thematique, blank=True)
62
e7d36875 63 mots_cles = models.TextField(verbose_name='Mots-clés', null=True, blank=True) # dc:subject # indexation libre
01a9197e 64
65 # source # dc:source (dc:relation?)
a5f76eb4
EMS
66 pays = models.ForeignKey(Pays, null = True, blank=True, db_column='pays', to_field='code', verbose_name = 'pays')
67 regions = models.ManyToManyField(Region, blank=True, related_name="sites", verbose_name='régions')
01a9197e 68
69 # meta
41d30718 70 actif = models.BooleanField(default=True)
03e081cb 71 date_maj = models.DateField(auto_now=True)
fc2908e4 72 recherche_google = models.BooleanField('Inclure dans la recherche Google', default=False)
878de341
EMS
73
74 # Manager
75 objects = SiteManager()
c59dba82 76 all_objects = models.Manager()
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
264a3210
EMS
87 def assigner_regions(self, regions):
88 self.regions.add(*regions)
89
90 def assigner_disciplines(self, disciplines):
91 self.discipline.add(*disciplines)
fdcf5874
EMS
92
93class SiteSearch(Search):
94 pays = models.ForeignKey(Pays, blank=True, null=True)
95
96 class Meta:
97 verbose_name = "recherche de sites"
98 verbose_name_plural = "recherches de sites"
99
100 def run(self):
101 results = Site.objects
102 if self.q:
103 results = results.search(self.q)
104 if self.discipline:
105 results = results.filter_discipline(self.discipline)
106 if self.region:
107 results = results.filter_region(self.region)
108 if self.pays:
109 results = results.filter_pays(pays=self.pays)
110 if not self.q:
111 results = results.order_by('-date_maj')
112 return results.all()
113
114 def url(self):
115 qs = self.query_string()
116 return reverse('sites') + ('?' + qs if qs else '')
117