Filtrer les chercheurs par domaine de recherche dans l'admin et permettre le
authorEric Mc Sween <eric.mcsween@gmail.com>
Fri, 5 Nov 2010 16:17:46 +0000 (12:17 -0400)
committerEric Mc Sween <eric.mcsween@gmail.com>
Fri, 5 Nov 2010 16:17:46 +0000 (12:17 -0400)
retrait d'un chercheur d'un domaine de recherche.

Demande #409.

auf_savoirs_en_partage/chercheurs/admin.py
auf_savoirs_en_partage/chercheurs/models.py

index 7b045b8..d271560 100644 (file)
@@ -1,10 +1,38 @@
 # -*- encoding: utf-8 -*-
+from chercheurs.models import Chercheur, Publication, Groupe, ChercheurGroupe
 from django.db import models
 from django.contrib import admin
+from django.core.urlresolvers import reverse as url
+from django.forms.models import BaseInlineFormSet
+from django.http import HttpResponseRedirect
 
-from models import *
+class ChercheurAdmin(admin.ModelAdmin):
+    list_filter = ('groupes',)
+    list_per_page = 25
+    actions = ('remove_from_group',)
 
-admin.site.register(Chercheur)
+    def remove_from_group(self, request, queryset):
+        groupe_id = request.GET.get('groupes__id__exact')
+        chercheur_ids = queryset.values_list('id', flat=True)
+        matches = ChercheurGroupe.objects.filter(groupe=groupe_id, chercheur__in=chercheur_ids)
+        matches.delete()
+        return HttpResponseRedirect(url('admin:chercheurs_chercheur_changelist') + '?groupes__id__exact=' + groupe_id)
+
+    def get_actions(self, request):
+        actions = super(ChercheurAdmin, self).get_actions(request)
+
+        # Si on filtre par groupe de recherche, offrir d'en retirer les
+        # chercheurs sélectionnés.
+        groupe_id = request.GET.get('groupes__id__exact')
+        if groupe_id:
+            groupe = Groupe.objects.get(id=groupe_id)
+            action_desc = actions['remove_from_group']
+            actions['remove_from_group'] = (action_desc[0], action_desc[1], u'Retirer du groupe « %s »' % groupe.nom)
+        else:
+            del actions['remove_from_group']
+        return actions
+
+admin.site.register(Chercheur, ChercheurAdmin)
 admin.site.register(Publication)
 admin.site.register(Groupe)
 
index ebb24c6..efea1b4 100644 (file)
@@ -88,7 +88,7 @@ class ChercheurQuerySet(models.query.QuerySet, RandomQuerySetMixin):
 STATUT_CHOICES = (('enseignant', 'Enseignant-chercheur dans un établissement'), ('etudiant', 'Étudiant-chercheur doctorant'), ('independant', 'Chercheur indépendant docteur'))
 class Chercheur(models.Model):
     id = models.AutoField(primary_key=True, db_column='id')
-    personne = models.ForeignKey('Personne', db_column='personne')
+    personne = models.ForeignKey('Personne', db_column='personne', editable=False)
     nationalite = models.ForeignKey(Pays, null = True, db_column='nationalite', to_field='code', 
                                     verbose_name = 'nationalité', related_name='nationalite')
     #fonction = models.CharField(max_length=36, choices=FONCTION_CHOICES)
@@ -117,12 +117,29 @@ class Chercheur(models.Model):
     groupes = models.ManyToManyField('Groupe', through='ChercheurGroupe', blank=True, verbose_name='Domaines de recherche')
     
     #Refactoring, mettre les publications comme etant des many2many;
-    publication1 = models.ForeignKey('Publication', db_column='publication1', null=True, blank=True, related_name='publication1', verbose_name = 'Publication 1')
-    publication2 = models.ForeignKey('Publication', db_column='publication2', null=True, blank=True, related_name='publication2', verbose_name = 'Publication 2')
-    publication3 = models.ForeignKey('Publication', db_column='publication3', null=True, blank=True, related_name='publication3', verbose_name = 'Publication 3')
-    publication4 = models.ForeignKey('Publication', db_column='publication4', null=True, blank=True, related_name='publication4', verbose_name = 'Publication 4')
+    publication1 = models.ForeignKey('Publication',
+                                     db_column='publication1', null=True,
+                                     blank=True, editable=False,
+                                     related_name='publication1',
+                                     verbose_name='Publication 1')
+    publication2 = models.ForeignKey('Publication',
+                                     db_column='publication2', null=True,
+                                     blank=True, editable=False,
+                                     related_name='publication2',
+                                     verbose_name = 'Publication 2')
+    publication3 = models.ForeignKey('Publication',
+                                     db_column='publication3', null=True,
+                                     blank=True, editable=False,
+                                     related_name='publication3',
+                                     verbose_name = 'Publication 3')
+    publication4 = models.ForeignKey('Publication',
+                                     db_column='publication4', null=True,
+                                     blank=True, editable=False,
+                                     related_name='publication4',
+                                     verbose_name = 'Publication 4')
     
-    these = models.ForeignKey('Publication', db_column='these', null=True, blank=True, related_name='These')
+    these = models.ForeignKey('Publication', db_column='these', null=True,
+                              blank=True, related_name='These', editable=False)
     
     # Activités en francophonie
     membre_instance_auf = models.BooleanField(default=False, verbose_name="est ou a déjà été membre d'une instance de l'AUF")
@@ -195,16 +212,23 @@ class Groupe(models.Model):
                                     verbose_name='Bulletin')
     actif = models.BooleanField(editable = False, db_column='actif')
 
+    class Meta:
+        verbose_name = 'domaine de recherche'
+        verbose_name_plural = 'domaines de recherche'
+
     def __unicode__(self):
         return u"%s" % (self.nom)
     
 class ChercheurGroupe(models.Model):
     id = models.AutoField(primary_key=True, db_column='id')
-    chercheur = models.ForeignKey('Chercheur', db_column='chercheur')
+    chercheur = models.ForeignKey('Chercheur', db_column='chercheur', editable=False)
     groupe = models.ForeignKey('Groupe', db_column='groupe')
     date_inscription = models.DateField(auto_now_add=True)
     date_modification = models.DateField(auto_now=True)
     actif = models.BooleanField(editable = False, db_column='actif')
 
+    class Meta:
+        verbose_name = 'adhésion'
+
     def __unicode__(self):
         return u"%s - %s" % (self.chercheur, self.groupe)