From 0b270a5b1cfeefeff9663764e716d633bf7382a4 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aleksander=20=C5=81ukasz?= Date: Thu, 7 Nov 2013 16:17:47 +0100 Subject: [PATCH] Allow for manual marking of question of type "file_upload" --- wtem/admin.py | 30 ++++-- wtem/forms.py | 2 +- ..._name__add_field_attachment_exercise_id.py | 101 ++++++++++++++++++ wtem/models.py | 2 +- .../templates/wtem/exercises/file_upload.html | 2 +- 5 files changed, 127 insertions(+), 10 deletions(-) create mode 100644 wtem/migrations/0006_auto__del_field_attachment_name__add_field_attachment_exercise_id.py diff --git a/wtem/admin.py b/wtem/admin.py index 89389c1..a101cad 100644 --- a/wtem/admin.py +++ b/wtem/admin.py @@ -5,9 +5,10 @@ import os from django.contrib import admin from django import forms from django.utils import simplejson +from django.utils.safestring import mark_safe from django.core.urlresolvers import reverse -from .models import Submission, Assignment +from .models import Submission, Assignment, Attachment from .middleware import get_current_request @@ -22,6 +23,9 @@ def get_user_exercises(user): readonly_fields = ('submitted_by', 'first_name', 'last_name', 'email', 'key', 'key_sent') +class AttachmentWidget(forms.Widget): + def render(self, name, value, *args, **kwargs): + return mark_safe('%s' % (value, value)) class SubmissionFormBase(forms.ModelForm): class Meta: @@ -67,13 +71,25 @@ def get_form(request, submission): for exercise in exercises: if exercise not in user_exercises: continue - if exercise['type'] == 'open' or exercise.get('open_part', None): - answer_field_name = 'exercise_%s' % exercise['id'] - mark_field_name = 'markof_%s_by_%s' % (exercise['id'], request.user.id) + + answer_field_name = 'exercise_%s' % exercise['id'] + mark_field_name = 'markof_%s_by_%s' % (exercise['id'], request.user.id) + if exercise['type'] in ('open', 'file_upload') or exercise.get('open_part', None): + if exercise['type'] == 'file_upload': + try: + attachment = Attachment.objects.get(submission = submission, exercise_id = exercise['id']) + except Attachment.DoesNotExist: + attachment = None + widget = AttachmentWidget + initial = attachment.file.url if attachment else None + else: + widget = forms.Textarea(attrs={'readonly':True}) + initial = get_open_answer(answers, exercise) + fields[answer_field_name] = forms.CharField( - widget = forms.Textarea(attrs={'readonly':True}), - initial = get_open_answer(answers, exercise), - label = 'Rozwiązanie zadania %s' % exercise['id'] + widget = widget, + initial = initial, + label = 'Rozwiązanie zadania %s' % exercise['id'] ) fields[mark_field_name] = forms.ChoiceField( diff --git a/wtem/forms.py b/wtem/forms.py index 61e1d7c..9555c72 100644 --- a/wtem/forms.py +++ b/wtem/forms.py @@ -22,7 +22,7 @@ class WTEMForm(forms.ModelForm): for exercise in exercises: if exercise['type'] != 'file_upload': continue - self.fields['attachment_' + exercise['name']] = forms.FileField(required = False) + self.fields['attachment_for_' + str(exercise['id'])] = forms.FileField(required = False) def save(self): submission = super(WTEMForm, self).save() diff --git a/wtem/migrations/0006_auto__del_field_attachment_name__add_field_attachment_exercise_id.py b/wtem/migrations/0006_auto__del_field_attachment_name__add_field_attachment_exercise_id.py new file mode 100644 index 0000000..ff72499 --- /dev/null +++ b/wtem/migrations/0006_auto__del_field_attachment_name__add_field_attachment_exercise_id.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Deleting field 'Attachment.name' + db.delete_column(u'wtem_attachment', 'name') + + # Adding field 'Attachment.exercise_id' + db.add_column(u'wtem_attachment', 'exercise_id', + self.gf('django.db.models.fields.IntegerField')(default=None), + keep_default=False) + + + def backwards(self, orm): + + # User chose to not deal with backwards NULL issues for 'Attachment.name' + raise RuntimeError("Cannot reverse this migration. 'Attachment.name' and its values cannot be restored.") + # Deleting field 'Attachment.exercise_id' + db.delete_column(u'wtem_attachment', 'exercise_id') + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'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': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'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': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}), + u'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': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'contact.contact': { + 'Meta': {'ordering': "('-created_at',)", 'object_name': 'Contact'}, + 'body': ('jsonfield.fields.JSONField', [], {'default': '{}'}), + 'contact': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'form_tag': ('django.db.models.fields.CharField', [], {'max_length': '32', 'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}) + }, + u'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'}), + u'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'}) + }, + u'wtem.assignment': { + 'Meta': {'object_name': 'Assignment'}, + 'exercises': ('jsonfield.fields.JSONField', [], {'default': '{}'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'unique': 'True'}) + }, + u'wtem.attachment': { + 'Meta': {'object_name': 'Attachment'}, + 'exercise_id': ('django.db.models.fields.IntegerField', [], {}), + 'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'submission': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['wtem.Submission']"}) + }, + u'wtem.submission': { + 'Meta': {'object_name': 'Submission'}, + 'answers': ('django.db.models.fields.CharField', [], {'max_length': '65536', 'null': 'True', 'blank': 'True'}), + 'contact': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contact.Contact']", 'null': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'unique': 'True', 'max_length': '100'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}), + 'key_sent': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'marks': ('jsonfield.fields.JSONField', [], {'default': '{}'}) + } + } + + complete_apps = ['wtem'] \ No newline at end of file diff --git a/wtem/models.py b/wtem/models.py index 4c91392..bef8b7c 100644 --- a/wtem/models.py +++ b/wtem/models.py @@ -66,7 +66,7 @@ class Submission(models.Model): class Attachment(models.Model): submission = models.ForeignKey(Submission) - name = models.CharField(max_length=100) + exercise_id = models.IntegerField() file = models.FileField(upload_to = 'wtem/attachment') diff --git a/wtem/templates/wtem/exercises/file_upload.html b/wtem/templates/wtem/exercises/file_upload.html index e3add7b..78ce64f 100644 --- a/wtem/templates/wtem/exercises/file_upload.html +++ b/wtem/templates/wtem/exercises/file_upload.html @@ -11,7 +11,7 @@
- +
-- 2.20.1