Assigner les disciplines et régions en bloc dans l'admin
authorEric Mc Sween <eric.mcsween@gmail.com>
Tue, 2 Nov 2010 15:15:48 +0000 (11:15 -0400)
committerEric Mc Sween <eric.mcsween@gmail.com>
Tue, 2 Nov 2010 15:15:48 +0000 (11:15 -0400)
auf_savoirs_en_partage/savoirs/admin.py
auf_savoirs_en_partage/savoirs/admin_views.py
auf_savoirs_en_partage/savoirs/forms.py
auf_savoirs_en_partage/savoirs/models.py
auf_savoirs_en_partage/sitotheque/admin.py
auf_savoirs_en_partage/sitotheque/models.py
auf_savoirs_en_partage/templates/savoirs/assigner.html
auf_savoirs_en_partage/urls.py

index e54aca8..d334516 100644 (file)
@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 import re
 
+from django.core.urlresolvers import reverse as url
 from django.db import models
 from django.contrib import admin
 from django.contrib.auth.admin import UserAdmin
@@ -193,7 +194,8 @@ class RecordAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
 
     def assigner_regions(self, request, queryset):
         selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
-        return HttpResponseRedirect("/admin/assigner_%s?ids=%s" % ('regions', ",".join(selected)))
+        return HttpResponseRedirect(url('assigner_regions', kwargs=dict(app_name='savoirs', model_name='record')) + '?ids=' + ','.join(selected))
+    assigner_regions.short_description = u'Assigner des régions'
 
     def assigner_thematiques(self, request, queryset):
         selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
@@ -201,7 +203,8 @@ class RecordAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
 
     def assigner_disciplines(self, request, queryset):
         selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
-        return HttpResponseRedirect("/admin/assigner_%s?ids=%s" % ('disciplines', ",".join(selected)))
+        return HttpResponseRedirect(url('assigner_disciplines', kwargs=dict(app_name='savoirs', model_name='record')) + '?ids=' + ','.join(selected))
+    assigner_disciplines.short_description = u'Assigner des disciplines'
 
 admin.site.register(Record, RecordAdmin)
 
@@ -237,7 +240,7 @@ admin.site.register(User, UserProfileAdmin)
 class ActualiteAdmin(admin.ModelAdmin):
     list_filter = ('visible',)
     list_display = ('titre', 'source', 'date', 'visible')
-    actions = ['rendre_visible', 'rendre_invisible']
+    actions = ['rendre_visible', 'rendre_invisible', 'assigner_regions', 'assigner_disciplines']
 
     # actions
     def rendre_visible(self, request, queryset):
@@ -248,6 +251,16 @@ class ActualiteAdmin(admin.ModelAdmin):
         selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
         return HttpResponseRedirect("/admin/confirmation/%s/%s?ids=%s" % ('actualite', 'invisible', ",".join(selected)))
 
+    def assigner_regions(self, request, queryset):
+        selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
+        return HttpResponseRedirect(url('assigner_regions', kwargs=dict(app_name='savoirs', model_name='actualite')) + '?ids=' + ','.join(selected))
+    assigner_regions.short_description = u'Assigner des régions'
+
+    def assigner_disciplines(self, request, queryset):
+        selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
+        return HttpResponseRedirect(url('assigner_disciplines', kwargs=dict(app_name='savoirs', model_name='actualite')) + '?ids=' + ','.join(selected))
+    assigner_disciplines.short_description = u'Assigner des disciplines'
+
 admin.site.register(Actualite, ActualiteAdmin)
 
 
@@ -267,20 +280,20 @@ class EvenementAdmin(admin.ModelAdmin):
     form = EvenementAdminForm
     list_filter = ('approuve',)
     list_display = ('titre', 'debut', 'fin', 'lieu', 'approuve')
-    fields = ['titre',
-              'discipline',
-              'discipline_secondaire',
-              'mots_cles',
-              'type',
-              'fuseau',
-              'debut',
-              'fin',
-              'lieu',
-              'regions',
-              'description',
-              'contact',
-              'url',
-              'approuve']
+    fields = ['titre', 'discipline', 'discipline_secondaire', 'mots_cles',
+              'type', 'fuseau', 'debut', 'fin', 'lieu', 'regions',
+              'description', 'contact', 'url', 'approuve']
+    actions = ['assigner_regions', 'assigner_disciplines']
+
+    def assigner_regions(self, request, queryset):
+        selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
+        return HttpResponseRedirect(url('assigner_regions', kwargs=dict(app_name='savoirs', model_name='evenement')) + '?ids=' + ','.join(selected))
+    assigner_regions.short_description = u'Assigner des régions'
+
+    def assigner_disciplines(self, request, queryset):
+        selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
+        return HttpResponseRedirect(url('assigner_disciplines', kwargs=dict(app_name='savoirs', model_name='evenement')) + '?ids=' + ','.join(selected))
+    assigner_disciplines.short_description = u'Assigner des disciplines'
 
 admin.site.register(Evenement, EvenementAdmin)
 
index be64dfa..4ddcc35 100644 (file)
@@ -1,7 +1,8 @@
 # -*- encoding: utf-8 -*-
 from django import forms
+from django.db.models import get_model
 from django.http import HttpResponseRedirect
-from django.core.urlresolvers import reverse
+from django.core.urlresolvers import reverse as url
 from django.contrib.auth.decorators import login_required
 from django.template import Context, RequestContext
 from django.shortcuts import render_to_response
@@ -48,7 +49,7 @@ class RecordDashboard:
 
     def change_url(self, object):
         """Retourne l'url pour éditer le record"""
-        return reverse('admin:%s_%s_change' %(object._meta.app_label, object._meta.module_name), args=[object.id])
+        return url('admin:%s_%s_change' %(object._meta.app_label, object._meta.module_name), args=[object.id])
 
     def a_traiter(self, ):
         """Retourne la structure de données nécessaire pour le widget de django-admin-tool"""
@@ -92,76 +93,65 @@ def assigner_pays(request):
                      context_instance = RequestContext(request))
 
 @login_required
-def assigner_regions(request):
+def assigner_regions(request, app_name, model_name):
     ids = request.GET.get("ids").split(",")
-    records = Record.objects.in_bulk(ids)
+    model = get_model(app_name, model_name)
+    objects = model.objects.filter(pk__in=ids)
     if request.method == 'POST':
         regions_form = RegionsForm(request.POST)
 
         if regions_form.is_valid():
+            regions = regions_form.cleaned_data['regions']
+            for o in objects:
+                o.assigner_regions(regions)
+                o.save() 
 
-            # charger tous les objets regions
-            regions = []
-            for region_id in request.POST.getlist("regions"):
-                regions.append(Region.objects.get(id=region_id))
-
-            # assigner chaque regions à chaque référence
-            for r in records.values():
-                for p in regions:
-                    r.regions.add(p)
-                r.save()
-            
             # retouner un status à l'utilisateur sur la liste des références
             regions_noms = u", ".join([p.nom for p in regions])
-            succes = u"Les regions %s ont été assignées à %s références" % (regions_noms, len(ids))
+            succes = u"Les regions %s ont été assignées à %s objets" % (regions_noms, len(ids))
             request.user.message_set.create(message=succes)
-            return HttpResponseRedirect('/admin/savoirs/record')
+            return HttpResponseRedirect(url('admin:%s_%s_changelist' % (app_name, model_name)))
     else:
         regions_form = RegionsForm()
-
-    return render_to_response ("savoirs/assigner.html",
-            Context ({'records': records,
-                      'form': regions_form,
-                      'titre': u"Assignation de régions par lots",
-                      'description': u"Sélectionner les regions qui seront associées aux références suivantes :" ,
-                      }),
-                     context_instance = RequestContext(request))
+    return render_to_response(
+        "savoirs/assigner.html",
+        dict(objects=objects,
+             form=regions_form,
+             titre=u"Assignation de régions par lots",
+             description=u"Sélectionner les régions qui seront associées aux références suivantes :"),
+        context_instance = RequestContext(request)
+    )
 
 @login_required
-def assigner_disciplines(request):
+def assigner_disciplines(request, app_name, model_name):
     ids = request.GET.get("ids").split(",")
-    records = Record.objects.in_bulk(ids)
+    model = get_model(app_name, model_name)
+    objects = model.objects.filter(pk__in=ids)
     if request.method == 'POST':
         disciplines_form = DisciplinesForm(request.POST)
 
         if disciplines_form.is_valid():
-
-            # charger tous les objets disciplines
-            disciplines = []
-            for discipline_id in request.POST.getlist("disciplines"):
-                disciplines.append(Discipline.objects.get(id=discipline_id))
-
-            # assigner chaque disciplines à chaque référence
-            for r in records.values():
-                for p in disciplines:
-                    r.disciplines.add(p)
-                r.save()
+            disciplines = disciplines_form.cleaned_data['disciplines']
+            for o in objects:
+                o.assigner_disciplines(disciplines)
+                o.save()
             
             # retouner un status à l'utilisateur sur la liste des références
             disciplines_noms = u", ".join([p.nom for p in disciplines])
-            succes = u"Les disciplines %s ont été assignées à %s références" % (disciplines_noms, len(ids))
+            succes = u"Les disciplines %s ont été assignées à %s objets" % (disciplines_noms, len(ids))
             request.user.message_set.create(message=succes)
-            return HttpResponseRedirect('/admin/savoirs/record')
+            return HttpResponseRedirect(url('admin:%s_%s_changelist' % (app_name, model_name)))
     else:
         disciplines_form = DisciplinesForm()
 
-    return render_to_response ("savoirs/assigner.html",
-            Context ({'records': records,
-                      'form': disciplines_form,
-                      'titre': u"Assignation de disciplines par lots",
-                      'description': u"Sélectionner les disciplines qui seront associées aux références suivantes :" ,
-                      }),
-                     context_instance = RequestContext(request))
+    return render_to_response(
+        "savoirs/assigner.html",
+        dict(objects=objects,
+             form=disciplines_form,
+             titre=u"Assignation de disciplines par lots",
+             description=u"Sélectionner les disciplines qui seront associées aux références suivantes :"),
+        context_instance = RequestContext(request)
+    )
 
 @login_required
 def assigner_thematiques(request):
index c1e45bd..2180883 100644 (file)
@@ -201,16 +201,14 @@ class PaysForm(forms.Form):
     pays = forms.MultipleChoiceField(choices=values)
 
 class RegionsForm(forms.Form):
-    values = [(r.id, r.nom) for r in Region.objects.all()]
-    regions = forms.MultipleChoiceField(choices=values)
+    regions = forms.ModelMultipleChoiceField(queryset=Region.objects.all())
 
 class ThematiquesForm(forms.Form):
     values = [(t.id, t.nom) for t in Thematique.objects.all()]
     thematiques = forms.MultipleChoiceField(choices=values)
 
 class DisciplinesForm(forms.Form):
-    values = [(t.id, t.nom) for t in Discipline.objects.all()]
-    disciplines = forms.MultipleChoiceField(choices=values)
+    disciplines = forms.ModelMultipleChoiceField(queryset=Discipline.objects.all())
 
 class ConfirmationForm(forms.Form):
     pass
index 44cb1a8..7b0d066 100644 (file)
@@ -57,13 +57,19 @@ class Actualite(models.Model):
 
     objects = ActualiteManager()
 
-    def __unicode__ (self):
-        return "%s" % (self.titre)
-
     class Meta:
         db_table = u'actualite'
         ordering = ["-date",]
 
+    def __unicode__ (self):
+        return "%s" % (self.titre)
+
+    def assigner_disciplines(self, disciplines):
+        self.disciplines.add(*disciplines)
+
+    def assigner_regions(self, regions):
+        self.regions.add(*regions)
+
 class EvenementManager(models.Manager):
 
     def get_query_set(self):
@@ -221,6 +227,19 @@ class Evenement(models.Model):
         except error.NotFoundError:
             pass
 
+    def assigner_regions(self, regions):
+        self.regions.add(*regions)
+
+    def assigner_disciplines(self, disciplines):
+        if len(disciplines) == 1:
+            if self.discipline:
+                self.discipline_secondaire = disciplines[0]
+            else:
+                self.discipline = disciplines[0]
+        elif len(disciplines) >= 2:
+            self.discipline = disciplines[0]
+            self.discipline_secondaire = disciplines[1]
+
 
 # Surcharge du comportement de suppression
 # La méthode de connexion par signals est préférable à surcharger la méthode delete()
@@ -354,20 +373,27 @@ class Record(models.Model):
     # Manager
     objects = RecordManager()
 
-    def getServeurURL(self,):
+    def __unicode__(self):
+        return "[%s] %s" % (self.server, self.title)
+
+    def getServeurURL(self):
         """Retourne l'URL du serveur de provenance"""
         return RESOURCES[self.server]['url']
 
-    def est_complet(self,):
+    def est_complet(self):
         """teste si le record à toutes les données obligatoires"""
         return self.disciplines.count() > 0 and \
            self.thematiques.count() > 0 and \
            self.pays.count() > 0 and \
            self.regions.count() > 0
 
-    def __unicode__(self):
-        return "[%s] %s" % (self.server, self.title)
+    def assigner_regions(self, regions):
+        self.regions.add(*regions)
 
+    def assigner_disciplines(self, disciplines):
+        self.disciplines.add(*disciplines)
+
+    
 class Serveur(models.Model):
     """Identification d'un serveur d'ou proviennent les références"""
     nom = models.CharField(primary_key = True, max_length = 255)
index b9eba7f..0c075b3 100644 (file)
@@ -1,7 +1,20 @@
 # -*- encoding: utf-8 -*-
 from django.contrib import admin
+from django.core.urlresolvers import reverse as url
+from django.http import HttpResponseRedirect
 from models import Site
 
-admin.site.register(Site)
+class SiteAdmin(admin.ModelAdmin):
+    actions = ['assigner_regions', 'assigner_disciplines']
 
+    def assigner_regions(self, request, queryset):
+        selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
+        return HttpResponseRedirect(url('assigner_regions', kwargs=dict(app_name='sitotheque', model_name='site')) + '?ids=' + ','.join(selected))
+    assigner_regions.short_description = u'Assigner des régions'
 
+    def assigner_disciplines(self, request, queryset):
+        selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
+        return HttpResponseRedirect(url('assigner_disciplines', kwargs=dict(app_name='sitotheque', model_name='site')) + '?ids=' + ','.join(selected))
+    assigner_disciplines.short_description = u'Assigner des disciplines'
+
+admin.site.register(Site, SiteAdmin)
index 478923e..09735d6 100644 (file)
@@ -84,3 +84,8 @@ class Site(models.Model):
                 return t[1]
         return "-"
 
+    def assigner_regions(self, regions):
+        self.regions.add(*regions)
+
+    def assigner_disciplines(self, disciplines):
+        self.discipline.add(*disciplines)
index a57b129..f515644 100644 (file)
@@ -6,8 +6,8 @@
 <div id="content-main">
     <h1>{{description}}</h1>
 <ul>
-{% for id, r in records.items %}
-<li>[{{r.server}}] {{r.title}}</li>
+{% for o in objects %}
+<li>{{ o }}</li>
 {% endfor %}
 </ul>
 </div>
index 4a96af0..e9d3959 100644 (file)
@@ -23,9 +23,9 @@ urlpatterns = patterns(
     (r'^admin/', include(admin.site.urls)),
     (r'^admin/confirmation/(.*)', 'savoirs.admin_views.confirmation'),
     (r'^admin/assigner_pays', 'savoirs.admin_views.assigner_pays'),
-    (r'^admin/assigner_regions', 'savoirs.admin_views.assigner_regions'),
     (r'^admin/assigner_thematiques', 'savoirs.admin_views.assigner_thematiques'),
-    (r'^admin/assigner_disciplines', 'savoirs.admin_views.assigner_disciplines'),
+    (r'^admin/(?P<app_name>[^/]*)/(?P<model_name>[^/]*)/assigner_regions', 'savoirs.admin_views.assigner_regions', {}, 'assigner_regions'),
+    (r'^admin/(?P<app_name>[^/]*)/(?P<model_name>[^/]*)/assigner_disciplines', 'savoirs.admin_views.assigner_disciplines', {}, 'assigner_disciplines'),
     (r'^admin/(.*)', admin.site.root),
 
     (r'^accounts/login/$', 'chercheurs.views.chercheur_login', {'template_name': 'accounts/login.html'}),