# -*- encoding: utf-8 -*-
import hashlib
+
from datamaster_modeles.models import *
from django.conf import settings
+from django.contrib.auth.models import User
+from django.core.urlresolvers import reverse as url
from django.db import models
from django.db.models import Q
from django.utils.encoding import smart_str
from django.utils.hashcompat import sha_constructor
from djangosphinx.models import SphinxSearch
-from savoirs.models import Discipline, SEPManager, SEPSphinxQuerySet, SEPQuerySet
+
+from savoirs.models import Discipline, SEPManager, SEPSphinxQuerySet, SEPQuerySet, Search
GENRE_CHOICES = (('m', 'Homme'), ('f', 'Femme'))
class Personne(models.Model):
def filter_expert(self):
return self.exclude(expertises=None)
+ def filter_date_modification(self, min=None, max=None):
+ return self._filter_date('date_modification', min=min, max=max)
+
def order_by_nom(self, direction=''):
return self.order_by(direction + 'nom', direction + 'prenom', '-date_modification')
def order_by_etablissement(self, direction=''):
- return self.extra(select=dict(nom_etablissement='IFNULL(ref_etablissement.nom, chercheurs_chercheur.etablissement_autre_nom)'),
- order_by=[direction + 'nom_etablissement', '-date_modification'])
+ return self.extra(select=dict(etablissement_nom='IFNULL(ref_etablissement.nom, chercheurs_chercheur.etablissement_autre_nom)'),
+ order_by=[direction + 'etablissement_nom', '-date_modification'])
def order_by_pays(self, direction=''):
return self.extra(select=dict(
def filter_expert(self):
return self.filter(expert=True)
+ def filter_date_modification(self, min=None, max=None):
+ return self._filter_date('date_modification', min=min, max=max)
+
def order_by_nom(self, direction=''):
return self.order_by(direction + 'nom_complet', '-date_modification')
def filter_expert(self):
return self.get_query_set().filter_expert()
+ def filter_date_modification(self, min=None, max=None):
+ return self.get_query_set().filter_date_modification(min=min, max=max)
+
def order_by_nom(self, direction=''):
return self.get_query_set().order_by_nom(self, direction=direction)
attestation = models.BooleanField()
#Domaine
- thematique = models.ForeignKey(Thematique, db_column='thematique', null=True, verbose_name='thematique')
+ thematique = models.ForeignKey(Thematique, db_column='thematique', blank=True, null=True, verbose_name='thematique')
mots_cles = models.CharField(max_length=255, null=True, verbose_name='mots-clés')
discipline = models.ForeignKey(Discipline, db_column='discipline', null=True, verbose_name='Discipline')
theme_recherche = models.TextField(null=True, blank=True, verbose_name='thèmes de recherche')
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, ...)"
)
- groupes = models.ManyToManyField('Groupe', through='ChercheurGroupe', blank=True, verbose_name='Domaines de recherche')
+ groupes = models.ManyToManyField('Groupe', through='ChercheurGroupe', related_name='membres', blank=True, verbose_name='Domaines de recherche')
# Activités en francophonie
membre_instance_auf = models.NullBooleanField(verbose_name="est ou a déjà été membre d'une instance de l'AUF")
@property
def etablissement_display(self):
- if self.etablissement:
- return self.etablissement.nom + ', ' + self.etablissement.pays.nom
- else:
- return self.etablissement_autre_nom + ', ' + self.etablissement_autre_pays.nom
+ return (self.nom_etablissement or '') + (', ' + self.pays.nom if self.pays else '')
@property
def pays(self):
return self.etablissement.pays if self.etablissement else self.etablissement_autre_pays
@property
+ def nom_etablissement(self):
+ return self.etablissement.nom if self.etablissement else self.etablissement_autre_nom
+
+ @property
def region(self):
return self.pays.region
+ @property
+ def domaines_recherche(self):
+ return self.groupes.filter(groupe_chercheur=False)
+
+ @property
+ def groupes_chercheur(self):
+ return self.groupes.filter(groupe_chercheur=True)
+
def save(self):
"""Si on a donné un établissement membre, on laisse tomber l'autre établissement."""
if self.etablissement:
def activation_token(self):
return sha_constructor(settings.SECRET_KEY + unicode(self.id)).hexdigest()[::2]
+ def get_absolute_url(self):
+ return url('chercheur', kwargs={'id': self.id})
+
+class ChercheurVoir(Chercheur):
+
+ class Meta:
+ proxy = True
+ verbose_name = '(visualisation) chercheur'
+ verbose_name_plural = '(visualisation) chercheur'
+
class Publication(models.Model):
chercheur = models.ForeignKey(Chercheur, related_name='publications')
auteurs = models.CharField(max_length=255, blank=True, verbose_name='auteur(s)')
def __unicode__(self):
return u"%s" % (self.nom)
+class GroupeManager(models.Manager):
+ def search(self, text):
+ return self.get_query_set().filter(nom__icontains=text)
+
+class GroupeChercheurManager(GroupeManager):
+ def get_query_set(self):
+ return super(GroupeChercheurManager, self).get_query_set().filter(groupe_chercheur=True)
+
+class DomaineRechercheManager(GroupeManager):
+ def get_query_set(self):
+ return super(DomaineRechercheManager, self).get_query_set().filter(groupe_chercheur=False)
+
class Groupe(models.Model):
id = models.AutoField(primary_key=True, db_column='id')
nom = models.CharField(max_length=255, db_column='nom')
bulletin = models.URLField(max_length=255, null=True, blank=True,
verbose_name='Bulletin')
actif = models.BooleanField(editable = False, db_column='actif')
+ groupe_chercheur = models.BooleanField(default=False, editable=False, verbose_name='Groupe de chercheur')
+
+ responsables = models.ManyToManyField(User, related_name='responsable_groupe', verbose_name='responsables', blank=True)
+
+ recherches = models.ManyToManyField(Search, related_name='recherche_groupe', verbose_name='recherches prédéfinies', blank=True)
+
+ page_accueil = models.TextField(null=True, blank=True)
+
+ objects = GroupeManager()
+ groupe_chercheur_objects = GroupeChercheurManager()
+ domaine_recherche_objects = DomaineRechercheManager()
class Meta:
verbose_name = 'domaine de recherche'
def __unicode__(self):
return u"%s" % (self.nom)
-
+
+ def get_absolute_url(self):
+ return url('groupe_retrieve', kwargs={'id': self.id})
+
+
+class GroupeChercheur(Groupe):
+ objects = GroupeChercheurManager()
+
+ class Meta:
+ proxy = True
+ verbose_name = 'groupe de chercheurs'
+ verbose_name_plural = 'groupes de chercheurs'
+
+ def save(self, *args, **kwargs):
+ self.groupe_chercheur = True
+ super(GroupeChercheur, self).save(*args, **kwargs)
+
+class DomaineRecherche(Groupe):
+ objects = DomaineRechercheManager()
+
+ class Meta:
+ proxy = True
+ verbose_name = 'domaine de recherche'
+ verbose_name_plural = 'domaines de recherche'
+
+ def save(self, *args, **kwargs):
+ self.groupe_chercheur = False
+ super(DomaineRecherche, self).save(*args, **kwargs)
+
class ChercheurGroupe(models.Model):
id = models.AutoField(primary_key=True, db_column='id')
- chercheur = models.ForeignKey('Chercheur', db_column='chercheur', editable=False)
- groupe = models.ForeignKey('Groupe', db_column='groupe')
+ chercheur = models.ForeignKey('Chercheur', db_column='chercheur')
+ groupe = models.ForeignKey('Groupe', db_column='groupe', related_name="membership")
date_inscription = models.DateField(auto_now_add=True)
date_modification = models.DateField(auto_now=True)
- actif = models.BooleanField(editable = False, db_column='actif')
+ actif = models.BooleanField(db_column='actif')
class Meta:
verbose_name = 'adhésion'
def __unicode__(self):
return u"%s - %s" % (self.chercheur, self.groupe)
+
+class ChercheurSearch(Search):
+ nom_chercheur = models.CharField(max_length=100, blank=True, verbose_name='nom')
+ domaine = models.ForeignKey(DomaineRecherche, blank=True, null=True, verbose_name='domaine de recherche')
+ groupe_chercheur = models.ForeignKey(GroupeChercheur, blank=True, null=True, verbose_name='groupe de chercheurs')
+ groupe_recherche = models.CharField(max_length=100, blank=True, null=True,
+ verbose_name='groupe de recherche',
+ help_text='ou Laboratoire, ou Groupement inter-universitaire')
+ statut = models.CharField(max_length=100, blank=True, choices=STATUT_CHOICES + (('expert', 'Expert'),))
+ pays = models.ForeignKey(Pays, blank=True, null=True)
+ nord_sud = models.CharField(max_length=4, blank=True, choices=(('Nord', 'Nord'), ('Sud', 'Sud')),
+ verbose_name='Nord/Sud',
+ 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)")
+ activites_francophonie = models.CharField(
+ max_length=25, blank=True, verbose_name='activités en Francophonie',
+ choices=(('instance_auf', "Membre d'une instance de l'AUF"),
+ ('expert_oif', "Sollicité par l'OIF"),
+ ('association_francophone', "Membre d'une association ou d'une société savante francophone"),
+ ('reseau_institutionnel', "Membre des instances d'un réseau institutionnel de l'AUF"))
+ )
+ genre = models.CharField(max_length=1, blank=True, choices=GENRE_CHOICES)
+
+ class Meta:
+ verbose_name = 'recherche de chercheurs'
+ verbose_name_plural = 'recherches de chercheurs'
+
+ def run(self, min_date=None, max_date=None):
+ results = Chercheur.objects
+ if self.q:
+ results = results.search(self.q)
+ if self.nom_chercheur:
+ results = results.add_to_query('@(nom,prenom) ' + self.nom_chercheur)
+ if self.groupe_recherche:
+ results = results.add_to_query('@groupe_recherche ' + self.groupe_recherche)
+ if self.discipline:
+ results = results.filter_discipline(self.discipline)
+ if self.region:
+ results = results.filter_region(self.region)
+ if self.statut:
+ if self.statut == "expert":
+ results = results.filter_expert()
+ else:
+ results = results.filter_statut(self.statut)
+ if self.domaine:
+ results = results.filter_groupe(self.domaine)
+ if self.groupe_chercheur:
+ results = results.filter_groupe(self.groupe_chercheur)
+ if self.pays:
+ results = results.filter_pays(self.pays)
+ if self.nord_sud:
+ results = results.filter_nord_sud(self.nord_sud)
+ if self.genre:
+ results = results.filter_genre(self.genre)
+ if self.activites_francophonie == 'instance_auf':
+ results = results.filter(membre_instance_auf=True)
+ elif self.activites_francophonie == 'expert_oif':
+ results = results.filter(expert_oif=True)
+ elif self.activites_francophonie == 'association_francophone':
+ results = results.filter(membre_association_francophone=True)
+ elif self.activites_francophonie == 'reseau_institutionnel':
+ results = results.filter(membre_reseau_institutionnel=True)
+ if min_date:
+ results = results.filter_date_modification(min=min_date)
+ if max_date:
+ results = results.filter_date_modification(max=max_date)
+ return results.all()
+
+ def url(self):
+ qs = self.query_string()
+ return url('chercheurs') + ('?' + qs if qs else '')
+
+ def rss_url(self):
+ qs = self.query_string()
+ return url('rss_chercheurs') + ('?' + qs if qs else '')
+
+ def get_email_alert_content(self, results):
+ content = ''
+ for chercheur in results:
+ content += u'- [%s %s](%s%s) \n' % (chercheur.nom.upper(),
+ chercheur.prenom,
+ settings.SITE_ROOT_URL,
+ chercheur.get_absolute_url())
+ content += u' %s\n\n' % chercheur.etablissement_display
+ return content
+
+class GroupeSearch(Search):
+
+ class Meta:
+ verbose_name = 'recherche de groupe'
+ verbose_name_plural = 'recherches de groupes'
+
+ def run(self):
+ results = Groupe.objects
+ if self.q:
+ results = results.search(self.q)
+ return results.all()
+
+ #def url(self):
+ # qs = self.query_string()
+ # return url('groupes') + ('?' + qs if qs else '')
+
+ #def rss_url(self):
+ # qs = self.query_string()
+ # return url('rss_groupes') + ('?' + qs if qs else '')
+
+class Message(models.Model):
+
+ chercheur = models.ForeignKey('Chercheur', db_column='chercheur')
+ groupe = models.ForeignKey('Groupe', db_column='groupe')
+ titre = models.CharField(max_length=255)
+ contenu = models.TextField()
+
+ date_creation = models.DateTimeField(auto_now_add=True, db_column='date_creation')
+
+ class Meta:
+ ordering = ['-date_creation']
+
+ def __unicode__(self):
+ return u"%s - %s" % (self.chercheur, self.titre)
+
+ def get_absolute_url(self):
+ return url('groupe_messages', kwargs={'id': self.groupe.id})
+