From 744e5dc9dd6043a3b98e68dcc9357936e0416624 Mon Sep 17 00:00:00 2001 From: Guillaume Pellerin Date: Thu, 12 Jun 2014 23:36:22 +0200 Subject: [PATCH] Add some Script views and workflow --- teleforma/exam/forms.py | 15 + ...rected__add_field_script_date_marked__a.py | 193 ++++++ teleforma/exam/models.py | 81 ++- .../exam/templates/exam/inc/script_list.html | 37 ++ .../templates/exam/messages/script_marked.txt | 1 + .../exam/messages/script_rejected.txt | 1 + .../exam/templates/exam/script_detail.html | 115 +++- teleforma/exam/templates/exam/scripts.html | 54 ++ teleforma/exam/urls.py | 7 + teleforma/exam/views.py | 67 +- teleforma/locale/fr/LC_MESSAGES/django.mo | Bin 8273 -> 9698 bytes teleforma/locale/fr/LC_MESSAGES/django.po | 592 +++++++++++++----- teleforma/templates/telemeta/base.html | 8 + teleforma/templatetags/teleforma_tags.py | 15 +- 14 files changed, 981 insertions(+), 205 deletions(-) create mode 100644 teleforma/exam/forms.py create mode 100644 teleforma/exam/migrations/0014_auto__del_field_script_date_corrected__add_field_script_date_marked__a.py create mode 100644 teleforma/exam/templates/exam/inc/script_list.html create mode 100644 teleforma/exam/templates/exam/messages/script_marked.txt create mode 100644 teleforma/exam/templates/exam/messages/script_rejected.txt create mode 100644 teleforma/exam/templates/exam/scripts.html diff --git a/teleforma/exam/forms.py b/teleforma/exam/forms.py new file mode 100644 index 00000000..6550d74a --- /dev/null +++ b/teleforma/exam/forms.py @@ -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 index 00000000..b9d8ff2c --- /dev/null +++ b/teleforma/exam/migrations/0014_auto__del_field_script_date_corrected__add_field_script_date_marked__a.py @@ -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 diff --git a/teleforma/exam/models.py b/teleforma/exam/models.py index c0ebe261..b1c909fd 100644 --- a/teleforma/exam/models.py +++ b/teleforma/exam/models.py @@ -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 index 00000000..4246e224 --- /dev/null +++ b/teleforma/exam/templates/exam/inc/script_list.html @@ -0,0 +1,37 @@ +{% load i18n %} +{% load telemeta_utils %} +{% load teleforma_tags %} +{% load pagination_tags %} + +{% autopaginate object_list 8 %} +{% paginate %} + +
+ + + + + + + + + + + + + + {% for script in object_list %} + + + + + + + + + + + {% endfor %} + +
{% trans "Last Name"%}{% trans "First Name"%}{% trans "Course"%}{% trans "Session"%}{% trans "Type"%}{% trans "Submission date"%}{% trans "Mark date"%}{% trans "Score"%}
{{ script.author.last_name }}{{ script.author.first_name }}{{ script.course.title }}{{ script.session }}{{ script.type }}{{ script.date_submitted }}{{ script.date_marked }}{{ script.score }}
+
diff --git a/teleforma/exam/templates/exam/messages/script_marked.txt b/teleforma/exam/templates/exam/messages/script_marked.txt new file mode 100644 index 00000000..837fad49 --- /dev/null +++ b/teleforma/exam/templates/exam/messages/script_marked.txt @@ -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 index 00000000..25ce34cf --- /dev/null +++ b/teleforma/exam/templates/exam/messages/script_rejected.txt @@ -0,0 +1 @@ +rejected \ No newline at end of file diff --git a/teleforma/exam/templates/exam/script_detail.html b/teleforma/exam/templates/exam/script_detail.html index 981e073c..83104d70 100644 --- a/teleforma/exam/templates/exam/script_detail.html +++ b/teleforma/exam/templates/exam/script_detail.html @@ -5,6 +5,66 @@ {% load thumbnail %} {% block extra_javascript %} + + + + + {% endblock extra_javascript %} @@ -18,13 +78,62 @@ {{ course.title }} - {{ script.type }}{% if script.session %} - {% trans "Session" %} {{ script.session }}{% endif %} - {{ script.author.first_name }} {{ script.author.last_name }} - {{ script.date_submitted }}
- {% trans "Score : " %}{% if script.score %}{{ script.score|floatformat }}{% else %} {% endif %}/20 - {% if script.status == 4 %}{% trans " corrected" %}{% else %}{% trans " pending" %}{% endif %} + + {% if script.score %} + {% trans "Score" %} : {{ script.score|floatformat }}/20 + {% elif script.status == 0 %} + {% trans "Rejected" %} + {% else %} + {% trans "Mark" %} + {% trans "Reject" %} + {% endif %}
+
+
{% csrf_token %} + + + {% for field in form %} + + {% if not field.html_name in mark_fields %} + + {% else %} + + + {% endif %} + + {% endfor %} +
{% for error in form.non_field_errors %}
  • {{ error }}
  • {% endfor %}
    {{ field.label_tag.as_hidden }}{{ field.as_hidden }}
    {{ field.errors }}
    {{ field.label_tag }}: {{ field }}
    +
    +
    + {% trans "Validate" %} + +
    + +
    +
    {% csrf_token %} + + + {% for field in form %} + + {% if not field.html_name in reject_fields %} + + {% else %} + + + {% endif %} + + {% endfor %} +
    {% for error in form.non_field_errors %}
  • {{ error }}
  • {% endfor %}
    {{ field.label_tag.as_hidden }}{{ field.as_hidden }}
    {{ field.errors }}
    {{ field.label_tag }}: {{ field }}
    +
    +
    + {% trans "Reject" %} +
    + + {% if access_error %}

    {{ access_error }}

    {{ message }}

    @@ -32,7 +141,7 @@ {% else %}
    -
    diff --git a/teleforma/exam/templates/exam/scripts.html b/teleforma/exam/templates/exam/scripts.html new file mode 100644 index 00000000..0d3de6b9 --- /dev/null +++ b/teleforma/exam/templates/exam/scripts.html @@ -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 %} + +
    + +{% block modules %} + +{% endblock modules %} + +
    + +
    + +{% if user.is_staff %} +
    +
    +{% endif %} + +{% block answers %} +
    {% trans "Scripts" %}
    +
    + {% if object_list %} + {% include "exam/inc/script_list.html" %} + {% else %} +

    {% trans "No scripts" %}

    + {% endif %} +
    +{% endblock answers %} + +{% endblock %} diff --git a/teleforma/exam/urls.py b/teleforma/exam/urls.py index 8d7aa44d..e794ac28 100644 --- a/teleforma/exam/urls.py +++ b/teleforma/exam/urls.py @@ -46,4 +46,11 @@ urlpatterns = patterns('', url(r'^desk/periods/(?P.*)/exam/script/(?P.*)/detail/$', ScriptView.as_view(), name="teleforma-exam-script-detail"), + url(r'^desk/periods/(?P.*)/exam/scripts/list/$', ScriptsView.as_view(), + name="teleforma-exam-script-list"), + + url(r'^desk/periods/(?P.*)/exam/scripts_pending/$', ScriptsPendingView.as_view(), name="teleforma-exam-scripts-pending"), + url(r'^desk/periods/(?P.*)/exam/scripts_treated/$', ScriptsTreatedView.as_view(), name="teleforma-exam-scripts-treated"), + url(r'^desk/periods/(?P.*)/exam/scripts_rejected/$', ScriptsRejectedView.as_view(), name="teleforma-exam-scripts-rejected"), + ) diff --git a/teleforma/exam/views.py b/teleforma/exam/views.py index 2c556289..c0a4c8c1 100644 --- a/teleforma/exam/views.py +++ b/teleforma/exam/views.py @@ -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'] + diff --git a/teleforma/locale/fr/LC_MESSAGES/django.mo b/teleforma/locale/fr/LC_MESSAGES/django.mo index 9a6df9e5771586dc0d638be568e64ab88cd36315..571834f25d8589fed157f29a618d9ee3feaf2e19 100644 GIT binary patch literal 9698 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\n" "Language-Team: LANGUAGE \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" diff --git a/teleforma/templates/telemeta/base.html b/teleforma/templates/telemeta/base.html index e255cc2a..dcba6999 100644 --- a/teleforma/templates/telemeta/base.html +++ b/teleforma/templates/telemeta/base.html @@ -113,6 +113,14 @@ alt="logo" />
  • {% trans "Annals" %}
  • {% endif %} +
  •  {% trans "Scripts" %} {% untreated_scripts_count user.username %} + +
  • + {% if user.is_authenticated %} {% if user.is_staff %}
  • {% trans "Archives" %} diff --git a/teleforma/templatetags/teleforma_tags.py b/teleforma/templatetags/teleforma_tags.py index ed7a60e1..e4903de6 100644 --- a/teleforma/templatetags/teleforma_tags.py +++ b/teleforma/templatetags/teleforma_tags.py @@ -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 '' -- 2.39.5