--- /dev/null
+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']
--- /dev/null
+# -*- 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
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'
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/'
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 = []
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)
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:
--- /dev/null
+{% load i18n %}
+{% load telemeta_utils %}
+{% load teleforma_tags %}
+{% load pagination_tags %}
+
+{% autopaginate object_list 8 %}
+{% paginate %}
+
+<div id="users">
+ <table class="listing" width="100%">
+ <thead>
+ <tr><th>{% trans "Last Name"%}</th>
+ <th>{% trans "First Name"%}</th>
+ <th>{% trans "Course"%}</th>
+ <th>{% trans "Session"%}</th>
+ <th>{% trans "Type"%}</th>
+ <th>{% trans "Submission date"%}</th>
+ <th>{% trans "Mark date"%}</th>
+ <th>{% trans "Score"%}</th>
+ </tr>
+ </thead>
+ <tbody id="spacing">
+ {% for script in object_list %}
+ <tr>
+ <td><a href="{% url teleforma-profile-detail script.author.username %}">{{ script.author.last_name }}</a></td>
+ <td><a href="{% url teleforma-profile-detail script.author.username %}">{{ script.author.first_name }}</a></td>
+ <td><a href="{% url teleforma-exam-script-detail period.id script.id %}">{{ script.course.title }}</a></td>
+ <td><a href="{% url teleforma-exam-script-detail period.id script.id %}">{{ script.session }}</a></td>
+ <td><a href="{% url teleforma-exam-script-detail period.id script.id %}">{{ script.type }}</a></td>
+ <td><a href="{% url teleforma-exam-script-detail period.id script.id %}">{{ script.date_submitted }}</a></td>
+ <td><a href="{% url teleforma-exam-script-detail period.id script.id %}">{{ script.date_marked }}</a></td>
+ <td><a href="{% url teleforma-exam-script-detail period.id script.id %}">{{ script.score }}</a></td>
+ </tr>
+ {% endfor %}
+ </tbody>
+ </table>
+</div>
--- /dev/null
+marked
\ No newline at end of file
--- /dev/null
+rejected
\ No newline at end of file
{% load thumbnail %}
{% block extra_javascript %}
+ <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
+ <script src="//code.jquery.com/jquery-1.10.2.js"></script>
+ <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
+
+ <script>
+ // increase the default animation speed to exaggerate the effect
+
+ $(function() {
+ $( "#dialog_mark" ).dialog({
+ autoOpen: false,
+ draggable: false,
+ resizable: false,
+ modal: true,
+
+ });
+
+ $( "#dialog_reject" ).dialog({
+ autoOpen: false,
+ draggable: false,
+ resizable: false,
+ modal: true,
+
+ });
+
+ $( "#opener_mark" ).click(function() {
+ $( "#dialog_mark" ).dialog({ width: 500 });
+ $( "#dialog_mark" ).dialog( "open");
+ return false;
+ });
+
+ $( "#opener_reject" ).click(function() {
+ $( "#dialog_reject" ).dialog( "open");
+ return false;
+ });
+
+ var b1 = $('#validate_button');
+ b1.unbind('click').click(function() {
+ $(window).unbind('beforeunload');
+ b1.unbind('click');
+ $('#_MarkForm #id_status').val("4");
+ $('#_MarkForm').submit();
+ });
+
+ var b2 = $('#reject_button');
+ b2.unbind('click').click(function() {
+ $(window).unbind('beforeunload');
+ b2.unbind('click');
+ $('#_RejectForm #id_status').val("0");
+ $('#_RejectForm').submit();
+ });
+
+ });
+
+ function SetValues()
+ {
+ var s = 'X=' + window.event.clientX + ' Y=' + window.event.clientY ;
+ document.getElementById('divCoord').innerText = s;
+
+ }
+ </script>
{% endblock extra_javascript %}
<a href="{% url teleforma-desk-period-course period.id script.course.id %}">{{ course.title }} - {{ script.type }}{% if script.session %} - {% trans "Session" %} {{ script.session }}{% endif %} - {{ script.author.first_name }} {{ script.author.last_name }} - {{ script.date_submitted }}</a>
<div style="float: right; font-size: 0.9em;">
- <a id="publish" href="#" class="{% if script.score %}component_icon button icon_ok{% else %}component_icon button icon_delete{% endif %}">{% trans "Score : " %}{% if script.score %}{{ script.score|floatformat }}{% else %} {% endif %}/20</a>
- <a id="publish" href="#" class="{% if script.status == 4 %}component_icon button icon_ok{% else %}component_icon button icon_delete{% endif %}">{% if script.status == 4 %}{% trans " corrected" %}{% else %}{% trans " pending" %}{% endif %}</a>
+
+ {% if script.score %}
+ <a id="score" href="#" class="component_icon button icon_ok">{% trans "Score" %} : {{ script.score|floatformat }}/20</a>
+ {% elif script.status == 0 %}
+ <a href="#" class="component_icon button icon_delete">{% trans "Rejected" %}</a>
+ {% else %}
+ <a id="opener_mark" href="#" class="component_icon button icon_edit">{% trans "Mark" %}</a>
+ <a id="opener_reject" href="#" class="component_icon button icon_delete">{% trans "Reject" %}</a>
+ {% endif %}
</div>
</div>
+<div id="dialog_mark" title="{% trans "Mark" %}" style="width: 400px;">
+ <form method="post" id="_MarkForm" action="">{% csrf_token %}
+ <table>
+ <tr><td colspan="2">{% for error in form.non_field_errors %}<li class="error">{{ error }}</li>{% endfor %}</td></tr>
+ {% for field in form %}
+ <tr>
+ {% if not field.html_name in mark_fields %}
+ <td>{{ field.label_tag.as_hidden }}</td><td>{{ field.as_hidden }}</td>
+ {% else %}
+ <tr><td class="error">{{ field.errors }}</td></tr>
+ <td>{{ field.label_tag }}:</td><td> {{ field }}</td>
+ {% endif %}
+ </tr>
+ {% endfor %}
+ </table>
+ </form>
+ <br />
+ <a href="#" id="validate_button" class="component_icon button icon_ok">{% trans "Validate" %}</a>
+
+</div>
+
+<div id="dialog_reject" title="{% trans "Reject" %}">
+<form method="post" id="_RejectForm" action="">{% csrf_token %}
+ <table>
+ <tr><td colspan="2">{% for error in form.non_field_errors %}<li class="error">{{ error }}</li>{% endfor %}</td></tr>
+ {% for field in form %}
+ <tr>
+ {% if not field.html_name in reject_fields %}
+ <td>{{ field.label_tag.as_hidden }}</td><td>{{ field.as_hidden }}</td>
+ {% else %}
+ <tr><td class="error">{{ field.errors }}</td></tr>
+ <td>{{ field.label_tag }}:</td><td> {{ field }}</td>
+ {% endif %}
+ </tr>
+ {% endfor %}
+ </table>
+ </form>
+ <br />
+ <a href="#" id="reject_button" class="component_icon button icon_delete">{% trans "Reject" %}</a>
+</div>
+
+
{% if access_error %}
<p>{{ access_error }}</p>
<p>{{ message }}</p>
{% else %}
<div class="media">
<div class="script">
- <iframe style="position:fixed; top:14%; left:0px; bottom:0px; right:0px; width:100%; height:85%; border:none; margin:0; padding:0; overflow:hidden; z-index:999999;" src="{{ script.box_admin_url }}">
+ <iframe style="position:fixed; top:14%; left:0px; bottom:0px; right:0px; width:100%; height:85%; border:none; margin:0; padding:0; z-index:0;" src="{{ script.box_admin_url }}">
</iframe>
</div>
</div>
--- /dev/null
+{% extends "telemeta/base.html" %}
+{% load i18n %}
+{% load telemeta_utils %}
+{% load teleforma_tags %}
+
+{% block head_title %}{% trans "Answers" %} - {{ block.super }}{% endblock %}
+
+{% block title %}
+{% endblock %}
+
+
+{% block infra_javascript %}
+{% endblock infra_javascript %}
+
+{% block content %}
+
+<div id="module-set-left" style="width: 18%">
+
+{% block modules %}
+<div class="module">
+<h3><a href="{% url teleforma-desk %}"><img src="{{ STATIC_URL }}telemeta/images/module_playlist.png" alt="playlists" style="vertical-align:middle" />{% trans "Scripts" %}</a></h3>
+ <div style="background: white;">
+ <ul>
+ {% block courses %}
+ <li><a href="{% url teleforma-exam-scripts-pending period.id %}">{% trans "Pending" %}{% untreated_scripts_count user.username %}</a></li>
+ <li><a href="{% url teleforma-exam-scripts-treated period.id %}">{% trans "Treated" %}</a></li>
+ <li><a href="{% url teleforma-exam-scripts-rejected period.id %}">{% trans "Rejected" %}</a></li>
+ {% endblock courses %}
+ </ul>
+ </div>
+</div>
+{% endblock modules %}
+
+</div>
+
+<div class="desk_messages">
+
+{% if user.is_staff %}
+<div style="float:right;">
+</div>
+{% endif %}
+
+{% block answers %}
+<div class="course_title">{% trans "Scripts" %}</div>
+<br />
+ {% if object_list %}
+ {% include "exam/inc/script_list.html" %}
+ {% else %}
+ <p class="help">{% trans "No scripts" %}</p>
+ {% endif %}
+</div>
+{% endblock answers %}
+
+{% endblock %}
url(r'^desk/periods/(?P<period_id>.*)/exam/script/(?P<pk>.*)/detail/$', ScriptView.as_view(),
name="teleforma-exam-script-detail"),
+ url(r'^desk/periods/(?P<period_id>.*)/exam/scripts/list/$', ScriptsView.as_view(),
+ name="teleforma-exam-script-list"),
+
+ url(r'^desk/periods/(?P<period_id>.*)/exam/scripts_pending/$', ScriptsPendingView.as_view(), name="teleforma-exam-scripts-pending"),
+ url(r'^desk/periods/(?P<period_id>.*)/exam/scripts_treated/$', ScriptsTreatedView.as_view(), name="teleforma-exam-scripts-treated"),
+ url(r'^desk/periods/(?P<period_id>.*)/exam/scripts_rejected/$', ScriptsRejectedView.as_view(), name="teleforma-exam-scripts-rejected"),
+
)
# 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
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']
+
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-07-22 22:04+0200\n"
+"POT-Creation-Date: 2014-06-12 14:39+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Guillaume Pellerin <yomguy@parisson.com>\n"
"Language-Team: LANGUAGE <lists@parisson.com>\n"
"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"
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"
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 ""
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 ""
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 ""
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 ""
msgid "Message"
msgstr "Messages"
-#: templates/postman/view.html:25
-#, fuzzy
-msgid "Rejected"
-msgstr "rejeté"
-
#: templates/postman/view.html:25
msgid ":"
msgstr ""
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"
#: 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"
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"
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"
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"
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"
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"
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"
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"
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 ""
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 ""
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"
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é"
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"
"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."
"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"
#~ msgid "payment"
#~ msgstr "paiement"
-#~ msgid "Reject"
-#~ msgstr "Rejeter"
-
#~ msgid "is live"
#~ msgstr "en direct"
#~ msgid "Duration"
#~ msgstr "Durée"
-#~ msgid "Messages"
-#~ msgstr "Messages"
-
#~ msgid "obligation"
#~ msgstr "obligation"
<li><a href="{% url teleforma-annals %}" class="yellow">{% trans "Annals" %}</a></li>
{% endif %}
+ <li><a href="#scripts#" class="green"> {% trans "Scripts" %} {% untreated_scripts_count user.username %}</a>
+ <ul>
+ {% for period in periods %}
+ <li><a href="{% url teleforma-exam-scripts-pending period.id %}" class="green">{{ period.name }}</a></li>
+ {% endfor %}
+ </ul>
+ </li>
+
{% if user.is_authenticated %}
{% if user.is_staff %}
<li><a href="#archives#" class="green">{% trans "Archives" %}</a>
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
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
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 ''