Premier jet pour l'application rappels
authorPA Parent <paparent@paparent.me>
Wed, 5 Oct 2011 20:23:39 +0000 (16:23 -0400)
committerPA Parent <paparent@paparent.me>
Wed, 5 Oct 2011 20:23:39 +0000 (16:23 -0400)
auf_savoirs_en_partage/menu.py
auf_savoirs_en_partage/rappels/__init__.py [new file with mode: 0644]
auf_savoirs_en_partage/rappels/migrations/0001_initial.py [new file with mode: 0644]
auf_savoirs_en_partage/rappels/migrations/__init__.py [new file with mode: 0644]
auf_savoirs_en_partage/rappels/models.py [new file with mode: 0644]
auf_savoirs_en_partage/rappels/views.py [new file with mode: 0644]
auf_savoirs_en_partage/settings.py
auf_savoirs_en_partage/templates/admin/rappels/rappels.html [new file with mode: 0644]
auf_savoirs_en_partage/urls.py

index b81dfd4..0e57d19 100644 (file)
@@ -10,6 +10,7 @@ class CustomMenu(Menu):
     """
 
     statistiques = items.MenuItem(title='Statistiques', url=reverse('stats'))
+    rappels = items.MenuItem(title='Rappels', url=reverse('admin-rappels'))
 
     def __init__(self, **kwargs):
         Menu.__init__(self, **kwargs)
@@ -33,3 +34,5 @@ class CustomMenu(Menu):
         request = context['request']
         if request.user.has_perm('savoirs.statistiques'):
             self.children.append(self.statistiques)
+
+        self.children.append(self.rappels)
diff --git a/auf_savoirs_en_partage/rappels/__init__.py b/auf_savoirs_en_partage/rappels/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/auf_savoirs_en_partage/rappels/migrations/0001_initial.py b/auf_savoirs_en_partage/rappels/migrations/0001_initial.py
new file mode 100644 (file)
index 0000000..0c02cc7
--- /dev/null
@@ -0,0 +1,98 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Adding model 'Rappel'
+        db.create_table('rappels_rappel', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('date_creation', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+            ('user_creation', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
+            ('date_cible', self.gf('django.db.models.fields.DateField')()),
+            ('date_limite', self.gf('django.db.models.fields.DateField')()),
+            ('sujet', self.gf('django.db.models.fields.CharField')(max_length=255)),
+            ('contenu', self.gf('django.db.models.fields.TextField')()),
+        ))
+        db.send_create_signal('rappels', ['Rappel'])
+
+        # Adding model 'RappelUser'
+        db.create_table('rappels_rappeluser', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('rappel', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['rappels.Rappel'])),
+            ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
+            ('date_envoi', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
+        ))
+        db.send_create_signal('rappels', ['RappelUser'])
+
+
+    def backwards(self, orm):
+        
+        # Deleting model 'Rappel'
+        db.delete_table('rappels_rappel')
+
+        # Deleting model 'RappelUser'
+        db.delete_table('rappels_rappeluser')
+
+
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'unique': 'True'}),
+            'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
+        },
+        'auth.permission': {
+            'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
+            'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+        },
+        'auth.user': {
+            'Meta': {'object_name': 'User'},
+            'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
+            'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+            'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
+            'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+            'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+            'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
+            'username': ('django.db.models.fields.CharField', [], {'max_length': '30', 'unique': 'True'})
+        },
+        'contenttypes.contenttype': {
+            'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
+            'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
+        },
+        'rappels.rappel': {
+            'Meta': {'object_name': 'Rappel'},
+            'contenu': ('django.db.models.fields.TextField', [], {}),
+            'date_cible': ('django.db.models.fields.DateField', [], {}),
+            'date_creation': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'date_limite': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'sujet': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'user_creation': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+        },
+        'rappels.rappeluser': {
+            'Meta': {'object_name': 'RappelUser'},
+            'date_envoi': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'rappel': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['rappels.Rappel']"}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
+        }
+    }
+
+    complete_apps = ['rappels']
diff --git a/auf_savoirs_en_partage/rappels/migrations/__init__.py b/auf_savoirs_en_partage/rappels/migrations/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/auf_savoirs_en_partage/rappels/models.py b/auf_savoirs_en_partage/rappels/models.py
new file mode 100644 (file)
index 0000000..fa4424e
--- /dev/null
@@ -0,0 +1,31 @@
+# -*- coding: utf-8 -*-
+
+from django.db import models
+
+from django.contrib.auth.models import User
+
+
+class Rappel(models.Model):
+    date_creation = models.DateTimeField("date de création", auto_now_add=True)
+    user_creation = models.ForeignKey(User, verbose_name="utilisateur création")
+    date_cible = models.DateField("date cible", help_text="Date antérieure ciblée pour cerner les cas à rappeler")
+    date_limite = models.DateField("date limite", help_text="Date limite à communiquer dans le rappel avant laquelle le destinataire doit poser une action")
+    sujet = models.CharField("sujet", max_length=255)
+    contenu = models.TextField("contenu")
+
+    def __unicode__(self):
+        return self.sujet
+
+
+class RappelUser(models.Model):
+    rappel = models.ForeignKey(Rappel, verbose_name="rappel")
+    user = models.ForeignKey(User, verbose_name="utilisateur")
+    date_envoi = models.DateTimeField("date de l'envoi", auto_now_add=True)
+
+    def __unicode__(self):
+        return "%s: %s" % (self.rappel.sujet, self.user)
+
+    def save(self, *args, **kwargs):
+        super(RappelUser, self).save(*args, **kwargs)
+
+        # Envoi du courriel...
diff --git a/auf_savoirs_en_partage/rappels/views.py b/auf_savoirs_en_partage/rappels/views.py
new file mode 100644 (file)
index 0000000..4245fa7
--- /dev/null
@@ -0,0 +1,17 @@
+# -*- coding: utf-8 -*-
+
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+from django.db.models import Count
+from django.contrib.auth.decorators import permission_required
+from django.contrib.auth.models import User
+
+
+@permission_required('savoirs.statistiques')
+def admin_rappels(request):
+
+    chercheurs = User.objects.extra(select={'year': "EXTRACT(year FROM last_login)", 'month': "EXTRACT(month FROM last_login)"}).values('year', 'month').annotate(total=Count('username')).order_by('year', 'month')
+
+    return render_to_response('admin/rappels/rappels.html', {
+        'chercheurs': chercheurs
+    }, context_instance=RequestContext(request))
index 6960655..0aa1aa8 100644 (file)
@@ -72,6 +72,7 @@ INSTALLED_APPS = (
     'auf.django.admingroup',
     'alphafilter',
     'interfaces',
+    'rappels',
 )
 
 TEMPLATE_CONTEXT_PROCESSORS = (
diff --git a/auf_savoirs_en_partage/templates/admin/rappels/rappels.html b/auf_savoirs_en_partage/templates/admin/rappels/rappels.html
new file mode 100644 (file)
index 0000000..c3e7aae
--- /dev/null
@@ -0,0 +1,19 @@
+{% extends "admin/base_site.html" %}
+
+{% block breadcrumbs %}{% endblock %}
+
+{% block content %}
+<h1>Mise à jour des fiches chercheurs</h1>
+
+<h2>Chercheurs connectés depuis un an (détail par mois)</h2>
+
+<table>
+{% for chercheur in chercheurs %}
+<tr>
+       <td>{{ chercheur.year }}-{{ chercheur.month|stringformat:"02d" }}</td>
+       <td>{{ chercheur.total }}</td>
+</tr>
+{% endfor %}
+</table>
+
+{% endblock %}
index 7cf65c7..2f8428c 100644 (file)
@@ -118,6 +118,10 @@ urlpatterns = sep_patterns + patterns(
     # traduction disponible dans le frontend sans permissons
     url(r'^jsi18n/$', admin.site.i18n_javascript,),
 
+    # Rappels
+    (r'^admin/rappels/$', 'rappels.views.admin_rappels', {}, 'admin-rappels'),
+
+    # Admin
     url(r'^admin_tools/', include('admin_tools.urls')),
     (r'^admin/', include(admin.site.urls)),
     (r'^admin/confirmation/(.*)', 'savoirs.admin_views.confirmation'),
@@ -133,6 +137,7 @@ urlpatterns = sep_patterns + patterns(
     # stats
     (r'^stats/$', 'savoirs.admin_views.stats', {}, 'stats'),
 
+
     # rss
     (r'^rss/chercheurs/$', FilChercheurs(), {}, 'rss_chercheurs'),
     (r'^rss/ressources/$', FilRessources(), {}, 'rss_ressources'),