Export de chercheurs CSV et ODS
authorEric Mc Sween <eric.mcsween@gmail.com>
Wed, 16 Feb 2011 21:45:15 +0000 (16:45 -0500)
committerEric Mc Sween <eric.mcsween@gmail.com>
Wed, 16 Feb 2011 21:45:15 +0000 (16:45 -0500)
Demande #1169

auf_savoirs_en_partage/chercheurs/admin.py
auf_savoirs_en_partage/chercheurs/models.py
buildout.cfg

index 1994c79..ea2d497 100644 (file)
@@ -5,13 +5,15 @@ 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 django.utils.encoding import smart_str
+from django_exportateur.exportateur import exportateur
 
-from chercheurs.models import Chercheur, Publication, Groupe, ChercheurGroupe, ChercheurQuerySet
+from chercheurs.models import Chercheur, Publication, Groupe, ChercheurGroupe, ChercheurQuerySet, These
 
 class ChercheurAdmin(admin.ModelAdmin):
     list_filter = ['genre']
     list_per_page = 25
-    actions = ('remove_from_group',)
+    actions = ('remove_from_group', 'export_as_ods', 'export_as_csv')
     search_fields = ('nom', 'prenom')
 
     def lookup_allowed(self, lookup):
@@ -44,6 +46,81 @@ class ChercheurAdmin(admin.ModelAdmin):
     def queryset(self, request):
         return ChercheurAdminQuerySet(Chercheur)
 
+    def export(self, queryset, type):
+        if queryset.count() == 0:
+            return None
+        obj = queryset[0]
+        headers = ['Nom', 'Prénom', 'Genre', 'Courriel', 'Téléphone', 'Adresse postale', 
+                   'Statut', 'Diplôme', 'Établissement', 'Pays', 'Domaines de recherche',
+                   'Thèse', 'Directeur', 'Discipline', 'Thèmes de recherche', 'Groupe de recherche', 'Mots-clés', 
+                   'Site web', 'Blog', 'Réseau social',
+                   'Membre instance AUF', "Sollicité par l'OIF", 'Membre société francophone',
+                   'Membre instance réseau institutionnel AUF', 'Expertises', 'Solliciter pour expertises', 
+                   'Publications']
+        data = []
+        for c in queryset:
+            row = []
+            row.append(c.nom)
+            row.append(c.prenom)
+            row.append(c.get_genre_display())
+            row.append(c.courriel)
+            row.append(c.telephone)
+            row.append(c.adresse_postale)
+            row.append(c.get_statut_display())
+            row.append(c.diplome)
+            row.append(c.nom_etablissement)
+            row.append(c.pays)
+            row.append(', '.join(g.nom for g in c.groupes.all()))
+            try:
+                t = c.these
+                row.append('%s, %s, %s, %s pages.' % (t.titre, t.etablissement, t.annee, t.nb_pages))
+                row.append(t.directeur)
+            except These.DoesNotExist:
+                row.append('')
+                row.append('')
+            row.append(c.discipline.nom if c.discipline else '')
+            row.append(c.theme_recherche)
+            row.append(c.groupe_recherche)
+            row.append(c.mots_cles)
+            row.append(c.url_site_web)
+            row.append(c.url_blog)
+            row.append(c.url_reseau_social)
+            if c.membre_instance_auf:
+                row.append(', '.join([c.membre_instance_auf_nom, c.membre_instance_auf_fonction, c.membre_instance_auf_dates]))
+            else:
+                row.append('')
+            if c.expert_oif:
+                row.append(', '.join([c.expert_oif_details, c.expert_oif_dates]))
+            else:
+                row.append('')
+            if c.membre_association_francophone:
+                row.append(c.membre_association_francophone_details)
+            else:
+                row.append('')
+            if c.membre_reseau_institutionnel:
+                row.append(', '.join([c.membre_reseau_institutionnel_nom, c.membre_reseau_institutionnel_fonction, c.membre_reseau_institutionnel_dates]))
+            else:
+                row.append('')
+            row.append('; '.join(', '.join([e.nom, e.date, e.organisme_demandeur]) for e in c.expertises.all()))
+            if c.expertises_auf is None:
+                row.append('')
+            else:
+                row.append('Oui' if c.expertises_auf else 'Non')
+            row.append('; '.join(p.publication_affichage if p.publication_affichage else
+                                 '%s, %s, %s, %s, %s, %s, %s pages.' % 
+                                 (p.auteurs, p.titre, p.revue, p.annee, p.editeur, p.lieu_edition, p.nb_pages)
+                                 for p in c.publications.all()))
+            data.append([smart_str(x) if x else '' for x in row])
+        return exportateur(headers, data, type, filename='chercheurs.%s' % type)
+
+    def export_as_csv(self, request, queryset):
+        return self.export(queryset, 'csv')
+    export_as_csv.short_description = 'Export CSV'
+
+    def export_as_ods(self, request, queryset):
+        return self.export(queryset, 'ods')
+    export_as_ods.short_description = 'Export ODS'
+
 class ChercheurAdminQuerySet(ChercheurQuerySet):
 
     def filter(self, *args, **kwargs):
index b73ada2..a6cc1ed 100644 (file)
@@ -262,16 +262,17 @@ class Chercheur(Personne):
     
     @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 + ', ' + self.pays
 
     @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
 
index 30a1bc2..4b8e441 100644 (file)
@@ -6,6 +6,7 @@ find-links = http://pypi.auf.org/caldav/
     http://pypi.auf.org/auf_references_modeles/
     http://pypi.auf.org/datamaster_modeles/
     http://pypi.auf.org/django-roa/
+    http://pypi.auf.org/django_exportateur/
 
 [django]
 recipe = djangorecipe
@@ -31,6 +32,7 @@ eggs = auf_references_client==0.4.9
     django-flash==1.7.2
     PyYAML==3.09
     South==0.7.3
+    django_exportateur==1.0
     MySQL-python
     simplejson