]> git.parisson.com Git - teleforma.git/commitdiff
Add some Script views and workflow
authorGuillaume Pellerin <yomguy@parisson.com>
Thu, 12 Jun 2014 21:36:22 +0000 (23:36 +0200)
committerGuillaume Pellerin <yomguy@parisson.com>
Thu, 12 Jun 2014 21:36:22 +0000 (23:36 +0200)
14 files changed:
teleforma/exam/forms.py [new file with mode: 0644]
teleforma/exam/migrations/0014_auto__del_field_script_date_corrected__add_field_script_date_marked__a.py [new file with mode: 0644]
teleforma/exam/models.py
teleforma/exam/templates/exam/inc/script_list.html [new file with mode: 0644]
teleforma/exam/templates/exam/messages/script_marked.txt [new file with mode: 0644]
teleforma/exam/templates/exam/messages/script_rejected.txt [new file with mode: 0644]
teleforma/exam/templates/exam/script_detail.html
teleforma/exam/templates/exam/scripts.html [new file with mode: 0644]
teleforma/exam/urls.py
teleforma/exam/views.py
teleforma/locale/fr/LC_MESSAGES/django.mo
teleforma/locale/fr/LC_MESSAGES/django.po
teleforma/templates/telemeta/base.html
teleforma/templatetags/teleforma_tags.py

diff --git a/teleforma/exam/forms.py b/teleforma/exam/forms.py
new file mode 100644 (file)
index 0000000..6550d74
--- /dev/null
@@ -0,0 +1,15 @@
+from django.forms import ModelForm, HiddenInput
+from teleforma.exam.models import *
+from django.forms.models import inlineformset_factory
+
+
+class ScriptForm(ModelForm):
+
+    def __init__(self, *args, **kwargs):
+        super(ScriptForm, self).__init__(*args, **kwargs)
+
+    class Meta:
+        model = Script
+        exclude = ['uuid', 'url', 'author', 'corrector', 'date_submitted', 'date_rejected', 'date_marked',
+                ]
+        #hidden_fields = ['status']
diff --git a/teleforma/exam/migrations/0014_auto__del_field_script_date_corrected__add_field_script_date_marked__a.py b/teleforma/exam/migrations/0014_auto__del_field_script_date_corrected__add_field_script_date_marked__a.py
new file mode 100644 (file)
index 0000000..b9d8ff2
--- /dev/null
@@ -0,0 +1,193 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        # Deleting field 'Script.date_corrected'
+        db.delete_column('exam_script', 'date_corrected')
+
+        # Adding field 'Script.date_marked'
+        db.add_column('exam_script', 'date_marked',
+                      self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True),
+                      keep_default=False)
+
+        # Adding field 'Script.date_rejected'
+        db.add_column('exam_script', 'date_rejected',
+                      self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True),
+                      keep_default=False)
+
+
+    def backwards(self, orm):
+        # Adding field 'Script.date_corrected'
+        db.add_column('exam_script', 'date_corrected',
+                      self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True),
+                      keep_default=False)
+
+        # Deleting field 'Script.date_marked'
+        db.delete_column('exam_script', 'date_marked')
+
+        # Deleting field 'Script.date_rejected'
+        db.delete_column('exam_script', 'date_rejected')
+
+
+    models = {
+        'auth.group': {
+            'Meta': {'object_name': 'Group'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
+            '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', [], {'unique': 'True', 'max_length': '30'})
+        },
+        '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'})
+        },
+        'exam.corrector': {
+            'Meta': {'object_name': 'Corrector'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'user': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'correctors'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"})
+        },
+        'exam.quota': {
+            'Meta': {'ordering': "['date_start']", 'object_name': 'Quota'},
+            'corrector': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'quotas'", 'null': 'True', 'to': "orm['exam.Corrector']"}),
+            'course': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'quotas'", 'null': 'True', 'to': "orm['teleforma.Course']"}),
+            'date_end': ('django.db.models.fields.DateField', [], {}),
+            'date_start': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'value': ('django.db.models.fields.IntegerField', [], {})
+        },
+        'exam.script': {
+            'Meta': {'object_name': 'Script'},
+            'author': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'scripts'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['auth.User']"}),
+            'box_uuid': ('django.db.models.fields.CharField', [], {'max_length': "'256'", 'blank': 'True'}),
+            'comments': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'corrector': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'scripts'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['exam.Corrector']"}),
+            'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'scripts'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Course']"}),
+            'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'date_marked': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
+            'date_rejected': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'date_submitted': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
+            'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
+            'period': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'scripts'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['teleforma.Period']"}),
+            'reject_reason': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'score': ('django.db.models.fields.FloatField', [], {'null': 'True', 'blank': 'True'}),
+            'session': ('django.db.models.fields.CharField', [], {'default': "'1'", 'max_length': '16'}),
+            'sha1': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}),
+            'status': ('django.db.models.fields.IntegerField', [], {'default': '1', 'blank': 'True'}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'scripts'", 'null': 'True', 'on_delete': 'models.SET_NULL', 'to': "orm['exam.ScriptType']"}),
+            'url': ('django.db.models.fields.CharField', [], {'max_length': "'2048'", 'blank': 'True'}),
+            'uuid': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'})
+        },
+        'exam.scriptpage': {
+            'Meta': {'object_name': 'ScriptPage'},
+            'date_added': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+            'date_modified': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
+            'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '100', 'blank': 'True'}),
+            'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}),
+            'rank': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'script': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'pages'", 'null': 'True', 'to': "orm['exam.Script']"}),
+            'sha1': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}),
+            'uuid': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'})
+        },
+        'exam.scripttype': {
+            'Meta': {'object_name': 'ScriptType'},
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': "'512'", 'blank': 'True'})
+        },
+        'notes.note': {
+            'Meta': {'object_name': 'Note'},
+            'author': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'}),
+            'content': ('django.db.models.fields.TextField', [], {}),
+            'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
+            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date': ('django.db.models.fields.DateField', [], {'default': 'datetime.datetime(2014, 6, 12, 0, 0)'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'markup': ('django.db.models.fields.CharField', [], {'default': "'m'", 'max_length': '1'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'object_id': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'public': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+            'rendered_content': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'topic': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['notes.Topic']"})
+        },
+        'notes.topic': {
+            'Meta': {'object_name': 'Topic'},
+            'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'modified': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'slug': ('django_extensions.db.fields.AutoSlugField', [], {'allow_duplicates': 'False', 'max_length': '50', 'separator': "u'-'", 'blank': 'True', 'populate_from': "'title'", 'overwrite': 'False'}),
+            'title': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+        },
+        'teleforma.course': {
+            'Meta': {'ordering': "['number']", 'object_name': 'Course'},
+            'code': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
+            'date_modified': ('telemeta.models.core.DateTimeField', [], {'default': 'None', 'auto_now': 'True', 'null': 'True', 'blank': 'True'}),
+            'department': ('telemeta.models.core.ForeignKey', [], {'related_name': "'course'", 'to': "orm['teleforma.Department']"}),
+            'description': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'magistral': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
+            'number': ('telemeta.models.core.IntegerField', [], {'default': 'None', 'null': 'True', 'blank': 'True'}),
+            'obligation': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
+            'synthesis_note': ('telemeta.models.core.BooleanField', [], {'default': 'False'}),
+            'title': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
+            'title_tweeter': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'})
+        },
+        'teleforma.department': {
+            'Meta': {'object_name': 'Department'},
+            'default_period': ('telemeta.models.core.ForeignKey', [], {'related_name': "'department'", 'on_delete': 'models.SET_NULL', 'default': 'None', 'to': "orm['teleforma.Period']", 'blank': 'True', 'null': 'True'}),
+            'description': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
+            'domain': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
+            'organization': ('telemeta.models.core.ForeignKey', [], {'related_name': "'department'", 'to': "orm['teleforma.Organization']"})
+        },
+        'teleforma.organization': {
+            'Meta': {'object_name': 'Organization'},
+            'description': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'})
+        },
+        'teleforma.period': {
+            'Meta': {'object_name': 'Period'},
+            'description': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('telemeta.models.core.CharField', [], {'default': "''", 'max_length': '255', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['exam']
\ No newline at end of file
index c0ebe261cfbc268ed7f885737fa0ed45bfe1f714..b1c909fdb632509319bcd7de8575ee2c57bdd193 100644 (file)
@@ -44,7 +44,9 @@ from django.conf import settings
 from django.utils.translation import ugettext_lazy as _
 
 from teleforma.models import *
-
+from django.template.loader import render_to_string
+from postman.utils import email_visitor, notify_user
+from postman.models import Message
 
 app = 'teleforma'
 
@@ -56,8 +58,8 @@ import crocodoc
 crocodoc.api_token = settings.BOX_API_TOKEN
 
 SCRIPT_STATUS = ((0, _('rejected')), (1, _('draft')), (2, _('submitted')),
-                (3, _('pending')),(4, _('corrected')) )
-REJECT_REASON = ((0, _('none')), (1, _('unreadable')),
+                (3, _('pending')),(4, _('marked')) )
+REJECT_REASON = ((1, _('unreadable')),
                 (2, _('bad orientation')), (3, _('bad framing')), (4, _('incomplete')),)
 
 cache_path = settings.MEDIA_ROOT + 'cache/'
@@ -198,13 +200,35 @@ class Script(BaseResource):
     comments = models.TextField(_('comments'), blank=True)
     status = models.IntegerField(_('status'), choices=SCRIPT_STATUS, default=1, blank=True)
     reject_reason = models.IntegerField(_('reject_reason'), choices=REJECT_REASON, null=True, blank=True)
-    date_corrected = models.DateTimeField(_('date corrected'), null=True, blank=True)
     date_submitted = models.DateTimeField(_('date submitted'), null=True, blank=True)
+    date_marked = models.DateTimeField(_('date marked'), null=True, blank=True)
+    date_rejected = models.DateTimeField(_('date rejected'), null=True, blank=True)
+
     url  = models.CharField(_('URL'), max_length='2048', blank=True)
 
+    def __unicode__(self):
+        return unicode(self.uuid)
+
     class Meta(MetaCore):
         verbose_name = _('Script')
         verbose_name_plural = _('Scripts')
+        ordering = ['-date_submitted']
+
+    @property
+    def box_admin_url(self):
+        user = {'id': self.corrector.id, 'name': unicode(self.corrector)}
+        session_key = crocodoc.session.create(self.box_uuid, editable=True, user=user,
+                                filter='all', admin=True, downloadable=True,
+                                copyprotected=False, demo=False, sidebar='invisible')
+        return 'https://crocodoc.com/view/' + session_key
+
+    @property
+    def box_user_url(self, user):
+        user = {'id': user.id, 'name': unicode(user)}
+        session_key = crocodoc.session.create(self.box_uuid, editable=False, user=user,
+                                filter='all', admin=False, downloadable=True,
+                                copyprotected=False, demo=False, sidebar='invisible')
+        return 'https://crocodoc.com/view/' + session_key
 
     def auto_set_corrector(self):
         quota_list = []
@@ -247,11 +271,13 @@ class Script(BaseResource):
         self.save()
 
     def save(self, *args, **kwargs):
-        if self.score:
-            self.date_corrected = datetime.datetime.now()
-            self.status = 4
+        #FIXME
         if self.status == 2:
             self.submit()
+        if self.status == 4 and self.score:
+            self.mark()
+        if self.status == 0 and self.reject_reason:
+            self.reject()
 
         super(Script, self).save(*args, **kwargs)
 
@@ -264,23 +290,30 @@ class Script(BaseResource):
             self.auto_set_corrector()
         self.status = 3
 
-    @property
-    def box_admin_url(self):
-        user = {'id': self.corrector.id, 'name': unicode(self.corrector)}
-        session_key = crocodoc.session.create(self.box_uuid, editable=True, user=user,
-                                filter='all', admin=True, downloadable=True,
-                                copyprotected=False, demo=False, sidebar='invisible')
-        return 'https://crocodoc.com/view/' + session_key
-
-    @property
-    def box_user_url(self, user):
-        user = {'id': user.id, 'name': unicode(user)}
-        session_key = crocodoc.session.create(self.box_uuid, editable=False, user=user,
-                                filter='all', admin=False, downloadable=True,
-                                copyprotected=False, demo=False, sidebar='invisible')
-        return 'https://crocodoc.com/view/' + session_key
-
-
+    def mark(self):
+        self.date_marked = datetime.datetime.now()
+        context = {}
+        text = render_to_string('exam/messages/script_marked.txt', context)
+        a = _('script')
+        v = _('marked')
+        subject = '%s : %s - %s %s' % (unicode(self), a, self.session, v)
+        mess = Message(sender=self.corrector.user, recipient=self.author, subject=subject[:119], body=text)
+        mess.moderation_status = 'a'
+        mess.save()
+        #notify_user(mess, 'acceptance')
+        
+    def reject(self):
+        self.date_rejected = datetime.datetime.now()
+        context = {}
+        text = render_to_string('exam/messages/script_rejected.txt', context)
+        a = _('script')
+        v = _('rejected')
+        subject = '%s : %s - %s %s' % (unicode(self), a, self.session, v)
+        mess = Message(sender=self.corrector.user, recipient=self.author, subject=subject[:119], body=text)
+        mess.moderation_status = 'a'
+        mess.save()
+        #notify_user(mess, 'acceptance')
+        
 def set_file_properties(sender, instance, **kwargs):
     if instance.file:
         if not instance.mime_type:
diff --git a/teleforma/exam/templates/exam/inc/script_list.html b/teleforma/exam/templates/exam/inc/script_list.html
new file mode 100644 (file)
index 0000000..4246e22
--- /dev/null
@@ -0,0 +1,37 @@
+{% load i18n %}
+{% load telemeta_utils %}
+{% load teleforma_tags %}
+{% load pagination_tags %}
+
+{% autopaginate object_list 8 %}
+{% paginate %}
+
+<div id="users">
+  <table class="listing" width="100%">
+   <thead>
+   <tr><th>{% trans "Last Name"%}</th>
+    <th>{% trans "First Name"%}</th>
+    <th>{% trans "Course"%}</th>
+    <th>{% trans "Session"%}</th>
+    <th>{% trans "Type"%}</th>
+    <th>{% trans "Submission date"%}</th>
+    <th>{% trans "Mark date"%}</th>
+    <th>{% trans "Score"%}</th>
+    </tr>
+    </thead>
+    <tbody id="spacing">
+    {% for script in object_list %}
+    <tr>
+     <td><a href="{% url teleforma-profile-detail script.author.username %}">{{ script.author.last_name }}</a></td>
+     <td><a href="{% url teleforma-profile-detail script.author.username %}">{{ script.author.first_name }}</a></td>
+     <td><a href="{% url teleforma-exam-script-detail period.id script.id %}">{{ script.course.title }}</a></td>
+     <td><a href="{% url teleforma-exam-script-detail period.id script.id %}">{{ script.session }}</a></td>
+     <td><a href="{% url teleforma-exam-script-detail period.id script.id %}">{{ script.type }}</a></td>
+     <td><a href="{% url teleforma-exam-script-detail period.id script.id %}">{{ script.date_submitted }}</a></td>
+     <td><a href="{% url teleforma-exam-script-detail period.id script.id %}">{{ script.date_marked }}</a></td>
+     <td><a href="{% url teleforma-exam-script-detail period.id script.id %}">{{ script.score }}</a></td>
+    </tr>
+    {% endfor %}
+    </tbody>
+  </table>
+</div>
diff --git a/teleforma/exam/templates/exam/messages/script_marked.txt b/teleforma/exam/templates/exam/messages/script_marked.txt
new file mode 100644 (file)
index 0000000..837fad4
--- /dev/null
@@ -0,0 +1 @@
+marked
\ No newline at end of file
diff --git a/teleforma/exam/templates/exam/messages/script_rejected.txt b/teleforma/exam/templates/exam/messages/script_rejected.txt
new file mode 100644 (file)
index 0000000..25ce34c
--- /dev/null
@@ -0,0 +1 @@
+rejected
\ No newline at end of file
index 981e073cd7b238e68366a7f9ed6cec4a7f00a084..83104d70c8cc4bc611084e3316cc03682d34debb 100644 (file)
@@ -5,6 +5,66 @@
 {% load thumbnail %}
 
 {% block extra_javascript %}
+  <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
+  <script src="//code.jquery.com/jquery-1.10.2.js"></script>
+  <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
+
+  <script>
+    // increase the default animation speed to exaggerate the effect
+
+    $(function() {
+        $( "#dialog_mark" ).dialog({
+            autoOpen: false,
+            draggable: false,
+            resizable: false,
+                    modal: true,
+
+        });
+
+        $( "#dialog_reject" ).dialog({
+            autoOpen: false,
+            draggable: false,
+            resizable: false,
+                    modal: true,
+
+        });
+
+        $( "#opener_mark" ).click(function() {
+            $( "#dialog_mark" ).dialog({ width: 500 });
+            $( "#dialog_mark" ).dialog( "open");
+            return false;
+        });
+
+        $( "#opener_reject" ).click(function() {
+            $( "#dialog_reject" ).dialog( "open");
+            return false;
+        });
+
+        var b1 = $('#validate_button');
+        b1.unbind('click').click(function() {
+            $(window).unbind('beforeunload');
+            b1.unbind('click');
+            $('#_MarkForm #id_status').val("4");
+            $('#_MarkForm').submit();
+        });
+
+        var b2 = $('#reject_button');
+        b2.unbind('click').click(function() {
+            $(window).unbind('beforeunload');
+            b2.unbind('click');
+            $('#_RejectForm #id_status').val("0");
+            $('#_RejectForm').submit();
+        });
+
+    });
+
+    function SetValues()
+    {
+        var s = 'X=' + window.event.clientX +  ' Y=' + window.event.clientY ;
+        document.getElementById('divCoord').innerText = s;
+
+    }
+    </script>
 {% endblock extra_javascript %}
 
 
     <a href="{% url teleforma-desk-period-course period.id script.course.id %}">{{ course.title }} - {{ script.type }}{% if script.session %} - {% trans "Session" %} {{ script.session }}{% endif %} - {{ script.author.first_name }} {{ script.author.last_name }} - {{ script.date_submitted }}</a>
 
     <div style="float: right; font-size: 0.9em;">
-        <a id="publish" href="#" class="{% if script.score %}component_icon button icon_ok{% else %}component_icon button icon_delete{% endif %}">{% trans "Score : " %}{% if script.score %}{{ script.score|floatformat }}{% else %}    {% endif %}/20</a>
-        <a id="publish" href="#" class="{% if script.status == 4 %}component_icon button icon_ok{% else %}component_icon button icon_delete{% endif %}">{% if script.status == 4 %}{% trans " corrected" %}{% else %}{% trans " pending" %}{% endif %}</a>
+
+        {% if script.score %}
+        <a id="score" href="#" class="component_icon button icon_ok">{% trans "Score" %} : {{ script.score|floatformat }}/20</a>
+        {% elif script.status == 0 %}
+        <a href="#" class="component_icon button icon_delete">{% trans "Rejected" %}</a>
+        {% else %}
+        <a id="opener_mark" href="#" class="component_icon button icon_edit">{% trans "Mark" %}</a>
+        <a id="opener_reject" href="#" class="component_icon button icon_delete">{% trans "Reject" %}</a>
+        {% endif %}
 
     </div>
 
 </div>
 
+<div id="dialog_mark" title="{% trans "Mark" %}" style="width: 400px;">
+    <form method="post" id="_MarkForm" action="">{% csrf_token %}
+       <table>
+       <tr><td colspan="2">{% for error in form.non_field_errors %}<li class="error">{{ error }}</li>{% endfor %}</td></tr>
+       {% for field in form %}
+       <tr>
+        {% if not field.html_name in mark_fields %}
+            <td>{{ field.label_tag.as_hidden }}</td><td>{{ field.as_hidden }}</td>
+        {% else %}
+            <tr><td class="error">{{ field.errors }}</td></tr>
+            <td>{{ field.label_tag }}:</td><td> {{ field }}</td>
+        {% endif %}
+        </tr>
+       {% endfor %}
+       </table>
+    </form>
+    <br />
+    <a href="#" id="validate_button" class="component_icon button icon_ok">{% trans "Validate" %}</a>
+
+</div>
+
+<div id="dialog_reject" title="{% trans "Reject" %}">
+<form method="post" id="_RejectForm" action="">{% csrf_token %}
+       <table>
+       <tr><td colspan="2">{% for error in form.non_field_errors %}<li class="error">{{ error }}</li>{% endfor %}</td></tr>
+       {% for field in form %}
+       <tr>
+        {% if not field.html_name in reject_fields %}
+            <td>{{ field.label_tag.as_hidden }}</td><td>{{ field.as_hidden }}</td>
+        {% else %}
+            <tr><td class="error">{{ field.errors }}</td></tr>
+            <td>{{ field.label_tag }}:</td><td> {{ field }}</td>
+        {% endif %}
+        </tr>
+       {% endfor %}
+       </table>
+    </form>
+    <br />
+        <a href="#" id="reject_button" class="component_icon button icon_delete">{% trans "Reject" %}</a>
+</div>
+
+
 {% if access_error %}
   <p>{{ access_error }}</p>
   <p>{{ message }}</p>
 {% else %}
 <div class="media">
  <div class="script">
-    <iframe style="position:fixed; top:14%; left:0px; bottom:0px; right:0px; width:100%; height:85%; border:none; margin:0; padding:0; overflow:hidden; z-index:999999;" src="{{ script.box_admin_url }}">
+    <iframe style="position:fixed; top:14%; left:0px; bottom:0px; right:0px; width:100%; height:85%; border:none; margin:0; padding:0; z-index:0;" src="{{ script.box_admin_url }}">
     </iframe>
  </div>
 </div>
diff --git a/teleforma/exam/templates/exam/scripts.html b/teleforma/exam/templates/exam/scripts.html
new file mode 100644 (file)
index 0000000..0d3de6b
--- /dev/null
@@ -0,0 +1,54 @@
+{% extends "telemeta/base.html" %}
+{% load i18n %}
+{% load telemeta_utils %}
+{% load teleforma_tags %}
+
+{% block head_title %}{% trans "Answers" %} - {{ block.super }}{% endblock %}
+
+{% block title %}
+{% endblock %}
+
+
+{% block infra_javascript %}
+{% endblock infra_javascript %}
+
+{% block content %}
+
+<div id="module-set-left" style="width: 18%">
+
+{% block modules %}
+<div class="module">
+<h3><a href="{% url teleforma-desk %}"><img src="{{ STATIC_URL }}telemeta/images/module_playlist.png" alt="playlists" style="vertical-align:middle" />{% trans "Scripts" %}</a></h3>
+ <div style="background: white;">
+  <ul>
+  {% block courses %}
+   <li><a href="{% url teleforma-exam-scripts-pending period.id %}">{% trans "Pending" %}{% untreated_scripts_count user.username %}</a></li>
+   <li><a href="{% url teleforma-exam-scripts-treated period.id %}">{% trans "Treated" %}</a></li>
+   <li><a href="{% url teleforma-exam-scripts-rejected period.id %}">{% trans "Rejected" %}</a></li>
+  {% endblock courses %}
+  </ul>
+ </div>
+</div>
+{% endblock modules %}
+
+</div>
+
+<div class="desk_messages">
+
+{% if user.is_staff %}
+<div style="float:right;">
+</div>
+{% endif %}
+
+{% block answers %}
+<div class="course_title">{% trans "Scripts" %}</div>
+<br />
+ {% if object_list %}
+  {% include "exam/inc/script_list.html" %}
+ {% else %}
+    <p class="help">{% trans "No scripts" %}</p>
+ {% endif %}
+</div>
+{% endblock answers %}
+
+{% endblock %}
index 8d7aa44d293c6fc6adf8c730d1c05a692fc8db84..e794ac2899bec1a6d08e932e5524634f16b6b1bf 100644 (file)
@@ -46,4 +46,11 @@ urlpatterns = patterns('',
     url(r'^desk/periods/(?P<period_id>.*)/exam/script/(?P<pk>.*)/detail/$', ScriptView.as_view(),
         name="teleforma-exam-script-detail"),
 
+    url(r'^desk/periods/(?P<period_id>.*)/exam/scripts/list/$', ScriptsView.as_view(),
+        name="teleforma-exam-script-list"),
+
+    url(r'^desk/periods/(?P<period_id>.*)/exam/scripts_pending/$', ScriptsPendingView.as_view(), name="teleforma-exam-scripts-pending"),
+    url(r'^desk/periods/(?P<period_id>.*)/exam/scripts_treated/$', ScriptsTreatedView.as_view(), name="teleforma-exam-scripts-treated"),
+    url(r'^desk/periods/(?P<period_id>.*)/exam/scripts_rejected/$', ScriptsRejectedView.as_view(), name="teleforma-exam-scripts-rejected"),
+
 )
index 2c556289550baaba736b034b71b1090e46df1973..c0a4c8c1ae2df49416ae82efa4aa77635e8ae9f1 100644 (file)
@@ -1,21 +1,33 @@
 # Create your views here.
 
 from teleforma.exam.models import *
+from teleforma.exam.forms import *
 from teleforma.views.core import *
 
+from django.views.generic.edit import CreateView, UpdateView, DeleteView
+from django.core.urlresolvers import reverse_lazy, reverse
 
-class ScriptView(CourseAccessMixin, DetailView):
+
+class ScriptView(CourseAccessMixin, UpdateView):
 
     model = Script
     template_name='exam/script_detail.html'
+    form_class = ScriptForm
+    success_url = reverse_lazy('teleforma-exam-scripts-pending', kwargs={'period_id':1})
 
     def get_context_data(self, **kwargs):
         context = super(ScriptView, self).get_context_data(**kwargs)
         script = self.get_object()
         context['script'] = script
         context['course'] = script.course
+        context['mark_fields'] = ['score', 'comments' ]
+        context['reject_fields'] = ['reject_reason' ]
+
+        access = self.request.user == script.author or \
+                               self.request.user == script.corrector or \
+                               self.request.user.is_superuser or \
+                                self.request.user.is_staff
 
-        access = get_access(script, context['all_courses'])
         if not access:
             context['access_error'] = access_error
             context['message'] = contact_message
@@ -26,3 +38,54 @@ class ScriptView(CourseAccessMixin, DetailView):
         return super(ScriptView, self).dispatch(*args, **kwargs)
 
 
+class ScriptsView(ListView):
+
+    model = Script
+    template_name='exam/scripts.html'
+
+    def get_context_data(self, **kwargs):
+       context = super(ScriptsView, self).get_context_data(**kwargs)
+       context['period'] = Period.objects.get(id=self.kwargs['period_id'])
+        return context
+
+    @method_decorator(login_required)
+    def dispatch(self, *args, **kwargs):
+        return super(ScriptsView, self).dispatch(*args, **kwargs)
+
+
+class ScriptsPendingView(ScriptsView):
+
+    def get_queryset(self):
+       user = self.request.user
+       scripts = Script.objects.filter(Q(status=3, author=user) | Q(status=3, corrector=user))
+        return scripts
+
+
+class ScriptsTreatedView(ScriptsView):
+
+    def get_queryset(self):
+       user = self.request.user
+       scripts = Script.objects.filter(Q(status=4, author=user) | Q(status=4, corrector=user))
+        return scripts
+
+
+class ScriptsRejectedView(ScriptsView):
+
+    def get_queryset(self):
+       user = self.request.user
+       scripts = Script.objects.filter(Q(status=0, author=user) | Q(status=0, corrector=user))
+        return scripts
+
+
+class ScriptCreate(CreateView):
+    model = Script
+
+    def form_valid(self, form):
+        form.instance.author = self.request.user
+        return super(ScriptCreate, self).form_valid(form)
+
+
+class ScriptUpdate(UpdateView):
+    model = Script
+    fields = ['score']
+
index 9a6df9e5771586dc0d638be568e64ab88cd36315..571834f25d8589fed157f29a618d9ee3feaf2e19 100644 (file)
Binary files a/teleforma/locale/fr/LC_MESSAGES/django.mo and b/teleforma/locale/fr/LC_MESSAGES/django.mo differ
index bddeb09e2947bfb9d13b793998850512f9a120dd..7bfab6ad3c131a95e16243de596ade58bfd69937 100644 (file)
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-07-22 22:04+0200\n"
+"POT-Creation-Date: 2014-06-12 14:39+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Guillaume Pellerin <yomguy@parisson.com>\n"
 "Language-Team: LANGUAGE <lists@parisson.com>\n"
@@ -16,21 +16,331 @@ msgstr ""
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n > 1)\n"
 
-#: models/ae.py:46 models/core.py:199 models/crfpa.py:108 models/crfpa.py:149
-#: models/pro.py:101 models/pro.py:140
+#: exam/models.py:60 exam/models.py:311
+#, fuzzy
+msgid "rejected"
+msgstr " rejeté"
+
+#: exam/models.py:60
+#, fuzzy
+msgid "draft"
+msgstr "Brouillon"
+
+#: exam/models.py:60
+msgid "submitted"
+msgstr "soumise"
+
+#: exam/models.py:61
+msgid "pending"
+msgstr "en attente"
+
+#: exam/models.py:61 exam/models.py:298
+msgid "marked"
+msgstr "corrigée"
+
+#: exam/models.py:62
+msgid "unreadable"
+msgstr "illisible"
+
+#: exam/models.py:63
+msgid "bad orientation"
+msgstr "mauvaise orientation"
+
+#: exam/models.py:63
+msgid "bad framing"
+msgstr "mauvais cadrage"
+
+#: exam/models.py:63
+msgid "incomplete"
+msgstr "incomplet"
+
+#: exam/models.py:106 models/ae.py:46 models/core.py:205 models/crfpa.py:108
+#: models/crfpa.py:149 models/pro.py:101 models/pro.py:140
 msgid "user"
 msgstr "utilisateur"
 
-#: models/ae.py:47 models/core.py:131 models/core.py:241 models/core.py:487
-#: models/core.py:530 models/core.py:572 models/crfpa.py:64
+#: exam/models.py:109
+msgid "Corrector"
+msgstr "Correcteur"
+
+#: exam/models.py:110
+msgid "Correctors"
+msgstr "Correcteurs"
+
+#: exam/models.py:118 exam/models.py:189 models/core.py:198 models/core.py:252
+#: models/core.py:492 models/core.py:578 models/pro.py:45
+msgid "course"
+msgstr "matière"
+
+#: exam/models.py:119 exam/models.py:198
+msgid "corrector"
+msgstr "correcteur"
+
+#: exam/models.py:120
+msgid "value"
+msgstr "valeur"
+
+#: exam/models.py:121
+msgid "date start"
+msgstr "date de début"
+
+#: exam/models.py:122
+msgid "date end"
+msgstr "date de fin"
+
+#: exam/models.py:125
+msgid "Quota"
+msgstr ""
+
+#: exam/models.py:126
+msgid "Quotas"
+msgstr ""
+
+#: exam/models.py:145 models/core.py:458 models/pro.py:67
+msgid "date added"
+msgstr "date d'ajout"
+
+#: exam/models.py:146 models/core.py:159 models/core.py:459 models/pro.py:68
+msgid "date modified"
+msgstr "date de modification"
+
+#: exam/models.py:147
+msgid "UUID"
+msgstr ""
+
+#: exam/models.py:148
+#, fuzzy
+msgid "MIME type"
+msgstr "Type mime"
+
+#: exam/models.py:149
+msgid "sha1"
+msgstr ""
+
+#: exam/models.py:165 exam/models.py:297 exam/models.py:310
+#, fuzzy
+msgid "script"
+msgstr "description"
+
+#: exam/models.py:166
+#, fuzzy
+msgid "Page file"
+msgstr "Profil"
+
+#: exam/models.py:167
+msgid "Image file"
+msgstr ""
+
+#: exam/models.py:168 models/pro.py:49 models/pro.py:85
+msgid "rank"
+msgstr "rang"
+
+#: exam/models.py:171
+msgid "Page"
+msgstr ""
+
+#: exam/models.py:172
+#, fuzzy
+msgid "Pages"
+msgstr "Messages"
+
+#: exam/models.py:177 models/core.py:93 models/core.py:106 models/core.py:128
+#: models/core.py:140 models/core.py:234 models/core.py:475 models/crfpa.py:47
+#: models/crfpa.py:63
+msgid "name"
+msgstr "nom"
+
+#: exam/models.py:180
+msgid "ScriptType"
+msgstr ""
+
+#: exam/models.py:181
+#, fuzzy
+msgid "ScriptTypes"
+msgstr "type"
+
+#: exam/models.py:190 models/ae.py:47 models/core.py:111 models/core.py:136
+#: models/core.py:250 models/core.py:497 models/core.py:541 models/core.py:582
+#: models/crfpa.py:64
 msgid "period"
 msgstr "période"
 
+#: exam/models.py:192 models/core.py:256
+msgid "session"
+msgstr "session"
+
+#: exam/models.py:194 models/core.py:389 models/core.py:499 models/core.py:586
+msgid "type"
+msgstr "type"
+
+#: exam/models.py:195
+msgid "author"
+msgstr "auteur"
+
+#: exam/models.py:196
+#, fuzzy
+msgid "PDF file"
+msgstr "fichier"
+
+#: exam/models.py:197
+msgid "Box UUID"
+msgstr ""
+
+#: exam/models.py:199
+msgid "score"
+msgstr "note"
+
+#: exam/models.py:200 models/pro.py:125
+msgid "comments"
+msgstr "commentaires"
+
+#: exam/models.py:201 models/core.py:265 models/pro.py:48 models/pro.py:88
+#: models/pro.py:104
+msgid "status"
+msgstr "status"
+
+#: exam/models.py:202
+msgid "reject_reason"
+msgstr " raison du rejet"
+
+#: exam/models.py:203
+msgid "date submitted"
+msgstr "date de soumission"
+
+#: exam/models.py:204
+msgid "date marked"
+msgstr "date de correction"
+
+#: exam/models.py:205
+#, fuzzy
+msgid "date rejected"
+msgstr "date de rejet"
+
+#: exam/models.py:207
+msgid "URL"
+msgstr ""
+
+#: exam/models.py:213
+msgid "Script"
+msgstr "Copie"
+
+#: exam/models.py:214 exam/templates/exam/scripts.html:43
+#: templates/telemeta/base.html:116
+msgid "Scripts"
+msgstr "Copies"
+
+#: exam/templates/exam/script_detail.html:76
+#: exam/templates/exam/inc/script_list.html:15 models/core.py:503
+#: templates/teleforma/course.html:50
+#: templates/teleforma/course_conference.html:40
+#: templates/teleforma/course_conference.html:71
+#: templates/teleforma/course_conference_audio.html:68
+#: templates/teleforma/course_media.html:86
+#: templates/teleforma/course_media.html:135
+#: templates/teleforma/course_media_video_embed.html:34
+#: templates/teleforma/inc/conference_list.html:26
+#: templates/teleforma/inc/media_list.html:37
+msgid "Session"
+msgstr "Session"
+
+#: exam/templates/exam/script_detail.html:81
+#, fuzzy
+msgid "Score : "
+msgstr "Note"
+
+#: exam/templates/exam/script_detail.html:83 templates/postman/view.html:25
+msgid "Rejected"
+msgstr "Rejeté"
+
+#: exam/templates/exam/script_detail.html:85
+#: exam/templates/exam/script_detail.html:93
+msgid "Mark"
+msgstr "Note"
+
+#: exam/templates/exam/script_detail.html:86
+#: exam/templates/exam/script_detail.html:114
+#: exam/templates/exam/script_detail.html:131
+msgid "Reject"
+msgstr "Rejeter"
+
+#: exam/templates/exam/script_detail.html:110
+#, fuzzy
+msgid "Validate"
+msgstr "validé"
+
+#: exam/templates/exam/scripts.html:6 exam/templates/exam/scripts.html:21
+#, fuzzy
+msgid "Answers"
+msgstr "Réponse"
+
+#: exam/templates/exam/scripts.html:25
+msgid "Pending"
+msgstr "En attente"
+
+#: exam/templates/exam/scripts.html:26
+msgid "Treated"
+msgstr "Traîtées"
+
+#: exam/templates/exam/scripts.html:48
+msgid "No scripts"
+msgstr "Aucune Copie"
+
+#: exam/templates/exam/inc/script_list.html:12
+#: templates/telemeta/profile_detail.html:60
+#: templates/telemeta/inc/user_list.html:19
+msgid "Last Name"
+msgstr "Nom"
+
+#: exam/templates/exam/inc/script_list.html:13
+#: templates/telemeta/profile_detail.html:59
+#: templates/telemeta/inc/user_list.html:20
+msgid "First Name"
+msgstr "Prénom"
+
+#: exam/templates/exam/inc/script_list.html:14
+#: templates/teleforma/course_conference.html:70
+#: templates/teleforma/course_media.html:134
+#: templates/teleforma/course_media_video_embed.html:33
+msgid "Course"
+msgstr "Matière"
+
+#: exam/templates/exam/inc/script_list.html:16
+#: templates/telemeta/lists.html:70
+#: templates/telemeta/inc/module_revisions.html:18
+msgid "Type"
+msgstr ""
+
+#: exam/templates/exam/inc/script_list.html:17
+msgid "Submission date"
+msgstr "Date de soumission"
+
+#: exam/templates/exam/inc/script_list.html:18
+msgid "Mark date"
+msgstr "Date de correction"
+
+#: exam/templates/exam/inc/script_list.html:19
+msgid "Score"
+msgstr "Note"
+
+#: exam/templates/exam/inc/script_list.html:20
+#: templates/teleforma/course_conference_record.html:30
+#: templates/teleforma/courses.html:107
+msgid "Status"
+msgstr "Status"
+
+#: exam/templates/exam/inc/script_list.html:36
+msgid " marked"
+msgstr " corrigée"
+
+#: exam/templates/exam/inc/script_list.html:38
+msgid " pending"
+msgstr " en attente"
+
 #: models/ae.py:49 models/crfpa.py:117
 msgid "platform only"
 msgstr "plateforme seulement"
 
-#: models/ae.py:51 models/core.py:201
+#: models/ae.py:51 models/core.py:207
 msgid "courses"
 msgstr "matières"
 
@@ -38,191 +348,169 @@ msgstr "matières"
 msgid "AE student"
 msgstr "Etudiant AE"
 
-#: models/core.py:74
+#: models/core.py:75
+msgid "Hidden"
+msgstr ""
+
+#: models/core.py:76
 msgid "Private"
 msgstr "Privé"
 
-#: models/core.py:75
+#: models/core.py:77
 msgid "Draft"
 msgstr "Brouillon"
 
-#: models/core.py:76
+#: models/core.py:78
 msgid "Public"
 msgstr "Publié"
 
-#: models/core.py:91 models/core.py:103 models/core.py:123 models/core.py:135
-#: models/core.py:225 models/core.py:465 models/crfpa.py:47 models/crfpa.py:63
-msgid "name"
-msgstr "nom"
-
-#: models/core.py:92 models/core.py:104 models/core.py:124 models/core.py:136
-#: models/core.py:150 models/core.py:226 models/core.py:380 models/core.py:446
-#: models/core.py:466 models/crfpa.py:48 models/pro.py:124
+#: models/core.py:94 models/core.py:107 models/core.py:129 models/core.py:141
+#: models/core.py:156 models/core.py:235 models/core.py:390 models/core.py:456
+#: models/core.py:476 models/crfpa.py:48 models/pro.py:124
 msgid "description"
 msgstr "description"
 
-#: models/core.py:99 models/core.py:106 models/core.py:224 models/pro.py:123
+#: models/core.py:101 models/core.py:109 models/core.py:233 models/pro.py:123
 msgid "organization"
 msgstr "organisation"
 
-#: models/core.py:107
+#: models/core.py:110
 msgid "Master domain"
 msgstr ""
 
-#: models/core.py:118 models/core.py:148 models/core.py:239
+#: models/core.py:123 models/core.py:154 models/core.py:248
 msgid "department"
 msgstr "département"
 
-#: models/core.py:143 models/core.py:244 models/core.py:484 models/core.py:570
+#: models/core.py:148 models/core.py:253 models/core.py:494 models/core.py:580
 msgid "course type"
 msgstr "type de matière"
 
-#: models/core.py:149 models/core.py:445 models/pro.py:46 models/pro.py:83
+#: models/core.py:155 models/core.py:455 models/pro.py:46 models/pro.py:83
 msgid "title"
 msgstr "titre"
 
-#: models/core.py:151 models/core.py:450 models/crfpa.py:62
+#: models/core.py:157 models/core.py:460 models/crfpa.py:62
 msgid "code"
 msgstr "cote"
 
-#: models/core.py:152
+#: models/core.py:158
 msgid "tweeter title"
 msgstr ""
 
-#: models/core.py:153 models/core.py:449 models/pro.py:68
-msgid "date modified"
-msgstr "date de modification"
-
-#: models/core.py:154 models/core.py:467
+#: models/core.py:160 models/core.py:477
 msgid "number"
 msgstr ""
 
-#: models/core.py:155 models/crfpa.py:67
+#: models/core.py:161 models/crfpa.py:67
 msgid "synthesis note"
 msgstr "note de synthèse"
 
-#: models/core.py:156 models/crfpa.py:70
+#: models/core.py:162 models/crfpa.py:70
 msgid "obligations"
 msgstr "obligations"
 
-#: models/core.py:157 models/crfpa.py:91
+#: models/core.py:163 models/crfpa.py:91
 msgid "magistral"
 msgstr "magistral"
 
-#: models/core.py:192 models/core.py:243 models/core.py:482 models/core.py:568
-#: models/pro.py:45
-msgid "course"
-msgstr "matière"
-
-#: models/core.py:218 models/core.py:245
+#: models/core.py:227 models/core.py:254
 msgid "professor"
 msgstr "professeur"
 
-#: models/core.py:233 models/core.py:249
+#: models/core.py:242 models/core.py:258
 msgid "room"
 msgstr "salle"
 
-#: models/core.py:238
+#: models/core.py:247
 msgid "public_id"
 msgstr "public id"
 
-#: models/core.py:247
-msgid "session"
-msgstr "session"
-
-#: models/core.py:251
+#: models/core.py:260
 msgid "comment"
 msgstr "commentaire"
 
-#: models/core.py:252
+#: models/core.py:261
 msgid "begin date"
 msgstr "date de début"
 
-#: models/core.py:253
+#: models/core.py:262
 msgid "end date"
 msgstr "date de fin"
 
-#: models/core.py:254 models/core.py:496 models/core.py:533 models/core.py:577
+#: models/core.py:263 models/core.py:507 models/core.py:544 models/core.py:587
 msgid "readers"
 msgstr ""
 
-#: models/core.py:369 models/core.py:397 models/core.py:485 models/core.py:566
+#: models/core.py:379 models/core.py:407 models/core.py:495 models/core.py:576
 msgid "conference"
 msgstr "conférence"
 
-#: models/core.py:377
+#: models/core.py:387
 msgid "host"
 msgstr ""
 
-#: models/core.py:378
+#: models/core.py:388
 msgid "port"
 msgstr ""
 
-#: models/core.py:379 models/core.py:489 models/core.py:576
-msgid "type"
-msgstr "type"
-
-#: models/core.py:381
+#: models/core.py:391
 msgid "source password"
 msgstr ""
 
-#: models/core.py:382
+#: models/core.py:392
 msgid "admin password"
 msgstr ""
 
-#: models/core.py:389 models/core.py:400
+#: models/core.py:399 models/core.py:410
 msgid "streaming server"
 msgstr "serveur de diffusion"
 
-#: models/core.py:401
+#: models/core.py:411
 msgid "Streaming type"
 msgstr "Type de flux"
 
-#: models/core.py:403
+#: models/core.py:413
 msgid "streaming"
 msgstr "diffusion"
 
-#: models/core.py:439
+#: models/core.py:449
 msgid "live stream"
 msgstr "stream en direct"
 
-#: models/core.py:447
+#: models/core.py:457
 msgid "credits"
 msgstr "crédits"
 
-#: models/core.py:448 models/pro.py:67
-msgid "date added"
-msgstr "date d'ajout"
-
-#: models/core.py:451
+#: models/core.py:461
 msgid "published"
 msgstr "publié"
 
-#: models/core.py:452
+#: models/core.py:462
 msgid "mime type"
 msgstr "Type mime"
 
-#: models/core.py:453 models/pro.py:86
+#: models/core.py:463 models/pro.py:86
 msgid "weight"
 msgstr ""
 
-#: models/core.py:474
+#: models/core.py:484
 msgid "document type"
 msgstr "type de document"
 
-#: models/core.py:491 models/crfpa.py:111
+#: models/core.py:501 models/crfpa.py:111
 msgid "iej"
 msgstr "iej"
 
-#: models/core.py:493
+#: models/core.py:504
 msgid "annal"
 msgstr "annale"
 
-#: models/core.py:494
+#: models/core.py:505
 msgid "year"
 msgstr "année"
 
-#: models/core.py:495 models/core.py:532
+#: models/core.py:506 models/core.py:543
 msgid "file"
 msgstr "fichier"
 
@@ -312,14 +600,6 @@ msgstr "profil"
 msgid "price"
 msgstr "prix"
 
-#: models/pro.py:48 models/pro.py:88 models/pro.py:104
-msgid "status"
-msgstr "status"
-
-#: models/pro.py:49 models/pro.py:85
-msgid "rank"
-msgstr ""
-
 #: models/pro.py:50
 msgid "public concerned"
 msgstr ""
@@ -384,10 +664,6 @@ msgstr "validé"
 msgid "Answer"
 msgstr "Réponse"
 
-#: models/pro.py:125
-msgid "comments"
-msgstr "commentaires"
-
 #: models/pro.py:126 models/pro.py:142
 msgid "testimonial_template"
 msgstr ""
@@ -444,7 +720,7 @@ msgstr ""
 msgid "Sent Messages"
 msgstr "Messages"
 
-#: templates/postman/base.html:17 templates/telemeta/base.html:118
+#: templates/postman/base.html:17 templates/telemeta/base.html:126
 msgid "Archives"
 msgstr ""
 
@@ -514,15 +790,15 @@ msgstr ""
 msgid "No messages."
 msgstr "Messages"
 
-#: templates/postman/base_write.html:13
+#: templates/postman/base_write.html:31
 msgid "to an administrator"
 msgstr "à un administrateur"
 
-#: templates/postman/base_write.html:21
+#: templates/postman/base_write.html:39
 msgid "to a professor"
 msgstr "à un professeur"
 
-#: templates/postman/base_write.html:38
+#: templates/postman/base_write.html:56
 #: templates/teleforma/inc/chat_room.html:13
 msgid "Send"
 msgstr ""
@@ -666,11 +942,6 @@ msgstr ""
 msgid "Message"
 msgstr "Messages"
 
-#: templates/postman/view.html:25
-#, fuzzy
-msgid "Rejected"
-msgstr "rejeté"
-
 #: templates/postman/view.html:25
 msgid ":"
 msgstr ""
@@ -684,7 +955,7 @@ msgid "Write"
 msgstr ""
 
 #: templates/teleforma/annals.html:6 templates/teleforma/annals.html.py:54
-#: templates/telemeta/base.html:113 templates/telemeta/base.html.py:123
+#: templates/telemeta/base.html:113 templates/telemeta/base.html.py:131
 msgid "Annals"
 msgstr "Annales"
 
@@ -731,7 +1002,7 @@ msgstr "Description"
 
 #: templates/teleforma/course.html:19 templates/teleforma/course.html.py:35
 #: templates/teleforma/course.html:52
-#: templates/teleforma/course_media.html:147
+#: templates/teleforma/course_media.html:146
 #: templates/telemeta/profile_detail.html:81
 msgid "Date added"
 msgstr "Date d'ajout"
@@ -744,22 +1015,12 @@ msgstr "Médias"
 msgid "Conferences"
 msgstr "Conférences"
 
-#: templates/teleforma/course.html:50
-#: templates/teleforma/course_conference.html:40
-#: templates/teleforma/course_conference.html:71
-#: templates/teleforma/course_conference_audio.html:68
-#: templates/teleforma/course_media.html:86
-#: templates/teleforma/course_media.html:136
-#: templates/teleforma/inc/conference_list.html:26
-#: templates/teleforma/inc/media_list.html:37
-msgid "Session"
-msgstr "Session"
-
 #: templates/teleforma/course.html:51
 #: templates/teleforma/course_conference.html:72
 #: templates/teleforma/course_conference_audio.html:67
-#: templates/teleforma/course_media.html:138
-#: templates/teleforma/inc/conference_list.html:27
+#: templates/teleforma/course_media.html:137
+#: templates/teleforma/course_media_video_embed.html:36
+#: templates/teleforma/inc/conference_list.html:28
 #: templates/teleforma/inc/media_list.html:39
 #: templates/telemeta/inc/user_list.html:48
 msgid "Professor"
@@ -775,24 +1036,22 @@ msgstr "S T O P"
 msgid "Audio"
 msgstr ""
 
-#: templates/teleforma/course_conference.html:70
-#: templates/teleforma/course_media.html:135
-msgid "Course"
-msgstr "Matière"
-
 #: templates/teleforma/course_conference.html:75
-#: templates/teleforma/course_media.html:141
+#: templates/teleforma/course_media.html:140
+#: templates/teleforma/course_media_video_embed.html:39
 #: templates/teleforma/inc/media_list.html:43
 msgid "Comment"
 msgstr "Commentaire"
 
 #: templates/teleforma/course_conference.html:76
-#: templates/teleforma/course_media.html:142
+#: templates/teleforma/course_media.html:141
+#: templates/teleforma/course_media_video_embed.html:40
 msgid "Begin date"
 msgstr "Date de début"
 
 #: templates/teleforma/course_conference.html:77
-#: templates/teleforma/course_media.html:143
+#: templates/teleforma/course_media.html:142
+#: templates/teleforma/course_media_video_embed.html:41
 msgid "End date"
 msgstr "Date de fin"
 
@@ -802,18 +1061,19 @@ msgid "Live"
 msgstr "Direct"
 
 #: templates/teleforma/course_conference.html:78
-#: templatetags/teleforma_tags.py:132
+#: templatetags/teleforma_tags.py:134
 msgid "Yes"
 msgstr "Oui"
 
 #: templates/teleforma/course_conference.html:79
 #: templates/teleforma/course_conference_audio.html:69
-#: templates/teleforma/course_media.html:144
+#: templates/teleforma/course_media.html:143
+#: templates/teleforma/course_media_video_embed.html:42
 msgid "Room"
 msgstr "Salle"
 
 #: templates/teleforma/course_conference.html:81
-#: templates/teleforma/course_media.html:150
+#: templates/teleforma/course_media.html:149
 msgid "Conference ID"
 msgstr "ID Conférence"
 
@@ -823,7 +1083,7 @@ msgid "Video"
 msgstr ""
 
 #: templates/teleforma/course_conference_audio.html:70
-#: templates/teleforma/inc/conference_list.html:28
+#: templates/teleforma/inc/conference_list.html:30
 #: templates/teleforma/inc/media_list.html:41
 msgid "Begin"
 msgstr "Début"
@@ -832,11 +1092,6 @@ msgstr "Début"
 msgid "End"
 msgstr "Fin"
 
-#: templates/teleforma/course_conference_record.html:30
-#: templates/teleforma/courses.html:107
-msgid "Status"
-msgstr "Status"
-
 #: templates/teleforma/course_conference_record.html:41
 #: templates/teleforma/courses.html:42
 msgid "New conference"
@@ -858,15 +1113,15 @@ msgstr " publié"
 msgid " rejected"
 msgstr " rejeté"
 
-#: templates/teleforma/course_media.html:146
+#: templates/teleforma/course_media.html:145
 msgid "Mime type"
 msgstr "Type mime"
 
-#: templates/teleforma/course_media.html:148
+#: templates/teleforma/course_media.html:147
 msgid "Date modified"
 msgstr "Date de modification"
 
-#: templates/teleforma/course_media.html:149
+#: templates/teleforma/course_media.html:148
 msgid "Media ID"
 msgstr "ID Média"
 
@@ -878,11 +1133,25 @@ msgstr "Mes notes"
 msgid "New note"
 msgstr "Nouvelle note"
 
-#: templates/teleforma/help.html:11 templates/telemeta/base.html:128
-#: templates/telemeta/base.html.py:141
+#: templates/teleforma/help.html:11 templates/telemeta/base.html:136
+#: templates/telemeta/base.html.py:149
 msgid "Help"
 msgstr "Aide"
 
+#: templates/teleforma/media_pending.html:7
+msgid "Peding media"
+msgstr ""
+
+#: templates/teleforma/media_pending.html:27
+#, fuzzy
+msgid "Testimonials"
+msgstr "Attestation"
+
+#: templates/teleforma/media_pending.html:45
+#, fuzzy
+msgid "No testimonial"
+msgstr "attestation"
+
 #: templates/teleforma/inc/conference_list.html:8
 msgid "Live conferences"
 msgstr "Conférences en direct"
@@ -914,39 +1183,39 @@ msgstr "Messagerie"
 msgid "Users"
 msgstr ""
 
-#: templates/telemeta/base.html:120 templates/telemeta/search_criteria.html:69
+#: templates/telemeta/base.html:128 templates/telemeta/search_criteria.html:69
 msgid "Search"
 msgstr ""
 
-#: templates/telemeta/base.html:121
+#: templates/telemeta/base.html:129
 msgid "Collections"
 msgstr ""
 
-#: templates/telemeta/base.html:122
+#: templates/telemeta/base.html:130
 msgid "Items"
 msgstr ""
 
-#: templates/telemeta/base.html:126
+#: templates/telemeta/base.html:134
 msgid "Admin"
 msgstr ""
 
-#: templates/telemeta/base.html:138
+#: templates/telemeta/base.html:146
 msgid "Profile"
 msgstr "Profil"
 
-#: templates/telemeta/base.html:140
+#: templates/telemeta/base.html:148
 msgid "Lists"
 msgstr ""
 
-#: templates/telemeta/base.html:143
+#: templates/telemeta/base.html:151
 msgid "Sign out"
 msgstr ""
 
-#: templates/telemeta/base.html:185
+#: templates/telemeta/base.html:193
 msgid "Powered by"
 msgstr ""
 
-#: templates/telemeta/base.html:195
+#: templates/telemeta/base.html:203
 msgid "Legal notices"
 msgstr ""
 
@@ -966,11 +1235,6 @@ msgstr ""
 msgid "Edit"
 msgstr ""
 
-#: templates/telemeta/lists.html:70
-#: templates/telemeta/inc/module_revisions.html:18
-msgid "Type"
-msgstr ""
-
 #: templates/telemeta/lists.html:71
 msgid "Code"
 msgstr ""
@@ -1029,16 +1293,6 @@ msgstr ""
 msgid "Login as"
 msgstr "Se connecter en tant que"
 
-#: templates/telemeta/profile_detail.html:59
-#: templates/telemeta/inc/user_list.html:20
-msgid "First Name"
-msgstr ""
-
-#: templates/telemeta/profile_detail.html:60
-#: templates/telemeta/inc/user_list.html:19
-msgid "Last Name"
-msgstr ""
-
 #: templates/telemeta/profile_detail.html:61
 msgid "Username"
 msgstr "Nom d'utilisateur"
@@ -1058,12 +1312,12 @@ msgid "Procedure"
 msgstr "Procédure"
 
 #: templates/telemeta/profile_detail.html:68
-#: templates/telemeta/inc/user_list.html:24
+#: templates/telemeta/inc/user_list.html:25
 msgid "Oral spe"
 msgstr "Oral Spé"
 
 #: templates/telemeta/profile_detail.html:69
-#: templates/telemeta/inc/user_list.html:25
+#: templates/telemeta/inc/user_list.html:24
 msgid "Written spe"
 msgstr "Ecrit Spé"
 
@@ -1149,19 +1403,19 @@ msgstr ""
 msgid "Unknown"
 msgstr ""
 
-#: templatetags/teleforma_tags.py:61
+#: templatetags/teleforma_tags.py:63
 msgid "General tweeter"
 msgstr "Tweeter général"
 
-#: templatetags/teleforma_tags.py:62
+#: templatetags/teleforma_tags.py:64
 msgid "Local tweeter"
 msgstr "Tweeter local"
 
-#: templatetags/teleforma_tags.py:127
+#: templatetags/teleforma_tags.py:129
 msgid "me"
 msgstr "moi"
 
-#: templatetags/teleforma_tags.py:134
+#: templatetags/teleforma_tags.py:136
 msgid "No"
 msgstr "Non"
 
@@ -1176,7 +1430,7 @@ msgstr ""
 "Merci de vous connecter ou bien contactez l'administateur du site pour "
 "obtenir un accès privé."
 
-#: views/core.py:205
+#: views/core.py:218
 msgid ""
 "You do NOT have access to this resource and then have been redirected to "
 "your desk."
@@ -1184,17 +1438,13 @@ msgstr ""
 "Vous n'avez pas accès à cette ressource et avez été redirigé vers votre "
 "bureau."
 
-#: views/core.py:495
+#: views/core.py:546
 msgid "A new live conference has started : "
 msgstr "Une nouvelle conférence en direct a commencé : "
 
 #~ msgid "AE students"
 #~ msgstr "Etudiants AE"
 
-#, fuzzy
-#~ msgid "types"
-#~ msgstr "type"
-
 #~ msgid "Training"
 #~ msgstr "Formation"
 
@@ -1207,9 +1457,6 @@ msgstr "Une nouvelle conférence en direct a commencé : "
 #~ msgid "payment"
 #~ msgstr "paiement"
 
-#~ msgid "Reject"
-#~ msgstr "Rejeter"
-
 #~ msgid "is live"
 #~ msgstr "en direct"
 
@@ -1222,9 +1469,6 @@ msgstr "Une nouvelle conférence en direct a commencé : "
 #~ msgid "Duration"
 #~ msgstr "Durée"
 
-#~ msgid "Messages"
-#~ msgstr "Messages"
-
 #~ msgid "obligation"
 #~ msgstr "obligation"
 
index e255cc2a20abc164f084b50836e5e41f54b79360..dcba699906ca9421ee08f7053407bbd5edbdb5c9 100644 (file)
@@ -113,6 +113,14 @@ alt="logo" />
   <li><a href="{% url teleforma-annals %}" class="yellow">{% trans "Annals" %}</a></li>
  {% endif %}
 
+    <li><a href="#scripts#" class="green">&nbsp;{% trans "Scripts" %}&nbsp;{% untreated_scripts_count user.username %}</a>
+      <ul>
+       {% for period in periods %}
+        <li><a href="{% url teleforma-exam-scripts-pending period.id %}" class="green">{{ period.name }}</a></li>
+       {% endfor %}
+      </ul>
+    </li>
+
  {% if user.is_authenticated %}
   {% if user.is_staff %}
    <li><a href="#archives#" class="green">{% trans "Archives" %}</a>
index ed7a60e1e6585a5cd12619fea8b08a21e2a1d518..e4903de66795fd5a80c908b4e68d76daa553483c 100644 (file)
@@ -34,7 +34,6 @@
 
 from django import template
 from django.utils.http import urlquote
-from teleforma.models import *
 from django.core.urlresolvers import reverse
 from django.utils import html
 from django import template
@@ -52,9 +51,12 @@ from django.template.defaultfilters import stringfilter
 import django.utils.timezone as timezone
 from timezones.utils import localtime_for_timezone
 from django.utils.translation import ugettext_lazy as _
-from teleforma.views import get_courses
 from urlparse import urlparse
 
+from teleforma.views import get_courses
+from teleforma.models import *
+from teleforma.exam.models import *
+
 register = template.Library()
 
 # more translations for template variables
@@ -205,3 +207,12 @@ def get_host(url, host):
 def published(doc):
     if doc:
         return doc.filter(is_published=True)
+
+@register.simple_tag
+def untreated_scripts_count(username):
+    user = User.objects.get(username=username)
+    scripts = Script.objects.filter(Q(status=3, author=user) | Q(status=3, corrector=user))
+    if scripts:
+        return ' (' + str(len(scripts)) + ')'
+    else:
+        return ''