From: Guillaume Pellerin Date: Thu, 12 Jun 2014 21:36:22 +0000 (+0200) Subject: Add some Script views and workflow X-Git-Tag: 1.1~482 X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=744e5dc9dd6043a3b98e68dcc9357936e0416624;p=teleforma.git Add some Script views and workflow --- 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 9a6df9e5..571834f2 100644 Binary files a/teleforma/locale/fr/LC_MESSAGES/django.mo and b/teleforma/locale/fr/LC_MESSAGES/django.mo differ diff --git a/teleforma/locale/fr/LC_MESSAGES/django.po b/teleforma/locale/fr/LC_MESSAGES/django.po index bddeb09e..7bfab6ad 100644 --- a/teleforma/locale/fr/LC_MESSAGES/django.po +++ b/teleforma/locale/fr/LC_MESSAGES/django.po @@ -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 \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 ''