closed #444 ajout traitement par lot de disciplines, thematiques, pays, regions
authorolivier larcheveque <olivier.larcheveque@u-ol.(none)>
Tue, 21 Sep 2010 20:23:30 +0000 (16:23 -0400)
committerolivier larcheveque <olivier.larcheveque@u-ol.(none)>
Tue, 21 Sep 2010 20:23:30 +0000 (16:23 -0400)
auf_savoirs_en_partage/savoirs/admin.py
auf_savoirs_en_partage/savoirs/admin_views.py [new file with mode: 0644]
auf_savoirs_en_partage/savoirs/models.py
auf_savoirs_en_partage/savoirs/views.py
auf_savoirs_en_partage/templates/savoirs/assigner.html [new file with mode: 0644]
auf_savoirs_en_partage/urls.py

index 6810801..ea18bfa 100644 (file)
@@ -1,7 +1,10 @@
 # -*- encoding: utf-8 -*-
 import re
+
 from django.contrib import admin
 from django.utils.safestring import mark_safe
+from django.http import HttpResponseRedirect
+
 from models import SourceActualite, Actualite, Discipline, Evenement, Record, ListSet, HarvestLog
 from savoirs.globals import META
 from savoirs.lib.backend import Backend
@@ -79,13 +82,15 @@ class RecordAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
         'language',
         'disciplines',
         'thematiques',
+        'pays',
+        'regions',
         'validated',
         ]
 
     search_fields = []
     readonly_fields = []
 
-    list_filter = ('server', 'validated')
+    list_filter = ('server', 'validated', 'pays', 'regions')
     list_display = (
       #OAI et extra AUF
       'title',
@@ -112,7 +117,12 @@ class RecordAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
        #'orig_lang',
        'validated',
     )
+    actions = ['assigner_pays',
+               'assigner_regions',
+               'assigner_disciplines',
+               'assigner_thematiques']
 
+    # fonctions pour présenter l'information
     def __init__(self, *args, **kwargs):
         """Surcharge l'initialisation pour définir les champs de recherche dynamiquement,
         et les champs en lecture seule uniquement."""
@@ -134,6 +144,23 @@ class RecordAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
         else:
             return obj.description
 
+    # actions
+    def assigner_pays(self, request, queryset):
+        selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
+        return HttpResponseRedirect("/admin/assigner_%s?ids=%s" % ('pays', ",".join(selected)))
+
+    def assigner_regions(self, request, queryset):
+        selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
+        return HttpResponseRedirect("/admin/assigner_%s?ids=%s" % ('regions', ",".join(selected)))
+
+    def assigner_thematiques(self, request, queryset):
+        selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
+        return HttpResponseRedirect("/admin/assigner_%s?ids=%s" % ('thematiques', ",".join(selected)))
+
+    def assigner_disciplines(self, request, queryset):
+        selected = request.POST.getlist(admin.ACTION_CHECKBOX_NAME)
+        return HttpResponseRedirect("/admin/assigner_%s?ids=%s" % ('disciplines', ",".join(selected)))
+
 admin.site.register(Record, RecordAdmin)
 
 class ListSetAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
diff --git a/auf_savoirs_en_partage/savoirs/admin_views.py b/auf_savoirs_en_partage/savoirs/admin_views.py
new file mode 100644 (file)
index 0000000..f9f8a44
--- /dev/null
@@ -0,0 +1,172 @@
+# -*- encoding: utf-8 -*-
+from django import forms
+from django.http import HttpResponseRedirect
+from django.contrib.auth.decorators import login_required
+from django.template import Context, RequestContext
+from django.shortcuts import render_to_response
+
+from datamaster_modeles.models import Thematique, Pays, Region
+from savoirs.models import Record, Discipline
+
+# Admin views pour les associations par lots
+
+class PaysForm(forms.Form):
+    values = [(p.id, p.nom) for p in Pays.objects.all()]
+    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)
+
+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)
+
+@login_required
+def assigner_pays(request):
+    ids = request.GET.get("ids").split(",")
+    records = Record.objects.in_bulk(ids)
+    if request.method == 'POST':
+        pays_form = PaysForm(request.POST)
+
+        if pays_form.is_valid():
+
+            # charger tous les objets pays
+            pays = []
+            for pays_id in request.POST.getlist("pays"):
+                pays.append(Pays.objects.get(id=pays_id))
+
+            # assigner chaque pays à chaque référence
+            for r in records.values():
+                for p in pays:
+                    r.pays.add(p)
+                r.save()
+            
+            # retouner un status à l'utilisateur sur la liste des références
+            pays_noms = u", ".join([p.nom for p in pays])
+            succes = u"Les pays %s ont été assignés à %s références" % (pays_noms, len(ids))
+            request.user.message_set.create(message=succes)
+            return HttpResponseRedirect('/admin/savoirs/record')
+    else:
+        pays_form = PaysForm()
+
+    return render_to_response ("savoirs/assigner.html",
+            Context ({'records': records,
+                      'form': pays_form,
+                      'titre': u"Assignation de pays par lots",
+                      'description': u"Sélectionner les pays qui seront associés aux références suivantes :" ,
+                      }),
+                     context_instance = RequestContext(request))
+
+@login_required
+def assigner_regions(request):
+    ids = request.GET.get("ids").split(",")
+    records = Record.objects.in_bulk(ids)
+    if request.method == 'POST':
+        regions_form = RegionsForm(request.POST)
+
+        if regions_form.is_valid():
+
+            # 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))
+            request.user.message_set.create(message=succes)
+            return HttpResponseRedirect('/admin/savoirs/record')
+    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))
+
+@login_required
+def assigner_disciplines(request):
+    ids = request.GET.get("ids").split(",")
+    records = Record.objects.in_bulk(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()
+            
+            # 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))
+            request.user.message_set.create(message=succes)
+            return HttpResponseRedirect('/admin/savoirs/record')
+    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))
+
+@login_required
+def assigner_thematiques(request):
+    ids = request.GET.get("ids").split(",")
+    records = Record.objects.in_bulk(ids)
+    if request.method == 'POST':
+        thematiques_form = ThematiquesForm(request.POST)
+
+        if thematiques_form.is_valid():
+
+            # charger tous les objets thematiques
+            thematiques = []
+            for thematique_id in request.POST.getlist("thematiques"):
+                thematiques.append(Thematique.objects.get(id=thematique_id))
+
+            # assigner chaque thematiques à chaque référence
+            for r in records.values():
+                for p in thematiques:
+                    r.thematiques.add(p)
+                r.save()
+            
+            # retouner un status à l'utilisateur sur la liste des références
+            thematiques_noms = u", ".join([p.nom for p in thematiques])
+            succes = u"Les thématiques %s ont été assignées à %s références" % (thematiques_noms, len(ids))
+            request.user.message_set.create(message=succes)
+            return HttpResponseRedirect('/admin/savoirs/record')
+    else:
+        thematiques_form = ThematiquesForm()
+
+    return render_to_response ("savoirs/assigner.html",
+            Context ({'records': records,
+                      'form': thematiques_form,
+                      'titre': u"Assignation de thématiques par lots",
+                      'description': u"Sélectionner les thématiques qui seront associées aux références suivantes :" ,
+                      }),
+                     context_instance = RequestContext(request))
index 0d2123e..d48b6f3 100644 (file)
@@ -4,7 +4,7 @@ import simplejson
 import uuid, datetime
 from timezones.fields import TimeZoneField
 from savoirs.globals import META
-from datamaster_modeles.models import Thematique
+from datamaster_modeles.models import Thematique, Pays, Region
 
 class Discipline(models.Model):
     id = models.IntegerField(primary_key=True, db_column='id_discipline')
@@ -117,6 +117,8 @@ class Record(models.Model):
     # Metadata AUF multivaluées
     disciplines = models.ManyToManyField(Discipline)
     thematiques = models.ManyToManyField(Thematique)
+    pays = models.ManyToManyField(Pays)
+    regions = models.ManyToManyField(Region)
 
 
     def __unicode__(self):
index 717fc18..c844321 100644 (file)
@@ -6,8 +6,7 @@ from django.template import Context, RequestContext
 from django.http import HttpResponse, HttpResponseRedirect
 from django.contrib.auth.decorators import login_required
 from django.core.urlresolvers import reverse
-
-
+from django import forms
 from lib.recherche import cherche, google_search
 from lib import sep
 from lib.calendrier import evenements, evenement_info, evenement_publie, combine
diff --git a/auf_savoirs_en_partage/templates/savoirs/assigner.html b/auf_savoirs_en_partage/templates/savoirs/assigner.html
new file mode 100644 (file)
index 0000000..a57b129
--- /dev/null
@@ -0,0 +1,18 @@
+{% extends "admin/base_site.html" %}
+
+{% block title %}{{titre}}{% endblock %}
+
+{% block content %}
+<div id="content-main">
+    <h1>{{description}}</h1>
+<ul>
+{% for id, r in records.items %}
+<li>[{{r.server}}] {{r.title}}</li>
+{% endfor %}
+</ul>
+</div>
+<form action="" method="post">
+    {{form.as_p}}
+    <input type="submit" value="Assigner" />
+</form>
+{% endblock %}
index c0fb3e1..3523d60 100644 (file)
@@ -8,7 +8,12 @@ handler500 # Pyflakes
 
 urlpatterns = patterns(
     '',
+    (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/(.*)', admin.site.root),
+
     (r'^accounts/login/$', 'django.contrib.auth.views.login', {'template_name': 'savoirs/login.html'}),
     (r'^accounts/logout/$', 'django.contrib.auth.views.logout', {'template_name': 'savoirs/logout.html'}),