Commit c6a73bfe by Joe Blaylock Committed by Stephen Sanchez

WIP: Data went in, but doesn't any more

* remaining items:
 - replace submission fk w/ m2m on peerworkflowitem
 - complete move
 - initialize feedback box, grayed out
 - tests

* TODO: incomplete move, usage still in submissions api
parent 376a7bd8
from django.contrib import admin
from openassessment.assessment.models import Assessment, AssessmentPart, Rubric, Criterion, CriterionOption, PeerWorkflow, PeerWorkflowItem
from openassessment.assessment.models import Assessment, AssessmentFeedback, AssessmentPart, Rubric, Criterion, CriterionOption, PeerWorkflow, PeerWorkflowItem
admin.site.register(Assessment)
admin.site.register(AssessmentPart)
......@@ -10,3 +10,4 @@ admin.site.register(CriterionOption)
admin.site.register(PeerWorkflow)
admin.site.register(PeerWorkflowItem)
admin.site.register(AssessmentFeedback)
......@@ -439,3 +439,18 @@ class PeerWorkflowItem(models.Model):
def __unicode__(self):
return repr(self)
class AssessmentFeedback(models.Model):
"""A response to a submission's feedback, judging accuracy or helpfulness."""
peerworkflows = models.ManyToManyField(PeerWorkflowItem)
HELPFULNESS_CHOICES = (
(0, 'These results were not at all helpful'),
(1, 'These results were somewhat helpful'),
(2, 'These results were helpful'),
(3, 'These results were very helpful'),
(4, 'These results were extremely helpful'),
)
helpfulness = models.IntegerField(choices=HELPFULNESS_CHOICES, default=2)
feedback = models.TextField(max_length=10000, default="")
......@@ -8,7 +8,7 @@ from copy import deepcopy
from django.utils.translation import ugettext as _
from rest_framework import serializers
from openassessment.assessment.models import (
Assessment, AssessmentPart, Criterion, CriterionOption, Rubric
Assessment, AssessmentFeedback, AssessmentPart, Criterion, CriterionOption, Rubric
)
......@@ -271,3 +271,15 @@ def rubric_from_dict(rubric_dict):
rubric = rubric_serializer.save()
return rubric
class AssessmentFeedbackSerializer(serializers.ModelSerializer):
class Meta:
model = AssessmentFeedback
fields = ('id',
'peerworkflows',
'helpfulness',
'feedback',
)
import copy
from django.utils.translation import ugettext as _
from xblock.core import XBlock
from openassessment.assessment import peer_api
from submissions import api as submissions_api
class GradeMixin(object):
......@@ -14,6 +19,11 @@ class GradeMixin(object):
"""
def __stackinfo(self):
import inspect
stack = inspect.stack()
return str(stack[0][1]) +':L'+str(stack[0][2])+':'+ str(stack[0][3]) +'()'
@XBlock.handler
def render_grade(self, data, suffix=''):
workflow = self.get_workflow_info()
......@@ -65,3 +75,16 @@ class GradeMixin(object):
path = 'openassessmentblock/grade/oa_grade_incomplete.html'
return self.render_assessment(path, context)
@XBlock.json_handler
def feedback_submit(self, data, suffix=''):
"""Attach the Assessment Feedback text to some submission."""
submission_uuid = self.submission_uuid
assessment_feedback = data.get('feedback', '')
raise Exception, "jrbl everything worked up to here" # DEBUG
if not assessment_feedback:
return {'success': False, 'msg': _(u"No feedback given, so none recorded")}
feedback_dict = submissions_api.get_assessment_feedback(submission_uuid)
feedback_dict['feedback'] = assessment_feedback
__ = submissions_api.set_assessment_feedback(feedback_dict)
return {'success': True, 'msg': _(u"Feedback saved!")}
......@@ -98,6 +98,7 @@ OpenAssessment.BaseUI.prototype = {
ui.save();
}
);
}
).fail(function(errMsg) {
ui.showLoadError('response');
......@@ -150,6 +151,7 @@ OpenAssessment.BaseUI.prototype = {
ui.peerAssess();
}
);
}
).fail(function(errMsg) {
ui.showLoadError('peer-assessment');
......@@ -255,10 +257,17 @@ OpenAssessment.BaseUI.prototype = {
// Install a click handler for collapse/expand
var sel = $('#openassessment__grade', ui.element);
ui.setUpCollapseExpand(sel);
// Install a click handler for assessment feedback
sel.find('#feedback__submit').click(function(eventObject) {
eventObject.preventDefault();
ui.feedback_assess();
});
}
).fail(function(errMsg) {
ui.showLoadError('grade', errMsg);
});
},
/**
......@@ -308,8 +317,24 @@ OpenAssessment.BaseUI.prototype = {
},
/**
* Send an assessment to the server and update the UI.
*/
Send assessment feedback to the server and update the UI.
**/
feedback_assess: function() {
// Send the submission to the server
var feedback = $('#feedback__remarks__value', this.element).val();
var ui = this;
this.server.feedback_submit(feedback).done(
// When we have successfully sent the submission, textarea no longer editable
console.log("Feedback to the assessments submitted, thanks!") // JRBL: FIXME: TODO: make this true
).fail(function(errMsg) {
// TODO: display to the user
console.log(errMsg);
});
},
/**
Send an assessment to the server and update the UI.
**/
peerAssess: function() {
var ui = this;
ui.peerAssessRequest(function() {
......
......@@ -161,9 +161,35 @@ OpenAssessment.Server.prototype = {
}).promise();
},
/**
Send feedback on assessments to the XBlock.
FIXME: JRBL: write documentation
**/
feedback_submit: function(feedback) {
var url = this.url('feedback_submit');
var payload = JSON.stringify({
feedback: feedback
});
return $.Deferred(function(defer) {
$.ajax({ type: "POST", url: url, data: payload }).done(
function(data) {
if (data.success) {
defer.resolve();
alert("resolved!");
}
else {
defer.rejectWith(this, [data.msg]);
alert("rejected!");
}
}
).fail(function(data) {
defer.rejectWith(this, ['Could not contact server.']);
});
}).promise()
},
/**
Send a peer assessment to the XBlock.
Args:
submissionId (string): The UUID of the submission.
optionsSelected (object literal): Keys are criteria names,
......
......@@ -61,8 +61,8 @@
<assessment name="peer-assessment"
start="2014-12-20T19:00-7:00"
due="2014-12-21T22:22-7:00"
must_grade="5"
must_be_graded_by="3" />
must_grade="1"
must_be_graded_by="1" />
<assessment name="self-assessment" />
</assessments>
</openassessment>
import copy
import logging
import dateutil
from xblock.core import XBlock
import logging
from django.utils.translation import ugettext as _
from xblock.core import XBlock
from submissions import api
from openassessment.assessment import peer_api
from openassessment.workflow import api as workflow_api
......
......@@ -8,10 +8,10 @@ import logging
from django.db import DatabaseError
from django.utils.encoding import force_unicode
from submissions.serializers import (
SubmissionSerializer, StudentItemSerializer, ScoreSerializer
)
from submissions.serializers import SubmissionSerializer, StudentItemSerializer, ScoreSerializer
from submissions.models import Submission, StudentItem, Score, ScoreSummary
from openassessment.assessment.serializers import AssessmentFeedbackSerializer
from openassessment.assessment.models import AssessmentFeedback
logger = logging.getLogger(__name__)
......@@ -489,3 +489,25 @@ def _get_or_create_student_item(student_item_dict):
student_item_dict)
logger.exception(error_message)
raise SubmissionInternalError(error_message)
def get_assessment_feedback(submission_uuid):
"""Retrieve a feedback object for an assessment whether it exists or not."""
try:
submission = Submission.objects.get(uuid=submission_uuid)
feedback_obj, feedback_created = AssessmentFeedback.objects.get_or_create(submission=submission)
return AssessmentFeedbackSerializer(feedback_obj).data
except DatabaseError, msg:
error_message = u"An error occurred retrieving assessment feedback for {}.".format(submission_uuid)
logger.exception(error_message)
raise DatabaseError, msg
def set_assessment_feedback(feedback_dict):
"""Set a feedback object for an assessment to have some new values."""
submission = Submission.objects.get(submission_uuid=feedback_dict['submission_uuid'])
feedback_obj = AssessmentFeedback.objects.get(pk=feedback_dict['id'])
if feedback_obj.submission != submission:
raise Exception, "Can't re-associate a piece of feedback" # TODO: less generic
feedback_obj.helpfulness = feedback_dict['helpfulness']
feedback_obj.feedback = feedback_dict['feedback']
feedback_obj.save()
return AssessmentFeedbackSerializer(feedback_obj).data
......@@ -157,3 +157,4 @@ class ScoreSummary(models.Model):
u"Error while updating score summary for student item {}"
.format(score.student_item)
)
......@@ -42,3 +42,4 @@ class ScoreSerializer(serializers.ModelSerializer):
# Computed
'submission_uuid',
)
......@@ -16,3 +16,5 @@ MIDDLEWARE_CLASSES += (
)
INTERNAL_IPS = ('127.0.0.1',)
LOGGING['loggers']['django.request']['level'] = 'DEBUG'
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