Commit 867d9373 by Stephen Sanchez

Renaming everything with an appended _block, and some cleanup

parent f693bc1f
class Assessment(object):
class AssessmentBlock(object):
assessment_type = None
name = ''
start_datetime = None
......@@ -7,6 +7,7 @@ class Assessment(object):
must_be_graded_by = 0
navigation_text = ""
path = ""
title = ""
def create_ui_model(self):
return {
......@@ -17,5 +18,6 @@ class Assessment(object):
"must_grade": self.must_grade,
"must_be_graded_by": self.must_be_graded_by,
"navigation_text": self.navigation_text,
"path": self.path
"path": self.path,
"title": self.title
}
\ No newline at end of file
"""An XBlock where students can read a question and compose their response"""
from django.template.context import Context
import pkg_resources
import datetime
from django.template.context import Context
from django.template.loader import get_template
import datetime
from xblock.core import XBlock
from xblock.fields import List, Scope, String
from xblock.fragment import Fragment
from openassessment.xblock.peer_assessment import PeerAssessment
from submissions.api import SubmissionRequestError
from submissions import api
from openassessment.xblock.peer_assessment_block import PeerAssessmentBlock
from openassessment.xblock.submission_block import SubmissionBlock
from openassessment.xblock.utils import load
from scenario_parser import ScenarioParser
......@@ -112,7 +110,7 @@ DEFAULT_RUBRIC_CRITERIA = [
}
]
DEFAULT_PEER_ASSESSMENT = PeerAssessment()
DEFAULT_PEER_ASSESSMENT = PeerAssessmentBlock()
DEFAULT_PEER_ASSESSMENT.name = "peer-assessment"
DEFAULT_PEER_ASSESSMENT.start_datetime = datetime.datetime.now().isoformat()
DEFAULT_PEER_ASSESSMENT.must_grade = 5
......@@ -123,12 +121,6 @@ DEFAULT_ASSESSMENT_MODULES = [
]
def load(path):
"""Handy helper for getting resources from our kit."""
data = pkg_resources.resource_string(__name__, path)
return data.decode("utf8")
class OpenAssessmentBlock(XBlock):
"""Displays a question and gives an area where students can compose a response."""
......@@ -179,13 +171,6 @@ class OpenAssessmentBlock(XBlock):
help="The course_id associated with this prompt (until we can get it from runtime).",
)
submit_errors = { # Reported to user sometimes, and useful in tests
'ENOSUB': 'API submission is unrequested',
'ENODATA': 'API returned an empty response',
'EBADFORM': 'API Submission Request Error',
'EUNKNOWN': 'API returned unclassified exception',
}
def _get_xblock_trace(self):
"""Uniquely identify this xblock by context.
......@@ -231,29 +216,12 @@ class OpenAssessmentBlock(XBlock):
"grade_state": grade_state,
}
try:
previous_submissions = api.get_submissions(student_item_dict)
except SubmissionRequestError:
previous_submissions = []
peer_module = self._get_assessment_module('peer-assessment')
peer_assessment = peer_module.get_peer_submission(student_item_dict)
if previous_submissions and peer_assessment: # XXX: until workflow better, move on w/ prev submit
template = get_template("static/html/oa_base.html")
context = Context(context_dict)
frag = Fragment(template.render(context))
frag.add_css(load("static/css/openassessment.css"))
frag.add_javascript(load("static/js/src/oa_assessment.js"))
frag.initialize_js('OpenAssessmentBlock')
elif previous_submissions:
return Fragment(u"<div>There are no submissions to review.</div>")
else: # XXX: until workflow better, submit until submitted
template = get_template("static/html/oa_base.html")
context = Context(context_dict)
frag = Fragment(template.render(context))
frag.add_css(load("static/css/openassessment.css"))
frag.add_javascript(load("static/js/src/oa_submission.js"))
frag.initialize_js('OpenAssessmentBlock')
template = get_template("static/html/oa_base.html")
context = Context(context_dict)
frag = Fragment(template.render(context))
frag.add_css(load("static/css/openassessment.css"))
frag.add_javascript(load("static/js/src/oa_base.js"))
frag.initialize_js('OpenAssessmentBlock')
return frag
@XBlock.json_handler
......@@ -279,26 +247,7 @@ class OpenAssessmentBlock(XBlock):
"""
Place the submission text into Openassessment system
"""
status = False
status_tag = 'ENOSUB'
status_text = None
student_sub = data['submission']
student_item_dict = self._get_student_item_dict()
try:
status_tag = 'ENODATA'
response = api.create_submission(student_item_dict, student_sub)
if response:
status = True
status_tag = response.get('student_item')
status_text = response.get('attempt_number')
except api.SubmissionRequestError, e:
status_tag = 'EBADFORM'
status_text = unicode(e.field_errors)
except api.SubmissionError:
status_tag = 'EUNKNOWN'
# relies on success being orthogonal to errors
status_text = status_text if status_text else self.submit_errors[status_tag]
return status, status_tag, status_text
return SubmissionBlock().submit(self._get_student_item_dict(), data)
@staticmethod
def workbench_scenarios():
......@@ -328,6 +277,7 @@ class OpenAssessmentBlock(XBlock):
sparser = ScenarioParser(block, node, unknown_handler)
block = sparser.parse()
block.rubric_assessments.insert(0, SubmissionBlock())
return block
def _get_grade_state(self):
......
from django.template import Context
from django.template.loader import get_template
from xblock.fragment import Fragment
from openassessment.peer import api as peer_api
from openassessment.peer.api import PeerAssessmentWorkflowError
from openassessment.xblock.assessment import Assessment
from openassessment.xblock.assessment_block import AssessmentBlock
from openassessment.xblock.utils import load
class PeerAssessment(Assessment):
class PeerAssessmentBlock(AssessmentBlock):
assessment_type = "peer-assessment"
title = "Assess Peers' Responses"
navigation_text = "Your assessment(s) of peer responses"
path = "static/html/oa_peer_assessment.html"
......@@ -48,4 +55,13 @@ class PeerAssessment(Assessment):
except PeerAssessmentWorkflowError:
# TODO: Log?
pass
return peer_submission
\ No newline at end of file
return peer_submission
def render(self, context_dict):
template = get_template("static/html/oa_peer_assessment.html")
context = Context(context_dict)
frag = Fragment(template.render(context))
frag.add_css(load("static/css/openassessment.css"))
frag.add_javascript(load("static/js/src/oa_assessment.js"))
frag.initialize_js('PeerAssessment')
return frag
\ No newline at end of file
# -*- coding: utf-8 -*-
"""XBlock scenario parsing routines"""
from openassessment.xblock.peer_assessment import PeerAssessment
from openassessment.xblock.self_assessment import SelfAssessment
from openassessment.xblock.peer_assessment_block import PeerAssessmentBlock
from openassessment.xblock.self_assessment_block import SelfAssessmentBlock
class ScenarioParser(object):
......@@ -81,11 +81,11 @@ class ScenarioParser(object):
assessment = None
assessment_type = asmnt.tag
if 'peer-assessment' == assessment_type:
assessment = PeerAssessment()
assessment = PeerAssessmentBlock()
assessment.must_grade = int(asmnt.attrib.get('must_grade', 1))
assessment.must_be_graded_by = int(asmnt.attrib.get('must_be_graded_by', 0))
elif 'self-assessment' == assessment_type:
assessment = SelfAssessment()
assessment = SelfAssessmentBlock()
if assessment:
assessment.name = asmnt.attrib.get('name', '')
......
from openassessment.xblock.assessment import Assessment
from openassessment.xblock.assessment_block import AssessmentBlock
class SelfAssessment(Assessment):
class SelfAssessmentBlock(AssessmentBlock):
assessment_type = "self-assessment"
navigation_text = "Your assessment of your response"
path = "static/html/oa_self_assessment.html"
\ No newline at end of file
path = "static/html/oa_self_assessment.html"
title = "Assess Your Response"
\ No newline at end of file
......@@ -32,9 +32,6 @@
<h2 class="title">Skip to a part of this problem:</h2>
<ol class="list list--nav">
<li class="list--nav__item">
<a class="action" href="#openassessment__response">Your response to this problem</a>
</li>
{% for assessment in rubric_assessments %}
<li class="list--nav__item">
<a class="action" href="#openassessment__{{ assessment.type }}">{{ assessment.navigation_text }}</a>
......@@ -71,10 +68,8 @@
<ol class="openassessment__steps" id="openassessment__steps">
<!-- STEP: response -->
{% include "static/html/oa_response.html" %}
{% for assessment in rubric_assessments %}
{% include assessment.path %}
<li id="{{ assessment.name }}">{{ assessment.title }}</li>
{% endfor %}
</ol>
......
from openassessment.xblock.assessment_block import AssessmentBlock
from submissions import api
class SubmissionBlock(AssessmentBlock):
assessment_type = "submission"
name = "submission"
navigation_text = "Your response to this problem"
path = "static/html/oa_response.html"
title = "Your Response"
submit_errors = {
# Reported to user sometimes, and useful in tests
'ENOSUB': 'API submission is unrequested',
'ENODATA': 'API returned an empty response',
'EBADFORM': 'API Submission Request Error',
'EUNKNOWN': 'API returned unclassified exception',
}
def submit(self, student_item_dict, data):
"""
Place the submission text into Openassessment system
"""
status = False
status_text = None
student_sub = data['submission']
try:
status_tag = 'ENODATA'
response = api.create_submission(student_item_dict, student_sub)
if response:
status = True
status_tag = response.get('student_item')
status_text = response.get('attempt_number')
except api.SubmissionRequestError, e:
status_tag = 'EBADFORM'
status_text = unicode(e.field_errors)
except api.SubmissionError:
status_tag = 'EUNKNOWN'
# relies on success being orthogonal to errors
status_text = status_text if status_text else self.submit_errors[status_tag]
return status, status_tag, status_text
\ No newline at end of file
......@@ -7,6 +7,7 @@ import webob
from django.test import TestCase
from mock import patch
from openassessment.xblock.submission_block import SubmissionBlock
from submissions import api
from submissions.api import SubmissionRequestError, SubmissionInternalError
......@@ -97,7 +98,7 @@ class TestOpenAssessment(TestCase):
result = json.loads(resp.body)
self.assertFalse(result[0])
self.assertEqual(result[1], "EUNKNOWN")
self.assertEqual(result[2], self.assessment.submit_errors["EUNKNOWN"])
self.assertEqual(result[2], SubmissionBlock().submit_errors["EUNKNOWN"])
@patch.object(api, 'create_submission')
def test_submission_API_failure(self, mock_submit):
......
import pkg_resources
def load(path):
"""Handy helper for getting resources from our kit."""
data = pkg_resources.resource_string(__name__, path)
return data.decode("utf8")
\ No newline at end of file
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