ferme #460 ajout du dashboard pour connaitre les references à traiter
authorolivier larcheveque <olivier.larcheveque@u-ol.(none)>
Mon, 27 Sep 2010 15:24:23 +0000 (11:24 -0400)
committerolivier larcheveque <olivier.larcheveque@u-ol.(none)>
Mon, 27 Sep 2010 15:24:23 +0000 (11:24 -0400)
auf_savoirs_en_partage/savoirs/admin.py
auf_savoirs_en_partage/savoirs/admin_views.py
auf_savoirs_en_partage/savoirs/models.py
auf_savoirs_en_partage/settings.py
auf_savoirs_en_partage/urls.py
buildout.cfg

index a85f657..e5c04bf 100644 (file)
@@ -3,13 +3,15 @@ import re
 
 from django.db import models
 from django.contrib import admin
+from django.contrib.auth.admin import UserAdmin
+from django.contrib.auth.models import User
 from django.contrib.admin.filterspecs import RelatedFilterSpec, FilterSpec
 from django.utils.safestring import mark_safe
 from django.utils.translation import ugettext as _
 from django.utils.encoding import smart_unicode, iri_to_uri
 from django.http import HttpResponseRedirect
 
-from models import SourceActualite, Actualite, Discipline, Evenement, Record, ListSet, HarvestLog
+from models import SourceActualite, Actualite, Discipline, Evenement, Record, ListSet, HarvestLog, Profile
 from savoirs.globals import META
 
 admin.site.register(Actualite)
@@ -30,9 +32,6 @@ class ListSetFilterSpec(RelatedFilterSpec):
     def has_output(self):
         return self.server_name is not None
 
-    def title(self):
-        return self.lookup_title
-
 FilterSpec.filter_specs.insert(0, (lambda f: f.name == 'listsets', ListSetFilterSpec))
 
 # Ces deux classes permettent d'implémenter la possibilité d'avoir un champs readonly_fields
@@ -103,7 +102,6 @@ class RecordAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
         'language',
         'disciplines',
         'thematiques',
-        'listsets',
         'pays',
         'regions',
         'validated',
@@ -138,14 +136,15 @@ class RecordAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
       'format',
       'type',
     
-       #SEP 2 (aucune données récoltées)
-       #'alt_title',
-       #'abstract',
-       #'creation',
-       #'issued',
-       #'isbn',
-       #'orig_lang',
-       'validated',
+      #SEP 2 (aucune données récoltées)
+      #'alt_title',
+      #'abstract',
+      #'creation',
+      #'issued',
+      #'isbn',
+      #'orig_lang',
+      'est_complet',
+      'validated',
     )
     actions = ['assigner_pays',
                'assigner_regions',
@@ -160,6 +159,12 @@ class RecordAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
         self.readonly_fields = META.keys()
         self.readonly_fields.append('listsets')
         super(RecordAdmin, self).__init__(*args, **kwargs) 
+
+    def est_complet(self, obj):
+        """ """
+        v = obj.est_complet()
+        return '<img src="/admin_media/img/admin/icon-%s.gif" alt="%d"/>' % (('no','yes')[v], v)
+    est_complet.allow_tags = True
     
     def _uri(self, obj):
         """ """
@@ -210,3 +215,15 @@ class HarvestLogAdmin(ReadOnlyAdminFields, admin.ModelAdmin):
     list_filter = ('context',)
 
 admin.site.register(HarvestLog, HarvestLogAdmin)
+
+class ProfileInline(admin.TabularInline):
+    model = Profile
+    fk_name = 'user'
+    max_num = 1
+
+class UserProfileAdmin(UserAdmin):
+    inlines = [ProfileInline, ]
+
+admin.site.unregister(User)
+admin.site.register(User, UserProfileAdmin)
+
index f9f8a44..c04c6c4 100644 (file)
@@ -1,6 +1,7 @@
 # -*- encoding: utf-8 -*-
 from django import forms
 from django.http import HttpResponseRedirect
+from django.core.urlresolvers import reverse
 from django.contrib.auth.decorators import login_required
 from django.template import Context, RequestContext
 from django.shortcuts import render_to_response
@@ -8,6 +9,52 @@ from django.shortcuts import render_to_response
 from datamaster_modeles.models import Thematique, Pays, Region
 from savoirs.models import Record, Discipline
 
+# Dashboard
+class RecordDashboard:
+    """Cette classe permet d'afficher une liste de tâche à faire en fonction de l'usagé"""
+    context = None
+
+    def __init__(self, context):
+        """Récupère le context"""
+        self.context = context
+
+    def get_fitre_serveurs(self,):
+        """Retourner la liste des serveurs sélectionnés.
+        S'il n'y en a pas, tous les serveurs sont retournés."""
+        try:
+            user = self.context.get('user')
+            profile = user.get_profile()
+            serveurs =  profile.serveurs.all()
+        except:
+            serveurs = Serveur.objects.all()
+        return [s.nom for s in serveurs]
+
+
+    def total_a_faire(self,):
+        """Retourne le total des références à traiter"""
+        return len(self.tout_mes_records())
+
+    def tout_mes_records(self,):
+        """Retourne la liste des références à traiter en fonction du filtre"""
+        filtre = self.get_fitre_serveurs()
+        return [r for r in Record.objects.filter(server__in=filtre) if not r.est_complet()]
+    
+    def mes_records(self,):
+        """Retourne la liste des références à traiter en fonction du filtre"""
+        return self.tout_mes_records()
+
+    def ref_apercu(self, record):
+        return "[%s] %s" % (record.server, record.title)
+
+    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])
+
+    def a_traiter(self, ):
+        """Retourne la structure de données nécessaire pour le widget de django-admin-tool"""
+        records = self.mes_records()
+        return [{'title':self.ref_apercu(r), 'url':self.change_url(r), 'external': False} for r in records]
+
 # Admin views pour les associations par lots
 
 class PaysForm(forms.Form):
index 5c029b7..66546a8 100644 (file)
@@ -1,8 +1,11 @@
 # -*- encoding: utf-8 -*-
+from django.contrib.auth.models import User
 from django.db import models
+from django.db.models.signals import post_save
 import simplejson
 import uuid, datetime
 from timezones.fields import TimeZoneField
+from auf_savoirs_en_partage.backend_config import RESOURCES
 from savoirs.globals import META
 from datamaster_modeles.models import Thematique, Pays, Region
 
@@ -123,6 +126,13 @@ class Record(models.Model):
     pays = models.ManyToManyField(Pays)
     regions = models.ManyToManyField(Region)
 
+    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 "R[%s] %s" % (self.id, self.title)
@@ -156,6 +166,21 @@ class Record(models.Model):
 #
 #models.signals.post_init.connect(decode_json, Record)
 
+class Serveur(models.Model):
+    nom = models.CharField(primary_key = True, max_length = 255)
+
+    def __unicode__(self,):
+        return self.nom
+
+    def conf_2_db(self,):
+        for k in RESOURCES.keys():
+            s, created = Serveur.objects.get_or_create(nom=k)
+            s.nom = k
+            s.save()
+
+class Profile(models.Model):
+    user = models.ForeignKey(User, unique=True)
+    serveurs = models.ManyToManyField(Serveur, null = True, blank = True)
 
 class HarvestLog(models.Model):
     context = models.CharField(max_length = 255)
index b4b0a94..5b53bdd 100644 (file)
@@ -58,6 +58,10 @@ ROOT_URLCONF = 'auf_savoirs_en_partage.urls'
 
 
 INSTALLED_APPS = (
+    'admin_tools',
+    'admin_tools.theming',
+    'admin_tools.menu',
+    'admin_tools.dashboard',
     'django.contrib.auth',
     'django.contrib.contenttypes',
     'django.contrib.sessions',
@@ -98,4 +102,8 @@ CACHE_BACKEND = 'memcached://127.0.0.1:11211/'
 
 ROA_CUSTOM_ARGS = {'api-key': ROA_API_KEY}
 
+ADMIN_TOOLS_INDEX_DASHBOARD = 'auf_savoirs_en_partage.dashboard.CustomIndexDashboard'
+
+AUTH_PROFILE_MODULE = 'savoirs.Profile'
+
 from auf_references_client.settings import *
index 9e0a7c2..c0f4116 100644 (file)
@@ -1,4 +1,4 @@
-from django.conf.urls.defaults import patterns, include, handler500
+from django.conf.urls.defaults import patterns, include, handler500, url
 from django.conf import settings
 from django.contrib import admin
 
@@ -8,6 +8,8 @@ handler500 # Pyflakes
 
 urlpatterns = patterns(
     '',
+    url(r'^admin_tools/', include('admin_tools.urls')),
+    (r'^admin/', include(admin.site.urls)),
     (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'),
index 865a255..0edeab5 100644 (file)
@@ -22,6 +22,7 @@ eggs = auf_references_client
     django_sorting
     datamaster_modeles
     django-roa
+    django-admin-tools
     
 [articles]
 recipe = buildout_script