Bugfix: problèmes avec les modèles de la sitothèque lors du merge avec la
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / sitotheque / models.py
1 # -*- encoding: utf-8 -*-
2 from datamaster_modeles.models import *
3 from django.db import models
4 from django.db.models import Q
5 from djangosphinx.models import SphinxSearch
6 from savoirs.models import Discipline, SEPManager, SEPSphinxQuerySet, SEPQuerySet
7
8 TYPE_SITE_CHOICES = (
9 ('RV', 'Revue en ligne'),
10 ('BB', 'Bibliothèque en ligne'),
11 ('FD', 'Fonds documentaire'),
12 ('AR', 'Archive ouverte'),
13 ('CO', 'Cours en ligne'),
14 ('RE', 'Repertoire de ressource'),
15 ('SA', 'Site associatif'),
16 ('SC', 'Site culturel'),
17 ('SI', 'Site d\'information'),
18 ('AU', 'Autre type de site'),
19 )
20
21 class SiteQuerySet(SEPQuerySet):
22
23 def filter_pays(self, pays):
24 return self.filter(pays=pays)
25
26 class SiteSphinxQuerySet(SEPSphinxQuerySet):
27
28 def __init__(self, model=None):
29 SEPSphinxQuerySet.__init__(self, model=model, index='savoirsenpartage_sites', weights=dict(titre=3))
30
31 def filter_pays(self, pays):
32 return self.filter(pays_ids=pays.id)
33
34 class SiteManager(SEPManager):
35
36 def get_query_set(self):
37 return SiteQuerySet(self.model).filter(actif=True)
38
39 def get_sphinx_query_set(self):
40 return SiteSphinxQuerySet(self.model)
41
42 def filter_pays(self, pays):
43 return self.get_query_set().filter_pays(pays)
44
45 class Site(models.Model):
46 """Fiche d'info d'un site web"""
47 url = models.URLField(verify_exists=False) # dc:identifier (dc:source?)
48 titre = models.CharField(max_length=255, verbose_name='titre') # dc.title
49 description = models.TextField(null=True, blank=True)
50 editeur = models.CharField(max_length=255, null=True, blank=True, verbose_name='éditeur') # dc.publisher : organisation resp
51 auteur = models.CharField(max_length=255, null=True, blank=True, verbose_name='auteur') # dc.creator : nom, prénom
52
53 #auf_partenaire = models.BooleanField() # dc.contributor
54
55 date_publication = models.DateField(null=True, blank=True) # dc.date : date de publication
56 type = models.CharField(max_length=2, null=True, blank=True, choices=TYPE_SITE_CHOICES,
57 verbose_name = 'Type de site') # dc.type
58 discipline = models.ManyToManyField(Discipline, blank=True)
59 thematique = models.ManyToManyField(Thematique, blank=True)
60
61 mots_cles = models.TextField(verbose_name='Mots-clés', null=True, blank=True) # dc:subject # indexation libre
62
63 # source # dc:source (dc:relation?)
64 pays = models.ForeignKey(Pays, null = True, blank=True, db_column='pays', to_field='code', verbose_name = 'pays')
65 regions = models.ManyToManyField(Region, blank=True, related_name="sites", verbose_name='régions')
66
67 # meta
68 actif = models.BooleanField(default=True)
69 date_maj = models.DateField(auto_now=True)
70
71 # Manager
72 objects = SiteManager()
73 all_objects = models.Manager()
74
75 def __unicode__(self):
76 return "%s" % (self.titre)
77
78 def type_display(self):
79 for t in TYPE_SITE_CHOICES:
80 if self.type == t[0]:
81 return t[1]
82 return "-"
83
84 def assigner_regions(self, regions):
85 self.regions.add(*regions)
86
87 def assigner_disciplines(self, disciplines):
88 self.discipline.add(*disciplines)