Commit 8d1bb9e6 by Xavier Antoviaque

Add ability to share answers between XBlocks, using Django models

parent a63d4d60
...@@ -9,6 +9,8 @@ from xblock.core import XBlock ...@@ -9,6 +9,8 @@ from xblock.core import XBlock
from xblock.fields import Any, Scope from xblock.fields import Any, Scope
from xblock.fragment import Fragment from xblock.fragment import Fragment
from .models import Answer
# Globals ########################################################### # Globals ###########################################################
...@@ -25,13 +27,21 @@ class AnswerBlock(XBlock): ...@@ -25,13 +27,21 @@ class AnswerBlock(XBlock):
to make them searchable and referenceable across xblocks. to make them searchable and referenceable across xblocks.
""" """
student_input = Any(help="Last input submitted by the student", default="", scope=Scope.user_state) student_input = Any(help="Last input submitted by the student", default="", scope=Scope.user_state)
def __init__(self, *args, **kwargs):
super(AnswerBlock, self).__init__(*args, **kwargs)
if self.name:
self.student_input = self.get_model_object().student_input
def student_view(self, context=None): # pylint: disable=W0613 def student_view(self, context=None): # pylint: disable=W0613
"""Returns default student view.""" """Returns default student view."""
return Fragment(u"<p>I can only appear inside problems.</p>") return Fragment(u"<p>I can only appear inside problems.</p>")
def mentoring_view(self, context=None): def mentoring_view(self, context=None):
html = u'<textarea cols="100" rows="10" name="input">{}</textarea>'.format(self.student_input) html = u'<textarea cols="100" rows="10" maxlength="{}" name="input">{}</textarea>'.format(
Answer._meta.get_field('student_input').max_length,
self.student_input)
fragment = Fragment(html) fragment = Fragment(html)
fragment.add_javascript(""" fragment.add_javascript("""
function AnswerBlock(runtime, element) { function AnswerBlock(runtime, element) {
...@@ -53,3 +63,25 @@ class AnswerBlock(XBlock): ...@@ -53,3 +63,25 @@ class AnswerBlock(XBlock):
log.info(u'Answer submitted for`{}`: "{}"'.format(self.name, self.student_input)) log.info(u'Answer submitted for`{}`: "{}"'.format(self.name, self.student_input))
return self.student_input return self.student_input
def save(self):
"""
Replicate data changes on the related Django model used for sharing of data accross XBlocks
"""
super(AnswerBlock, self).save()
answer_data = self.get_model_object()
if answer_data.student_input != self.student_input:
answer_data.student_input = self.student_input
answer_data.save()
def get_model_object(self):
if not self.name:
raise ValueError, 'AnswerBlock.name field need to be set to a non-null/empty value'
# TODO Use a random user id
student_id = self.scope_ids.user_id
answer_data, created = Answer.objects.get_or_create(
student_id=student_id,
name=self.name
)
return answer_data
# -*- 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):
# Adding model 'Answer'
db.create_table('mentoring_answer', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=20, db_index=True)),
('student_id', self.gf('django.db.models.fields.CharField')(max_length=20, db_index=True)),
('student_input', self.gf('django.db.models.fields.CharField')(max_length=10000)),
('created_on', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)),
('modified_on', self.gf('django.db.models.fields.DateTimeField')(auto_now=True, blank=True)),
))
db.send_create_signal('mentoring', ['Answer'])
# Adding unique constraint on 'Answer', fields ['student_id', 'name']
db.create_unique('mentoring_answer', ['student_id', 'name'])
def backwards(self, orm):
# Removing unique constraint on 'Answer', fields ['student_id', 'name']
db.delete_unique('mentoring_answer', ['student_id', 'name'])
# Deleting model 'Answer'
db.delete_table('mentoring_answer')
models = {
'mentoring.answer': {
'Meta': {'unique_together': "(('student_id', 'name'),)", 'object_name': 'Answer'},
'created_on': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'modified_on': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '20', 'db_index': 'True'}),
'student_id': ('django.db.models.fields.CharField', [], {'max_length': '20', 'db_index': 'True'}),
'student_input': ('django.db.models.fields.CharField', [], {'max_length': '10000'})
}
}
complete_apps = ['mentoring']
\ No newline at end of file
...@@ -3,6 +3,10 @@ from django.db import models ...@@ -3,6 +3,10 @@ from django.db import models
class Answer(models.Model): class Answer(models.Model):
class Meta: class Meta:
app_label = 'mentoring' app_label = 'mentoring'
unique_together = (('student_id', 'name'),)
text = models.CharField(max_length=2000) name = models.CharField(max_length=20, db_index=True)
pub_date = models.DateTimeField('date published', auto_now_add=True) student_id = models.CharField(max_length=20, db_index=True)
student_input = models.CharField(max_length=10000)
created_on = models.DateTimeField('created on', auto_now_add=True)
modified_on = models.DateTimeField('modified on', auto_now=True)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment