1 # -*- encoding: utf-8 -*-
4 from datamaster_modeles
.models
import *
5 from django
.conf
import settings
6 from django
.contrib
.auth
.models
import User
7 from django
.core
.urlresolvers
import reverse
as url
8 from django
.db
import models
9 from django
.db
.models
import Q
10 from django
.utils
.encoding
import smart_str
11 from django
.utils
.hashcompat
import sha_constructor
12 from djangosphinx
.models
import SphinxSearch
14 from savoirs
.models
import Discipline
, SEPManager
, SEPSphinxQuerySet
, SEPQuerySet
, Search
16 GENRE_CHOICES
= (('m', 'Homme'), ('f', 'Femme'))
17 class Personne(models
.Model
):
18 salutation
= models
.CharField(max_length
=128, null
=True, blank
=True)
19 nom
= models
.CharField(max_length
=255)
20 prenom
= models
.CharField(max_length
=128, verbose_name
='prénom')
21 courriel
= models
.EmailField(max_length
=128, verbose_name
="courriel")
22 afficher_courriel
= models
.BooleanField(default
=True)
23 fonction
= models
.CharField(max_length
=128, null
=True, blank
=True)
24 date_naissance
= models
.DateField(null
=True, blank
=True)
25 sousfonction
= models
.CharField(max_length
=128, null
=True, blank
=True, verbose_name
='sous-fonction')
26 telephone
= models
.CharField(max_length
=32, null
=True, blank
=True, verbose_name
='numéro de téléphone')
27 adresse_postale
= models
.TextField(blank
=True)
28 genre
= models
.CharField(max_length
=1, choices
=GENRE_CHOICES
)
29 commentaire
= models
.TextField(verbose_name
='commentaires', null
=True, blank
=True)
30 actif
= models
.BooleanField(editable
=False, default
=False)
32 def __unicode__(self
):
33 return u
"%s %s, %s" % (self
.prenom
, self
.nom
, self
.courriel
)
36 ordering
= ["nom", "prenom"]
42 elif self
.genre
== 'f':
47 def courriel_display(self
):
48 return self
.courriel
.replace(u
'@', u
' (à) ')
50 class ChercheurQuerySet(SEPQuerySet
):
52 def filter_groupe(self
, groupe
):
53 return self
.filter(groupes
=groupe
)
55 def filter_pays(self
, pays
):
56 return self
.filter(Q(etablissement__pays
=pays
) |
Q(etablissement_autre_pays
=pays
))
58 def filter_region(self
, region
):
59 return self
.filter(Q(etablissement__pays__region
=region
) |
Q(etablissement_autre_pays__region
=region
))
61 def filter_nord_sud(self
, nord_sud
):
62 return self
.filter(Q(etablissement__pays__nord_sud
=nord_sud
) |
Q(etablissement_autre_pays__nord_sud
=nord_sud
))
64 def filter_genre(self
, genre
):
65 return self
.filter(genre
=genre
)
67 def filter_statut(self
, statut
):
68 return self
.filter(statut
=statut
)
70 def filter_expert(self
):
71 return self
.exclude(expertises
=None)
73 def filter_date_modification(self
, min=None, max=None):
74 return self
._filter_date('date_modification', min=min, max=max)
76 def order_by_nom(self
, direction
=''):
77 return self
.order_by(direction
+ 'nom', direction
+ 'prenom', '-date_modification')
79 def order_by_etablissement(self
, direction
=''):
80 return self
.extra(select
=dict(etablissement_nom
='IFNULL(ref_etablissement.nom, chercheurs_chercheur.etablissement_autre_nom)'),
81 order_by
=[direction
+ 'etablissement_nom', '-date_modification'])
83 def order_by_pays(self
, direction
=''):
84 return self
.extra(select
=dict(
85 pays_etablissement
='''(SELECT nom FROM ref_pays
86 WHERE ref_pays.code = IFNULL(ref_etablissement.pays, chercheurs_chercheur.etablissement_autre_pays))'''
87 ), order_by
=[direction
+ 'pays_etablissement', '-date_modification'])
89 class ChercheurSphinxQuerySet(SEPSphinxQuerySet
):
91 def __init__(self
, model
=None):
92 return SEPSphinxQuerySet
.__init__(self
, model
=model
, index
='savoirsenpartage_chercheurs',
93 weights
=dict(nom
=2, prenom
=2))
95 def filter_region(self
, region
):
96 return self
.filter(region_id
=region
.id)
98 def filter_groupe(self
, groupe
):
99 return self
.filter(groupe_ids
=groupe
.id)
101 def filter_pays(self
, pays
):
102 return self
.filter(pays_id
=pays
.id)
104 NORD_SUD_CODES
= {'Nord': 1, 'Sud': 2}
105 def filter_nord_sud(self
, nord_sud
):
106 return self
.filter(nord_sud
=self
.NORD_SUD_CODES
[nord_sud
])
108 GENRE_CODES
= dict([(k
, i
+1) for i
, (k
, v
) in enumerate(GENRE_CHOICES
)])
109 def filter_genre(self
, genre
):
110 return self
.filter(genre
=self
.GENRE_CODES
[genre
])
112 STATUT_CODES
= {'enseignant': 1, 'etudiant': 2, 'independant': 3}
113 def filter_statut(self
, statut
):
114 return self
.filter(statut
=self
.STATUT_CODES
[statut
])
116 def filter_expert(self
):
117 return self
.filter(expert
=True)
119 def filter_date_modification(self
, min=None, max=None):
120 return self
._filter_date('date_modification', min=min, max=max)
122 def order_by_nom(self
, direction
=''):
123 return self
.order_by(direction
+ 'nom_complet', '-date_modification')
125 def order_by_etablissement(self
, direction
=''):
126 return self
.order_by(direction
+ 'etablissement_attr', '-date_modification')
128 def order_by_pays(self
, direction
=''):
129 return self
.order_by(direction
+ 'pays_attr', '-date_modification')
131 class ChercheurManager(SEPManager
):
133 def get_query_set(self
):
134 return ChercheurQuerySet(self
.model
).filter(actif
=True)
136 def get_sphinx_query_set(self
):
137 return ChercheurSphinxQuerySet(self
.model
).order_by('-date_modification')
139 def filter_region(self
, region
):
140 """Le filtrage de chercheurs par région n'est pas une recherche texte."""
141 return self
.get_query_set().filter_region(region
)
143 def filter_groupe(self
, groupe
):
144 return self
.get_query_set().filter_groupe(groupe
)
146 def filter_pays(self
, pays
):
147 return self
.get_query_set().filter_pays(pays
)
149 def filter_nord_sud(self
, nord_sud
):
150 return self
.get_query_set().filter_nord_sud(nord_sud
)
152 def filter_genre(self
, genre
):
153 return self
.get_query_set().filter_genre(genre
=genre
)
155 def filter_statut(self
, statut
):
156 return self
.get_query_set().filter_statut(statut
)
158 def filter_expert(self
):
159 return self
.get_query_set().filter_expert()
161 def filter_date_modification(self
, min=None, max=None):
162 return self
.get_query_set().filter_date_modification(min=min, max=max)
164 def order_by_nom(self
, direction
=''):
165 return self
.get_query_set().order_by_nom(self
, direction
=direction
)
167 def order_by_etablissement(self
, direction
=''):
168 return self
.get_query_set().order_by_etablissement(self
, direction
=direction
)
170 def order_by_pays(self
, direction
=''):
171 return self
.get_query_set().order_by_pays(self
, direction
=direction
)
174 ('enseignant', 'Enseignant-chercheur dans un établissement'),
175 ('etudiant', 'Étudiant-chercheur doctorant'),
176 ('independant', 'Chercheur indépendant docteur')
179 class Chercheur(Personne
):
180 RESEAU_INSTITUTIONNEL_CHOICES
= (
181 ('AFELSH', 'Association des facultés ou établissements de lettres et sciences humaines des universités d’expression française (AFELSH)'),
182 ('CIDEGEF', 'Conférence internationale des dirigeants des institutions d’enseignement supérieur et de recherche de gestion d’expression française (CIDEGEF)'),
183 ('RIFEFF', 'Réseau international francophone des établissements de formation de formateurs (RIFEFF)'),
184 ('CIDMEF', 'Conférence internationale des doyens des facultés de médecine d’expression française (CIDMEF)'),
185 ('CIDCDF', 'Conférence internationale des doyens des facultés de chirurgie dentaire d’expression totalement ou partiellement française (CIDCDF)'),
186 ('CIFDUF', 'Conférence internationale des facultés de droit ayant en commun l’usage du français (CIFDUF)'),
187 ('CIRUISEF', 'Conférence internationale des responsables des universités et institutions à dominante scientifique et technique d’expression française (CIRUISEF)'),
188 ('Theophraste', 'Réseau Théophraste (Réseau de centres francophones de formation au journalisme)'),
189 ('CIDPHARMEF', 'Conférence internationale des doyens des facultés de pharmacie d’expression française (CIDPHARMEF)'),
190 ('CIDEFA', 'Conférence internationale des directeurs et doyens des établissements supérieurs d’expression française des sciences de l’agriculture et de l’alimentation (CIDEFA)'),
191 ('CITEF', 'Conférence internationale des formations d’ingénieurs et techniciens d’expression française (CITEF)'),
192 ('APERAU', 'Association pour la promotion de l’enseignement et de la recherche en aménagement et urbanisme (APERAU)'),
194 INSTANCE_AUF_CHOICES
= (
195 ('CASSOC', 'Conseil associatif'),
196 ('CA', "Conseil d'administration"),
197 ('CS', 'Conseil scientifique'),
198 ('CRE', "Commission régionale d'experts"),
199 ('CR', 'Conférence des recteurs'),
200 ('CNO', "Conseil national d'orientation")
203 nationalite
= models
.ForeignKey(Pays
, null
= True, db_column
='nationalite', to_field
='code',
204 verbose_name
= 'nationalité', related_name
='nationalite')
205 statut
= models
.CharField(max_length
=36, choices
=STATUT_CHOICES
)
206 diplome
= models
.CharField(max_length
=255, null
=True, verbose_name
= 'diplôme le plus élevé')
207 etablissement
= models
.ForeignKey(Etablissement
, db_column
='etablissement', null
=True, blank
=True)
208 etablissement_autre_nom
= models
.CharField(max_length
=255, null
=True, blank
=True, verbose_name
= 'autre établissement')
209 etablissement_autre_pays
= models
.ForeignKey(Pays
, null
= True, blank
=True, db_column
='etablissement_autre_pays',
210 to_field
='code', related_name
='etablissement_autre_pays',
211 verbose_name
= "pays de l'établissement")
212 attestation
= models
.BooleanField()
215 thematique
= models
.ForeignKey(Thematique
, db_column
='thematique', blank
=True, null
=True, verbose_name
='thematique')
216 mots_cles
= models
.CharField(max_length
=255, null
=True, verbose_name
='mots-clés')
217 discipline
= models
.ForeignKey(Discipline
, db_column
='discipline', null
=True, verbose_name
='Discipline')
218 theme_recherche
= models
.TextField(null
=True, blank
=True, verbose_name
='thèmes de recherche')
219 groupe_recherche
= models
.CharField(max_length
=255, blank
=True, verbose_name
='groupe de recherche')
220 url_site_web
= models
.URLField(max_length
=255, null
=True, blank
=True,
221 verbose_name
='adresse site Internet', verify_exists
=False)
222 url_blog
= models
.URLField(max_length
=255, null
=True, blank
=True, verbose_name
='blog',
224 url_reseau_social
= models
.URLField(
225 max_length
=255, null
=True, blank
=True, verbose_name
='Réseau social',
227 help_text
=u
"Vous pouvez indiquer ici l'adresse de votre page personnelle dans votre réseau social préféré (e.g. Facebook, LinkedIn, Twitter, Identica, ...)"
230 groupes
= models
.ManyToManyField('Groupe', through
='ChercheurGroupe', related_name
='membres', blank
=True, verbose_name
='Domaines de recherche')
232 # Activités en francophonie
233 membre_instance_auf
= models
.NullBooleanField(verbose_name
="est ou a déjà été membre d'une instance de l'AUF")
234 membre_instance_auf_nom
= models
.CharField(max_length
=10, blank
=True, choices
=INSTANCE_AUF_CHOICES
, verbose_name
="instance")
235 membre_instance_auf_fonction
= models
.CharField(max_length
=255, blank
=True, verbose_name
="fonction")
236 membre_instance_auf_dates
= models
.CharField(max_length
=255, blank
=True, verbose_name
="dates")
237 expert_oif
= models
.NullBooleanField(verbose_name
="a été sollicité par l'OIF")
238 expert_oif_details
= models
.CharField(max_length
=255, blank
=True, verbose_name
="détails")
239 expert_oif_dates
= models
.CharField(max_length
=255, blank
=True, verbose_name
="dates")
240 membre_association_francophone
= models
.NullBooleanField(verbose_name
="est membre d'une association francophone")
241 membre_association_francophone_details
= models
.CharField(max_length
=255, blank
=True, verbose_name
="nom de l'association")
242 membre_reseau_institutionnel
= models
.NullBooleanField(
243 verbose_name
="est membre des instances d'un réseau institutionnel de l'AUF"
245 membre_reseau_institutionnel_nom
= models
.CharField(
246 max_length
=15, choices
=RESEAU_INSTITUTIONNEL_CHOICES
, blank
=True,
247 verbose_name
="réseau institutionnel"
249 membre_reseau_institutionnel_fonction
= models
.CharField(
250 max_length
=255, blank
=True, verbose_name
="fonction"
252 membre_reseau_institutionnel_dates
= models
.CharField(
253 max_length
=255, blank
=True, verbose_name
="dates"
257 expertises_auf
= models
.NullBooleanField(verbose_name
="est disposé à réaliser des expertises pour l'AUF")
260 date_creation
= models
.DateField(auto_now_add
=True, db_column
='date_creation')
261 date_modification
= models
.DateField(auto_now
=True, db_column
='date_modification')
264 objects
= ChercheurManager()
265 all_objects
= models
.Manager()
267 def __unicode__(self
):
268 return u
"%s %s" % (self
.nom
.upper(), self
.prenom
.title())
270 def statut_display(self
):
271 for s
in STATUT_CHOICES
:
272 if self
.statut
== s
[0]:
277 def etablissement_display(self
):
278 return (self
.nom_etablissement
or '') + (', ' + self
.pays
.nom
if self
.pays
else '')
282 return self
.etablissement
.pays
if self
.etablissement
else self
.etablissement_autre_pays
285 def nom_etablissement(self
):
286 return self
.etablissement
.nom
if self
.etablissement
else self
.etablissement_autre_nom
290 return self
.pays
.region
293 def domaines_recherche(self
):
294 return self
.groupes
.filter(groupe_chercheur
=False)
297 def groupes_chercheur(self
):
298 return self
.groupes
.filter(groupe_chercheur
=True)
301 """Si on a donné un établissement membre, on laisse tomber l'autre établissement."""
302 if self
.etablissement
:
303 self
.etablissement_autre_nom
= None
304 self
.etablissement_autre_pays
= None
305 super(Chercheur
, self
).save()
307 def activation_token(self
):
308 return sha_constructor(settings
.SECRET_KEY
+ unicode(self
.id)).hexdigest()[::2]
310 def get_absolute_url(self
):
311 return url('chercheur', kwargs
={'id': self
.id})
313 class ChercheurVoir(Chercheur
):
317 verbose_name
= '(visualisation) chercheur'
318 verbose_name_plural
= '(visualisation) chercheur'
320 class Publication(models
.Model
):
321 chercheur
= models
.ForeignKey(Chercheur
, related_name
='publications')
322 auteurs
= models
.CharField(max_length
=255, blank
=True, verbose_name
='auteur(s)')
323 titre
= models
.CharField(max_length
=255, null
=True, blank
=True, verbose_name
='titre')
324 revue
= models
.CharField(max_length
=255, null
=True, blank
=True, verbose_name
='revue')
325 annee
= models
.IntegerField(null
=True, blank
=True, verbose_name
='année de publication')
326 editeur
= models
.CharField(max_length
=255, null
=True, blank
=True, verbose_name
='éditeur')
327 lieu_edition
= models
.CharField(max_length
=255, null
=True, blank
=True, verbose_name
="lieu d'édition")
328 nb_pages
= models
.CharField(max_length
=255, null
=True, blank
=True, verbose_name
='nombre de pages')
329 url
= models
.URLField(max_length
=255, null
=True, blank
=True, verbose_name
='lien vers la publication', verify_exists
=False)
330 #Migration des publications depuis l'ancien repertoire de chercheurs
331 publication_affichage
= models
.TextField(verbose_name
='publication', null
=True, blank
=True)
332 actif
= models
.BooleanField(editable
=False)
334 def __unicode__(self
):
335 return self
.titre
or '(Aucun)'
338 if self
.publication_affichage
and (self
.auteurs
or self
.titre
or
339 self
.revue
or self
.annee
or
340 self
.editeur
or self
.lieu_edition
341 or self
.nb_pages
or self
.url
):
342 self
.publication_affichage
= ''
343 super(Publication
, self
).save()
345 class These(models
.Model
):
346 chercheur
= models
.OneToOneField(Chercheur
, primary_key
=True)
347 titre
= models
.CharField(max_length
=255, verbose_name
='Titre')
348 annee
= models
.IntegerField(verbose_name
='Année de soutenance (réalisée ou prévue)')
349 directeur
= models
.CharField(max_length
=255, verbose_name
='Directeur')
350 etablissement
= models
.CharField(max_length
=255, verbose_name
='Établissement de soutenance')
351 nb_pages
= models
.IntegerField(verbose_name
='Nombre de pages', blank
=True, null
=True)
352 url
= models
.URLField(max_length
=255, verbose_name
='Lien vers la publication', blank
=True, verify_exists
=False)
354 def __unicode__(self
):
357 class Expertise(models
.Model
):
358 id = models
.AutoField(primary_key
=True, db_column
='id')
359 chercheur
= models
.ForeignKey(Chercheur
, related_name
='expertises')
360 nom
= models
.CharField(max_length
=255, verbose_name
= "Objet de l'expertise")
361 date
= models
.CharField(max_length
=255, blank
=True)
362 lieu
= models
.CharField(max_length
=255, null
=True, blank
=True, verbose_name
= "Lieu de l'expertise")
363 organisme_demandeur
= models
.CharField(max_length
=255, null
=True, blank
=True, verbose_name
= 'Organisme demandeur')
364 organisme_demandeur_visible
= models
.BooleanField(verbose_name
="Afficher l'organisme demandeur")
365 actif
= models
.BooleanField(editable
= False, db_column
='actif')
367 def __unicode__(self
):
368 return u
"%s" % (self
.nom
)
370 class GroupeManager(models
.Manager
):
371 def search(self
, text
):
372 return self
.get_query_set().filter(nom__icontains
=text
)
374 class GroupeChercheurManager(GroupeManager
):
375 def get_query_set(self
):
376 return super(GroupeChercheurManager
, self
).get_query_set().filter(groupe_chercheur
=True)
378 class DomaineRechercheManager(GroupeManager
):
379 def get_query_set(self
):
380 return super(DomaineRechercheManager
, self
).get_query_set().filter(groupe_chercheur
=False)
382 class Groupe(models
.Model
):
383 id = models
.AutoField(primary_key
=True, db_column
='id')
384 nom
= models
.CharField(max_length
=255, db_column
='nom')
385 url
= models
.URLField(max_length
=255, null
=True, blank
=True,
386 verbose_name
='Site web')
387 liste_diffusion
= models
.URLField(max_length
=255, null
=True, blank
=True,
388 verbose_name
='Liste de diffusion')
389 bulletin
= models
.URLField(max_length
=255, null
=True, blank
=True,
390 verbose_name
='Bulletin')
391 actif
= models
.BooleanField(editable
= False, db_column
='actif')
392 groupe_chercheur
= models
.BooleanField(default
=False, editable
=False, verbose_name
='Groupe de chercheur')
394 responsables
= models
.ManyToManyField(User
, related_name
='responsable_groupe', verbose_name
='responsables', blank
=True)
396 recherches
= models
.ManyToManyField(Search
, related_name
='recherche_groupe', verbose_name
='recherches prédéfinies', blank
=True)
398 page_accueil
= models
.TextField(null
=True, blank
=True)
400 objects
= GroupeManager()
401 groupe_chercheur_objects
= GroupeChercheurManager()
402 domaine_recherche_objects
= DomaineRechercheManager()
405 verbose_name
= 'domaine de recherche'
406 verbose_name_plural
= 'domaines de recherche'
408 def __unicode__(self
):
409 return u
"%s" % (self
.nom
)
411 def get_absolute_url(self
):
412 return url('groupe_retrieve', kwargs
={'id': self
.id})
415 class GroupeChercheur(Groupe
):
416 objects
= GroupeChercheurManager()
420 verbose_name
= 'groupe de chercheur'
421 verbose_name_plural
= 'groupes de chercheur'
423 def save(self
, *args
, **kwargs
):
424 self
.groupe_chercheur
= True
425 super(GroupeChercheur
, self
).save(*args
, **kwargs
)
427 class DomaineRecherche(Groupe
):
428 objects
= DomaineRechercheManager()
432 verbose_name
= 'domaine de recherche'
433 verbose_name_plural
= 'domaines de recherche'
435 def save(self
, *args
, **kwargs
):
436 self
.groupe_chercheur
= False
437 super(DomaineRecherche
, self
).save(*args
, **kwargs
)
439 class ChercheurGroupe(models
.Model
):
440 id = models
.AutoField(primary_key
=True, db_column
='id')
441 chercheur
= models
.ForeignKey('Chercheur', db_column
='chercheur')
442 groupe
= models
.ForeignKey('Groupe', db_column
='groupe', related_name
="membership")
443 date_inscription
= models
.DateField(auto_now_add
=True)
444 date_modification
= models
.DateField(auto_now
=True)
445 actif
= models
.BooleanField(db_column
='actif')
448 verbose_name
= 'adhésion'
450 def __unicode__(self
):
451 return u
"%s - %s" % (self
.chercheur
, self
.groupe
)
453 class ChercheurSearch(Search
):
454 nom_chercheur
= models
.CharField(max_length
=100, blank
=True, verbose_name
='nom')
455 domaine
= models
.ForeignKey(DomaineRecherche
, blank
=True, null
=True, verbose_name
='domaine de recherche')
456 groupe_chercheur
= models
.ForeignKey(GroupeChercheur
, blank
=True, null
=True, verbose_name
='groupe de chercheur')
457 groupe_recherche
= models
.CharField(max_length
=100, blank
=True, null
=True,
458 verbose_name
='groupe de recherche',
459 help_text
='ou Laboratoire, ou Groupement inter-universitaire')
460 statut
= models
.CharField(max_length
=100, blank
=True, choices
=STATUT_CHOICES
+ (('expert', 'Expert'),))
461 pays
= models
.ForeignKey(Pays
, blank
=True, null
=True)
462 nord_sud
= models
.CharField(max_length
=4, blank
=True, choices
=(('Nord', 'Nord'), ('Sud', 'Sud')),
463 verbose_name
='Nord/Sud',
464 help_text
="Distinction d'ordre géopolitique et économique, non géographique, qui conditionne souvent l'attribution de soutiens par les agences internationales: on entend par Nord les pays développés, par Sud les pays en développement (pays les moins avancés, pays émergents et pays à économies en transition)")
465 activites_francophonie
= models
.CharField(
466 max_length
=25, blank
=True, verbose_name
='activités en Francophonie',
467 choices
=(('instance_auf', "Membre d'une instance de l'AUF"),
468 ('expert_oif', "Sollicité par l'OIF"),
469 ('association_francophone', "Membre d'une association ou d'une société savante francophone"),
470 ('reseau_institutionnel', "Membre des instances d'un réseau institutionnel de l'AUF"))
472 genre
= models
.CharField(max_length
=1, blank
=True, choices
=GENRE_CHOICES
)
475 verbose_name
= 'recherche de chercheurs'
476 verbose_name_plural
= 'recherches de chercheurs'
478 def run(self
, min_date
=None, max_date
=None):
479 results
= Chercheur
.objects
481 results
= results
.search(self
.q
)
482 if self
.nom_chercheur
:
483 results
= results
.add_to_query('@(nom,prenom) ' + self
.nom_chercheur
)
484 if self
.groupe_recherche
:
485 results
= results
.add_to_query('@groupe_recherche ' + self
.groupe_recherche
)
487 results
= results
.filter_discipline(self
.discipline
)
489 results
= results
.filter_region(self
.region
)
491 if self
.statut
== "expert":
492 results
= results
.filter_expert()
494 results
= results
.filter_statut(self
.statut
)
496 results
= results
.filter_groupe(self
.domaine
)
497 if self
.groupe_chercheur
:
498 results
= results
.filter_groupe(self
.groupe_chercheur
)
500 results
= results
.filter_pays(self
.pays
)
502 results
= results
.filter_nord_sud(self
.nord_sud
)
504 results
= results
.filter_genre(self
.genre
)
505 if self
.activites_francophonie
== 'instance_auf':
506 results
= results
.filter(membre_instance_auf
=True)
507 elif self
.activites_francophonie
== 'expert_oif':
508 results
= results
.filter(expert_oif
=True)
509 elif self
.activites_francophonie
== 'association_francophone':
510 results
= results
.filter(membre_association_francophone
=True)
511 elif self
.activites_francophonie
== 'reseau_institutionnel':
512 results
= results
.filter(membre_reseau_institutionnel
=True)
514 results
= results
.filter_date_modification(min=min_date
)
516 results
= results
.filter_date_modification(max=max_date
)
520 qs
= self
.query_string()
521 return url('chercheurs') + ('?' + qs
if qs
else '')
524 qs
= self
.query_string()
525 return url('rss_chercheurs') + ('?' + qs
if qs
else '')
527 def get_email_alert_content(self
, results
):
529 for chercheur
in results
:
530 content
+= u
'- [%s %s](%s%s) \n' % (chercheur
.nom
.upper(),
532 settings
.SITE_ROOT_URL
,
533 chercheur
.get_absolute_url())
534 content
+= u
' %s\n\n' % chercheur
.etablissement_display
537 class GroupeSearch(Search
):
540 verbose_name
= 'recherche de groupe'
541 verbose_name_plural
= 'recherches de groupes'
544 results
= Groupe
.objects
546 results
= results
.search(self
.q
)
550 # qs = self.query_string()
551 # return url('groupes') + ('?' + qs if qs else '')
554 # qs = self.query_string()
555 # return url('rss_groupes') + ('?' + qs if qs else '')
557 class Message(models
.Model
):
559 chercheur
= models
.ForeignKey('Chercheur', db_column
='chercheur')
560 groupe
= models
.ForeignKey('Groupe', db_column
='groupe')
561 titre
= models
.CharField(max_length
=255)
562 contenu
= models
.TextField()
564 date_creation
= models
.DateTimeField(auto_now_add
=True, db_column
='date_creation')
567 ordering
= ['-date_creation']
569 def __unicode__(self
):
570 return u
"%s - %s" % (self
.chercheur
, self
.titre
)
572 def get_absolute_url(self
):
573 return url('groupe_messages', kwargs
={'id': self
.groupe
.id})