Skip to content
Snippets Groups Projects
Commit 49db27b5 authored by srosse's avatar srosse
Browse files
parents 6882c2ee 112338fe
No related branches found
No related tags found
No related merge requests found
Showing
with 114 additions and 8 deletions
...@@ -177,14 +177,14 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle ...@@ -177,14 +177,14 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle
AssessmentTestSession testSession = correction.getTestSession(); AssessmentTestSession testSession = correction.getTestSession();
TestSessionState testSessionState = correction.getTestSessionState(); TestSessionState testSessionState = correction.getTestSessionState();
answerItem = initFormInteraction(testPlanNodeKey, testSessionState, testSession, formLayout, true); answerItem = initFormInteraction(testPlanNodeKey, testSessionState, testSession, formLayout, true, false);
formLayout.add("answer", answerItem); formLayout.add("answer", answerItem);
viewSolutionButton = uifactory.addFormLink("view.solution", formLayout); viewSolutionButton = uifactory.addFormLink("view.solution", formLayout);
viewSolutionButton.setIconLeftCSS("o_icon o_icon_open_togglebox"); viewSolutionButton.setIconLeftCSS("o_icon o_icon_open_togglebox");
viewSolutionButton.setVisible(hasSolution()); viewSolutionButton.setVisible(hasSolution());
solutionItem = initFormInteraction(testPlanNodeKey, testSessionState, testSession, formLayout, false); solutionItem = initFormInteraction(testPlanNodeKey, testSessionState, testSession, formLayout, false, true);
solutionItem.setVisible(false); solutionItem.setVisible(false);
solutionItem.setShowSolution(true); solutionItem.setShowSolution(true);
formLayout.add("solution", solutionItem); formLayout.add("solution", solutionItem);
...@@ -347,7 +347,7 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle ...@@ -347,7 +347,7 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle
private ItemBodyResultFormItem initFormInteraction(TestPlanNodeKey testPlanNodeKey, private ItemBodyResultFormItem initFormInteraction(TestPlanNodeKey testPlanNodeKey,
TestSessionState testSessionState, AssessmentTestSession assessmentTestSession, TestSessionState testSessionState, AssessmentTestSession assessmentTestSession,
FormItemContainer layoutCont, boolean correctionHelp) { FormItemContainer layoutCont, boolean correctionHelp, boolean correctionSolution) {
ItemSessionState sessionState = testSessionState.getItemSessionStates().get(testPlanNodeKey); ItemSessionState sessionState = testSessionState.getItemSessionStates().get(testPlanNodeKey);
...@@ -360,6 +360,7 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle ...@@ -360,6 +360,7 @@ public class CorrectionIdentityInteractionsController extends FormBasicControlle
responseFormItem.setAssessmentObjectUri(assessmentObjectUri); responseFormItem.setAssessmentObjectUri(assessmentObjectUri);
responseFormItem.setMapperUri(mapperUri); responseFormItem.setMapperUri(mapperUri);
responseFormItem.setCorrectionHelp(correctionHelp); responseFormItem.setCorrectionHelp(correctionHelp);
responseFormItem.setCorrectionSolution(correctionSolution);
layoutCont.add(responseFormItem); layoutCont.add(responseFormItem);
return responseFormItem; return responseFormItem;
} }
......
...@@ -11,6 +11,7 @@ correction.min.max.score=Punkte m\u00FCssen zwischen {0} und {1} sein. ...@@ -11,6 +11,7 @@ correction.min.max.score=Punkte m\u00FCssen zwischen {0} und {1} sein.
correction.test.title=Korrigieren correction.test.title=Korrigieren
correction.assessment.items=Fragen correction.assessment.items=Fragen
correction.assessed.identities=Benutzer correction.assessed.identities=Benutzer
correction.alternatives=Varianten
correction.auto=Auto correction.auto=Auto
error.double.format=Falsches Zahlenformat. Beispiele\: 15.0, 5.5, 10, 15,0 error.double.format=Falsches Zahlenformat. Beispiele\: 15.0, 5.5, 10, 15,0
error.in.form=Die \u00C4nderungen k\u00F6nnen nicht gespeichert werden, da bei einer oder mehreren Fragen Fehler auftreten. Die detaillierte Fehlerbeschreibung befindet sich bei der betroffenen Frage. error.in.form=Die \u00C4nderungen k\u00F6nnen nicht gespeichert werden, da bei einer oder mehreren Fragen Fehler auftreten. Die detaillierte Fehlerbeschreibung befindet sich bei der betroffenen Frage.
......
...@@ -6,6 +6,7 @@ comment.help=Comments are visible to user as to other coaches. ...@@ -6,6 +6,7 @@ comment.help=Comments are visible to user as to other coaches.
comment.test=Test comment comment.test=Test comment
confirm.save=Do you want to save the results as completed? confirm.save=Do you want to save the results as completed?
correction=Correction correction=Correction
correction.alternatives=Alternative
correction.assessed.identities=Users correction.assessed.identities=Users
correction.assessment.items=Questions correction.assessment.items=Questions
correction.auto=Auto correction.auto=Auto
......
...@@ -6,6 +6,7 @@ comment.help=Ce commentaire est visible pour l'utilisateur dans le r\u00E9sum\u0 ...@@ -6,6 +6,7 @@ comment.help=Ce commentaire est visible pour l'utilisateur dans le r\u00E9sum\u0
comment.test=Commentaire du test comment.test=Commentaire du test
confirm.save=Voulez-vous sauver d\u00E9finitivement les r\u00E9sultats? confirm.save=Voulez-vous sauver d\u00E9finitivement les r\u00E9sultats?
correction=Corriger correction=Corriger
correction.alternatives=Alternatives
correction.assessed.identities=Utilisateurs correction.assessed.identities=Utilisateurs
correction.assessment.items=Questions correction.assessment.items=Questions
correction.auto=Auto correction.auto=Auto
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
assessed.identity=Utente assessed.identity=Utente
comment=Commento comment=Commento
correction=Correzione correction=Correzione
correction.alternatives=Varianti
correction.min.max.score=Il punteggio deve essere compreso tra {0} e {1}. correction.min.max.score=Il punteggio deve essere compreso tra {0} e {1}.
correction.test.title=Valutazione correction.test.title=Valutazione
grade.no.items=Non ci sono risultati da correggere per questa domanda. grade.no.items=Non ci sono risultati da correggere per questa domanda.
......
...@@ -6,6 +6,7 @@ comment.help=Coment\u00E1rios s\u00E3o vis\u00EDveis para o usu\u00E1rio como pa ...@@ -6,6 +6,7 @@ comment.help=Coment\u00E1rios s\u00E3o vis\u00EDveis para o usu\u00E1rio como pa
comment.test=Coment\u00E1rio do teste comment.test=Coment\u00E1rio do teste
confirm.save=Voc\u00EA deseja salvar os resultados como conclu\u00EDdos? confirm.save=Voc\u00EA deseja salvar os resultados como conclu\u00EDdos?
correction=Corre\u00E7\u00E3o correction=Corre\u00E7\u00E3o
correction.alternatives=Alternativa
correction.assessed.identities=Usu\u00E1rios correction.assessed.identities=Usu\u00E1rios
correction.assessment.items=Quest\u00F5es correction.assessment.items=Quest\u00F5es
correction.auto=Auto correction.auto=Auto
......
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
assessed.identity=\u5DF2\u8BC4\u4F30\u7684\u7528\u6237 assessed.identity=\u5DF2\u8BC4\u4F30\u7684\u7528\u6237
comment=\u8BC4\u8BBA comment=\u8BC4\u8BBA
correction=\u66F4\u6B63 correction=\u66F4\u6B63
correction.alternatives=\u5907\u9009
correction.min.max.score=\u5206\u6570\u5728{0}\u548C{1}\u4E4B\u95F4 correction.min.max.score=\u5206\u6570\u5728{0}\u548C{1}\u4E4B\u95F4
correction.test.title=\u8BC4\u5206 correction.test.title=\u8BC4\u5206
grade.no.items=\u8FD9\u4E2A\u95EE\u9898\u6CA1\u6709\u8981\u66F4\u6B63\u7684\u6210\u7EE9\u3002 grade.no.items=\u8FD9\u4E2A\u95EE\u9898\u6CA1\u6709\u8981\u66F4\u6B63\u7684\u6210\u7EE9\u3002
......
...@@ -59,6 +59,7 @@ public abstract class AssessmentObjectComponent extends AbstractComponent implem ...@@ -59,6 +59,7 @@ public abstract class AssessmentObjectComponent extends AbstractComponent implem
private final boolean mathAssess; private final boolean mathAssess;
private boolean hideFeedbacks = false; private boolean hideFeedbacks = false;
private boolean correctionHelp = false; private boolean correctionHelp = false;
private boolean correctionSolution = false;
private boolean maxScoreAssessmentItem = false; private boolean maxScoreAssessmentItem = false;
private String mapperUri; private String mapperUri;
...@@ -126,6 +127,14 @@ public abstract class AssessmentObjectComponent extends AbstractComponent implem ...@@ -126,6 +127,14 @@ public abstract class AssessmentObjectComponent extends AbstractComponent implem
public void setCorrectionHelp(boolean correctionHelp) { public void setCorrectionHelp(boolean correctionHelp) {
this.correctionHelp = correctionHelp; this.correctionHelp = correctionHelp;
} }
public boolean isCorrectionSolution() {
return correctionSolution;
}
public void setCorrectionSolution(boolean correctionSolution) {
this.correctionSolution = correctionSolution;
}
public abstract String getResponseUniqueIdentifier(ItemSessionState itemSessionState, Interaction interaction); public abstract String getResponseUniqueIdentifier(ItemSessionState itemSessionState, Interaction interaction);
......
...@@ -1025,6 +1025,8 @@ public abstract class AssessmentObjectComponentRenderer extends DefaultComponent ...@@ -1025,6 +1025,8 @@ public abstract class AssessmentObjectComponentRenderer extends DefaultComponent
ctx.put("isItemSessionOpen", component.isItemSessionOpen(itemSessionState, renderer.isSolutionMode())); ctx.put("isItemSessionOpen", component.isItemSessionOpen(itemSessionState, renderer.isSolutionMode()));
ctx.put("isItemSessionEnded", component.isItemSessionEnded(itemSessionState, renderer.isSolutionMode())); ctx.put("isItemSessionEnded", component.isItemSessionEnded(itemSessionState, renderer.isSolutionMode()));
ctx.put("isCorrectionHelp", component.isCorrectionHelp()); ctx.put("isCorrectionHelp", component.isCorrectionHelp());
ctx.put("isCorrectionSolution", component.isCorrectionSolution());
ctx.put("isSolutionMode", renderer.isSolutionMode());
Renderer fr = Renderer.getInstance(component, translator, ubu, new RenderResult(), renderer.getGlobalSettings()); Renderer fr = Renderer.getInstance(component, translator, ubu, new RenderResult(), renderer.getGlobalSettings());
AssessmentRenderer fHints = renderer.newHints(fr); AssessmentRenderer fHints = renderer.newHints(fr);
......
...@@ -123,6 +123,14 @@ public abstract class AssessmentObjectFormItem extends FormItemImpl implements F ...@@ -123,6 +123,14 @@ public abstract class AssessmentObjectFormItem extends FormItemImpl implements F
getComponent().setCorrectionHelp(enable); getComponent().setCorrectionHelp(enable);
} }
public boolean isCorrectionSolution() {
return getComponent().isCorrectionSolution();
}
public void setCorrectionSolution(boolean correctionSolution) {
getComponent().setCorrectionSolution(correctionSolution);
}
protected Map<Identifier, StringResponseData> extractStringResponseData() { protected Map<Identifier, StringResponseData> extractStringResponseData() {
final Map<Identifier, StringResponseData> responseMap = new HashMap<>(); final Map<Identifier, StringResponseData> responseMap = new HashMap<>();
......
...@@ -25,6 +25,7 @@ import java.io.IOException; ...@@ -25,6 +25,7 @@ import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
...@@ -53,6 +54,7 @@ import uk.ac.ed.ph.jqtiplus.node.content.basic.FlowStatic; ...@@ -53,6 +54,7 @@ import uk.ac.ed.ph.jqtiplus.node.content.basic.FlowStatic;
import uk.ac.ed.ph.jqtiplus.node.content.variable.TextOrVariable; import uk.ac.ed.ph.jqtiplus.node.content.variable.TextOrVariable;
import uk.ac.ed.ph.jqtiplus.node.expression.operator.Shape; import uk.ac.ed.ph.jqtiplus.node.expression.operator.Shape;
import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem; import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem;
import uk.ac.ed.ph.jqtiplus.node.item.CorrectResponse;
import uk.ac.ed.ph.jqtiplus.node.item.interaction.AssociateInteraction; import uk.ac.ed.ph.jqtiplus.node.item.interaction.AssociateInteraction;
import uk.ac.ed.ph.jqtiplus.node.item.interaction.ChoiceInteraction; import uk.ac.ed.ph.jqtiplus.node.item.interaction.ChoiceInteraction;
import uk.ac.ed.ph.jqtiplus.node.item.interaction.ExtendedTextInteraction; import uk.ac.ed.ph.jqtiplus.node.item.interaction.ExtendedTextInteraction;
...@@ -79,7 +81,10 @@ import uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleChoice; ...@@ -79,7 +81,10 @@ import uk.ac.ed.ph.jqtiplus.node.item.interaction.choice.SimpleChoice;
import uk.ac.ed.ph.jqtiplus.node.item.interaction.content.Gap; import uk.ac.ed.ph.jqtiplus.node.item.interaction.content.Gap;
import uk.ac.ed.ph.jqtiplus.node.item.interaction.graphic.AssociableHotspot; import uk.ac.ed.ph.jqtiplus.node.item.interaction.graphic.AssociableHotspot;
import uk.ac.ed.ph.jqtiplus.node.item.interaction.graphic.HotspotChoice; import uk.ac.ed.ph.jqtiplus.node.item.interaction.graphic.HotspotChoice;
import uk.ac.ed.ph.jqtiplus.node.item.response.declaration.MapEntry;
import uk.ac.ed.ph.jqtiplus.node.item.response.declaration.Mapping;
import uk.ac.ed.ph.jqtiplus.node.item.response.declaration.ResponseDeclaration; import uk.ac.ed.ph.jqtiplus.node.item.response.declaration.ResponseDeclaration;
import uk.ac.ed.ph.jqtiplus.node.shared.FieldValue;
import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentItem; import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentItem;
import uk.ac.ed.ph.jqtiplus.state.ItemSessionState; import uk.ac.ed.ph.jqtiplus.state.ItemSessionState;
import uk.ac.ed.ph.jqtiplus.types.Identifier; import uk.ac.ed.ph.jqtiplus.types.Identifier;
...@@ -93,6 +98,7 @@ import uk.ac.ed.ph.jqtiplus.value.NullValue; ...@@ -93,6 +98,7 @@ import uk.ac.ed.ph.jqtiplus.value.NullValue;
import uk.ac.ed.ph.jqtiplus.value.Orientation; import uk.ac.ed.ph.jqtiplus.value.Orientation;
import uk.ac.ed.ph.jqtiplus.value.RecordValue; import uk.ac.ed.ph.jqtiplus.value.RecordValue;
import uk.ac.ed.ph.jqtiplus.value.SingleValue; import uk.ac.ed.ph.jqtiplus.value.SingleValue;
import uk.ac.ed.ph.jqtiplus.value.StringValue;
import uk.ac.ed.ph.jqtiplus.value.Value; import uk.ac.ed.ph.jqtiplus.value.Value;
/** /**
...@@ -611,6 +617,52 @@ public class AssessmentObjectVelocityRenderDecorator extends VelocityRenderDecor ...@@ -611,6 +617,52 @@ public class AssessmentObjectVelocityRenderDecorator extends VelocityRenderDecor
return Boolean.valueOf(correct); return Boolean.valueOf(correct);
} }
public String renderTextEntryAlternatives(TextEntryInteraction textEntry) {
LinkedHashSet<String> alternatives = new LinkedHashSet<>();
ResponseDeclaration responseDeclaration = assessmentItem.getResponseDeclaration(textEntry.getResponseIdentifier());
if(responseDeclaration != null &&responseDeclaration.hasBaseType(BaseType.STRING) && responseDeclaration.hasCardinality(Cardinality.SINGLE)) {
CorrectResponse correctResponse = responseDeclaration.getCorrectResponse();
if(correctResponse != null && correctResponse.getFieldValues() != null) {
for(FieldValue fValue:correctResponse.getFieldValues()) {
SingleValue aValue = fValue.getSingleValue();
if(aValue instanceof StringValue) {
alternatives.add(((StringValue)aValue).stringValue());
}
}
}
Mapping mapping = responseDeclaration.getMapping();
if(mapping != null) {
for(MapEntry mapEntry:mapping.getMapEntries()) {
SingleValue sValue = mapEntry.getMapKey();
if(sValue instanceof StringValue) {
alternatives.add(((StringValue)sValue).stringValue());
}
}
}
// if there is a correct answer, remove the first one
if(correctResponse != null && correctResponse.getFieldValues() != null
&& !correctResponse.getFieldValues().isEmpty() && !alternatives.isEmpty()) {
alternatives.remove(alternatives.iterator().next());
}
}
String separator = ", ";
// Don't use , as a separator on punctuation exercise
if(alternatives.contains(",") || alternatives.contains(" ") || alternatives.contains(".")) {
separator = " \u007C ";
}
StringBuilder sb = new StringBuilder();
for(String alternative:alternatives) {
if(sb.length() > 0) sb.append(separator);
sb.append(alternative);
}
return sb.toString();
}
public String renderClassAttr(BodyElement block) { public String renderClassAttr(BodyElement block) {
List<String> classAttr = block.getClassAttr(); List<String> classAttr = block.getClassAttr();
if(classAttr != null && !classAttr.isEmpty()) { if(classAttr != null && !classAttr.isEmpty()) {
......
...@@ -103,15 +103,27 @@ public class AssessmentTestFormItem extends AssessmentObjectFormItem { ...@@ -103,15 +103,27 @@ public class AssessmentTestFormItem extends AssessmentObjectFormItem {
public void setMaxScoreAssessmentItem(boolean maxScoreAssessmentItem) { public void setMaxScoreAssessmentItem(boolean maxScoreAssessmentItem) {
component.setMaxScoreAssessmentItem(maxScoreAssessmentItem); component.setMaxScoreAssessmentItem(maxScoreAssessmentItem);
} }
@Override
public boolean isCorrectionHelp() { public boolean isCorrectionHelp() {
return component.isCorrectionHelp(); return component.isCorrectionHelp();
} }
@Override
public void setCorrectionHelp(boolean correctionHelp) { public void setCorrectionHelp(boolean correctionHelp) {
component.setCorrectionHelp(correctionHelp); component.setCorrectionHelp(correctionHelp);
} }
@Override
public boolean isCorrectionSolution() {
return component.isCorrectionSolution();
}
@Override
public void setCorrectionSolution(boolean correctionSolution) {
component.setCorrectionSolution(correctionSolution);
}
public ResolvedAssessmentTest getResolvedAssessmentTest() { public ResolvedAssessmentTest getResolvedAssessmentTest() {
return component.getResolvedAssessmentTest(); return component.getResolvedAssessmentTest();
} }
......
...@@ -24,5 +24,11 @@ ...@@ -24,5 +24,11 @@
#if($isInvalidResponse) #if($isInvalidResponse)
<span class="badResponse">$r.translate("error.required.format")</span> <span class="badResponse">$r.translate("error.required.format")</span>
#end #end
#if($r.isTrue($isCorrectionSolution))
#set($alternativesString = $r.renderTextEntryAlternatives($interaction))
#if($r.isNotEmpty($alternativesString))
<span class="o_qti_gaptext_alternatives" title='$r.translate("correction.alternatives")'>$alternativesString</span>
#end
#end
</span> </span>
$r.appendFlexiFormDirty("od_${responseIdentifier}") $r.appendFlexiFormDirty("od_${responseIdentifier}")
\ No newline at end of file
...@@ -205,6 +205,14 @@ img.o_hotspot_responsive[usemap] { ...@@ -205,6 +205,14 @@ img.o_hotspot_responsive[usemap] {
margin-bottom: 3px; margin-bottom: 3px;
} }
.o_qti_gaptext_alternatives {
background-color: $gray-lighter;
color: $gray;
border: 1px solid $gray-lighter;
border-radius: $border-radius-base;
padding: 2px 5px;
}
/* Essay extended text */ /* Essay extended text */
.o_qti_item_body .extendedTextInteraction { .o_qti_item_body .extendedTextInteraction {
margin: 15px 0; margin: 15px 0;
......
source diff could not be displayed: it is too large. Options to address this: view the blob.
source diff could not be displayed: it is too large. Options to address this: view the blob.
source diff could not be displayed: it is too large. Options to address this: view the blob.
source diff could not be displayed: it is too large. Options to address this: view the blob.
source diff could not be displayed: it is too large. Options to address this: view the blob.
source diff could not be displayed: it is too large. Options to address this: view the blob.
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment